def get_user_id(username): # ensure valid userid if len(username) <= 5: return None if username.startswith('@'): username = username[1:] users = sql.get_userid_by_name(username) if not users: return None elif len(users) == 1: return users[0].user_id else: for user_obj in users: try: userdat = dispatcher.bot.get_chat(user_obj.user_id) if userdat.username == username: return userdat.id except BadRequest as excp: if excp.message == 'Chat not found': pass else: LOGGER.exception("Error extracting user ID") return None
async def report(c: Alita, m: Message): me = await c.get_me() if m.chat and m.reply_to_message and db.chat_should_report(m.chat.id): reported_user = m.reply_to_message.from_user chat_name = m.chat.title or m.chat.username admin_list = await c.get_chat_members(m.chat.id, filter="administrators") if m.from_user.id == reported_user.id: await m.reply_text( "Uh yeah, Sure sure...you don't need to report yourself!") return if reported_user.id == me.id: await m.reply_text("Nice try.") return if reported_user.id in SUPPORT_STAFF: await m.reply_text("Uh? You reporting whitelisted users?") return if m.chat.username and m.chat.type == "supergroup": reported = f"{mention_html(m.from_user.first_name, m.from_user.id)} reported {mention_html(reported_user.first_name, reported_user.id)} to the admins!" msg = ( f"<b>⚠️ Report: </b>{html.escape(m.chat.title)}\n" f"<b> • Report by:</b> {mention_html(m.from_user.first_name, m.from_user.id)}(<code>{m.from_user.id}</code>)\n" f"<b> • Reported user:</b> {mention_html(reported_user.first_name, reported_user.id)} (<code>{reported_user.id}</code>)\n" ) link = f'<b> • Reported message:</b> <a href="https://t.me/{m.chat.username}/{m.reply_to_message.message_id}">click here</a>' should_forward = False keyboard = [ [ InlineKeyboardButton( "➡ Message", url= f"https://t.me/{m.chat.username}/{m.reply_to_message.message_id}", ) ], [ InlineKeyboardButton( "⚠ Kick", callback_data= f"report_{m.chat.id}=kick={reported_user.id}={reported_user.first_name}", ), InlineKeyboardButton( "⛔️ Ban", callback_data= f"report_{m.chat.id}=banned={reported_user.id}={reported_user.first_name}", ), ], [ InlineKeyboardButton( "❎ Delete Message", callback_data= f"report_{m.chat.id}=delete={reported_user.id}={m.reply_to_message.message_id}", ) ], ] reply_markup = InlineKeyboardMarkup(keyboard) else: reported = f"{mention_html(m.from_user.first_name, m.from_user.id)} reported {mention_html(reported_user.first_name, reported_user.id)} to the admins!" msg = f'{mention_html(m.from_user.first_name, m.from_user.id)} is calling for admins in "{html.escape(chat_name)}"!' link = "" should_forward = True for admin in admin_list: if admin.user.is_bot: # can't message bots continue if db.user_should_report(admin.user.id): try: if not m.chat.type == "supergroup": await c.send_message(admin.user.id, msg + link) if should_forward: await m.reply_to_message.forward(admin.user.id) if ( len(m.text.split()) > 1 ): # If user is giving a reason, send his message too await m.reply_to_message.forward(admin.user.id) if not m.chat.username: await c.send_message(admin.user.id, msg + link) if should_forward: await m.reply_to_message.forward(admin.user.id) if ( len(m.text.split()) > 1 ): # If user is giving a reason, send his message too await m.forward(admin.user.id) if m.chat.username and m.chat.type == "supergroup": await c.send_message(admin.user.id, msg + link, reply_markup=reply_markup) if should_forward: await m.reply_to_message.forward(admin.user.id) if ( len(m.text.split()) > 1 ): # If user is giving a reason, send his message too await m.forward(admin.user.id) except Unauthorized: pass except BadRequest: LOGGER.exception("Exception while reporting user") await m.reply_to_message.reply_text( f"{mention_html(m.from_user.first_name, m.from_user.id)} reported the message to the admins." ) return return
def extract_user_and_text(message: Message, args: List[str]) -> (Optional[int], Optional[str]): chat = message.chat prev_message = message.reply_to_message split_text = message.text.split(None, 1) if len(split_text) < 2: return id_from_reply(message) # only option possible text_to_parse = split_text[1] text = "" entities = list(message.parse_entities([MessageEntity.TEXT_MENTION])) if len(entities) > 0: ent = entities[0] else: ent = None # if entity offset matches (command end/text start) then all good if entities and ent and ent.offset == len( message.text) - len(text_to_parse): ent = entities[0] user_id = ent.user.id text = message.text[ent.offset + ent.length:] elif len(args) >= 1 and args[0][0] == '@': user = args[0] user_id = get_user_id(user) if not user_id: message.reply_text(tld(chat.id, 'helpers_user_not_in_db')) return None, None else: user_id = user_id res = message.text.split(None, 2) if len(res) >= 3: text = res[2] elif len(args) >= 1 and args[0].isdigit(): user_id = int(args[0]) res = message.text.split(None, 2) if len(res) >= 3: text = res[2] elif prev_message: user_id, text = id_from_reply(message) else: return None, None try: message.bot.get_chat(user_id) except BadRequest as excp: if excp.message in ("User_id_invalid", "Chat not found"): message.reply_text(tld(chat.id, 'helpers_user_not_in_db')) else: LOGGER.exception("Exception %s on user %s", excp.message, user_id) return None, None return user_id, text