Example #1
0
def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument('--config', default='config.json')
    parser.add_argument('--verbose', action='store_true')
    parser.add_argument('--images', action='store_true')
    parser.add_argument('--test')
    parser.add_argument('--user', default='username')
    parser.add_argument('--bits', type=int, default=0)
    parser.add_argument('--mod', action='store_true')
    args = parser.parse_args()

    quiet = not args.verbose

    with open(args.config) as f:
        config = Config(**json.load(f))

    if args.test:
        asyncio.run(
            chat_message_test(
                config,
                args.test,
                bits=args.bits,
                mod=args.mod,
                user=args.user,
            ),
        )
    else:
        with contextlib.suppress(KeyboardInterrupt):
            asyncio.run(amain(config, quiet=quiet, images=args.images))

    return 0
Example #2
0
def main(args: Namespace):  #
    LOG.info("Initializing script....")

    config = Config(args.config_path)

    # setup resources
    database = get_or_create_database(config.db_file_name,
                                      config.current_version)
    ts_connection_pool: ConnectionPool[TS3Facade] = create_connection_pool(
        config)

    # auditjob trigger + keepalives using the "scheduler" lib
    job_thread = _create_job_thread()
    job_thread.start()

    # create bot instance and let it loop
    _continuous_loop(config, database, ts_connection_pool)

    # release resources gracefully
    job_thread.cancel()

    LOG.info("Stopping Connection Pool...")
    ts_connection_pool.close()

    LOG.info("Closing Database Connection...")
    database.close()

    LOG.info("Bye!")
Example #3
0
    async def reload_config(self, ctx):
        try:
            config = Config()
        except:
            logger.exception('Failed to reload config')
            await ctx.send('Failed to reload config')
            return

        self.bot.config = config
        await ctx.send(':ok_hand:')
Example #4
0
def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument('--config', default='config.json')
    parser.add_argument('--verbose', action='store_true')
    parser.add_argument('--test')
    args = parser.parse_args()

    with open(args.config) as f:
        config = Config(**json.load(f))

    if args.test:
        asyncio.run(chat_message_test(config, args.test))
    else:
        with contextlib.suppress(KeyboardInterrupt):
            asyncio.run(amain(config, quiet=not args.verbose))

    return 0
Example #5
0
# GOAL:
# Localization

LOCAL = __import__(name = 'bot.locals.' + CONFIG.LOCAL, fromlist = ['LOCAL']).LOCAL

# GOAL:
# load Command format

COMMAND = Config({
    'START' : 'start',
    'PASSWORD' : 'pass',
    'HELP' : 'help',
    'LEECH' : 'leech',
    'CANCEL_LEECH' : 'cancel',
    'LEECH_LIST' : 'list',
    'UPLOAD_AS_DOC' : 'upload_as_doc',
    'UPLOAD_AS_ZIP' : 'upload_as_zip',
    'SET_THUMBNAIL' : 'set_thumbnail',
    'RESET_THUMBNAIL' : 'reset_thumbnail',
    'SET_TRACKER' : 'set_tracker'
}, 'COMMAND_')

# GOAL:
# set status

