Example #1
0
def show_top(update: Update, context: CallbackContext):
    default_words = _db.find_all()

    try:
        words = _eval_filter(default_words, _get_pred(context))
    except (ValueError, TypeError) as err:
        logger.exception(err)
        words = default_words

    top = "\n".join(
        [f"{w['word']}: {w['count']}" for w in words[:DEFAULT_TOP_LIMIT]])
    result = context.bot.send_message(
        chat_id=update.effective_chat.id,
        text=f"```\n{top}\n```",
        disable_notification=True,
        parse_mode=telegram.ParseMode.MARKDOWN,
    )

    cleanup_queue_update(
        context.job_queue,
        update.message,
        result,
        600,
        remove_cmd=True,
        remove_reply=False,
    )
Example #2
0
def _longest(update: Update, context: CallbackContext):
    message = "🍆 🔝🔟 best known lengths 🍆: \n\n"

    n = 1

    for col in _db.get_best_n(10):
        username = _get_username(col)
        message += f"{n} → {username}\n"

        n += 1

    result: Optional[Message] = context.bot.send_message(
        update.effective_chat.id,
        message,
        disable_notification=True,
    )

    cleanup_queue_update(
        context.job_queue,
        update.message,
        result,
        120,
        remove_cmd=True,
        remove_reply=False,
    )
Example #3
0
def show_active_hussars(update: Update, context: CallbackContext):
    hussars = _db.find_all()

    message = "No hussars in da club 😒"

    restricted_hussars = []

    for hussar in hussars:
        chat_member = context.bot.get_chat_member(
            update.effective_chat.id, hussar.get("_id")
        )

        if chat_member.status == ChatMember.RESTRICTED:
            restricted_hussars.append(hussar)

    if len(restricted_hussars) > 0:
        message = "Right meow in da club ☠️:\n"

        for hussar in restricted_hussars:
            message += f"{choice(HONORED_HUSSARS_EMOJIS)} {_get_username(hussar)} \n"

    result = context.bot.send_message(update.effective_chat.id, message)

    cleanup_queue_update(
        context.job_queue,
        update.message,
        result,
        120,
        remove_cmd=True,
        remove_reply=False,
    )
Example #4
0
def coc(update: Update, context: CallbackContext):
    result = context.bot.send_message(update.effective_chat.id,
                                      f"Please behave! {COC_LINK}")
    cleanup_queue_update(
        context.job_queue,
        update.message,
        result,
        600,
        remove_cmd=True,
        remove_reply=False,
    )
Example #5
0
def wipe_hussars(update: Update, context: CallbackContext):
    _db.remove_all()
    logger.info("all hussars was removed from DB")
    result = update.message.reply_text("👍", disable_notification=True)

    cleanup_queue_update(
        context.job_queue,
        update.message,
        result,
        120,
        remove_cmd=True,
        remove_reply=False,
    )
Example #6
0
def ban(update: Union[str, Update], context: CallbackContext):
    user: User = update.message.reply_to_message.from_user
    chat_id = update.effective_chat.id

    if user and chat_id:
        result = context.bot.send_message(
            chat_id, f"Пользователь {user.name} был забанен")
        cleanup_queue_update(
            context.job_queue,
            update.message,
            result,
            600,
            remove_cmd=True,
            remove_reply=False,
        )
Example #7
0
def infect_admin(update: Update, context: CallbackContext):
    infect_user: User = update.message.reply_to_message.from_user
    _db.add(infect_user)
    _db.infect(infect_user.id)
    result = update.message.reply_text(
        f"{update.effective_user.full_name} опрокинул колбу с коронавирусом на {infect_user.full_name}"
    )
    cleanup_queue_update(
        context.job_queue,
        update.message,
        result,
        600,
        remove_cmd=True,
        remove_reply=False,
    )
Example #8
0
def satisfy_GDPR(update: Update, context: CallbackContext):
    user: User = update.effective_user

    _db.remove(user.id)
    logger.info("%s was removed from DB", user.full_name)
    result = update.message.reply_text("ok, boomer 😒", disable_notification=True)

    cleanup_queue_update(
        context.job_queue,
        update.message,
        result,
        120,
        remove_cmd=True,
        remove_reply=False,
    )
Example #9
0
def roll(update: Update, context: CallbackContext):
    if update.message is None:
        return

    user: User = update.effective_user
    result: Optional[Message] = None
    # check if hussar already exist or create new one
    existing_user = _db.find(user_id=user.id)
    if existing_user is None:
        _db.add(user=user)

    is_shot, shots_remained = _shot(context)
    shot_result = "he is dead!" if is_shot else "miss!"
    logger.info(
        "user: %s[%s] is rolling and... %s", user.full_name, user.id, shot_result
    )

    if is_shot:
        # todo: https://github.com/vldc-hq/vldc-bot/issues/93
        #  if bot can't restrict user, user should be passed into towel-mode like state

        mute_min = get_mute_minutes(shots_remained)
        result = context.bot.send_message(
            update.effective_chat.id,
            f"💥 boom! {user.full_name} 😵 [{mute_min // 60}h mute]",
        )

        mute_user_for_time(update, context, user, timedelta(minutes=mute_min))
        _db.dead(user.id, mute_min)
    else:

        # lucky one
        _db.miss(user.id)

        result = context.bot.send_message(
            update.effective_chat.id,
            f"{user.full_name}: {get_miss_string(shots_remained)}",
        )

    cleanup_queue_update(
        context.job_queue,
        update.message,
        result,
        120,
        remove_cmd=True,
        remove_reply=False,
    )
