async def assigncustomrole(self, ctx, member, *, rolename): """Connects a role to a member so they can use color(), as so: .customrole @member rolename""" member = get_user(ctx.message, member) if member: if ctx.author.top_role <= member.top_role: if ctx.author.id != member.id: return await ctx.send( "You cannot assign a custom role to {}!".format(member) ) role = discord.utils.get(ctx.guild.roles, name=rolename) if role: self.role_db.cursor().execute( "CREATE TABLE IF NOT EXISTS roles (userid INT PRIMARY KEY, roleid INT)" ) exists = self.role_db_cursor.execute( "SELECT roleid FROM roles WHERE userid={}".format( member.id)).fetchone() if exists: return await ctx.send("Member already has custom role") self.role_db.cursor().execute("INSERT INTO roles VALUES(?, ?)", (member.id, role.id)) self.role_db.commit() await ctx.send("Added role {} to member {}".format( role.name, member.name)) else: await ctx.send("Invalid role name") else: await ctx.send("Invalid member")
async def removecustomrole(self, ctx, member): """Removes custom role from member, if any exists""" member = get_user(ctx.message, member) if member: if ctx.author.top_role <= member.top_role: if ctx.author.id != member.id: return await ctx.send( "You cannot remove a custom role from {}!".format( member)) table = self.role_db_cursor.execute( "SELECT name FROM sqlite_master WHERE type='table' AND name = 'roles'" ).fetchone() if table: roleid = self.role_db_cursor.execute( "SELECT roleid FROM roles WHERE userid={}".format( member.id)).fetchone() if roleid: self.role_db_cursor.execute( "DELETE from roles WHERE userid={}".format(member.id)) self.role_db.commit() role = discord.utils.get(ctx.guild.roles, id=roleid[0]) if role: await member.remove_roles(role) await role.delete() else: await ctx.send("Role not found") await ctx.send("Removed custom role") else: await ctx.send("Member has no custom roles") else: await ctx.send("No custom roles have been added yet") else: await ctx.send("Invalid member")
async def delwarn(self, ctx, member, warn): """ Revoke a specific warn for a member Usage: [p]delwarn <mention, ID, or name> <warn #> """ member = get_user(ctx.message, member) if member: self.warn_db_cursor.execute( "UPDATE _{} SET revoked = 1 WHERE key={}".format( member.id, warn)) await ctx.send("Warn {} for {} cleared!".format(warn, member)) if self.log_channel: embed = discord.Embed() embed.color = discord.Color.teal() embed.set_author(name=str(ctx.author) + self.executed, icon_url=ctx.message.author.avatar_url) embed.add_field(name="Action type", value="Delete Warn", inline=False) embed.add_field(name="Target", value="{} ({})".format(member.mention, member), inline=False) embed.add_field(name="Warn revoked", value=warn, inline=False) await self.log_channel.send(embed=embed) else: await ctx.send("Please enter a valid member!")
async def clearwarns(self, ctx, member): """ Clear warns for a member permanently Usage: [p]clearwarns <member> """ member = get_user(ctx.message, member) if member == ctx.author: await ctx.send("You can't clear your own warns!") elif member.top_role >= ctx.message.author.top_role: await ctx.send("You can't clear this member's warns!") elif member: self.warn_db_cursor.execute("DROP TABLE IF EXISTS _{}".format( member.id)) await ctx.send("Warns for {} cleared!".format(member)) if self.log_channel: embed = discord.Embed() embed.color = discord.Color.green() embed.set_author(name=str(ctx.author) + self.executed, icon_url=ctx.message.author.avatar_url) embed.add_field(name="Action type", value="Clearwarns", inline=False) embed.add_field(name="Target", value="{} ({})".format(member.mention, member), inline=False) await self.log_channel.send(embed=embed) else: await ctx.send("Please mention a valid member!")
async def listwarns(self, ctx, member): """ List warns for a specified member Usage: [p]listwarns <mention, ID, or name> """ member = get_user(ctx.message, member) if member: exists = self.warn_db_cursor.execute( "SELECT name FROM sqlite_master WHERE type='table' AND name='_{}'" .format(member.id)).fetchone() if exists: warns = self.warn_db_cursor.execute("SELECT * FROM _{}".format( str(member.id))).fetchall() embed = discord.Embed(title="Warns for {}".format(member)) for timestamp, invoker, reason, revoked, key in warns: invoker = ctx.guild.get_member(int(invoker)) if not revoked: embed.add_field(name="{}: {}".format(key, timestamp), value="{}\nWarned by: {}".format( reason, invoker), inline=False) else: embed.add_field(name="~~{}: {}~~".format( key, timestamp), value="~~{}\nWarned by: {}~~".format( reason, invoker), inline=False) await ctx.send(embed=embed) else: await ctx.send("No warns found!") else: await ctx.send("Please enter a valid member!")
async def ban(self, ctx, member, *, reason=""): """ Ban the specified member Usage: [p]ban <mention, ID, or name> [reason] """ try: member = get_user(ctx.message, member) if member: if ctx.author.top_role <= member.top_role: return await ctx.send("You cannot ban {}!".format(member)) try: await member.send( "You have been banned from {}! Reason: {}".format( ctx.guild.name, reason if reason else "No reason provided")) except discord.errors.Forbidden: print("DMing user failed.") await member.ban( reason=reason + "\nResponsible moderator: {}".format(ctx.author), delete_message_days=0) await ctx.send("{} has been banned".format(member)) if self.log_channel: channel = ctx.channel embed = discord.Embed() embed.color = discord.Color.dark_red() embed.set_author(name=str(ctx.author) + self.executed, icon_url=ctx.author.avatar_url) embed.add_field(name="Action type", value="Ban", inline=False) embed.add_field(name="Target", value="{} ({})".format( member.mention, member), inline=False) embed.add_field( name="Reason", value=reason if reason else "No reason provided", inline=False) embed.add_field(name="In", value="{} ({})".format( channel.mention, channel), inline=False) await self.log_channel.send(embed=embed) else: await ctx.send("Please enter a valid member!") except discord.errors.Forbidden: await ctx.send("That member cannot be banned!")
async def warn(self, ctx, member, *, reason): """ Warn the specific member. Usage: [p]warn <mention, ID, or name> <reason> """ member = get_user(ctx.message, member) if member: if ctx.author.top_role <= member.top_role: return await ctx.send("You cannot warn this member!") self.warn_db_cursor.execute( "CREATE TABLE IF NOT EXISTS _{} (datetime timestamp, invoker text, reason text, revoked integer, key integer PRIMARY KEY)" .format(str(member.id))) self.warn_db_cursor.execute("SELECT * FROM _{}".format( str(member.id))) warns = self.warn_db_cursor.fetchall() warncount = 0 for _, _, _, revoked, _ in warns: warncount += revoked self.warn_db_cursor.execute( "INSERT INTO _{} VALUES (?, ?, ?, 0, {})".format( str(member.id), len(warns) + 1), (datetime.datetime.now(), str(ctx.message.author.id), reason)) self.warn_db.commit() await ctx.send("Warned member {}!".format(member)) try: await member.send( "You have been warned on {}! Reason: {}".format( ctx.guild.name, reason)) except discord.errors.Forbidden: print("DMing user failed.") if self.log_channel: channel = ctx.channel embed = discord.Embed() embed.color = discord.Color.gold() embed.set_author(name=str(ctx.author) + self.executed, icon_url=ctx.message.author.avatar_url) embed.add_field(name="Action type", value="Warn", inline=False) embed.add_field(name="Target", value="{} ({})".format(member.mention, member), inline=False) embed.add_field(name="Reason", value=reason, inline=False) embed.add_field(name="In", value="{} ({})".format(channel.mention, channel), inline=False) await self.log_channel.send(embed=embed) else: await ctx.send("Please enter a valid member!")
async def createcustomrole(self, ctx, member, *, rolename): """Creates a custom role for a member, connecting it to them and enabling them to use colour/color as: .createcustomrole member rolename""" member = get_user(ctx.message, member) if member: if ctx.author.top_role <= member.top_role: if ctx.author.id != member.id: return await ctx.send("You cannot create a custom role for {}!".format(member)) self.role_db.cursor().execute("CREATE TABLE IF NOT EXISTS roles (userid INT PRIMARY KEY, roleid INT)") exists = self.role_db_cursor.execute("SELECT * FROM roles WHERE userid={}".format(member.id)).fetchone() if exists: return await ctx.send("Member already has custom role") toprole = member.top_role newrole = await ctx.guild.create_role(name=rolename) newrole.edit(position=toprole.position+1) await member.add_roles(newrole) self.role_db.cursor().execute("INSERT INTO roles VALUES(?, ?)", (member.id, newrole.id)) await ctx.send("Created role!")
async def kick(self, ctx, member, *, reason=""): """ Kick the specified member Usage: [p]kick <mention, ID, or name> [reason] """ try: member = get_user(ctx.message, member) if member: if ctx.author.top_role <= member.top_role: return await ctx.send("You cannot kick {}!".format(member)) try: await member.send( "You have been kicked from SSSv4stro! Reason: {}". format(reason if reason else "No reason provided")) except discord.errors.Forbidden: print("DMing user failed.") await member.kick( reason=reason + "\nResponsible moderator: {}".format(ctx.author)) await ctx.send("{} has been kicked".format(member)) if self.log_channel: embed = discord.Embed() embed.set_author(name=str(ctx.message.author) + " moderator action", icon_url=ctx.message.author.avatar_url) embed.add_field(name="Action type", value="Kick", inline=False) embed.add_field(name="Target", value=member.mention + " ({})".format(member), inline=False) embed.add_field( name="Reason", value=reason if reason else "No reason provided", inline=False) await self.log_channel.send(embed=embed) else: await ctx.send("Please enter a valid member!") except discord.errors.Forbidden: await ctx.send("That member cannot be kicked!")