Example #1
0
    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")
Example #2
0
 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")
     ]
Example #3
0
 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()
Example #4
0
	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))
Example #5
0
	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
								}
							]
						}
					)
				)
Example #6
0
	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)
						}
					)
				)