bf6c1842d2
Restart the bot, on heavy DB errors, with an 30 seconds delay (like: all connections terminated by DB, table_definition_cache exhausted) Fix for channel prefixing (org <-> priv)
130 lines
4.3 KiB
Python
130 lines
4.3 KiB
Python
import os
|
|
import platform
|
|
import sys
|
|
import time
|
|
|
|
from conf.config import BotConfig
|
|
from core.aochat.mmdb_parser import MMDBParser
|
|
from core.bot_status import BotStatus
|
|
from core.db import DB
|
|
from core.dict_object import DictObject
|
|
from core.functions import merge_dicts
|
|
from core.logger import Logger
|
|
from core.registry import Registry
|
|
from core.upgrade import run_upgrades
|
|
|
|
|
|
def get_config_from_env():
|
|
config_obj = DictObject()
|
|
for k, v in os.environ.items():
|
|
if k.startswith("IGNCORE_"):
|
|
keys = k[7:].lower().split("_")
|
|
temp_config = config_obj
|
|
for key in keys[:-1]:
|
|
key = key.replace("-", "_")
|
|
# create key if it doesn't already exist
|
|
if key not in temp_config:
|
|
temp_config[key] = DictObject()
|
|
temp_config = temp_config.get(key)
|
|
logger.debug(f"overriding config value from env var '{k}'")
|
|
if v.lower() == "true":
|
|
v = True
|
|
elif v.lower() == "false":
|
|
v = False
|
|
temp_config[keys[-1].replace("-", "_")] = v
|
|
return config_obj
|
|
|
|
|
|
try:
|
|
# load logging configuration
|
|
import conf.logging_settings
|
|
Registry.logger = Logger("core.registry")
|
|
bot = "config"
|
|
if len(sys.argv) > 1:
|
|
bot = f"{sys.argv[1]}"
|
|
else:
|
|
print("Unknown bot specified. Please edit your ##botname##.start.sh accordingly to the instructions found in the README.")
|
|
exit(0)
|
|
logger = Logger("core.bootstrap")
|
|
logger.info("Starting Bot...")
|
|
mod = __import__(f'conf.{bot}', fromlist=['BotConfig'])
|
|
config: BotConfig = getattr(mod, 'BotConfig')
|
|
if sys.version_info < (3, 9):
|
|
logger.warning("Versions lower then Python3.9 are not supported.")
|
|
exit(-1)
|
|
|
|
# load config values from env vars
|
|
env_config = get_config_from_env()
|
|
if env_config:
|
|
# converts dicts to lists
|
|
if "slaves" in env_config and isinstance(env_config.slaves, dict):
|
|
env_config.slaves = list(env_config.slaves.values())
|
|
|
|
if "module_paths" in env_config and isinstance(env_config.module_paths, dict):
|
|
env_config.module_paths = list(env_config.module_paths.values())
|
|
|
|
config = merge_dicts(config, env_config)
|
|
logger.info("Reading config from env vars")
|
|
else:
|
|
pass
|
|
# ensure dimension is integer
|
|
if isinstance(config.server.dimension, str):
|
|
config.server.dimension = int(config.server.dimension)
|
|
|
|
if platform.system() == "Windows":
|
|
os.system(f"title {config.character}.{config.server.dimension:d}")
|
|
|
|
# paths to search for instances: core + module_paths
|
|
paths = ["core"]
|
|
paths.extend(config.module_paths)
|
|
# load instances
|
|
logger.debug("Loading instances")
|
|
Registry.load_instances(paths)
|
|
Registry.inject_all(paths)
|
|
|
|
# configure database
|
|
db = Registry.get_instance("db")
|
|
if config.database.type == "mariadb":
|
|
if config.database.port in [0, ""]:
|
|
config.database.port = 3306
|
|
db.connect_mariadb(config.database.host, config.database.port, config.database.username,
|
|
config.database.password,
|
|
config.database.name)
|
|
if hasattr(config, "shared_db"):
|
|
if config.shared_db.port in [0, ""]:
|
|
config.shared_db.port = 3306
|
|
db.shared = DB()
|
|
db.shared.connect_mariadb(config.shared_db.host, config.shared_db.port, config.shared_db.username,
|
|
config.shared_db.password, config.shared_db.name)
|
|
else:
|
|
db.shared = db
|
|
else:
|
|
raise Exception(f"Unknown database type '{config.database.type}'")
|
|
|
|
# run db upgrade scripts
|
|
run_upgrades()
|
|
|
|
# finish initializing bot and modules, and then connect
|
|
bot = Registry.get_instance("bot")
|
|
bot.init(config, Registry, MMDBParser("text.mdb"))
|
|
|
|
if not bot.connect(config):
|
|
bot.disconnect()
|
|
time.sleep(5)
|
|
exit(3)
|
|
else:
|
|
status = bot.run()
|
|
bot.disconnect()
|
|
exit(status.value)
|
|
|
|
except KeyboardInterrupt:
|
|
# noinspection PyUnboundLocalVariable
|
|
if bot:
|
|
# noinspection PyUnboundLocalVariable
|
|
bot.status = BotStatus.SHUTDOWN
|
|
# exit(0)
|
|
except Exception as e:
|
|
logger = Logger("bootstrap")
|
|
logger.error("", e)
|
|
exit(4)
|