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.'
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
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
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."
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
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"
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})
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"
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})
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.'
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