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)