def no_longer_afk(update, context): user = update.effective_user message = update.effective_message if not user: # ignore channels return if not is_user_afk(user.id): #Check if user is afk or not return end_afk_time = get_readable_time((time.time() - float(REDIS.get(f'afk_time_{user.id}')))) REDIS.delete(f'afk_time_{user.id}') res = end_afk(user.id) if res: if message.new_chat_members: # dont say msg return firstname = update.effective_user.first_name try: options = [ "{} Is wasting his time in the chat!", "The Dead {} Came Back From His Grave!", "Welcome back {}! I hope you bought pizza", "Good to hear from you again {}", "{} Good job waking up now get ready for your classes!", "Hey {}! Why weren't you online for such a long time?", "{} why did you came back?", "{} Is now back online!", "OwO, Welcome back {}", "Welcome to hell again {}", "Whats poppin {}?", ] chosen_option = random.choice(options) update.effective_message.reply_text( chosen_option.format(firstname), ) except Exception: return
def disapprove(chat_id, user_id): approved = ast.literal_eval(REDIS.get("Approvals")) try: list = approved[chat_id] if user_id in list: list.remove(user_id) approved.update({chat_id: list}) except BaseException: pass return REDIS.set("Approvals", str(approved))
def unapproveall(update, context): chat = update.effective_chat user = update.effective_user message = update.effective_message chat_id = str(chat.id)[1:] approve_list = list(REDIS.sunion(f'approve_list_{chat_id}')) for target_user in approve_list: REDIS.srem(f'approve_list_{chat_id}', target_user) message.reply_text("Successully unapproved all users from {}.".format( chat.title))
def approve(chat_id, user_id): approved = ast.literal_eval(REDIS.get("Approvals")) try: list = approved[chat_id] if user_id not in list: list.append(user_id) approved.update({chat_id: list}) except BaseException: approved.update({chat_id: [user_id]}) return REDIS.set("Approvals", str(approved))
def reply_filter(update: Update, context: CallbackContext) -> str: chat: Optional[Chat] = update.effective_chat message: Optional[Message] = update.effective_message user: Optional[User] = update.effective_user chat_id = str(chat.id)[1:] approve_list = list(REDIS.sunion(f'approve_list_{chat_id}')) is_user_approved = mention_html(user.id, user.first_name) if is_user_approved in approve_list: return if not user: #Ignore channel return if user.id == 777000: return chat_warn_filters = sql.get_chat_warn_triggers(chat.id) to_match = extract_text(message) if not to_match: return "" for keyword in chat_warn_filters: pattern = r"( |^|[^\w])" + re.escape(keyword) + r"( |$|[^\w])" if re.search(pattern, to_match, flags=re.IGNORECASE): user: Optional[User] = update.effective_user warn_filter = sql.get_warn_filter(chat.id, keyword) return warn(user, chat, warn_filter.reply, message) return ""
def afk(update, context): args = update.effective_message.text.split(None, 1) user = update.effective_user if not user: # ignore channels return if user.id == 777000: return start_afk_time = time.time() reason = args[1] if len(args) >= 2 else "none" start_afk(update.effective_user.id, reason) REDIS.set(f'afk_time_{update.effective_user.id}', start_afk_time) fname = update.effective_user.first_name try: update.effective_message.reply_text("{} is now Away!".format(fname)) except BadRequest: pass
def is_approved(chat_id, user_id): approved = ast.literal_eval(REDIS.get("Approvals")) try: list = approved[chat_id] if user_id in list: return True return except BaseException: return
def __user_info__(user_id): is_afk = is_user_afk(user_id) text = "" if is_afk: since_afk = get_readable_time((time.time() - float(REDIS.get(f'afk_time_{user_id}')))) text = "This user is currently afk (away from keyboard)." text += f"\nLast Seen: {since_afk} Ago." else: text = "This user currently isn't afk (not away from keyboard)." return text
def check_afk(update, context, user_id, fst_name, userc_id): if is_user_afk(user_id): reason = afk_reason(user_id) since_afk = get_readable_time((time.time() - float(REDIS.get(f'afk_time_{user_id}')))) if int(userc_id) == int(user_id): return if reason == "none": res = "{} is Dead!\nLast Liveliness: {} Ago.".format(fst_name, since_afk) else: res = "{} is afk!\nReason: {}\nLast seen: {} Ago.".format(fst_name, reason, since_afk) update.effective_message.reply_text(res)
def approve(update: Update, context: CallbackContext) -> str: bot = context.bot args = context.args chat = update.effective_chat user = update.effective_user message = update.effective_message args = context.args user_id, reason = extract_user_and_text(message, args) if not user_id: message.reply_text("You don't seem to be referring to a user.") return try: member = chat.get_member(user_id) except BadRequest as excp: if excp.message == "User not found": message.reply_text("I can't seem to find this user") return raise if user_id == context.bot.id: message.reply_text("How I supposed to approve myself") return chat_id = str(chat.id)[1:] approve_list = list(REDIS.sunion(f'approve_list_{chat_id}')) target_user = mention_html(member.user.id, member.user.first_name) if target_user in approve_list: message.reply_text("{} is already approved in {}.".format( mention_html(member.user.id, member.user.first_name), chat.title), parse_mode=ParseMode.HTML) return member = chat.get_member(int(user_id)) chat_id = str(chat.id)[1:] REDIS.sadd(f'approve_list_{chat_id}', mention_html(member.user.id, member.user.first_name)) message.reply_text("{} has been approved in {}.".format( mention_html(member.user.id, member.user.first_name), chat.title), parse_mode=ParseMode.HTML)
def removewatchlist(update, context): user = update.effective_user message = update.effective_message removewlist = message.text.split(' ', 1) args = context.args query = " ".join(args) if not query: message.reply_text("Please enter a anime name to remove from your watchlist.") return watchlist = list(REDIS.sunion(f'anime_watch_list{user.id}')) removewlist = removewlist[1] if removewlist not in watchlist: message.reply_text( f"<code>{removewlist}</code> doesn't exist in your watch list.", parse_mode=ParseMode.HTML ) else: message.reply_text( f"<code>{removewlist}</code> has been removed from your watch list.", parse_mode=ParseMode.HTML ) REDIS.srem(f'anime_watch_list{user.id}', removewlist)
def removemangalist(update, context): user = update.effective_user message = update.effective_message removewlist = message.text.split(' ', 1) args = context.args query = " ".join(args) if not query: message.reply_text("Please enter a manga name to remove from your manga list.") return fvrt_char = list(REDIS.sunion(f'anime_mangaread{user.id}')) removewlist = removewlist[1] if removewlist not in fvrt_char: message.reply_text( f"<code>{removewlist}</code> doesn't exist in your manga list.", parse_mode=ParseMode.HTML ) else: message.reply_text( f"<code>{removewlist}</code> has been removed from your favorite characters list.", parse_mode=ParseMode.HTML ) REDIS.srem(f'anime_mangaread{user.id}', removewlist)
def animestuffs(update, context): query = update.callback_query user = update.effective_user splitter = query.data.split('=') query_match = splitter[0] callback_anime_data = splitter[1] if query_match == "xanime_watchlist": watchlist = list(REDIS.sunion(f'anime_watch_list{user.id}')) if not callback_anime_data in watchlist: REDIS.sadd(f'anime_watch_list{user.id}', callback_anime_data) context.bot.answer_callback_query(query.id, text=f"{callback_anime_data} is successfully added to your watch list.", show_alert=True) else: context.bot.answer_callback_query(query.id, text=f"{callback_anime_data} is already exists in your watch list!", show_alert=True) elif query_match == "xanime_fvrtchar": fvrt_char = list(REDIS.sunion(f'anime_fvrtchar{user.id}')) if not callback_anime_data in fvrt_char: REDIS.sadd(f'anime_fvrtchar{user.id}', callback_anime_data) context.bot.answer_callback_query(query.id, text=f"{callback_anime_data} is successfully added to your favorite character.", show_alert=True) else: context.bot.answer_callback_query(query.id, text=f"{callback_anime_data} is already exists in your favorite characters list!", show_alert=True) elif query_match == "xanime_manga": fvrt_char = list(REDIS.sunion(f'anime_mangaread{user.id}')) if not callback_anime_data in fvrt_char: REDIS.sadd(f'anime_mangaread{user.id}', callback_anime_data) context.bot.answer_callback_query(query.id, text=f"{callback_anime_data} is successfully added to your favorite character.", show_alert=True) else: context.bot.answer_callback_query(query.id, text=f"{callback_anime_data} is already exists in your favorite characters list!", show_alert=True)
def readmanga(update, context): chat = update.effective_chat user = update.effective_user message = update.effective_message manga_list = list(REDIS.sunion(f'anime_mangaread{user.id}')) manga_list.sort() manga_list = "\n• ".join(manga_list) if manga_list: message.reply_text( "{}<b>'s Manga Lists:</b>" "\n• {}".format(mention_html(user.id, user.first_name), manga_list), parse_mode=ParseMode.HTML ) else: message.reply_text( "You havn't added anything in your manga list!" )
def watchlist(update, context): chat = update.effective_chat user = update.effective_user message = update.effective_message watchlist = list(REDIS.sunion(f'anime_watch_list{user.id}')) watchlist.sort() watchlist = "\n• ".join(watchlist) if watchlist: message.reply_text( "{}<b>'s Watchlist:</b>" "\n• {}".format(mention_html(user.id, user.first_name), watchlist), parse_mode=ParseMode.HTML ) else: message.reply_text( "You havn't added anything in your watchlist!" )
def fvrtchar(update, context): chat = update.effective_chat user = update.effective_user message = update.effective_message fvrt_char = list(REDIS.sunion(f'anime_fvrtchar{user.id}')) fvrt_char.sort() fvrt_char = "\n• ".join(fvrt_char) if fvrt_char: message.reply_text( "{}<b>'s Harem:</b>" "\n• {}".format(mention_html(user.id, user.first_name), fvrt_char), parse_mode=ParseMode.HTML ) else: message.reply_text( "You havn't added any waifu in your harem!" )
def approved(update: Update, context: CallbackContext) -> str: bot = context.bot args = context.args chat = update.effective_chat user = update.effective_user message = update.effective_message chat_id = str(chat.id)[1:] approved_list = list(REDIS.sunion(f'approve_list_{chat_id}')) approved_list.sort() approved_list = ", ".join(approved_list) if approved_list: message.reply_text("The Following Users Are Approved: \n" "{}".format(approved_list), parse_mode=ParseMode.HTML) else: message.reply_text("No users are are approved in {}.".format( chat.title), parse_mode=ParseMode.HTML)
def approval(update: Update, context: CallbackContext) -> str: bot = context.bot args = context.args chat = update.effective_chat user = update.effective_user message = update.effective_message args = context.args user_id, reason = extract_user_and_text(message, args) if not user_id: message.reply_text("You don't seem to be referring to a user.") return try: member = chat.get_member(user_id) except BadRequest as excp: if excp.message == "User not found": message.reply_text("I can't seem to find this user") return raise if user_id == context.bot.id: message.reply_text("How I supposed to approve myself") return chat_id = str(chat.id)[1:] approve_list = list(REDIS.sunion(f'approve_list_{chat_id}')) target_user = mention_html(member.user.id, member.user.first_name) if target_user in approve_list: message.reply_text( "{} is an approved user. Auto Warns, antiflood, and blocklists won't apply to them." .format(mention_html(member.user.id, member.user.first_name)), parse_mode=ParseMode.HTML) return if target_user not in approve_list: message.reply_text( "{} is not an approved user. They are affected by normal commands." .format(mention_html(member.user.id, member.user.first_name)), parse_mode=ParseMode.HTML) return
def del_blacklist(update, context): chat = update.effective_chat message = update.effective_message user = update.effective_user bot = context.bot to_match = extract_text(message) if not to_match: return chat_id = str(chat.id)[1:] approve_list = list(REDIS.sunion(f'approve_list_{chat_id}')) target_user = mention_html(user.id, user.first_name) if target_user in approve_list: return getmode, value = sql.get_blacklist_setting(chat.id) chat_filters = sql.get_chat_blacklist(chat.id) for trigger in chat_filters: pattern = r"( |^|[^\w])" + re.escape(trigger) + r"( |$|[^\w])" if re.search(pattern, to_match, flags=re.IGNORECASE): try: if getmode == 0: return if getmode == 1: message.delete() elif getmode == 2: message.delete() warn( update.effective_user, chat, ("Using blacklisted trigger: {}".format(trigger)), message, update.effective_user, ) return elif getmode == 3: message.delete() bot.restrict_chat_member( chat.id, update.effective_user.id, permissions=ChatPermissions(can_send_messages=False), ) bot.sendMessage( chat.id, f"Muted {user.first_name} for using Blacklisted word: {trigger}!", ) return elif getmode == 4: message.delete() res = chat.unban_member(update.effective_user.id) if res: bot.sendMessage( chat.id, f"Kicked {user.first_name} for using Blacklisted word: {trigger}!", ) return elif getmode == 5: message.delete() chat.ban_member(user.id) bot.sendMessage( chat.id, f"Banned {user.first_name} for using Blacklisted word: {trigger}", ) return elif getmode == 6: message.delete() bantime = extract_time(message, value) chat.ban_member(user.id, until_date=bantime) bot.sendMessage( chat.id, f"Banned {user.first_name} until '{value}' for using Blacklisted word: {trigger}!", ) return elif getmode == 7: message.delete() mutetime = extract_time(message, value) bot.restrict_chat_member( chat.id, user.id, until_date=mutetime, permissions=ChatPermissions(can_send_messages=False), ) bot.sendMessage( chat.id, f"Muted {user.first_name} until '{value}' for using Blacklisted word: {trigger}!", ) return except BadRequest as excp: if excp.message != "Message to delete not found": LOGGER.exception("Error while deleting blacklist message.") break
def del_lockables(update, context): chat = update.effective_chat # type: Optional[Chat] user = update.effective_user message = update.effective_message # type: Optional[Message] chat_id = str(chat.id)[1:] approve_list = list(REDIS.sunion(f'approve_list_{chat_id}')) is_user_approved = mention_html(user.id, user.first_name) if is_user_approved in approve_list: return for lockable, filter in LOCK_TYPES.items(): if lockable == "rtl": if sql.is_locked(chat.id, lockable) and can_delete( chat, context.bot.id): if message.caption: check = ad.detect_alphabet(u"{}".format(message.caption)) if "ARABIC" in check: try: message.delete() except BadRequest as excp: if excp.message != "Message to delete not found": LOGGER.exception("ERROR in lockables") break if message.text: check = ad.detect_alphabet(u"{}".format(message.text)) if "ARABIC" in check: try: message.delete() except BadRequest as excp: if excp.message != "Message to delete not found": LOGGER.exception("ERROR in lockables") break continue if lockable == "button": if ( sql.is_locked(chat.id, lockable) and can_delete( chat, context.bot.id) and message.reply_markup and message.reply_markup.inline_keyboard ): try: message.delete() except BadRequest as excp: if excp.message != "Message to delete not found": LOGGER.exception("ERROR in lockables") break continue if lockable == "inline": if ( sql.is_locked(chat.id, lockable) and can_delete( chat, context.bot.id) and message and message.via_bot ): try: message.delete() except BadRequest as excp: if excp.message != "Message to delete not found": LOGGER.exception("ERROR in lockables") break continue if (filter(update) and sql.is_locked(chat.id, lockable) and can_delete(chat, context.bot.id)): if lockable == "bots": new_members = update.effective_message.new_chat_members for new_mem in new_members: if new_mem.is_bot: if not is_bot_admin(chat, context.bot.id): send_message( update.effective_message, "I see a bot and I've been told to stop them from joining..." "but I'm not admin!", ) return chat.ban_member(new_mem.id) send_message( update.effective_message, "Only admins are allowed to add bots in this chat! Get outta here.", ) break else: try: message.delete() except BadRequest as excp: if excp.message != "Message to delete not found": LOGGER.exception("ERROR in lockables") break
def check_flood(update, context) -> str: user = update.effective_user # type: Optional[User] chat = update.effective_chat # type: Optional[Chat] msg = update.effective_message # type: Optional[Message] chat_id = str(chat.id)[1:] approve_list = list(REDIS.sunion(f'approve_list_{chat_id}')) target_user = mention_html(user.id, user.first_name) if target_user in approve_list: return if not user: # ignore channels return "" # ignore admins if is_user_admin(chat, user.id): sql.update_flood(chat.id, None) return "" should_ban = sql.update_flood(chat.id, user.id) if not should_ban: return "" try: getmode, getvalue = sql.get_flood_setting(chat.id) if getmode == 1: chat.ban_member(user.id) execstrings = "Banned" tag = "BANNED" elif getmode == 2: chat.ban_member(user.id) chat.unban_member(user.id) execstrings = "Kicked" tag = "KICKED" elif getmode == 3: context.bot.restrict_chat_member( chat.id, user.id, permissions=ChatPermissions(can_send_messages=False) ) execstrings = "Muted" tag = "MUTED" elif getmode == 4: bantime = extract_time(msg, getvalue) chat.ban_member(user.id, until_date=bantime) execstrings = "Banned for {}".format(getvalue) tag = "TBAN" elif getmode == 5: mutetime = extract_time(msg, getvalue) context.bot.restrict_chat_member( chat.id, user.id, until_date=mutetime, permissions=ChatPermissions(can_send_messages=False), ) execstrings = "Muted for {}".format(getvalue) tag = "TMUTE" send_message(update.effective_message, "Wanna Spam?! Sorry it's not your house Man!\n{}!".format(execstrings)) return ( "<b>{}:</b>" "\n#{}" "\n<b>User:</b> {}" "\nFlooded the group.".format( html.escape(chat.title), tag, mention_html(user.id, user.first_name) ) ) except BadRequest: msg.reply_text( "I can't restrict people here, give me permissions first! Until then, I'll disable anti-flood." ) sql.set_flood(chat.id, 0) return ( "<b>{}:</b>" "\n#INFO" "\nDon't have enough permission to restrict users so automatically disabled anti-flood".format( chat.title ) )
def end_afk(userid): REDIS.delete(f'is_afk_{userid}') return True
def afk_reason(userid): return strb(REDIS.get(f'is_afk_{userid}'))
def start_afk(userid, reason): REDIS.set(f'is_afk_{userid}', reason)
def is_user_afk(userid): rget = REDIS.get(f'is_afk_{userid}') return bool(rget)
def list_approved(chat_id): approved = ast.literal_eval(REDIS.get("Approvals")) try: return approved[chat_id] except BaseException: return
copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ import ast from Cutiepii_Robot import REDIS try: ast.literal_eval(REDIS.get("Approvals")) except BaseException: REDIS.set("Approvals", "{}") def approve(chat_id, user_id): approved = ast.literal_eval(REDIS.get("Approvals")) try: list = approved[chat_id] if user_id not in list: list.append(user_id) approved.update({chat_id: list}) except BaseException: approved.update({chat_id: [user_id]}) return REDIS.set("Approvals", str(approved))