Exemple #1
0
def handle_change_set_language(session, context):
    """Handle the change language button in newsfeed chats."""
    sticker_set = session.query(StickerSet).get(context.payload.lower())
    sticker_set.international = not sticker_set.international

    keyboard = get_nsfw_ban_keyboard(sticker_set)
    context.query.message.edit_reply_markup(reply_markup=keyboard)
Exemple #2
0
def handle_ban_set(session, context):
    """Handle the ban button in newsfeed chats."""
    sticker_set = session.query(StickerSet).get(context.payload.lower())
    sticker_set.banned = not sticker_set.banned

    keyboard = get_nsfw_ban_keyboard(sticker_set)
    context.query.message.edit_reply_markup(reply_markup=keyboard)
Exemple #3
0
def handle_deluxe_set(session, context):
    """Handle the deluxe button in newsfeed chats."""
    sticker_set = session.query(StickerSet).get(context.payload)
    sticker_set.deluxe = not sticker_set.deluxe

    keyboard = get_nsfw_ban_keyboard(sticker_set)
    context.query.message.edit_reply_markup(reply_markup=keyboard)
Exemple #4
0
def handle_fur_set(session, context):
    """Handle the fur button in newsfeed chats."""
    sticker_set = session.query(StickerSet).get(context.payload.lower())
    sticker_set.furry = not sticker_set.furry

    keyboard = get_nsfw_ban_keyboard(sticker_set)
    call_tg_func(context.query.message, "edit_reply_markup", [],
                 {"reply_markup": keyboard})
def handle_group_sticker(bot, update, session, chat, user):
    """Read all stickers.

    - Handle initial sticker addition.
    - Detect whether a sticker set is used in a chat or not.
    """
    tg_sticker = update.message.sticker
    set_name = tg_sticker.set_name

    # The sticker is no longer associated to a sticker set
    if set_name is None:
        return

    # Handle maintenance and newsfeed sticker sets
    if chat.is_maintenance or chat.is_newsfeed:
        sticker_set = StickerSet.get_or_create(session, set_name, chat, user)
        if not sticker_set.complete:
            return "Sticker set is not yet reviewed"

        message = f'StickerSet "{sticker_set.title}" ({sticker_set.name})'
        keyboard = get_nsfw_ban_keyboard(sticker_set)
        call_tg_func(
            update.message.chat, "send_message", [message], {"reply_markup": keyboard}
        )

        return

    # Handle replies to #request messages and tag those stickers with the request tags
    handle_request_reply(tg_sticker.file_id, update, session, chat, user)

    # Right now we only want to add animated stickers
    if not tg_sticker.is_animated:
        return

    sticker_set = StickerSet.get_or_create(session, set_name, chat, user)

    if sticker_set not in chat.sticker_sets:
        chat.sticker_sets.append(sticker_set)

    # Stickerset is not yet completed
    if not sticker_set.complete:
        return

    # Set the send sticker to the current sticker for tagging or report.
    sticker = session.query(Sticker).get(tg_sticker.file_id)
    if sticker is None:
        sticker_set.scan_scheduled = True
        return

    chat.current_sticker = sticker

    return
Exemple #6
0
def handle_next_newsfeed_set(session, context):
    """Handle the next button in newsfeed chats."""
    bot = context.bot
    sticker_set = session.query(StickerSet).get(context.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(context.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(context.query, "answer", ["No new stickers sets"])

    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, task.user)
            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
Exemple #7
0
def check_newsfeed_chat(bot, session, chat):
    """Check if this chat should get a new sticker for inspection."""
    # Get all tasks of added sticker sets, which have been scanned and aren't currently assigned to a chat.
    next_task = session.query(Task) \
        .filter(Task.type == Task.SCAN_SET) \
        .join(Task.sticker_set) \
        .outerjoin(Task.processing_chat) \
        .filter(Chat.current_task_id.is_(None)) \
        .filter(StickerSet.complete.is_(True)) \
        .filter(Task.reviewed.is_(False)) \
        .order_by(Task.created_at.asc()) \
        .limit(1) \
        .one_or_none()

    # No more tasks
    if next_task is None:
        chat.current_task = None
        return

    # TODO: HANDLE
    # Sticker set with zero stickers
    if len(next_task.sticker_set.stickers) == 0:
        session.delete(next_task.sticker_set)
        session.delete(next_task)
        return

    new_set = next_task.sticker_set

    task_count = session.query(func.count(Task.id)) \
        .filter(Task.type == Task.SCAN_SET) \
        .filter(Task.reviewed.is_(False)) \
        .one()

    task_count = task_count[0]

    # Add the keyboard for managing this specific sticker set.
    try:
        keyboard = get_nsfw_ban_keyboard(new_set)
        call_tg_func(bot, 'send_sticker',
                     [chat.id, new_set.stickers[0].file_id],
                     {'reply_markup': keyboard})

        if next_task.chat.type == 'private':
            message = f'Set {new_set.name} added by user: {next_task.user.username} ({next_task.user.id})'
        else:
            message = f'Set {new_set.name} added by chat: {next_task.chat.id}'
        if task_count > 1:
            message += f'\n{task_count - 1} sets remaining.'

        call_tg_func(bot, 'send_message', [chat.id, message])

        chat.current_task = next_task
        chat.current_sticker = new_set.stickers[0]

    # A newsfeed chat has been converted to a super group or the bot has been kicked. Delete it anyway
    except ChatMigrated:
        session.delete(chat)
    except BadRequest as e:
        if e.message == 'Chat not found':  # noqa
            session.delete(chat)
        else:
            raise e

    session.commit()