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
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!")
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:')
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
# 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(','),
def test_simple(self): bot = Bot( Config(api='http://127.0.0.1:8000', users=5, posts=3, likes=2)) bot.run()
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]
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)
# 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):
# 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):
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):
def bot_message(bot, message): mp = MessageParser(Config()) channel_id = "#bdd" bot.send_message(mp.with_message(message).uid_to_tag().parse(), channel_id)
def setup(self): self.faux_config_path = "/opt/grimbot/.env" self.config = Config()
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()
# 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):
# 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:
# 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):
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))
# 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):
# 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):