コード例 #1
0
ファイル: chgk_bot.py プロジェクト: eignatenkov/chgk_bot
    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')
コード例 #2
0
    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')
コード例 #3
0
ファイル: chgk_bot.py プロジェクト: eignatenkov/chgk_bot
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("Выходим из тестового запуска, ничего не сохраняя")
コード例 #4
0
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("Выходим из тестового запуска, ничего не сохраняя")