def newsfeed_job(context, session): """Send all new sticker to the newsfeed chats.""" # Get all tasks of added sticker sets, which have been # scanned and aren't currently assigned to a chat. distribute_newsfeed_tasks(context.bot, session) return
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
def handle_next_newsfeed_set(session, bot, action, query, payload, chat, tg_chat, user): """Handle the next button in newsfeed chats.""" 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, 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 except: # noqa pass
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