async def guild_logger(self, guild: discord.Guild, event: str): if event.casefold() == 'remove': colour = discord.Colour.red() title = 'Guild Left' elif event.casefold() == 'join': colour = discord.Colour.green() title = 'Guild Joined' embed = Embed( title = title, colour = colour, footer = f'Server Count: {len(self.bot.guilds)}', description = ( f'Guild ID: {guild.id}\n'\ f'Guild Name: {guild.name}\n'\ f'Owner: {guild.owner} ({guild.owner.id})\n'\ f'Membercount: {len(guild.members)}' ) ) if guild.icon: embed.set_thumbnail(url=guild.icon.url) webhook = discord.Webhook.from_url(url=os.getenv('DSCN_LOGGER'), session=self.bot.session) await webhook.send(embed=embed)
async def ping(self, ctx: Context): """Shows the bot's ping.""" start = time.perf_counter() msg = await ctx.send('Pinging...') end = time.perf_counter() typing_latency = (end - start) * 1000 websocket_latency = self.bot.latency * 1000 start = time.perf_counter() await self.bot.settings.find_one({'guildId': ctx.guild.id}) end = time.perf_counter() mongo_latency = (end - start) * 1000 embed = Embed(title='\U0001f3d3 Pong!') embed.add_field(name='<a:typing:828718094959640616> | Typing', value=f'`{typing_latency:.2f}ms`') embed.add_field(name='<a:settings:801424449542815744> | Websocket', value=f'`{websocket_latency:.2f}ms`') embed.add_field(name='<:mongo:814706574928379914> | Database', value=f'`{mongo_latency:.2f}ms`') await msg.edit(content=None, embed=embed)
async def avatar(self, ctx: Context, *, user: Optional[discord.User]): """Shows avatar of a user.""" user = user or ctx.author def url_as(format: str) -> str: return user.avatar.with_format(format).url embed = Embed( title = f'Avatar for {user}', description=( f'Link As\n'\ f'[png]({url_as("png")}) | [jpg]({url_as("jpg")}) | [webp]({url_as("webp")})' ) ) embed.set_image(url=user.avatar.url) await embed.send(ctx.channel)
async def on_member_update(self, before: discord.Member, after: discord.Member): if before.bot: return channel = await self.check_log_channel(before.guild) if not channel: return if before.display_name != after.display_name: embed = Embed( author = after, colour = discord.Colour.blue(), footer = 'Modified At', title = 'Nickname Updated', description = ( f'**Before:** {before.display_name}\n'\ f'**After:** {after.display_name}' ) ) await embed.send(channel) if before.roles != after.roles: embed = Embed(title='Roles Updated', colour=discord.Colour.blue(), author=after, footer='Modified At') temp: list[discord.Role] = list(set(before.roles + after.roles)) added = [] removed = [] for role in temp: if role in before.roles and role not in after.roles: removed.append(role) elif role in after.roles and role not in before.roles: added.append(role) if added: embed.add_field(name='Roles Added', value=', '.join([r.mention for r in added]), inline=False) if removed: embed.add_field(name='Roles Removed', value=', '.join([r.mention for r in removed]), inline=False) await embed.send(channel)
async def on_member_remove(self, member: discord.Member): channel = await self.check_log_channel(member.guild) if not channel: return embed = Embed( author=member, title='Member Left', colour=discord.Colour.red(), footer=f'ID: {member.id}', description= (f'{member.mention} joined {humanize.naturaltime(member.joined_at, when=discord.utils.utcnow())}.\n' )) roles = member.roles roles.remove(member.guild.default_role) if roles: embed.add_field(name='Roles', value=', '.join(r.mention for r in roles)) await embed.send(channel)
async def invite(self, ctx: Context): """Gives an invite for the bot""" def get_link(permissions: discord.Permissions) -> str: return discord.utils.oauth_url(self.bot.user.id, permissions) embed = Embed( title = 'Invite Links', description = ( f'[Invite Link (Minimal Perms)]({get_link(discord.Permissions(2147863616))})\n'\ f'[Invite Link (Admin)]({get_link(discord.Permissions(8))})\n'\ f'[Bot Server](https://discord.gg/2NVgaEwd2J)' ) ) await embed.send(ctx.channel)
async def prefix(self, ctx: Context): """Shows all the set prefix for the guild.""" base = [self.bot.user.mention] settings = await self.bot.settings.find_one({'guildId': ctx.guild.id}) if settings: base.extend(settings['prefixes']) else: base.append('.') embed = Embed(title=f'Prefixes for {ctx.guild.name}', description='\n'.join(f'{i}. {p}' for i, p in enumerate(base, 1)), footer=f'ID: {ctx.guild.id}') await embed.send(ctx.channel)
async def on_bulk_message_delete(self, messages: list[discord.Message]): deleted = [m for m in messages if len(m.content) <= 200] description = '\n'.join(f'**[{m.author}]:** {m.content}' for m in deleted) dummy = messages[0] channel = await self.check_log_channel(dummy.guild) if not channel: return if len(description) > 2048: description = f'Too many messages to show. {len(messages)} messages were deleted' embed = Embed( colour=discord.Colour.red(), title=f'{len(messages)} messages deleted in #{dummy.channel}', description=description, footer=f'{len(deleted)} messages are shown.') await embed.send(channel)
async def on_member_join(self, member: discord.Member): channel = await self.check_log_channel(member.guild) if not channel: return new = '' if member.created_at.day < 3: new = '\N{WARNING SIGN} **New Member:** ' embed = Embed( colour = discord.Colour.green(), footer = 'Joined At', author = member, title = 'Member Joined', description = ( f'{member.mention} {humanize.intcomma(humanize.ordinal(len(member.guild.members)))} to join.\n'\ f'{new}created {humanize.naturaltime(member.created_at, when=discord.utils.utcnow())}.' ) ) await embed.send(channel)
async def on_member_unban(self, guild: discord.Guild, user: discord.User): if not guild.me.guild_permissions.view_audit_log: return channel = await self.check_log_channel(guild) if not channel: return async for entry in guild.audit_logs( action=discord.AuditLogAction.unban): if entry.target.id == user.id: reason = ( f'**Reason:** {entry.reason if entry.reason else "No reason was provided."}\n'\ f'**Moderator:** {entry.user.mention} (ID: `{entry.user.id}`)' ) break embed = Embed(title='Member Unbanned', description=reason, colour=discord.Colour.green(), author=user) await embed.send(channel)
async def on_message_edit(self, before: discord.Message, after: discord.Message): if not before.guild: return if before.author.bot: return channel = await self.check_log_channel(before.guild) if not channel: return if before.content != after.content: embed = Embed(author=before.author, colour=discord.Colour.blue(), footer='Modified At', title='Message Edited', description=f'**Channel:** {before.channel.mention}') embed.add_field(name='Before', value=before.content, inline=False) embed.add_field(name='After', value=after.content, inline=False) await embed.send(channel)
async def on_message_delete(self, message: discord.Message): if message.author.bot: return channel = await self.check_log_channel(message.guild) if channel is None: return embed = Embed(author=message.author, colour=discord.Colour.red(), footer='Deleted At', title='Message Deleted', description=f'**Channel:** {message.channel.mention}') if message.content: embed.add_field(name='Content', value=message.content, inline=False) if message.attachments: embed.add_field(name='Attachments', value=', '.join(f'{a.filename} ({a.content_type})' for a in message.attachments)) await embed.send(channel)