Example #10
0
def random_cough(bot: Bot, queue: JobQueue):
    users = _db.find_all()

    message = ""

    for user in users:
        # todo: move "_get_username" to commons
        full_name = _get_username(user)

        if random() <= RANDOM_COUGH_UNINFECTED_CHANCE:
            message += f"{full_name} чихнул в пространство \n"

    if message:
        result = bot.send_message(get_group_chat_id(), message)
        cleanup_queue_update(
            queue, None, result, 30, remove_cmd=True, remove_reply=False
        )
Example #11
0
def kozula(update: Update, context: CallbackContext):
    usd_rate = _get_usd_rate()
    kozula_rates = [
        f"{KOZULA_RATE}₽",
        f"${round(KOZULA_RATE / usd_rate, 2)}" if usd_rate is not None else "",
    ]

    result = context.bot.send_message(
        update.effective_chat.id,
        f"Текущий курс Козули: {' | '.join(filter(bool, kozula_rates))}",
    )

    cleanup_queue_update(
        queue=context.job_queue,
        cmd=update.message,
        result=result,
        seconds=300,
        remove_reply=True,
    )
Example #12
0
def mute_self(update: Update, context: CallbackContext):
    user: User = update.effective_user
    mute_user_for_time(update, context, user, timedelta(days=1))
    self_mute_messages = [
        f"Да как эта штука работает вообще, {user.name}?",
        f"Не озоруй, {user.name}, мало ли кто увидит",
        f"Зловив {user.name} на вила!",
        f"Насилие порождает насилие, {user.name}",
        f"Опять ты, {user.name}!",
    ]
    result = update.message.reply_text(choice(self_mute_messages))

    cleanup_queue_update(
        context.job_queue,
        update.message,
        result,
        600,
        remove_cmd=True,
        remove_reply=False,
    )
Example #13
0
def _length(update: Update, context: CallbackContext):
    user: User = update.effective_user

    result: Optional[Message] = None

    if update.effective_message is not None:
        result = update.effective_message.reply_text(
            f"Your telegram id length is {len(str(user.id))} 🍆 ({str(user.id)})"
        )

    _db.add(user)

    cleanup_queue_update(
        context.job_queue,
        update.message,
        result,
        120,
        remove_cmd=True,
        remove_reply=False,
    )
Example #14
0
def _version(update: Update, context: CallbackContext):
    """Show a current version of bot"""

    version = _get_version_from_pipfile()

    logger.info("current ver.: %s", version)

    chat_id = update.effective_chat.id

    result = context.bot.send_message(
        chat_id,
        f"~=~~=~=~=_ver.:{version}_~=~=~=[,,_,,]:3\n\n"
        f"{_get_skills_hints(skills)}",
    )

    cleanup_queue_update(
        context.job_queue,
        update.message,
        result,
        120,
    )
Example #15
0
def cough(update: Update, context: CallbackContext):
    user: User = update.effective_user

    if update.message.reply_to_message is None:
        result = update.message.reply_text(f"{user.full_name} чихнул в пространство")
        cleanup_queue_update(
            context.job_queue,
            update.message,
            result,
            600,
            remove_cmd=True,
            remove_reply=False,
        )
        return

    reply_user: User = update.message.reply_to_message.from_user

    result = update.message.reply_text(
        f"{user.full_name} чихнул на {reply_user.full_name}"
    )
    cleanup_queue_update(
        context.job_queue,
        update.message,
        result,
        600,
        remove_cmd=True,
        remove_reply=False,
    )

    if _db.is_user_infected(user.id):
        infect_user_masked_condition(
            reply_user,
            COUGH_INFECTION_CHANCE_MASKED,
            COUGH_INFECTION_CHANCE_UNMASKED,
            context,
        )
Example #16
0
def show_hussars(update: Update, context: CallbackContext):
    """Show leader board, I believe it should looks like smth like:

                           Hussars leader board
    ====================================================
       time in club    | attempts | deaths |      hussar
    ------------------ + -------- + ------ + -----------
    2 days, 15:59:54   | 6        | 6      | egregors
    15:59:59           | 1        | 1      | getjump
    ----------------------------------------------------

    """
    # CSS is awesome!
    # todo:
    #  need to find out how to show board for mobile telegram as well
    board = (
        f"{'Hussars leader board'.center(52)}\n"
        f"{''.rjust(51, '=')}\n"
        f"{'time in club'.center(18)} "
        f"| {'attempts'.center(8)} "
        f"| {'deaths'.center(6)} "
        f"| {'hussar'.center(11)} "
        f"\n"
        f"{''.ljust(18, '-')} + {''.ljust(8, '-')} + {''.ljust(6, '-')} + {''.ljust(11, '-')}\n"
    )

    hussars = _db.find_all()
    hussars_length = len(hussars)

    for hussar in hussars:
        username = _get_username(hussar)
        board += (
            f"{str(timedelta(seconds=(hussar['total_time_in_club']))).ljust(18)} "
            f"| {str(hussar['shot_counter']).ljust(8)} "
            f"| {str(hussar['dead_counter']).ljust(6)} "
            f"| {username.ljust(15)}\n"
        )

    board += f"{''.rjust(51, '-')}"
    try:
        board_image, board_image_path = from_text_to_image(board, hussars_length)
    except (ValueError, RuntimeError, OSError) as ex:
        logger.error("Cannot get image from text, hussars error: %s", ex)
        return

    result: Optional[Message] = None

    if hussars_length <= HUSSARS_LIMIT_FOR_IMAGE:
        result = context.bot.send_photo(
            chat_id=update.effective_chat.id,
            photo=board_image,
            disable_notification=True,
        )
    else:
        result = context.bot.send_document(
            chat_id=update.effective_chat.id,
            document=board_image,
            disable_notification=True,
        )

    cleanup_queue_update(
        context.job_queue,
        update.message,
        result,
        600,
        remove_cmd=True,
        remove_reply=False,
    )

    os.remove(board_image_path)