90 lines
2.7 KiB
Python
90 lines
2.7 KiB
Python
|
|
import logging
|
||
|
|
import logging.handlers
|
||
|
|
import os
|
||
|
|
from pathlib import Path
|
||
|
|
import sqlite3
|
||
|
|
import sys
|
||
|
|
|
||
|
|
import discord
|
||
|
|
from dotenv import load_dotenv
|
||
|
|
|
||
|
|
from .client import Client
|
||
|
|
from .markov import Chain
|
||
|
|
|
||
|
|
################################################################################
|
||
|
|
# Environment
|
||
|
|
################################################################################
|
||
|
|
load_dotenv()
|
||
|
|
# More common values
|
||
|
|
token = os.getenv("TOKEN")
|
||
|
|
log = os.getenv("LOG", "stderr")
|
||
|
|
loglevel = os.getenv("LOGLEVEL", "INFO")
|
||
|
|
db_path = Path(os.getenv("DB_PATH", "markov.db"))
|
||
|
|
|
||
|
|
# Less common values
|
||
|
|
sql_path = Path(os.getenv("SQL_PATH", "db.sql"))
|
||
|
|
|
||
|
|
if not token:
|
||
|
|
print("ERROR: TOKEN environment variable not set. Exiting.")
|
||
|
|
sys.exit(1)
|
||
|
|
|
||
|
|
if not sql_path.exists:
|
||
|
|
print("ERROR: could not find database SQL file")
|
||
|
|
sys.exit(1)
|
||
|
|
|
||
|
|
if loglevel.upper() not in ("DEBUG", "INFO", "WARNING", "WARN", "ERROR", "CRITICAL"):
|
||
|
|
print(f"WARNING: unknown loglevel {loglevel} - defaulting to INFO")
|
||
|
|
loglevel = "INFO"
|
||
|
|
|
||
|
|
|
||
|
|
################################################################################
|
||
|
|
# Logging setup
|
||
|
|
################################################################################
|
||
|
|
handler: logging.Handler
|
||
|
|
|
||
|
|
if log is None or log.lower() == "stderr":
|
||
|
|
handler = logging.StreamHandler(sys.stderr)
|
||
|
|
elif log.lower() == "stdout":
|
||
|
|
handler = logging.StreamHandler(sys.stdout)
|
||
|
|
else:
|
||
|
|
# 5 megabytes per log
|
||
|
|
MAX_LOG_SIZE = 5 * (2**20)
|
||
|
|
# Keep up to 5 logs
|
||
|
|
MAX_LOG_BACKUP = 5
|
||
|
|
handler = logging.handlers.RotatingFileHandler(
|
||
|
|
log, maxBytes=MAX_LOG_SIZE, backupCount=MAX_LOG_BACKUP
|
||
|
|
)
|
||
|
|
|
||
|
|
# logging.basicConfig(
|
||
|
|
# handlers=[handler],
|
||
|
|
# format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
||
|
|
# level=getattr(logging, loglevel),
|
||
|
|
# )
|
||
|
|
discord.utils.setup_logging(handler=handler, level=getattr(logging, loglevel))
|
||
|
|
|
||
|
|
db = sqlite3.connect(db_path)
|
||
|
|
|
||
|
|
################################################################################
|
||
|
|
# Create the database
|
||
|
|
################################################################################
|
||
|
|
cursor = db.cursor()
|
||
|
|
with open(sql_path) as fp:
|
||
|
|
cursor.executescript(fp.read())
|
||
|
|
cursor.close()
|
||
|
|
db.commit()
|
||
|
|
|
||
|
|
################################################################################
|
||
|
|
# Set up markov chain
|
||
|
|
################################################################################
|
||
|
|
chain = Chain(order=2, reply_chance=0.01, db=db)
|
||
|
|
|
||
|
|
################################################################################
|
||
|
|
# Client setup and bot run
|
||
|
|
################################################################################
|
||
|
|
intents = discord.Intents.default()
|
||
|
|
intents.message_content = True
|
||
|
|
intents.members = True
|
||
|
|
|
||
|
|
client = Client(db=db, chain=chain, intents=intents)
|
||
|
|
client.run(token)
|