2017-08-22 14:47:10 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import os
|
2017-08-22 15:43:48 +00:00
|
|
|
import json
|
|
|
|
import logging
|
2017-08-22 16:02:33 +00:00
|
|
|
from collections import OrderedDict
|
2017-08-22 14:47:10 +00:00
|
|
|
|
2017-08-22 15:43:48 +00:00
|
|
|
import irc3
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
|
|
|
|
MODULE = __name__
|
|
|
|
|
|
|
|
|
|
|
|
# TODO: ddg
|
|
|
|
class Bot(irc3.IrcBot):
|
|
|
|
DEV = 'BOT_DEV' in os.environ
|
|
|
|
REPO_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
CONFIG_DIR = REPO_DIR if DEV else os.path.dirname(REPO_DIR)
|
|
|
|
|
2017-08-22 16:02:33 +00:00
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
self.cfg_file = None
|
|
|
|
self.env_file = None
|
|
|
|
|
|
|
|
def load_config(self):
|
|
|
|
with open(self.cfg_file, 'r') as fp:
|
|
|
|
return json.load(fp, object_pairs_hook=OrderedDict)
|
|
|
|
|
|
|
|
def save_config(self, data):
|
|
|
|
with open(self.cfg_file, 'w') as fp:
|
|
|
|
json.dump(data, fp, indent=2)
|
|
|
|
|
2017-08-22 15:43:48 +00:00
|
|
|
@classmethod
|
|
|
|
def from_json(cls, cfg_file: str = 'config.json', env_file: str = '.env'):
|
|
|
|
cfg_file = os.path.join(cls.CONFIG_DIR, cfg_file)
|
|
|
|
env_file = os.path.join(cls.CONFIG_DIR, env_file)
|
|
|
|
|
2017-08-22 17:01:33 +00:00
|
|
|
load_dotenv(env_file)
|
2017-08-22 15:43:48 +00:00
|
|
|
|
|
|
|
with open(cfg_file, 'r') as fp:
|
|
|
|
conf = json.load(fp)
|
|
|
|
|
2017-08-22 16:10:58 +00:00
|
|
|
if cls.DEV:
|
|
|
|
conf['debug'] = True
|
|
|
|
|
2017-08-22 16:02:33 +00:00
|
|
|
bot = cls.from_config(conf)
|
|
|
|
bot.cfg_file = cfg_file
|
|
|
|
bot.env_file = env_file
|
|
|
|
return bot
|
2017-08-22 15:43:48 +00:00
|
|
|
|
|
|
|
|
|
|
|
@irc3.plugin
|
|
|
|
class BasePlugin:
|
|
|
|
requires = ['irc3.plugins.command']
|
|
|
|
|
|
|
|
def __init__(self, bot: Bot):
|
|
|
|
self.bot = bot
|
|
|
|
self.log = logging.getLogger('irc3.{}'.format(self.__class__.__name__.lower()))
|
|
|
|
|
|
|
|
|
|
|
|
class Plugin(BasePlugin):
|
|
|
|
@classmethod
|
|
|
|
def reload(cls, old: BasePlugin):
|
|
|
|
return cls(old.bot)
|
|
|
|
|
|
|
|
|
|
|
|
from .storage import Storage # noqa
|
|
|
|
|
|
|
|
|
|
|
|
class DatabasePlugin(Plugin):
|
|
|
|
requires = Plugin.requires + ['bot.storage']
|
|
|
|
|
|
|
|
def __init__(self, bot: Bot):
|
|
|
|
super().__init__(bot)
|
|
|
|
self.db = bot.get_plugin(Storage)
|
|
|
|
self.con = self.db.con
|
|
|
|
self.cur = self.db.cur
|