예제 #1
0
def replace_single(bot, update, session, chat, user):
    """Tag the last sticker send to this chat."""
    if chat.current_sticker:
        # Remove the /tag command
        text = update.message.text[4:]
        if text.strip() == '':
            return 'You need to add some tags to the /replace command. E.g. "/replace meme prequel obi wan"'

        is_single_sticker = chat.tag_mode not in [
            TagMode.STICKER_SET, TagMode.RANDOM
        ]
        tag_sticker(
            session,
            text,
            chat.current_sticker,
            user,
            tg_chat=update.message.chat,
            chat=chat,
            message_id=update.message.message_id,
            single_sticker=is_single_sticker,
            replace=True,
        )
        if not is_single_sticker:
            handle_next(session, bot, chat, update.message.chat, user)
        else:
            return 'Sticker tags replaced.'
예제 #2
0
def tag_random(bot, update, session, chat, user):
    """Initialize tagging of a whole set."""
    chat.cancel(bot)
    chat.tag_mode = TagMode.RANDOM
    handle_next(session, bot, chat, update.message.chat, user)

    return
예제 #3
0
def tag_random(bot, update, session, chat, user):
    """Initialize tagging of a whole set."""
    chat.cancel()
    chat.tagging_random_sticker = True
    handle_next(session, bot, chat, update.message.chat, user)

    return
예제 #4
0
def handle_private_text(bot, update, session, chat, user):
    """Read all messages and handle the tagging of stickers."""
    # Handle the name of a sticker set to initialize full sticker set tagging
    if chat.tag_mode in [TagMode.STICKER_SET, TagMode.RANDOM]:
        # Try to tag the sticker. Return early if it didn't work.
        tag_sticker(
            session,
            update.message.text,
            chat.current_sticker,
            user,
            tg_chat=update.message.chat,
            chat=chat,
            message_id=update.message.message_id,
        )

        session.commit()
        handle_next(session, bot, chat, update.message.chat, user)

    elif chat.tag_mode == TagMode.SINGLE_STICKER:
        tag_sticker(
            session,
            update.message.text,
            chat.current_sticker,
            user,
            tg_chat=update.message.chat,
            chat=chat,
            message_id=update.message.message_id,
        )

        chat.cancel(bot)
        return "Sticker tags adjusted."
예제 #5
0
def tag_random(session, context):
    """Initialize tagging of a whole set."""
    chat = context.chat
    chat.cancel(context.bot)
    chat.tag_mode = TagMode.RANDOM
    handle_next(session, context.bot, chat, context.query.message.chat, context.user)

    return
예제 #6
0
def skip(bot, update, session, chat, user):
    """Initialize tagging of a whole set."""
    if chat.tag_mode in [TagMode.STICKER_SET, TagMode.RANDOM]:
        handle_next(session, bot, chat, update.message.chat, user)

        return

    return "Currently not tagging a set or some random stickers"
예제 #7
0
def handle_tag_next(session, bot, user, query, chat, tg_chat):
    """Send the next sticker for tagging."""
    current_sticker = chat.current_sticker
    handle_next(session, bot, chat, tg_chat, user)
    if chat.current_sticker is not None:
        keyboard = get_fix_sticker_tags_keyboard(current_sticker.file_id)
        call_tg_func(query.message, 'edit_reply_markup', [],
                     {'reply_markup': keyboard})
예제 #8
0
def skip(bot, update, session, chat, user):
    """Initialize tagging of a whole set."""
    if chat.tagging_random_sticker or chat.full_sticker_set:
        handle_next(session, bot, chat, update.message.chat, user)

        return

    return "Currently not tagging a set or some random stickers"
예제 #9
0
def handle_tag_next(session, context):
    """Send the next sticker for tagging."""
    chat = context.chat
    current_sticker = chat.current_sticker
    handle_next(session, context.bot, chat, context.tg_chat, context.user)
    if chat.current_sticker is not None:
        keyboard = get_fix_sticker_tags_keyboard(current_sticker.file_id)
        call_tg_func(context.query.message, "edit_reply_markup", [],
                     {"reply_markup": keyboard})
예제 #10
0
def replace_single(bot, update, session, chat, user):
    """Tag the last sticker send to this chat."""
    # The replace command has been replied to another message
    # If it's a sticker, replace the tags of this specific sticker
    if update.message.reply_to_message is not None and \
            update.message.reply_to_message.sticker is not None:
        tg_sticker = update.message.reply_to_message.sticker
        sticker = session.query(Sticker).get(tg_sticker.file_id)
        if sticker is None:
            return 'This sticker has not yet been added.'
        is_single_sticker = True

    # The replace command has been normally called
    elif chat.current_sticker:
        sticker = chat.current_sticker
        is_single_sticker = chat.tag_mode not in [
            TagMode.STICKER_SET, TagMode.RANDOM
        ]
    else:
        return 'No sticker for replacement selected'

    # Remove the /replace command
    text = update.message.text[8:]
    if text.strip() == '':
        return 'You need to add some tags to the /replace command. E.g. "/replace meme prequel obi wan"'

    tag_sticker(
        session,
        text,
        sticker,
        user,
        tg_chat=update.message.chat,
        chat=chat,
        message_id=update.message.message_id,
        single_sticker=is_single_sticker,
        replace=True,
    )
    if not is_single_sticker:
        handle_next(session, bot, chat, update.message.chat, user)
    else:
        return 'Sticker tags replaced.'
