def update_tour_db(bot): """ Регулярное обновление списка турниров :param bot: фиктивный параметр для того, чтобы можно было использовать очередь пакета telegram :return: """ d = datetime.today() if d.timetuple()[3] > 5: job_queue.put(update_tour_db, 60*60*(25-d.timetuple()[3]), repeat=False) logger.info("рано обновлять базу турниров, ставим в ожидание") else: job_queue.put(update_tour_db, 60*60*24, repeat=False) logger.info("Начинаем обновлять базу турниров") global tour_db tour_db = export_tournaments() logger.info("База турниров успешно обновлена") with open('tour_db.json', 'w') as f: json.dump(tour_db, f) s3_tour_db.upload_file('tour_db.json')
def update_tour_db(bot): """ Регулярное обновление списка турниров :param bot: фиктивный параметр для того, чтобы можно было использовать очередь пакета telegram :return: """ d = datetime.today() if d.timetuple()[3] > 5: job_queue.put(update_tour_db, 60 * 60 * (25 - d.timetuple()[3]), repeat=False) logger.info("рано обновлять базу турниров, ставим в ожидание") else: job_queue.put(update_tour_db, 60 * 60 * 24, repeat=False) logger.info("Начинаем обновлять базу турниров") global tour_db tour_db = export_tournaments() logger.info("База турниров успешно обновлена") with open('tour_db.json', 'w') as f: json.dump(tour_db, f) s3_tour_db.upload_file('tour_db.json')
def main(): """ считывание состояния игр, запуск бота :return: """ global job_queue, tour_db, s3_resource parser = argparse.ArgumentParser() parser.add_argument('-test', action='store_true') args = parser.parse_args() if args.test: token = os.environ['TEST_TOKEN'] else: token = os.environ['TOKEN'] s3_key = os.environ['AWS_ACCESS_KEY_ID'] s3_secret = os.environ['AWS_SECRET_ACCESS_KEY'] updater = Updater(token, workers=100) job_queue = updater.job_queue s3_resource = boto3.Session(aws_access_key_id=s3_key, aws_secret_access_key=s3_secret).resource('s3') s3_tour_db = s3_resource.Object('chgk-bot', 'tour_db.json') s3_chgk_db = s3_resource.Object('chgk-bot', 'chgk_db.json') logger.info('Загружаем базу турниров') try: # with open('tour_db.json') as f: tour_db = json.loads(s3_tour_db.get()['Body'].read().decode('utf-8')) logger.info('База турниров загружена из s3') except ClientError: logger.warn('В s3 пусто, выгружаем турниры из базы') tour_db = export_tournaments() logger.info('Турниры выгружены из базы') with open('tour_db.json', 'w') as f: json.dump(tour_db, f) s3_tour_db.upload_file('tour_db.json') logger.info('Турниры загружены в s3') logger.info('Загружаем состояния игр из s3') try: game_state = json.loads(s3_chgk_db.get()['Body'].read().decode('utf-8')) for chat_id, game in game_state.items(): all_games[int(chat_id)] = Game(**game) logger.info('Состояния игр успешно загружены') except ClientError: logger.info('Состояния игр не найдены, играем с нуля') def update_tour_db(bot): """ Регулярное обновление списка турниров :param bot: фиктивный параметр для того, чтобы можно было использовать очередь пакета telegram :return: """ d = datetime.today() if d.timetuple()[3] > 5: job_queue.put(update_tour_db, 60*60*(25-d.timetuple()[3]), repeat=False) logger.info("рано обновлять базу турниров, ставим в ожидание") else: job_queue.put(update_tour_db, 60*60*24, repeat=False) logger.info("Начинаем обновлять базу турниров") global tour_db tour_db = export_tournaments() logger.info("База турниров успешно обновлена") with open('tour_db.json', 'w') as f: json.dump(tour_db, f) s3_tour_db.upload_file('tour_db.json') update_tour_db(updater.bot) logger.info('Поехали') # Get the dispatcher to register handlers dp = updater.dispatcher dp.add_handler(CommandHandler("start", start)) dp.add_handler(CommandHandler("help", bot_help)) dp.add_handler(CommandHandler("recent", recent)) dp.add_handler(CommandHandler("more", more)) dp.add_handler(CommandHandler("play", play, pass_args=True)) dp.add_handler(CommandHandler("ask", ask, pass_args=True)) dp.add_handler(CommandHandler("answer", answer)) dp.add_handler(CommandHandler("next_tour", next_tour)) dp.add_handler(CommandHandler("search", search, pass_args=True)) dp.add_handler(CommandHandler("broadcast", broadcast)) # rating interface, just for fun dp.add_handler(CommandHandler("results", current_results)) dp.add_handler(MessageHandler([Filters.command], unknown_command)) dp.add_handler(MessageHandler([], any_message)) dp.add_error_handler(bot_error) # Start the Bot updater.start_polling() updater.idle() # Dump current state when receive SIGTERM or SIGINT if not args.test: state = {} for key, value in all_games.items(): state[key] = value.export() logger.info("Сохраняем состояние игр в s3") with open('chgk_db.json', 'w') as chgk_db: json.dump(state, chgk_db) s3_resource.Bucket('chgk-bot').upload_file('chgk_db.json', 'chgk_db.json') else: logger.info("Выходим из тестового запуска, ничего не сохраняя")
def main(): """ считывание состояния игр, запуск бота :return: """ global job_queue, tour_db, s3_resource parser = argparse.ArgumentParser() parser.add_argument('-test', action='store_true') args = parser.parse_args() if args.test: logger.info('Запускаем отладочного бота') token = os.environ['TEST_TOKEN'] else: token = os.environ['TOKEN'] s3_key = os.environ['AWS_ACCESS_KEY_ID'] s3_secret = os.environ['AWS_SECRET_ACCESS_KEY'] updater = Updater(token, workers=100) job_queue = updater.job_queue s3_resource = boto3.Session(aws_access_key_id=s3_key, aws_secret_access_key=s3_secret).resource('s3') s3_tour_db = s3_resource.Object('chgk-bot', 'tour_db.json') s3_chgk_db = s3_resource.Object('chgk-bot', 'chgk_db.json') logger.info('Загружаем базу турниров') try: # with open('tour_db.json') as f: tour_db = json.loads(s3_tour_db.get()['Body'].read().decode('utf-8')) logger.info('База турниров загружена из s3') except ClientError: logger.warn('В s3 пусто, выгружаем турниры из базы') tour_db = export_tournaments() logger.info('Турниры выгружены из базы') with open('tour_db.json', 'w') as f: json.dump(tour_db, f) s3_tour_db.upload_file('tour_db.json') logger.info('Турниры загружены в s3') logger.info('Загружаем состояния игр из s3') flag = s3_resource.Object('chgk-bot', 'flag') def is_flag(): try: flag.load() except ClientError as e: if e.response['Error']['Code'] == "404": exists = False else: raise e else: exists = True return exists try: if not args.test: if is_flag(): logger.info('Бот уже запущен, ждем закрытия') sleep(10) if is_flag(): logger.info('Что-то пошло не так, удаляем флаг руками') flag.delete() logger.info('Ставим флаг') with open("flag", 'w') as f: json.dump({'flag': 1}, f) flag.upload_file("flag") logger.info('Флаг поставлен') logger.info('Загружаем состояния игр') game_state = json.loads( s3_chgk_db.get()['Body'].read().decode('utf-8')) for chat_id, game in game_state.items(): all_games[int(chat_id)] = Game(**game) logger.info('Состояния игр успешно загружены') except ClientError: logger.info('Состояния игр не найдены, играем с нуля') def update_tour_db(bot): """ Регулярное обновление списка турниров :param bot: фиктивный параметр для того, чтобы можно было использовать очередь пакета telegram :return: """ d = datetime.today() if d.timetuple()[3] > 5: job_queue.put(update_tour_db, 60 * 60 * (25 - d.timetuple()[3]), repeat=False) logger.info("рано обновлять базу турниров, ставим в ожидание") else: job_queue.put(update_tour_db, 60 * 60 * 24, repeat=False) logger.info("Начинаем обновлять базу турниров") global tour_db tour_db = export_tournaments() logger.info("База турниров успешно обновлена") with open('tour_db.json', 'w') as f: json.dump(tour_db, f) s3_tour_db.upload_file('tour_db.json') update_tour_db(updater.bot) logger.info('Поехали') # Get the dispatcher to register handlers dp = updater.dispatcher dp.add_handler(CommandHandler("start", start)) dp.add_handler(CommandHandler("help", bot_help)) dp.add_handler(CommandHandler("recent", recent)) dp.add_handler(CommandHandler("more", more)) dp.add_handler(CommandHandler("play", play, pass_args=True)) dp.add_handler(CommandHandler("ask", ask, pass_args=True)) dp.add_handler(CommandHandler("answer", answer)) dp.add_handler(CommandHandler("next_tour", next_tour)) dp.add_handler(CommandHandler("search", search, pass_args=True)) dp.add_handler(CommandHandler("broadcast", broadcast)) dp.add_handler(CommandHandler("state", get_state)) # rating interface, just for fun dp.add_handler(CommandHandler("results", current_results)) dp.add_handler(MessageHandler([Filters.command], unknown_command)) dp.add_handler(MessageHandler([], any_message)) dp.add_error_handler(bot_error) # Start the Bot updater.start_polling() updater.idle() # Dump current state when receive SIGTERM or SIGINT if not args.test: state = {} for key, value in all_games.items(): state[key] = value.export() logger.info("Сохраняем состояние игр в s3") with open('chgk_db.json', 'w') as chgk_db: json.dump(state, chgk_db) s3_resource.Bucket('chgk-bot').upload_file('chgk_db.json', 'chgk_db.json') logger.info('Состояния игр сохранены') logger.info('снимаем флаг') flag.delete() logger.info('Флаг снят') else: logger.info("Выходим из тестового запуска, ничего не сохраняя")