async def self_kick(self, ctx): database = self.bot.client[config.database_name] servers = database["servers"] server_query = servers.find({"id": ctx.guild.id}, {"_id": 0}).limit(1) for server in server_query: def message_check(message): return message.author.id == ctx.author.id and message.channel.id == ctx.channel.id and message.content.lower( ) in [ text_handler.translate(server["language"], "yes"), text_handler.translate(server["language"], "no"), text_handler.translate(server["language"], "moderation_ban_or_kick_bot_stay") ] await text_handler.send(ctx, "moderation_ban_or_kick_bot") try: m3 = await self.bot.wait_for("message", check=message_check, timeout=20.0) except asyncio.TimeoutError: await text_handler.send(ctx, "moderation_ban_or_kick_bot_timeout") if text_handler.translate(server["language"], "yes") in m3.content.lower(): await text_handler.send(ctx, "moderation_ban_or_kick_bot_yes") elif m3.content.lower() == text_handler.translate( server["language"], "moderation_ban_or_kick_bot_stay"): await text_handler.send( ctx, "moderation_ban_or_kick_bot_selected_stay") return else: await text_handler.send(ctx, "moderation_ban_or_kick_bot_no")
def message_check(message): return message.author.id == ctx.author.id and message.channel.id == ctx.channel.id and message.content.lower( ) in [ text_handler.translate(server["language"], "yes"), text_handler.translate(server["language"], "no"), text_handler.translate(server["language"], "moderation_ban_or_kick_bot_stay") ]
async def settings(self, ctx): database = self.bot.client[config.database_name] servers = database["servers"] query = servers.find({"id": ctx.guild.id}, {"_id": 0}).limit(1) #will only run once anyway for server in query: role_perms = "" for role_perm in server["role_permissions"]: role_perms += f"<@&{role_perm['role_id']}> - {permissions.get_permission_str(role_perm['perms'])}\n" embed = discord.Embed().from_dict({ "title": "> Settings", "color": 15575881, "fields": [{ "name": text_handler.translate(server["language"], "settings_channels_title"), "value": text_handler.translate( server["language"], "settings_channels", moderator_actions_channel= f"<#{server['log_channels']['moderator_actions']}>" if server['log_channels']['moderator_actions'] is not None else "No channel set.", messages_channel= f"<#{server['log_channels']['messages']}>" if server['log_channels']['messages'] is not None else "No channel set.") }, { "name": text_handler.translate(server["language"], "settings_bot_perms"), "value": role_perms if role_perms != "" else "No permissions have been assigned." }] }) await ctx.send(embed=embed) return await ctx.send()
async def rank(self, ctx): database = self.bot.client[config.database_name] levels = database["levels"] servers = database["servers"] level_query = levels.find( { "user_id": ctx.author.id, "guild_id": ctx.guild.id }, {"_id": 0} ).limit(1) server_query = servers.find( { "id": ctx.guild.id }, {"_id": 0} ) if server_query.count() == 0: return username = await clean.clean_escape(str(ctx.author)) guild_name = await clean.clean_escape(ctx.guild.name) for server in server_query: try: if server["leveling_send_dm"] == True: for level_doc in level_query: await ctx.message.delete() await ctx.author.send(text_handler.translate(server["language"], "leveling_rank_cmd", user_tag=username, xp=level_doc["level"], guild_name=guild_name)) return else: for level_doc in level_query: await ctx.send(text_handler.translate(server["language"], "leveling_rank_cmd", user_tag=username, xp=level_doc["level"], guild_name=guild_name)) return except: for level_doc in level_query: await ctx.message.delete() await ctx.author.send(text_handler.translate(server["language"], "leveling_rank_cmd", user_tag=username, xp=level_doc["level"], guild_name=guild_name)) return await ctx.message.delete() await ctx.author.send(text_handler.translate(server["language"], "leveling_rank_cmd", user_tag=username, xp=0, guild_name=guild_name))
async def pardon(self, ctx, inf_id: int, *, reason: str): database = self.bot.client[config.database_name] infractions = database["infractions"] servers = database["servers"] query = servers.find({"id": ctx.guild.id}, {"_id": 0}).limit(1) if query.count() == 0: await ctx.send("Oh no! This server has not been set up yet, but don't fret, run `<.setup` and we'll get this server all ready in no time!") return infractions_query = infractions.find( { "guild_id": ctx.guild.id, "infraction_id": inf_id }, { "_id": 0 } ) if infractions_query.count() == 0: await text_handler.send(ctx, "pardon_infraction_not_found") return infraction = None for inf in infractions_query: infraction = inf infractions.delete_one( { "guild_id": ctx.guild.id, "infraction_id": inf_id } ) for server in query: log_channel = ctx.guild.get_channel(server["log_channels"]["moderator_actions"]) author_name = await clean.clean_escape(str(ctx.author)) user = ctx.guild.get_member(infraction["user_id"]) mod = ctx.guild.get_member(infraction["moderator_id"]) user_name = await clean.clean_escape(str(user) if user is not None else str(self.bot.get_user(infraction["user_id"]))) mod_name = await clean.clean_escape(str(mod) if mod is not None else str(self.bot.get_user(infraction["moderator_id"]))) if log_channel is not None: await log_channel.send( content=text_handler.translate( server["language"], "mod_log_pardon", time=datetime.now().strftime('%H:%M:%S'), author_name=author_name, author_id=ctx.author.id, inf_id=inf_id ), embed=discord.Embed().from_dict( { "color": self.get_embed_color_per_action("pardon"), "fields": [ { "name": text_handler.translate( server["language"], "mod_log_pardon_inf_info" ), "value": text_handler.translate( server["language"], "mod_log_pardon_inf_info_format", user=user_name, moderator=mod_name, type=infraction["type"], inf_reason=infraction["reason"] ) }, { "name": text_handler.translate( server["language"], "mod_log_reason" ), "value": reason } ] } ) )
async def add_infraction(self, ctx, inf_type: str, user: discord.Member, reason: str): database = self.bot.client[config.database_name] infractions = database["infractions"] servers = database["servers"] query = servers.find({"id": ctx.guild.id}, {"_id": 0}).limit(1) infractions_server_query = infractions.find( { #delibirate, do not "fix" "server_id": ctx.guild.id }, {"_id": 0} ) if query.count() == 0: await ctx.send("Oh no! This server has not been set up yet, but don't fret, run `<.setup` and we'll get this server all ready in no time!") return for server in query: # permissions check if len(reason) > config.max_reason_length: await text_handler.send(ctx, "moderation_failure_reason_too_long", max_reason_length=config.max_reason_length, amount=(len(reason) - config.max_reason_length)) return reason = await clean.clean_escape(reason) id = 0 if infractions_server_query.count() != 0: for infraction_server in infractions_server_query: id = infraction_server["last_id"]+1 infractions.update_one( { "server_id": ctx.guild.id }, { "$set": { "last_id": infraction_server["last_id"]+1 } } ) else: infractions.insert_one( { "server_id": ctx.guild.id, "last_id": 0 } ) infractions.insert_one( { "guild_id": ctx.guild.id, "moderator_id": ctx.author.id, "user_id": user.id, "infraction_id": id, "reason": reason, "type": inf_type } ) user_name = await clean.clean_escape(str(user)) author_name = await clean.clean_escape(str(ctx.author)) if inf_type == "ban": try: await ctx.guild.ban(user, reason=text_handler.translate(server["language"], "audit_log_ban", moderator=author_name, reason=reason)) except discord.Forbidden: return await text_handler.send(ctx, "moderation_ban_failure_missing_permissions") elif inf_type == "kick": try: await ctx.guild.kick(user, reason=text_handler.translate(server["language"], "audit_log_kick", moderator=author_name, reason=reason)) except discord.Forbidden: return await text_handler.send(ctx, "moderation_kick_failure_missing_permissions") await text_handler.send(ctx, f"moderation_{inf_type}_success", user_name=user_name, user_id=user.id) guild = self.bot.get_guild(server["id"]) log_channel = guild.get_channel(server["log_channels"]["moderator_actions"]) if log_channel is not None: await log_channel.send( content=text_handler.translate( server["language"], f"mod_log_{inf_type}", time=datetime.now().strftime('%H:%M:%S'), infraction_id=id, author_name=author_name, author_id=ctx.author.id, user_name=user_name, user_id=user.id ), embed=discord.Embed().from_dict( { "title": text_handler.translate( server["language"], "mod_log_reason" ), "description": reason, "color": self.get_embed_color_per_action(inf_type) } ) )