예제 #11
0
def handle_callback_query(bot, update, session, user):
    """Handle callback queries from inline keyboards."""
    query = update.callback_query
    data = query.data

    # Extract the callback type, task id
    [callback_type, payload, action] = data.split(':')
    callback_type = int(callback_type)
    action = int(action)

    chat = session.query(Chat).get(query.message.chat.id)
    tg_chat = query.message.chat

    # Handle task vote ban callbacks
    if CallbackType(callback_type).name == 'task_vote_ban':
        task = session.query(Task).get(payload)
        if CallbackResult(action).name == 'ban':
            task.sticker_set.banned = True
            call_tg_func(query, 'answer', ['Set banned'])
        else:
            task.sticker_set.banned = False
            call_tg_func(query, 'answer', ['Set unbanned'])

        if not task.reviewed:
            task.reviewed = True
            process_task(session, tg_chat, chat)

    # Handle task vote ban callbacks
    if CallbackType(callback_type).name == 'task_vote_nsfw':
        task = session.query(Task).get(payload)
        if CallbackResult(action).name == 'ban':
            task.sticker_set.nsfw = True
            call_tg_func(query, 'answer', ['Set tagged as nsfw'])
        else:
            task.sticker_set.nsfw = False
            call_tg_func(query, 'answer', ['Set no longer tagged as nsfw'])

        if not task.reviewed:
            task.reviewed = True
            process_task(session, tg_chat, chat)

    # Handle task user ban callbacks
    elif CallbackType(callback_type).name == 'check_user_tags':
        task = session.query(Task).get(payload)
        # Ban the user
        if CallbackResult(action).name == 'ban':
            task.user.banned = True
            call_tg_func(query, 'answer', ['User banned'])
            message = f'Your tagging activity seemed malicious. You have been banned.'
            call_tg_func(bot, 'send_message', [task.user.id, message],
                         {'reply_markup': main_keyboard})
        elif CallbackResult(action).name == 'unban':
            task.user.banned = False
            call_tg_func(query, 'answer', ['User ban reverted'])
            message = f'Your ban has been lifted.'
            call_tg_func(bot, 'send_message', [task.user.id, message],
                         {'reply_markup': main_keyboard})

        # Revert user changes
        elif CallbackResult(action).name == 'revert':
            task.reverted = True
            revert_user_changes(session, task.user)
            message = f'Your tagging activity seemed malicious. All of your tags have been reverted.'
            call_tg_func(bot, 'send_message', [task.user.id, message],
                         {'reply_markup': main_keyboard})
            call_tg_func(query, 'answer', ['All user changes reverted'])
        elif CallbackResult(action).name == 'undo_revert':
            task.reverted = False
            undo_user_changes_revert(session, task.user)
            message = f'All of your tags have been restored.'
            call_tg_func(bot, 'send_message', [task.user.id, message],
                         {'reply_markup': main_keyboard})
            call_tg_func(query, 'answer', ['User changes revert undone'])

        # Change the language of all changes of this task.
        elif CallbackResult(action).name == 'change_language':
            is_default_language = task.is_default_language
            change_language_of_task_changes(session, task)
            call_tg_func(query, 'answer', ['Language changed'])

            first = 'international' if is_default_language else 'english'
            second = 'english' if is_default_language else 'international'
            command = '/international' if is_default_language else '/english'
            message = f'It appears you have recently tagged stickers in {first}, while being in "{second}" mode. '
            message += f'Please use {command} beforehand next time. The tags have been corrected.'
            call_tg_func(bot, 'send_message', [task.user.id, message],
                         {'reply_markup': main_keyboard})

        elif CallbackResult(action).name == 'ok':
            if not task.reviewed:
                task.reviewed = True
                process_task(session, tg_chat, chat)

        keyboard = check_user_tags_keyboard(task)
        call_tg_func(query.message, 'edit_reply_markup', [],
                     {'reply_markup': keyboard})

    # Handle the "Ban this set" button
    elif CallbackType(callback_type).name == 'ban_set':
        sticker_set = session.query(StickerSet).get(payload.lower())
        if CallbackResult(action).name == 'ban':
            sticker_set.banned = True
        elif CallbackResult(action).name == 'ok':
            sticker_set.banned = False

        keyboard = get_nsfw_ban_keyboard(sticker_set)
        call_tg_func(query.message, 'edit_reply_markup', [],
                     {'reply_markup': keyboard})

    # Handle the "tag as nsfw" button
    elif CallbackType(callback_type).name == 'nsfw_set':
        sticker_set = session.query(StickerSet).get(payload.lower())
        if CallbackResult(action).name == 'ban':
            sticker_set.nsfw = True
        elif CallbackResult(action).name == 'ok':
            sticker_set.nsfw = False

        keyboard = get_nsfw_ban_keyboard(sticker_set)
        call_tg_func(query.message, 'edit_reply_markup', [],
                     {'reply_markup': keyboard})

    # Handle the "tag as furry" button
    elif CallbackType(callback_type).name == 'fur_set':
        sticker_set = session.query(StickerSet).get(payload.lower())
        if CallbackResult(action).name == 'ok':
            sticker_set.furry = False
        elif CallbackResult(action).name == 'ban':
            sticker_set.furry = True

        keyboard = get_nsfw_ban_keyboard(sticker_set)
        call_tg_func(query.message, 'edit_reply_markup', [],
                     {'reply_markup': keyboard})

    # Change sticker set language
    elif CallbackType(callback_type).name == 'change_set_language':
        sticker_set = session.query(StickerSet).get(payload.lower())
        if CallbackResult(action).name == 'international':
            sticker_set.is_default_language = False
        elif CallbackResult(action).name == 'default':
            sticker_set.is_default_language = True

        keyboard = get_nsfw_ban_keyboard(sticker_set)
        call_tg_func(query.message, 'edit_reply_markup', [],
                     {'reply_markup': keyboard})

    # Handle the "next" button in the newsfeed chat
    elif CallbackType(callback_type).name == 'newsfeed_next_set':
        sticker_set = session.query(StickerSet).get(payload.lower())
        task = session.query(Task) \
            .filter(Task.type == Task.SCAN_SET) \
            .filter(Task.sticker_set == sticker_set) \
            .one()

        task.reviewed = True
        sticker_set.reviewed = True

        try:
            task_chat = task.processing_chat[0]
            distribute_newsfeed_tasks(bot, session, [task_chat])
            keyboard = get_nsfw_ban_keyboard(sticker_set)
            call_tg_func(query.message, 'edit_reply_markup', [],
                         {'reply_markup': keyboard})
        except:  # noqa
            return

        session.commit()

        if task_chat is None or task_chat.current_task is None:
            call_tg_func(query, 'answer', ['No new stickers sets'])

        try:
            if task.chat and task.chat.type == 'private':
                if sticker_set.banned:
                    call_tg_func(bot, 'send_message', [
                        task.chat.id,
                        f'Stickerset {sticker_set.name} has been banned.'
                    ])

                else:
                    keyboard = get_tag_this_set_keyboard(sticker_set.name)
                    message = f'Stickerset {sticker_set.name} has been added.'
                    if sticker_set.nsfw or sticker_set.furry:
                        message += f"\n It has been tagged as: {'nsfw' if sticker_set.nsfw else ''} "
                        message += f"{'furry' if sticker_set.furry else ''}"

                    call_tg_func(bot, 'send_message', [task.chat.id, message],
                                 {'reply_markup': keyboard})
                return
        except:  # noqa
            pass

    # Handle the "Skip this sticker" button
    elif CallbackType(callback_type).name == 'next':
        current_sticker = chat.current_sticker
        handle_next(session, bot, chat, tg_chat, user)
        if chat.current_sticker is not None:
            keyboard = get_fix_sticker_tags_keyboard(current_sticker.file_id)
            call_tg_func(query.message, 'edit_reply_markup', [],
                         {'reply_markup': keyboard})

    # Handle the "Stop tagging" button
    elif CallbackType(callback_type).name == 'cancel':
        # Send a message to the user, which shows how many stickers he already tagged,
        # if the user was just tagging some stickers.
        # Otherwise just send the normal cancel success message.
        if not send_tagged_count_message(session, bot, user, chat):
            call_tg_func(query, 'answer',
                         ['All active commands have been canceled'])
            call_tg_func(tg_chat, 'send_message',
                         ['All running commands are canceled'],
                         {'reply_markup': main_keyboard})

        chat.cancel()

    # Handle "Fix this sticker's tags"
    elif CallbackType(callback_type).name == 'edit_sticker':
        sticker = session.query(Sticker).get(payload)
        chat.current_sticker = sticker
        if not chat.full_sticker_set and not chat.tagging_random_sticker:
            chat.fix_single_sticker = True
        send_tag_messages(chat, tg_chat, user)

    elif CallbackType(callback_type).name == 'tag_set':
        initialize_set_tagging(bot, tg_chat, session, payload, chat, user)

    return