async def lsar(self, ctx, page_number: int = 1): db_response = c.execute( "SELECT Role FROM SelfAssignableRoles WHERE Guild = " + str(ctx.guild.id) + " LIMIT 10 OFFSET " + str(10 * (page_number - 1))).fetchall() roles = list() purge = False for i in db_response: role = ctx.guild.get_role(i[0]) if role: roles.append(role) else: purge = True c.execute("DELETE FROM SelfAssignableRoles WHERE Role = " + str(i[0])) roles.append(str(i[0]) + ' - deleted role') if purge == True: conn.commit() embed = discord.Embed( title=get_lang(ctx.guild, 'ADMINISTRATION_selfassign_list'), description='\n'.join([str(role) for role in roles]), color=0x00FF00) embed.set_footer(text=get_lang( ctx.guild, 'ECONOMY_leaderboard_footer').format(str(page_number))) await ctx.send(embed=embed)
async def award(self, ctx, user_id: int, amount: int): if amount < 1: return await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'ECONOMY_award_nocurr'), color = 0xFF0000)) user = self.bot.get_user(user_id) if not user: try: user = await self.bot.get_user_info(user_id) except discord.NotFound: return await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'ECONOMY_award_nouser'), color = 0xFF0000)) if user.bot: return await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'ECONOMY_award_nobot'), color = 0xFF0000)) try: c.execute("INSERT INTO Currency (User, Amount) VALUES (" + str(user.id) + ", " + str(amount) + ")") except sqlite3.IntegrityError: c.execute("UPDATE Currency SET Amount = Amount + " + str(amount) + " WHERE User = " + str(user.id)) conn.commit() await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'ECONOMY_award_success').format(str(user), str(amount)), color = 0x00FF00)) try: await user.send(embed = discord.Embed(description = get_lang(ctx.guild, 'ECONOMY_award_dm').format(str(amount)), color = 0x00FF00)) except discord.Forbidden: pass
async def ban(self, ctx, member: discord.Member, *, reason=None): if not ctx.guild.me.guild_permissions.ban_members: await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'ADMINISTRATION_ban_me_noperms'), color=0xFF0000)) if not check_perms(ctx.guild, ctx.author, member, discord.Permissions.ban_members): await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'ADMINISTRATION_ban_author_noperms'), color=0xFF0000)) else: try: await member.send( embed=dm_member(ctx.guild, 'ADMINISTRATION_dm_banned', ctx.guild, ctx.author, reason)) except: pass await member.ban(delete_message_days=7, reason=reason) await ctx.send(embed=member_action_confirm( ctx.guild, 'ADMINISTRATION_method_feedback_banned', member, reason))
async def urlfilter(self, ctx, channel: discord.TextChannel = None): if not channel: channel = ctx.channel try: c.execute("INSERT INTO URLFilters VALUES (" + str(ctx.guild.id) + ", " + str(ctx.channel.id) + ")") conn.commit() try: url_filters[ctx.guild.id].append(channel.id) except: url_filters[ctx.guild.id] = [channel.id] await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'ADMINISTRATION_urlfilter_enabled'), color=0x00FF00)) except sqlite3.IntegrityError: c.execute("DELETE FROM URLFilters WHERE Channel = " + str(ctx.channel.id)) conn.commit() url_filters[ctx.guild.id].remove(channel.id) if len(url_filters[ctx.guild.id]) == 0: del url_filters[ctx.guild.id] await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'ADMINISTRATION_urlfilter_disabled'), color=0x00FF00))
async def permit(self, ctx, member: discord.Member): if ctx.guild.id not in url_filters.keys(): await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'ADMINISTRATION_permit_nochannel'), color=0xFF0000)) elif member.guild_permissions.manage_messages: await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'ADMINISTRATION_permit_fail'), color=0xFF0000)) else: url_permit.append(member) await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'ADMINISTRATION_permit_success').format( member.mention), color=0x00FF00)) def check(m): return m.author == member and m.channel.id in url_filters[ ctx.guild.id] and find_urls(m) try: await self.bot.wait_for('message', check=check, timeout=60) except asyncio.TimeoutError: url_permit.remove(member) else: url_permit.remove(member)
async def leavemsg(self, ctx, *, msg = None): if not msg: db_response = c.execute("SELECT LeaveMsg FROM ServerConfig WHERE Guild = " + str(ctx.guild.id)).fetchone() await ctx.send(embed = discord.Embed(title = get_lang(ctx.guild, 'MEMBERPRESENCE_leavemsg_currentmsg'), description = db_response[0], color = 0x00FF00)) elif ctx.author.guild_permissions.manage_guild: c.execute("UPDATE ServerConfig SET LeaveMsg = '" + msg.replace('\'', '\'\'') + "' WHERE Guild = " + str(ctx.guild.id)) conn.commit() await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'MEMBERPRESENCE_leavemsg_updatemsg'), color = 0x00FF00))
async def greet(self, ctx): db_response = c.execute("SELECT GreetChannel FROM ServerConfig WHERE Guild = " + str(ctx.guild.id)).fetchone() if not db_response[0]: c.execute("UPDATE ServerConfig SET GreetChannel = " + str(ctx.channel.id) + " WHERE Guild = " + str(ctx.guild.id)) conn.commit() await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'MEMBERPRESENCE_greet_enabled'), color = 0x00FF00)) else: c.execute("UPDATE ServerConfig SET GreetChannel = NULL WHERE Guild = " + str(ctx.guild.id)) conn.commit() await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'MEMBERPRESENCE_greet_disabled'), color = 0x00FF00))
async def greetdm(self, ctx): db_response = c.execute("SELECT GreetDmToggle FROM ServerConfig WHERE Guild = " + str(ctx.guild.id)).fetchone() if db_response[0] == 0: c.execute("UPDATE ServerConfig SET GreetDmToggle = 1 WHERE Guild = " + str(ctx.guild.id)) conn.commit() await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'MEMBERPRESENCE_greetdm_enabled'), color = 0x00FF00)) else: c.execute("UPDATE ServerConfig SET GreetDmToggle = 0 WHERE Guild = " + str(ctx.guild.id)) conn.commit() await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'MEMBERPRESENCE_greetdm_disabled'), color = 0x00FF00))
async def claim(self, ctx): db_response = c.execute("SELECT Claimed FROM Currency WHERE User = "******"INSERT INTO Currency VALUES (" + str(ctx.author.id) + ", " + str(config['claim_amount']) + ", '" + str(datetime.datetime.utcnow()) + "')") except sqlite3.IntegrityError: c.execute("UPDATE Currency SET Amount = Amount + " + str(config['claim_amount']) + ", Claimed = '" + str(datetime.datetime.utcnow()) + "' WHERE User = " + str(ctx.author.id)) conn.commit() await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'ECONOMY_claim_success').format(ctx.author.mention), color = 0x00FF00)) else: await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'ECONOMY_claim_fail'), color = 0xFF0000))
async def leavedel(self, ctx, arg: int = None): if not arg: c.execute("UPDATE ServerConfig SET LeaveDel = NULL WHERE Guild = " + str(ctx.guild.id)) conn.commit() await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'MEMBERPRESENCE_leavedel_disabled'), color = 0x00FF00)) elif arg < 1 or arg > 120: await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'MEMBERPRESENCE_greetdel_fail'), color = 0xFF0000)) else: c.execute("UPDATE ServerConfig SET LeaveDel = " + str(arg) + " WHERE Guild = " + str(ctx.guild.id)) conn.commit() await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'MEMBERPRESENCE_leavedel_enabled').format(str(arg)), color = 0x00FF00))
async def ping(self, ctx): now = time.time() msg = await ctx.send(content='*Pinging...*') ping = time.time() - now await msg.edit(content=None, embed=discord.Embed( description=':ping_pong: ' + get_lang(ctx.guild, 'UTILITY_ping_message').format( str(round(ping * 1000))) + '\n:desktop: ' + get_lang(ctx.guild, 'UTILITY_ping_latency').format( str(round(self.bot.latency * 1000))), color=0x00FF00))
async def languages(self, ctx): langs = list() for i in response_string.keys(): langs.append(i.capitalize()) langs.sort() embed = discord.Embed( title=get_lang(ctx.guild, 'UTILITY_language_list'), description='\n'.join(['• ' + i for i in langs]), color=0x00FF00) embed.set_footer(text=get_lang(ctx.guild, 'UTILITY_language_footer')) await ctx.send(embed=embed)
async def setlang(self, ctx, lang): if lang.lower() not in response_string.keys(): await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'UTILITY_language_set_fail'), color=0xFF0000)) else: c.execute("UPDATE ServerConfig SET Language = '" + lang.lower() + "' WHERE Guild = " + str(ctx.guild.id)) conn.commit() server_config[ctx.guild.id]['language'] = lang.lower() await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'UTILITY_language_set_success'), color=0x00FF00))
def dm_member(method, guild, moderator, reason): embed = discord.Embed(title=get_lang(guild, method), color=0xFFFF00) embed.set_thumbnail(url=guild.icon_url) embed.add_field(name=get_lang(guild, 'ADMINISTRATION_dm_guild'), value=str(guild), inline=True) embed.add_field(name=get_lang(guild, 'ADMINISTRATION_dm_moderator'), value=str(moderator), inline=True) if reason: embed.add_field(name=get_lang(guild, 'ADMINISTRATION_method_reason'), value=reason, inline=False) return embed
def member_action_confirm(guild, method, member, reason): embed = discord.Embed(color=0xFFFF00) embed.set_author(name=get_lang(guild, method), icon_url=member.avatar_url) embed.add_field(name=get_lang(guild, 'ADMINISTRATION_method_member_name'), value=str(member), inline=True) embed.add_field(name=get_lang(guild, 'ADMINISTRATION_method_member_id'), value=str(member.id), inline=True) if reason: embed.add_field(name=get_lang(guild, 'ADMINISTRATION_method_reason'), value=reason, inline=False) return embed
async def rsar(self, ctx, *, role: discord.Role): conf = c.execute("SELECT * FROM SelfAssignableRoles WHERE Role = " + str(role.id)).fetchone() if not conf: await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'ADMINISTRATION_selfassign_delete_fail').format( role.mention), color=0xFF0000)) else: c.execute("DELETE FROM SelfAssignableRoles WHERE Role = " + str(role.id)) conn.commit() await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'ADMINISTRATION_selfassign_delete_success').format( role.mention), color=0x00FF00))
async def leaderboard(self, ctx, page_number: int = 1): db_response = c.execute("SELECT User, Amount FROM Currency ORDER BY Amount DESC LIMIT 10 OFFSET " + str(10 * (page_number - 1))).fetchall() position = 10 * (page_number - 1) users = list() for i in db_response: position += 1 user = self.bot.get_user(i[0]) if user: user = user else: user = i[0] users.append('`' + str(position) + '.` ' + str(user) + ' - **' + str(i[1]) + '** currency') embed = discord.Embed(title = get_lang(ctx.guild, 'ECONOMY_leaderboard_title'), description = '\n'.join(users), color = 0x00FF00) embed.set_footer(text = get_lang(ctx.guild, 'ECONOMY_leaderboard_footer').format(str(page_number))) await ctx.send(embed = embed)
async def lookup(self, ctx, code): try: invite = await self.bot.get_invite(code) except discord.NotFound: await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'UTILITY_lookup_fail'), color=0xFF0000)) else: def chan_type(channel): if isinstance(channel, discord.PartialInviteChannel): if channel.type == discord.ChannelType.text: return '#' elif channel.type == discord.ChannelType.voice: return '\\🔊' else: return '' else: if isinstance(channel, discord.TextChannel): return '#' elif isinstance(channel, discord.VoiceChannel): return '\\🔊' else: return '' desc = '• ' + get_lang( ctx.guild, 'UTILITY_lookup_server' ) + ': **' + str(invite.guild) + '** (' + str( invite.guild.id) + ')\n• ' + get_lang( ctx.guild, 'UTILITY_lookup_channel') + ': **' + chan_type( invite.channel) + str(invite.channel) + '** (' + str( invite.channel.id) + ')\n• ' + get_lang( ctx.guild, 'UTILITY_lookup_inviter' ) + ': **' + str(invite.inviter) + '**' + ( ' (' + str(invite.inviter.id) + ')' if invite.inviter else '' ) + '\n\n• ' + get_lang( ctx.guild, 'UTILITY_lookup_invitecode' ) + ': **' + invite.code + '**' + ( '\n• ' + get_lang( ctx.guild, 'UTILITY_lookup_features') + ': ' + ', '.join([ '**' + str(feature) + '**' for feature in invite.guild.features ]) if len(invite.guild.features) > 0 else '' ) + '\n• ' + get_lang( ctx.guild, 'UTILITY_lookup_activemembers') + ': **' + str( invite.approximate_presence_count ) + '** / **' + str( invite.approximate_member_count) + '**' embed = discord.Embed(title=get_lang(ctx.guild, 'UTILITY_lookup_about'), description=desc, color=0x00FF00) embed.set_thumbnail(url=invite.guild.icon_url_as(size=128)) await ctx.send(embed=embed)
async def userinfo(self, ctx, *, member: discord.Member = None): if not member: member = ctx.author embed = discord.Embed(title=get_lang(ctx.guild, 'UTILITY_userinfo_about'), color=0x00FF00) embed.set_thumbnail(url=member.avatar_url_as(size=128)) embed.add_field(name=get_lang(ctx.guild, 'UTILITY_userinfo_id'), value=str(member.id)) embed.add_field(name=get_lang(ctx.guild, 'UTILITY_userinfo_username'), value=str(member)) if member.nick: embed.add_field(name=get_lang(ctx.guild, 'UTILITY_userinfo_nickname'), value=member.nick) embed.add_field(name=get_lang(ctx.guild, 'UTILITY_userinfo_joined_discord'), value=str(member.created_at)) embed.add_field(name=get_lang(ctx.guild, 'UTILITY_userinfo_joined_guild'), value=str(member.joined_at)) if len(member.roles) > 1: embed.add_field(name=get_lang(ctx.guild, 'UTILITY_userinfo_roles'), value=', '.join([ '`' + str(role) + '`' for role in member.roles if role != ctx.guild.default_role ]), inline=False) await ctx.send(embed=embed)
async def on_member_remove(self, member): if 'server_log' in server_config[member.guild.id].keys(): channel = self.bot.get_channel( server_config[member.guild.id]['server_log']) if channel: embed = discord.Embed( title=get_lang(member.guild, 'ADMINISTRATION_serverlog_member_leave'), description=get_lang( member.guild, 'ADMINISTRATION_serverlog_member_members').format( str(member.guild.member_count)), color=0xFF0000, timestamp=datetime.datetime.utcnow()) embed.set_footer(icon_url=member.avatar_url_as(size=128), text=str(member) + ' (' + str(member.id) + ')') await channel.send(embed=embed)
async def asar(self, ctx, *, role: discord.Role): db_response = c.execute( "SELECT * FROM SelfAssignableRoles WHERE Role = " + str(role.id)).fetchone() if db_response: await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'ADMINISTRATION_selfassign_add_fail').format( role.mention), color=0xFF0000)) else: c.execute("INSERT INTO SelfAssignableRoles VALUES (" + str(ctx.guild.id) + ", " + str(role.id) + ")") conn.commit() await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'ADMINISTRATION_selfassign_add_success').format( role.mention), color=0x00FF00))
async def setstatus(self, ctx, status_type: int, *, status): status = status.split(' | ') if len(status) == 2: await self.bot.change_presence(activity = discord.Activity(name = status[0], type = status_type, url = status[1])) else: await self.bot.change_presence(activity = discord.Activity(name = status[0], type = status_type)) await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'OWNERONLY_status'), color = 0x00FF00))
async def take(self, ctx, user_id: int, amount: int): if amount < 1: return await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'ECONOMY_take_nocurr'), color = 0xFF0000)) user = self.bot.get_user(user_id) if not user: try: user = await self.bot.get_user_info(user_id) except discord.NotFound: return await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'ECONOMY_award_nouser'), color = 0xFF0000)) db_response = c.execute("SELECT Amount FROM Currency WHERE User = "******"UPDATE Currency SET Amount = Amount - " + str(amount) + " WHERE User = " + str(user.id)) conn.commit() await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'ECONOMY_take_success').format(str(user), str(amount)), color = 0x00FF00)) else: await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'ECONOMY_take_fail'), color = 0xFF0000))
async def on_message(self, message): if message.guild and not message.author.bot and not message.author.guild_permissions.manage_messages and message.guild.me.permissions_in( message.channel ).manage_messages and message.channel.id in url_filters[ message.guild.id] and message.author not in url_permit: if len(find_urls(message)) > 0: return await message.delete() if isinstance( message.channel, discord.TextChannel ) and not message.author.bot and message.attachments and not message.channel.is_nsfw( ) and 'img_filter' in server_config[message.guild.id].keys( ) and message.guild.me.permissions_in(message.channel).manage_messages: del_msg = False for attachment in message.attachments: if attachment.url.lower().endswith( ('.jpg', '.png', '.bmp', '.gif', '.webp')): async with aiohttp.ClientSession() as session: async with session.get( 'https://www.moderatecontent.com/api/v2?' + urllib.parse.urlencode( { 'key': config['moderatecontent_api'], 'url': attachment.url })) as response: response_json = await response.json() if round( response_json['predictions']['adult'] ) >= server_config[message.guild.id]['img_filter']: del_msg = True break if del_msg == True: await message.delete() await message.channel.send(embed=discord.Embed( title=get_lang(message.guild, 'ADMINISTRATION_imgfilter_deleted_title'), description=get_lang( message.guild, 'ADMINISTRATION_imgfilter_deleted_description').format( message.author.mention, str(round(response_json['predictions']['adult']))), color=0xFF0000))
async def stats(self, ctx): seconds = time.time() - start_time minutes, seconds = divmod(seconds, 60) hours, minutes = divmod(minutes, 60) days, hours = divmod(hours, 24) embed = discord.Embed(color=0x00FF00) embed.set_author(name=self.bot.user.name, icon_url=self.bot.user.avatar_url_as(size=128)) embed.add_field(name=get_lang(ctx.guild, 'UTILITY_stats_uptime'), value=str(int(days)) + ' days\n' + str(int(hours)) + ' hours\n' + str(int(minutes)) + ' minutes') embed.add_field(name=get_lang(ctx.guild, 'UTILITY_stats_owners'), value=('\n'.join([str(i) for i in config['owner_ids']]) if len(config['owner_ids']) > 0 else get_lang( ctx.guild, 'HELP_permission_none'))) embed.add_field(name=get_lang(ctx.guild, 'UTILITY_stats_presence'), value=str(len(self.bot.guilds)) + ' servers') await ctx.send(embed=embed)
async def on_member_update(self, before, after): if 'server_log' in server_config[after.guild.id].keys( ) and before.display_name != after.display_name: channel = self.bot.get_channel( server_config[after.guild.id]['server_log']) if channel: embed = discord.Embed(title=get_lang( after.guild, 'ADMINISTRATION_serverlog_member_update'), color=0x8E44AD, timestamp=datetime.datetime.utcnow()) embed.add_field(name=get_lang( after.guild, 'ADMINISTRATION_serverlog_before'), value=before.display_name) embed.add_field(name=get_lang( after.guild, 'ADMINISTRATION_serverlog_after'), value=after.display_name) embed.set_footer(icon_url=after.avatar_url_as(size=128), text=str(after) + ' (' + str(after.id) + ')') await channel.send(embed=embed)
async def removerole(self, ctx, *, role: discord.Role): conf = c.execute("SELECT * FROM SelfAssignableRoles WHERE Role = " + str(role.id)).fetchone() if not conf: await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'ADMINISTRATION_selfassign_notinlist'), color=0xFF0000)) else: try: await ctx.author.remove_roles(role) except: await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'ADMINISTRATION_selfassign_remove_fail'), color=0xFF0000)) else: await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'ADMINISTRATION_selfassign_remove_success'). format(role.mention), color=0x00FF00))
async def memberpersistence(self, ctx): if server_config[ctx.guild.id]['member_persistence'] == 0: c.execute( "UPDATE ServerConfig SET MemberPersistence = 1 WHERE Guild = " + str(ctx.guild.id)) conn.commit() server_config[ctx.guild.id]['member_persistence'] = 1 await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'ADMINISTRATION_memberpersistence_enabled'), color=0x00FF00)) else: c.execute( "UPDATE ServerConfig SET MemberPersistence = 0 WHERE Guild = " + str(ctx.guild.id)) conn.commit() server_config[ctx.guild.id]['member_persistence'] = 0 await ctx.send(embed=discord.Embed(description=get_lang( ctx.guild, 'ADMINISTRATION_memberpersistence_disabled'), color=0x00FF00))
async def give(self, ctx, user: discord.User, amount: int): if user.bot: return await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'ECONOMY_give_nobot'), color = 0xFF0000)) db_response = c.execute("SELECT Amount FROM Currency WHERE User = "******"UPDATE Currency SET Amount = Amount - " + str(amount) + " WHERE User = "******"INSERT INTO Currency (User, Amount) VALUES (" + str(user.id) + ", " + str(amount) + ")") except sqlite3.IntegrityError: c.execute("UPDATE Currency SET Amount = Amount + " + str(amount) + " WHERE User = " + str(user.id)) conn.commit() await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'ECONOMY_give_success').format(str(user), str(amount)), color = 0x00FF00)) try: await user.send(embed = discord.Embed(description = get_lang(ctx.guild, 'ECONOMY_give_dm').format(str(ctx.author), str(amount)), color = 0x00FF00)) except discord.Forbidden: pass
async def currency(self, ctx, user: discord.User = None): if not user: user = ctx.author db_response = c.execute("SELECT Amount FROM Currency WHERE User = "******"INSERT INTO Currency (User, Amount) VALUES (" + str(user.id) + ", 0)") conn.commit() db_response = c.execute("SELECT Amount FROM Currency WHERE User = " + str(user.id)).fetchone() await ctx.send(embed = discord.Embed(description = get_lang(ctx.guild, 'ECONOMY_currency').format(user.mention, str(db_response[0])), color = 0x00FF00))