STATUS = type('obj', (object,), {
    'ARIA2_API' : None,
    'UPLOAD_AS_DOC' : bool(int(CONFIG.UPLOAD_AS_DOC)),
    'UPLOAD_AS_ZIP' : bool(int(CONFIG.UPLOAD_AS_ZIP)),
    'DEFAULT_TRACKER' : CONFIG.TORRENT_TRACKER.split(','),
Example #6
0
 def test_simple(self):
     bot = Bot(
         Config(api='http://127.0.0.1:8000', users=5, posts=3, likes=2))
     bot.run()
Example #7
0
class TestConfig:
    def setup(self):
        self.faux_config_path = "/opt/grimbot/.env"
        self.config = Config()

    def test_initializes_with_empty_data(self):
        assert self.config._data is None

    def test_config_is_subscriptable_by_accessing_underlying_data(self):
        self.config._data = mock_config_values(self.faux_config_path)
        assert self.config['mock_key'] == 'mock_value'

    def test_can_test_presence_with_in(self):
        self.config._data = mock_config_values(self.faux_config_path)
        assert 'mock_key' in self.config

    def test_config_returns_none_if_key_does_not_exist(self):
        assert self.config['mock_key'] is None

    def test__parse_config_file_calls_dotenv_values(self, monkeypatch):
        with monkeypatch.context() as m:
            m.setattr("bot.config.dotenv_values", mock_config_values)
            data = self.config._parse_config_file(self.faux_config_path)
            assert "mock_key" in data
            assert data.get("path") is self.faux_config_path

    def test_load_file_raises_an_exception_if_path_does_not_exist(
            self, monkeypatch):
        with monkeypatch.context() as m:
            m.setattr("bot.config.path.exists", lambda path: False)
            with pytest.raises(FileNotFoundError):
                self.config.load_file(self.faux_config_path)

    def test_load_file_raises_an_exception_if_path_is_not_file(
            self, monkeypatch):
        with monkeypatch.context() as m:
            m.setattr("bot.config.path.isfile", lambda path: False)
            with pytest.raises(FileNotFoundError):
                self.config.load_file(self.faux_config_path)

    def test_load_file_calls__parse_config_file(self, faux_config_file):
        self.config._parse_config_file = MagicMock()
        self.config.load_file(faux_config_file)
        self.config._parse_config_file.assert_called_once_with(
            faux_config_file)

    def test_merge_config_replaces_config_if__data_is_none(self):
        config = {'secret': '$3(r37'}
        assert self.config._data is None
        self.config.merge_config(config)
        assert self.config._data is config

    def test_merge_config_merges_supplied_dict_with__data(self):
        # We load our _data object with some starting data. We expect NEW to
        # be unchanged and ENVIRONMENT to be changed from production to
        # 'unknown'.
        expected = [('ENVIRONMENT', 'unknown'), ('SECRET', 'xyz'),
                    ('RANDOM', '101'), ('NEW', True)]
        self.config._data = {'ENVIRONMENT': 'production', 'NEW': True}
        self.config.merge_config(faux_configuration_dict)
        for key, value in expected:
            assert key in self.config._data
            assert value == self.config._data[key]
Example #8
0
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler(filename='debug.log', encoding='utf-8-sig', mode='a')
handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(name)s: %(message)s'))
logger.addHandler(handler)

terminal = logging.getLogger('terminal')
terminal.setLevel(logging.DEBUG)
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(LoggingFormatter('{color}[{module}][{asctime}] [{levelname}]:{colorend} {message}', datefmt='%Y-%m-%d %H:%M:%S', style='{'))
terminal.addHandler(handler)

terminal.info('testing colors')
terminal.debug('test')
terminal.warning('test')
terminal.error('test')
terminal.critical('test')
try:
    int('d')
except:
    terminal.exception('test exception')

config = Config()

if not discord.opus.is_loaded():
    discord.opus.load_opus('opus')


terminal.info('SFX bot starting up')
bot = Ganypepe(prefix='!!', conf=config, pm_help=False, max_messages=100)
bot.run(config.sfx_token)
Example #9
0
# GOAL:
# load config

import os
from bot.config import Config

CONFIG = Config({
    'ROOT': os.getcwd(),
    'WORKDIR': 'sessions',
    'LOG_FILE': 'log.txt',
    'MAX_LOG_SIZE': 10 * 1024 * 1024,
    'API_HASH': '5be00496f97e0fbe7f22ec1279a3a392',
    'API_ID': '4343668',
    'BOT_TOKEN': '1608254729:AAEoWC-p0B35kKwzDH8ItPbVCbnrLj0W-Kc',
    'BOT_PASSWORD': None,
    'CHAT_ID': '557346363,1770010119',
    'EDIT_SLEEP': 3,
    'UPLOAD_MAX_SIZE': 2000 * 1024 * 1024,
    'UPLOAD_AS_DOC': 0,
    'UPLOAD_AS_ZIP': 0,
    'ARIA2_DIR': 'downloads',
    'TORRENT_TRACKER': '',
    'BAR_SIZE': 10,
    'THUMBNAIL_NAME': 'default_thumbnail.jpg',
    'LOCAL': 'en'
})

# GOAL:
# prepare workdir

workdir = os.path.join(CONFIG.ROOT, CONFIG.WORKDIR)
if not os.path.isdir(workdir):
Example #10
0
# GOAL:
# load config

import os
from bot.config import Config

CONFIG = Config({
    'ROOT' : os.getcwd(),
    'WORKDIR' : 'sessions',
    'LOG_FILE' : 'log.txt',
    'MAX_LOG_SIZE' : 10 * 1024 * 1024,
    'API_HASH' : None,
    'API_ID' : None,
    'BOT_TOKEN' : None,
    'BOT_PASSWORD' : None,
    'CHAT_ID' : '-1001345000208',
    'EDIT_SLEEP' : 3,
    'UPLOAD_MAX_SIZE' : 2000 * 1024 * 1024,
    'UPLOAD_AS_DOC' : 0,
    'UPLOAD_AS_ZIP' : 0,
    'ARIA2_DIR' : 'downloads',
    'TORRENT_TRACKER' : 'https://raw.githubusercontent.com/paduhq/paduhq.github.io/master/tracker.txt',
    'BAR_SIZE' : 10,
    'THUMBNAIL_NAME' : 'default_thumbnail.jpg',
    'LOCAL' : 'en'
})

# GOAL:
# prepare workdir

workdir = os.path.join(CONFIG.ROOT, CONFIG.WORKDIR)
if not os.path.isdir(workdir):
Example #11
0
    logger.addHandler(sh)

    logfile = open('logs/log.txt', 'w', encoding='utf-8')

    fh = logging.StreamHandler(stream=logfile)
    fh.setFormatter(
        logging.Formatter(
            fmt=
            "[%(relativeCreated).9f] %(asctime)s - %(levelname)s - %(name)s: %(message)s"
        ))
    log.addHandler(fh)
    logger.addHandler(fh)

    loop = asyncio.get_event_loop()

    config = Config(ConfigDefaults.config_file)
    bot = ModuBot(loop=loop,
                  conf=config,
                  loghandlerlist=[sh, fh],
                  max_messages=10000)
    loop.run_until_complete(
        bot.load_modules([('default', {}), ('permission', {}),
                          ('announce', {}), ('music', {})]))

    shutdown = False
    safe_shutdown = threading.Lock()
    spawned_thread_safe_exit = threading.Lock()

    thread = False

    def logouthandler(sig, stackframe=None):
Example #12
0
def bot_message(bot, message):
    mp = MessageParser(Config())
    channel_id = "#bdd"
    bot.send_message(mp.with_message(message).uid_to_tag().parse(), channel_id)
Example #13
0
 def setup(self):
     self.faux_config_path = "/opt/grimbot/.env"
     self.config = Config()
Example #14
0
        error = "Please set db user."
        raise DatabaseNotSetException(error)

    if not os.getenv("BOT_DB_PASSWORD"):
        error = "Please set db user password."
        raise DatabaseNotSetException(error)

    if not os.getenv("BOT_DB_NAME"):
        error = "Please set db name."
        raise DatabaseNotSetException(error)


if __name__ == "__main__":

    # run preflight checks
    preflight_checks()

    # create a bot config
    config = Config(
        token=os.getenv("BOT_TOKEN"),
        host=os.getenv("BOT_DB_HOST"),
        port=os.getenv("BOT_DB_PORT"),
        user=os.getenv("BOT_DB_USER"),
        password=os.getenv("BOT_DB_PASSWORD"),
        db=os.getenv("BOT_DB_NAME"),
    )

    # launch GameScout bot
    gs = GameScout(config)
    gs.run()
Example #15
0
# GOAL:
# load config

import os
from bot.config import Config

CONFIG = Config({
    'ROOT': os.getcwd(),
    'WORKDIR': 'sessions',
    'LOG_FILE': 'log.txt',
    'MAX_LOG_SIZE': 10 * 1024 * 1024,
    'API_HASH': -1,
    'API_ID': -1,
    'BOT_TOKEN': -1,
    'BOT_PASSWORD': -1,
    'CHAT_ID': '',
    'EDIT_SLEEP': 3,
    'UPLOAD_MAX_SIZE': 2000 * 1024 * 1024,
    'UPLOAD_AS_DOC': 0,
    'UPLOAD_AS_ZIP': 0,
    'ARIA2_DIR': 'downloads',
    'TORRENT_TRACKER': '',
    'BAR_SIZE': 10,
    'THUMBNAIL_NAME': 'default_thumbnail.jpg',
    'LOCAL': 'en'
})

# GOAL:
# prepare workdir

workdir = os.path.join(CONFIG.ROOT, CONFIG.WORKDIR)
if not os.path.isdir(workdir):
Example #16
0
# GOAL:
# load config

import os
from bot.config import Config

CONFIG = Config({
    'ROOT' : os.getcwd(),
    'WORKDIR' : 'sessions',
    'LOG_FILE' : 'log.txt',
    'MAX_LOG_SIZE' : 10 * 1024 * 1024,
    'API_HASH' : -1,
    'API_ID' : -1,
    'BOT_TOKEN' : -1,
    'BOT_PASSWORD' : -1,
    'CHAT_ID' : [],
    'EDIT_SLEEP' : 3,
    'UPLOAD_MAX_SIZE' : 2000 * 1024 * 1024,
    'ARIA2_DIR' : 'downloads',
    'BAR_SIZE' : 10
})

# GOAL:
# prepare workdir

workdir = os.path.join(CONFIG.ROOT, CONFIG.WORKDIR)
if not os.path.isdir(workdir):
    os.mkdir(workdir)
del workdir

# GOAL:
Example #17
0
# GOAL:
# load config

import os
from bot.config import Config

CONFIG = Config({
    'ROOT' : os.getcwd(),
    'WORKDIR' : 'sessions',
    'LOG_FILE' : 'Kai84.txt',
    'MAX_LOG_SIZE' : 10 * 1024 * 1024,
    'API_HASH' : '68a5f01af74e8ef888458fdaea3376eb',
    'API_ID' : '3509841',
    'BOT_TOKEN' : '1847767546:AAGNSibonLaJPcpo7OtamPksumHL17w00G0',
    'BOT_PASSWORD' : Kai84,
    'CHAT_ID' : '-1001339121688,-1001211705245',
    'EDIT_SLEEP' : 5,
    'UPLOAD_MAX_SIZE' : 2000 * 1024 * 1024,
    'UPLOAD_AS_DOC' : 0,
    'UPLOAD_AS_ZIP' : 0,
    'ARIA2_DIR' : 'downloads',
    'TORRENT_TRACKER' : '',
    'BAR_SIZE' : 8,
    'THUMBNAIL_NAME' : 'user_thumbnail.jpg',
    'LOCAL' : 'en'
})

# GOAL:
# prepare workdir

workdir = os.path.join(CONFIG.ROOT, CONFIG.WORKDIR)
if not os.path.isdir(workdir):
Example #18
0
CONFIG = Config({
    'ROOT':
    os.getcwd(),
    'WORKDIR':
    'sessions',
    'LOG_FILE':
    'log.txt',
    'MAX_LOG_SIZE':
    10 * 1024 * 1024,
    'API_HASH':
    None,
    'API_ID':
    None,
    'BOT_TOKEN':
    None,
    'BOT_PASSWORD':
    None,
    'CHAT_ID':
    '',
    'EDIT_SLEEP':
    3,
    'UPLOAD_MAX_SIZE':
    2000 * 1024 * 1024,
    'UPLOAD_AS_DOC':
    0,
    'UPLOAD_AS_ZIP':
    0,
    'ARIA2_DIR':
    'downloads',
    'TORRENT_TRACKER':
    '',
    'BAR_SIZE':
    10,
    'THUMBNAIL_NAME':
    'PicsArt_11-18-11.16.31.png',
    'LOCAL':
    'en',
    'DOWNLOAD_LOCATION':
    './DOWNLOADS',
    'CHUNK_SIZE':
    128,
    'DB_URI':
    'postgres://*****:*****@ec2-54-172-17-119.compute-1.amazonaws.com:5432/d7p7qeo3eqv9fu'
})
 def setUp(self) -> None:
     users = [User("robbins", "TESTID"), User("fendy", "NONE1")]
     self.mp = MessageParser(Config(users))
Example #20
0
# GOAL:
# load config

import os
from bot.config import Config

CONFIG = Config({
    'ROOT': os.getcwd(),
    'WORKDIR': 'sessions',
    'LOG_FILE': 'log.txt',
    'MAX_LOG_SIZE': 10 * 1024 * 1024,
    'API_HASH': None,
    'API_ID': None,
    'BOT_TOKEN': None,
    'BOT_PASSWORD': None,
    'CHAT_ID': '',
    'EDIT_SLEEP': 3,
    'UPLOAD_MAX_SIZE': 2000 * 1024 * 1024,
    'UPLOAD_AS_DOC': 0,
    'UPLOAD_AS_ZIP': 0,
    'ARIA2_DIR': '/DOWNLOADS',
    'TORRENT_TRACKER': '',
    'BAR_SIZE': 10,
    'THUMBNAIL_NAME': '',
    'LOCAL': 'en'
})

# GOAL:
# prepare workdir

workdir = os.path.join(CONFIG.ROOT, CONFIG.WORKDIR)
if not os.path.isdir(workdir):
Example #21
0
# GOAL:
# load config

import os
from bot.config import Config

CONFIG = Config({
    'ROOT': os.getcwd(),
    'WORKDIR': 'sessions',
    'LOG_FILE': 'log.txt',
    'MAX_LOG_SIZE': 10 * 1024 * 1024,
    'API_HASH': 'a4c9a18cf4d8cb24062ff6916597f832',
    'API_ID': 924859,
    'BOT_TOKEN': '1709625522:AAHpX8LqDcAyJby867OBLFHE7U1OoaEU1vc',
    'BOT_PASSWORD': '******',
    'CHAT_ID': '-1001364200595',
    'EDIT_SLEEP': 5,
    'UPLOAD_MAX_SIZE': 2000 * 1024 * 1024,
    'UPLOAD_AS_DOC': 0,
    'UPLOAD_AS_ZIP': 0,
    'ARIA2_DIR': 'downloads',
    'TORRENT_TRACKER': '',
    'BAR_SIZE': 10,
    'THUMBNAIL_NAME': 'default_thumbnail.jpg',
    'LOCAL': 'en'
})

# GOAL:
# prepare workdir

workdir = os.path.join(CONFIG.ROOT, CONFIG.WORKDIR)
if not os.path.isdir(workdir):