Exemplo n.º 1
0
def send_to_all_chats(bot: telegram.Bot, key_name: str,
                      get_text: Callable[[int], str]) -> None:
    for chat in get_config_chats():
        chat_id = chat.chat_id
        chat_key = f'{CACHE_PREFIX}:{key_name}:{chat_id}'
        if cache.get(chat_key, False):
            continue
        dsp(send_html, bot, chat_id, get_text(chat_id))
        cache.set(chat_key, True, time=TWO_DAYS)
Exemplo n.º 2
0
def send_end(bot: telegram.Bot) -> None:
    """
    Отправка во все чаты подводящих итог сообщений
    """
    def _get_text(chat_id: int) -> str:
        stats_text = StatsHumanReporter(stats).get_text(chat_id)
        return f'Отгремело шампанское, отзвенели бубенцы. Замолили ли мы нашего двукратного дракона великого зеленокожесластного? Такс:\n\n{stats_text}'

    with StatsRedis() as stats:
        # отправка админу статы по всем чатам
        admin_key = f'{CACHE_PREFIX}:end:admin'
        if not cache.get(admin_key, False):
            text = StatsHumanReporter(stats).get_text(None)
            dsp(send_html, bot, CONFIG.get('debug_uid', None), text)
            cache.set(admin_key, True, time=TWO_DAYS)

        send_to_all_chats(bot, 'end', _get_text)
Exemplo n.º 3
0
def send_alert_if_full_moon(bot: telegram.Bot, chat_id: int) -> None:
    """
    Сегодня полнолуние? Оповещает чат.
    """
    # т.к. используется run_async, то мы можем одновременно вызвать этот метод.
    # но мы не хотим делать несколько одинаковых запросов к апи.
    # поэтому используем блокировку и сохраняем результат запроса в редис.
    logger.debug(f'full_moon_lock')
    with full_moon_lock:
        full_moon: Optional[bool] = cache.get('weather:full_moon', None)
        if full_moon is None:
            full_moon = full_moon_request()
            cache.set('weather:full_moon', full_moon,
                      time=6 * 60 * 60)  # 6 hours
    if full_moon:
        # отправляется через очередь
        dsp(_send_full_moon_alert, bot, chat_id)
Exemplo n.º 4
0
def send_list_replay(bot: telegram.Bot, chat_id: int, message_id: int, uids: Iterable[int]) -> None:
    """
    Бот отправляет в чат реплай, тегая участников музкружка.
    """
    formatted_chat_users = format_chat_users(chat_id, uids)
    first = True
    first_message_id = None
    # якобы телеграм не уведомляет если в сообщении больше 5 тегов
    # разбиваем на части
    for chunk in chunks(formatted_chat_users, 5):
        joined = ' '.join(chunk)
        # в первом сообщении указывается хештег и реплай идет к сообщению с музыкой
        if first:
            first = False
            first_msg = send_replay(bot, chat_id, message_id, f'#музкружок {joined}')
            first_message_id = first_msg.message_id
            continue
        # в последющих сообщениях тегаем первое
        dsp(send_replay, bot, chat_id, first_message_id, joined)
Exemplo n.º 5
0
    def on_poll_click(cls, bot: telegram.Bot, _: telegram.Update,
                      query: telegram.CallbackQuery, data) -> None:
        msg: ChannelMessage = cache.get(cls.__get_key(data['id']))
        if not msg:
            bot.answer_callback_query(query.id, 'Время голосования истекло')
            return

        uid = query.from_user.id
        telegram_message_id = query.message.message_id
        if msg.telegram_message_id != telegram_message_id:
            bot.answer_callback_query(query.id, 'Вы сюда как попали???')
            logger.warning(
                f'[{CACHE_PREFIX}] msg {telegram_message_id} access {uid}')
            return

        with cls.lock:
            poll = Poll(telegram_message_id)
            if data['value'] == cls.callback_like:
                voted = poll.like(uid)
                text = '👍'
            elif data['value'] == cls.callback_dislike:
                voted = poll.dislike(uid)
                text = '👎'
            else:
                bot.answer_callback_query(query.id, 'Вы сюда как попали???')
                logger.warning(
                    f'[{CACHE_PREFIX}] msg {telegram_message_id} access {uid}')
                return

        if not voted:
            bot.answer_callback_query(query.id, 'Только один раз')
            return
        likes, dislikes = poll.get_count()
        msg.likes = likes
        msg.dislikes = dislikes
        dsp(cls.__update_buttons_and_answer, bot, msg, query, text)
Exemplo n.º 6
0
def send_long(bot: telegram.Bot, chat_id: int, msg: str):
    for chunk in chunks(msg, 4096):
        dsp(bot.send_message, chat_id, chunk, parse_mode=ParseMode.HTML)
Exemplo n.º 7
0
def new_year(bot: telegram.Bot):
    if datetime.today().strftime("%m-%d") != '01-01':
        return
    for chat in get_config_chats():
        dsp(_send_new_year, bot, chat.chat_id)