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)
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)
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)
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
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 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()