From bfd62ccd7f9e76ed07f31b7a873e3c2e6284931f Mon Sep 17 00:00:00 2001 From: LBlend Date: Wed, 16 Nov 2022 00:45:21 +0100 Subject: [PATCH] migrate info cog & refactor --- src/cogs/info.py | 906 +++++++++++++++++++---------------------------- 1 file changed, 374 insertions(+), 532 deletions(-) diff --git a/src/cogs/info.py b/src/cogs/info.py index 4798251..38a1145 100644 --- a/src/cogs/info.py +++ b/src/cogs/info.py @@ -1,39 +1,84 @@ -from discord.ext import commands -import discord - from os import remove -from cogs.utils import embed_templates, misc_utils +import discord +from discord import app_commands +from discord.ext import commands + +from cogs.utils import discord_utils, embed_templates, misc_utils class Info(commands.Cog): def __init__(self, bot): self.bot = bot - @commands.bot_has_permissions(embed_links=True, external_emojis=True) - @commands.guild_only() - @commands.cooldown(1, 2, commands.BucketType.guild) - @commands.command(aliases=['guildinfo', 'server', 'serverinfo', 'si', 'gi']) - async def guild(self, ctx): - """ - Viser info om guilden - """ + guild_group = app_commands.Group(name="guild", description="Se ting om serveren") + user_group = app_commands.Group(name="bruker", description="Se ting om brukeren") - guild_created_date = ctx.guild.created_at.strftime('%d. %b. %Y - %H:%M') - since_created_days = (ctx.message.created_at - ctx.guild.created_at).days + def __construct_role_string(self, roles: list[discord.Role]) -> str: + """Puts all roles except @everyone into a list and joins them to a string""" + if not roles: + return "**Ingen roller**" - if since_created_days == 1: - since_created_days_string = 'dag' - else: - since_created_days_string = 'dager' + roles = [role.name for role in roles if role.name != "@everyone"] + roles.reverse() - total_members = ctx.guild.member_count + return ', '.join(roles) + + def __construct_booster_string(self, interaction: discord.Interaction, join_method: callable = ', '.join) -> str: + """Joins all boosters into a string""" + if not interaction.guild.premium_subscribers: + return '**Ingen boostere**' + + # Sort boosters by boost date and put name#discrim as well as date of boost into a list of stirngs + # Use map instead of list comprehension because I can divide the code into 2 lines + boosters = list(map(lambda booster: f'{booster.name}#{booster.discriminator} - {discord.utils.format_dt(booster.premium_since)}', + sorted(interaction.guild.premium_subscribers, key=lambda m: m.premium_since))) + boosters = [f'{booster.name}#{booster.discriminator}' for booster in boosters] + boosters.reverse() + + return join_method(boosters) + + def __construct_member_string(self, members: list[discord.Member]) -> str: + """Joins all name#discrim into a string""" + if not members: + return '**Ingen**' + + members = [f'{member.name}#{member.discriminator}' for member in members] + + return ', '.join(members) + + async def __send_as_txt_file(self, interaction: discord.Interaction, content: str, file_path: str): + """Sends a string as a txt file and deletes the file afterwards""" + # Create file + with open(file_path, 'w', encoding='utf-8') as file: + file.write(content) + + # Send file + txt_file = discord.File(file_path) + await interaction.response.send_message(file=txt_file) + + # Delete file + with misc_utils.ignore_exception(OSError): + remove(file_path) + + @app_commands.checks.bot_has_permissions(embed_links=True, external_emojis=True) + @app_commands.guild_only() + @app_commands.checks.cooldown(1, 2) + @guild_group.command(name="info", description="Hent informasjon om en server") + async def guild_info(self, interaction: discord.Interaction): + # Days since guild was created + creation_date_timestamp = discord.utils.format_dt(interaction.guild.created_at, style="F") + since_created_days = (interaction.created_at - interaction.guild.created_at).days + days_ago = f'{since_created_days} dager' if since_created_days != 1 else f'{since_created_days} dag' + + # Member count and status counts + total_members = interaction.guild.member_count bot_members = 0 online_members = 0 idle_members = 0 dnd_members = 0 offline_members = 0 - for member in ctx.guild.members: + for member in interaction.guild.members: if member.bot: bot_members += 1 if str(member.status) == 'online': @@ -45,63 +90,57 @@ class Info(commands.Cog): elif str(member.status) == 'offline': offline_members += 1 - roles = [] - for role in ctx.guild.roles: - if role.name != '@everyone': - roles.append(role.name) - roles.reverse() - roles = ', '.join(roles) - if len(roles) > 1024: - roles = f'Skriv `{self.bot.prefix}guildroller` for å se rollene' - if roles == '': - roles = '**Ingen roller**' + # Roles + roles = self.__construct_role_string(interaction.guild.roles) + roles = roles if len(roles) < 1024 else f'Bruk kommandoen for å se rollene' - boosters = [] - premium_subscribers = sorted( - ctx.guild.premium_subscribers, key=lambda m: m.premium_since) - for booster in premium_subscribers: - boosters.append(f'{booster.name}#{booster.discriminator}') - boosters = ', '.join(boosters) - if len(boosters) > 1024: - boosters = f'Skriv `{self.bot.prefix}boosters` for å se boosters' - if boosters == '': - boosters = '**Ingen boosters**' + # Boosts + boosters = self.__construct_booster_string(interaction) + boosters = boosters if len(boosters) < 1024 else f'Bruk kommandoen for å se boostere' - text_channels = len(ctx.guild.text_channels) - voice_channels = len(ctx.guild.voice_channels) - categories = len(ctx.guild.categories) + # Channels counts + text_channels = len(interaction.guild.text_channels) + voice_channels = len(interaction.guild.voice_channels) + categories = len(interaction.guild.categories) total_channels = text_channels + voice_channels + # Features features_string = '' - if ctx.guild.features is not []: + if interaction.guild.features is not []: features = { - 'VIP_REGIONS': 'VIP', - 'VANITY_URL': 'Egen URL', + 'ANIMATED_BANNER': 'Animer serverbanner', + 'ANIMATED_ICON': 'Animert serverikon', + 'BANNER': 'Serverbanner', + 'COMMERCE': 'E-handel', + 'COMMUNITY': 'Samfunnsserver', + 'DISCOVERABLE': 'På utforsksiden', + 'FEATURABLE': '', 'INVITE_SPLASH': 'Invitasjonsbilde', - 'VERIFIED': 'Verifisert', - 'PARTNERED': 'Discord Partner', - 'MORE_EMOJI': 'Ekstra emoji', - 'DISCOVERABLE': 'Fremhevet', - 'FEATURABLE': 'Kan fremheves', - 'COMMUNITY': 'Sammfunsguild', - 'COMMERCE': 'Butikkanaler', - 'PUBLIC': 'Offentlig guild', + 'MEMBER_VERIFICATION_GATE_ENABLED': 'Medlemsverifisering', + 'MONETIZATION_ENABLED': 'Betalingskanal', + 'MORE_EMOJI': 'Flere emoji', + 'MORE_STICKERS': 'Flere stickers', 'NEWS': 'Nyhetskanaler', - 'BANNER': 'Banner', - 'ANIMATED_ICON': 'Animert ikon', - 'PUBLIC_DISABLED': 'Ikke offentlig', - 'WELCOME_SCREEN_ENABLED': 'Velkomstvindu', + 'PARTNERED': 'Partner', 'PREVIEW_ENABLED': 'Forhåndsvisning', - 'MEMBER_VERIFICATION_GATE_ENABLED': 'Medlemsverifisering' + 'PRIVATE_THREADS': 'Private tråder', + 'ROLE_ICONS': 'Rolleikon', + 'TICKETED_EVENTS_ENABLED': 'Arrangmenter med billettsalg', + 'VANITY_URL': 'Egendefinert URL', + 'VERIFIED': 'Verifisert', + 'VIP_REGIONS': 'Høyere bitrate i stemmekanaler', + 'WELCOME_SCREEN_ENABLED': 'Velkomstskjerm', + 'INVITES_DISABLED': 'Invitasjoner deaktivert' } - for feature in ctx.guild.features: - features_string += f'{features[feature]}\n' + for feature in interaction.guild.features: + if translation := features.get(feature): + features_string += f'{translation}\n' photos = {} - if ctx.guild.discovery_splash: - photos['Invitasjonsbilde'] = ctx.guild.discovery_splash - if ctx.guild.banner: - photos['Banner'] = ctx.guild.banner + if interaction.guild.discovery_splash: + photos['Invitasjonsbilde'] = interaction.guild.discovery_splash + if interaction.guild.banner: + photos['Banner'] = interaction.guild.banner verification_level = { 'none': 'ingen', @@ -110,25 +149,25 @@ class Info(commands.Cog): 'high': 'e-post, registrert i 5 min, medlem i 10 min', 'extreme': 'telefon' } - verification = verification_level[str(ctx.guild.verification_level)] + verification = verification_level[str(interaction.guild.verification_level)] content_filter = { 'disabled': 'nei', 'no_role': 'for alle uten rolle', 'all_members': 'ja' } - content = content_filter[str(ctx.guild.explicit_content_filter)] + content = content_filter[str(interaction.guild.explicit_content_filter)] - embed = discord.Embed(color=ctx.me.color, description=f'**Verifiseringskrav:** {verification}\n' + + embed = discord.Embed(color=interaction.guild.me.color, description=f'**Verifiseringskrav:** {verification}\n' + f'**Innholdsfilter:** {content}\n' + - f'**Boost Tier:** {ctx.guild.premium_tier}\n' + - f'**Emoji:** {len(ctx.guild.emojis)}') - embed.set_author(name=ctx.guild.name, icon_url=ctx.guild.icon) - embed.set_thumbnail(url=ctx.guild.icon) - embed.add_field(name='ID', value=ctx.guild.id) - embed.add_field(name='Eier', value=ctx.guild.owner.mention) - embed.add_field(name='Opprettet', value=f'{guild_created_date}\n{since_created_days} ' + - f'{since_created_days_string} siden') + f'**Boost Tier:** {interaction.guild.premium_tier}\n' + + f'**Emoji:** {len(interaction.guild.emojis)}') + embed.set_author(name=interaction.guild.name, icon_url=interaction.guild.icon) + embed.set_thumbnail(url=interaction.guild.icon) + embed.add_field(name='ID', value=interaction.guild.id) + embed.add_field(name='Eier', value=interaction.guild.owner.mention) + embed.add_field(name='Opprettet', value=f'{creation_date_timestamp}\n{since_created_days} ' + + f'{days_ago} siden') embed.add_field(name=f'Kanaler ({total_channels})', value=f'💬 Tekst: **{text_channels}**\n' + f'🔊 Tale: **{voice_channels}**\n' + f'🗃️ Kategorier: **{categories}**') @@ -139,158 +178,248 @@ class Info(commands.Cog): f'{self.bot.emoji["idle"]}{idle_members} ' + f'{self.bot.emoji["dnd"]}{dnd_members} ' + f'{self.bot.emoji["offline"]}{offline_members}') - embed.add_field(name=f'Roller ({len(ctx.guild.roles) - 1})', value=roles, inline=False) - if ctx.guild.premium_tier != 0: - embed.add_field(name=f'Boosters ({ctx.guild.premium_subscription_count})', value=boosters, inline=False) + embed.add_field(name=f'Roller ({len(interaction.guild.roles) - 1})', value=roles, inline=False) + if interaction.guild.premium_tier != 0: + embed.add_field(name=f'Boosters ({interaction.guild.premium_subscription_count})', value=boosters, inline=False) - if features_string != '': + if not features_string: embed.add_field(name='Tillegsfunksjoner', value=features_string) - if photos != {}: + if photos: photos_string = '' for key, value in photos.items(): photos_string += f'[{key}]({value})\n' embed.add_field(name='Bilder', value=photos_string) - await ctx.send(embed=embed) + await interaction.response.send_message(embed=embed) - @commands.bot_has_permissions(embed_links=True) - @commands.guild_only() - @commands.cooldown(1, 2, commands.BucketType.guild) - @commands.command(aliases=['serverroller', 'guildroles', 'serverroles']) - async def guildroller(self, ctx): - """ - Viser rollene i en guild - """ - - roles = [] - for role in ctx.guild.roles: - if role.name != '@everyone': - roles.append(role.name) - if roles is []: - roles = ['**Ingen Roller**'] - roles.reverse() - roles = ', '.join(roles) - - roles = roles.replace(', --', '\n--') - roles = roles.replace('--, ', '--\n') + @app_commands.checks.bot_has_permissions(embed_links=True) + @app_commands.guild_only() + @app_commands.checks.cooldown(1, 2) + @guild_group.command(name="roller", description="Se rollene på serveren") + async def guild_roles(self, interaction: discord.Interaction): + roles = self.__construct_role_string(interaction.guild.roles) + # IF roles list is longer than 2048, create text file and send it if len(roles) > 2048: - with open(f'./assets/temp/{ctx.guild.id}_roles.txt', 'w') as f: - f.seek(0) - f.write(roles) + self.__send_as_txt_file(interaction, f'./assets/temp/{interaction.guild.id}_roles.txt', roles) + else: + embed = discord.Embed(color=interaction.guild.me.color, description=roles) + embed.set_author(name=f'Roller ({len(interaction.guild.roles)})', icon_url=interaction.guild.icon) + embed.set_footer(text=interaction.guild.name, icon_url=interaction.guild.icon) + await interaction.response.send_message(embed=embed) - txt_file = discord.File(f'./assets/temp/{ctx.guild.id}_roles.txt') - await ctx.send(file=txt_file) + @app_commands.checks.bot_has_permissions(embed_links=True) + @app_commands.guild_only() + @app_commands.checks.cooldown(1, 2) + @guild_group.command(name="boosters", description="Se boostere på serveren") + async def guild_boosters(self, interaction: discord.Interaction): + if len(interaction.guild.premium_subscribers) == 0: + embed = embed_templates.error_warning(interaction, text='Serveren har ikke noen boosts :(') + return await interaction.response.send_message(embed=embed) - with misc_utils.ignore_exception(OSError): - remove(f'./assets/temp/{ctx.guild.id}_roles.txt') + boosters = self.__construct_booster_string(interaction, '\n'.join) - return + embed = discord.Embed(color=interaction.guild.me.color, description=boosters) + embed.set_author(name=f'Boosters ({interaction.guild.premium_subscription_count})', icon_url=interaction.guild.icon) + embed.set_footer(text=interaction.guild.name, icon_url=interaction.guild.icon) + await interaction.response.send_message(embed=embed) - if roles == '': - roles = '**Ingen roller**' + @app_commands.checks.bot_has_permissions(embed_links=True) + @app_commands.guild_only() + @app_commands.checks.cooldown(1, 2) + @guild_group.command(name="ikon", description="Hent serverens ikon") + async def guild_icon(self, interaction: discord.Interaction): + embed = discord.Embed(color=interaction.guild.me.color, description=f'[Lenke]({interaction.guild.icon})') + embed.set_author(name=interaction.guild.name, icon_url=interaction.guild.icon) + embed.set_image(url=interaction.guild.icon) + embed = embed_templates.default_footer(interaction, embed) + await interaction.response.send_message(embed=embed) - embed = discord.Embed(color=ctx.me.color, description=roles) - embed.set_author(name=f'Roller ({len(ctx.guild.roles) - 1})', icon_url=ctx.guild.icon) - embed.set_footer(text=ctx.guild.name, icon_url=ctx.guild.icon) - await ctx.send(embed=embed) + @app_commands.checks.bot_has_permissions(embed_links=True) + @app_commands.guild_only() + @app_commands.checks.cooldown(1, 2) + @guild_group.command(name="splash", description="Hent serverens splash (bakgrunnsbilde på invitasjonsside)") + async def guild_splash(self, interaction: discord.Interaction): + if not interaction.guild.discovery_splash: + embed = embed_templates.error_warning(interaction, text='Serveren har ikke en splash') + return await interaction.response.send_message(embed=embed) + + embed = discord.Embed(color=interaction.guild.me.color, description=f'[Lenke]({interaction.guild.discovery_splash})') + embed.set_author(name=interaction.guild.name, icon_url=interaction.guild.icon) + embed.set_image(url=interaction.guild.discovery_splash) + embed = embed_templates.default_footer(interaction, embed) + await interaction.response.send_message(embed=embed) + + @app_commands.checks.bot_has_permissions(embed_links=True) + @app_commands.guild_only() + @app_commands.checks.cooldown(1, 2) + @guild_group.command(name="banner", description="Hen serverens banner") + async def guild_banner(self, interaction: discord.Interaction): + if not interaction.guild.banner: + embed = embed_templates.error_warning(interaction, text='Serveren har ikke et banner :(') + return await interaction.response.send_message(embed=embed) + + embed = discord.Embed(color=interaction.me.guild.color, description=f'[Lenke]({interaction.guild.banner})') + embed.set_author(name=interaction.guild.name, icon_url=interaction.guild.icon) + embed.set_image(url=interaction.guild.banner) + embed = embed_templates.default_footer(interaction, embed) + await interaction.response.send_message(embed=embed) + + @app_commands.checks.bot_has_permissions(embed_links=True) + @app_commands.guild_only() + @app_commands.checks.cooldown(1, 2) + @guild_group.command(name="rolle", description="Hent informasjon om en rolle på serveren") + async def guild_role(self, interaction: discord.Interaction, rolle: discord.Role): + if rolle.name == '@everyone': + embed = embed_templates.error_fatal(interaction, text='Skriv inn en annen rolle enn @everyone') + return await interaction.response.send_message(embed=embed) + + # Timestamp and days since creation + created_at_timestamp = discord.utils.format_dt(rolle.created_at, style="F") + since_created_days = (interaction.created_at - rolle.created_at).days + + # List of members with the role + members = self.__construct_member_string(rolle.members) + members = members if len(members) < 1024 else 'For mange medlemmer for å vise her' + + # List of permissions + permissions = ', '.join([permission for permission, value in iter(rolle.permissions) if value is True]) + + embed = discord.Embed(title=rolle.name, description=f'{rolle.mention}\n**ID:** {rolle.id}', color=discord_utils.get_color(rolle)) + embed.set_author(name=rolle.guild.name, icon_url=rolle.guild.icon) + embed.add_field(name='Fargekode', value=str(rolle.color)) + embed.add_field(name='Opprettet', value=f'{created_at_timestamp}\n{since_created_days} ' + + f'{"dager" if since_created_days > 1 else "dag"} siden') + embed.add_field(name='Posisjon', value=rolle.position) + embed.add_field(name='Nevnbar', value='Ja' if rolle.mentionable else 'Nei') + embed.add_field(name='Vises separat i medlemsliste', value='Ja' if rolle.hoist else 'Nei') + if permissions: + embed.add_field(name='Tillatelser', value=permissions, inline=False) + embed.add_field(name=f'Brukere med rollen ({len(rolle.members)})', value=members, inline=False) + embed = embed_templates.default_footer(interaction, embed) + await interaction.response.send_message(embed=embed) + + @app_commands.checks.bot_has_permissions(embed_links=True) + @app_commands.guild_only() + @app_commands.checks.cooldown(1, 2) + @guild_group.command(name="tekstkanal", description="Hent informasjon om en tekstkanal") + async def guild_text_channel(self, interaction: discord.Interaction, kanal: discord.TextChannel): + members = self.__construct_member_string(kanal.members) + if len(members) > 1024: + members = 'For mange for å vise her' + + embed = discord.Embed(color=interaction.guild.me.color, title=kanal.name, description=f'{kanal.mention}\nID: {kanal.id}') + embed.set_author(name=kanal.guild.name, icon_url=kanal.guild.icon) + embed.add_field(name='Beskrivelse', value=kanal.topic if kanal.topic else '**Ingen**', inline=False) + embed.add_field(name='Opprettet', value=discord.utils.format_dt(kanal.created_at, style='F')) + embed.add_field(name='NSFW', value='Ja' if kanal.is_nsfw() else 'Nei') + embed.add_field(name='Saktemodus', value=f'Ja ({kanal.slowmode_delay} sekunder)' if kanal.slowmode_delay else 'Nei') + if kanal.category: + embed.add_field(name='Kategori', value=kanal.category.name) + embed.add_field(name=f'Antall med tilgang ({len(kanal.members)})', value=members) + embed = embed_templates.default_footer(interaction, embed) + await interaction.response.send_message(embed=embed) + + @app_commands.checks.bot_has_permissions(embed_links=True) + @app_commands.guild_only() + @app_commands.checks.cooldown(1, 2) + @guild_group.command(name="talekanal", description="Hent informasjon om en talekanal") + async def guild_voice_channel(self, interaction: discord.Interaction, kanal: discord.VoiceChannel): + embed = discord.Embed(color=interaction.guild.me.color, title=kanal.name, description=f'ID: {kanal.id}') + embed.set_author(name=kanal.guild.name, icon_url=kanal.guild.icon) + embed.add_field(name='Opprettet', value=discord.utils.format_dt(kanal.created_at, style='F')) + embed.add_field(name='Bitrate', value=f'{int(kanal.bitrate / 1000)}kbps') + embed.add_field(name='Maksgrense', value=f'{kanal.user_limit} personer' if kanal.user_limit != 0 else '∞ personer') + if kanal.category: + embed.add_field(name='Kategori', value=kanal.category.name) + embed.add_field(name='Antall koblet til', value=len(kanal.members)) + embed = embed_templates.default_footer(interaction, embed) + await interaction.response.send_message(embed=embed) + + # @app_commands.checks.bot_has_permissions(embed_links=True) + # @app_commands.guild_only() + # @app_commands.checks.cooldown(1, 2) + # @app_commands.command() + # async def emoji(self, interaction: discord.Interaction, emoji: discord.Emoji): + # """ + # Viser info om en CUSTOM emoji som tilhører serveren + # """ + # emoji = await emoji.guild.fetch_emoji(emoji.id) + # try: + # emoji_creator = f'{emoji.user.mention}\n{emoji.user.name}#{emoji.user.discriminator}' + # except AttributeError: + # emoji_creator = 'Jeg trenger `manage_emojis`-tillatelsen på serveren den er fra for å hente dette' + + # embed = discord.Embed(color=interaction.guild.me.color, title=emoji.name, description=f'ID: {emoji.id}') + # embed.set_author(name=emoji.guild.name, icon_url=emoji.guild.icon) + # embed.add_field(name='Opprettet', value=discord.utils.format_dt(emoji.created_at, style="F")) + # embed.add_field(name='Animert', value='Ja' if emoji.animated else 'Nei') + # embed.add_field(name='Lagt til av', value=emoji_creator) + # embed.set_image(url=emoji.url) + # embed_templates.default_footer(interaction, embed) + # await interaction.response.send_message(embed=embed) + + guild_oldest_group = app_commands.Group(name="eldst", description="Viser de eldste medlemmene på serveren", parent=guild_group) + + def __construct_oldest_embed(self, paginator: misc_utils.Paginator, page: list, embed: discord.Embed) -> discord.Embed: + """Constructs the embed for the oldest commands""" + embed.description = '\n'.join(page) + embed.set_footer(text=f'Side {paginator.current_page}/{paginator.total_page_count}') + return embed @commands.bot_has_permissions(embed_links=True) @commands.guild_only() - @commands.cooldown(1, 2, commands.BucketType.guild) - @commands.command(aliases=['guildboosters', 'serverboosters', 'boosts']) - async def boosters(self, ctx): - """ - Viser boosters i en guild - """ + @app_commands.checks.cooldown(1, 5) + @guild_oldest_group.command(name="lagd", description="Liste over de eldste brukerene på serveren basert på når de ble lagd") + async def guild_user_created_oldest(self, interaction: discord.Interaction): + # Sort members by creation date + members = sorted(interaction.guild.members, key=lambda m: m.created_at) - if len(ctx.guild.premium_subscribers) == 0: - embed = embed_templates.error_warning(ctx, text='Serveren har ikke noen boosts :(') - return await ctx.send(embed=embed) + # Create list of members with index, name#discriminator and creation date + members_formatted = list(map( + lambda m: f'**#{(m[0] + 1)}** {m[1].name}#{m[1].discriminator} - {discord.utils.format_dt(m[1].created_at, style="F")}', + enumerate(members) + )) - boosters = [] - premium_subscribers = sorted(ctx.guild.premium_subscribers, key=lambda m: m.premium_since) - for booster in premium_subscribers: - date = booster.premium_since.strftime('%d.%m.%Y %H:%M') - boosters.append(f'{booster.name}#{booster.discriminator} - {date}') - boosters = '\n'.join(boosters) + paginator = misc_utils.Paginator(members_formatted) + view = discord_utils.Scroller(paginator, self.__construct_oldest_embed) - embed = discord.Embed(color=ctx.me.color, description=boosters) - embed.set_author(name=f'Boosters ({ctx.guild.premium_subscription_count})', icon_url=ctx.guild.icon) - embed.set_footer(text=ctx.guild.name, icon_url=ctx.guild.icon) - await ctx.send(embed=embed) + # Send first page + embed = discord.Embed(color=interaction.guild.me.color, title='Eldste brukere på serveren basert på når de ble lagd') + embed = self.__construct_oldest_embed(paginator, paginator.get_current_page(), embed) + await interaction.response.send_message(embed=embed, view=view) @commands.bot_has_permissions(embed_links=True) @commands.guild_only() - @commands.cooldown(1, 2, commands.BucketType.guild) - @commands.command(aliases=['serverikon', 'servericon', 'guildicon', 'icon', 'guildikon']) - async def ikon(self, ctx): - """ - Viser ikonet til serveren du er i - """ + @app_commands.checks.cooldown(1, 5) + @guild_oldest_group.command(name="joined", description="Liste over de eldste brukerene på serveren basert på når de ble med") + async def guild_user_joined_oldest(self, interaction: discord.Interaction): + # Sort members by creation date + members = sorted(interaction.guild.members, key=lambda m: m.joined_at) - url = ctx.guild.icon + # Create list of members with index, name#discriminator and creation date + members_formatted = list(map( + lambda m: f'**#{(m[0] + 1)}** {m[1].name}#{m[1].discriminator} - {discord.utils.format_dt(m[1].joined_at, style="F")}', + enumerate(members) + )) - embed = discord.Embed(color=ctx.me.color, description=f'[Lenke]({url})') - embed.set_author(name=ctx.guild.name, icon_url=url) - embed.set_image(url=url) - embed = embed_templates.default_footer(ctx, embed) - await ctx.send(embed=embed) + paginator = misc_utils.Paginator(members_formatted) + view = discord_utils.Scroller(paginator, self.__construct_oldest_embed) - @commands.bot_has_permissions(embed_links=True) - @commands.guild_only() - @commands.cooldown(1, 2, commands.BucketType.guild) - @commands.command(aliases=['guildsplash', 'serversplash']) - async def splash(self, ctx): - """ - Viser invite splash til serveren - """ - - if not ctx.guild.discovery_splash: - embed = embed_templates.error_warning(ctx, text='Serveren har ikke en splash') - return await ctx.send(embed=embed) - - url = ctx.guild.discovery_splash - - embed = discord.Embed(color=ctx.me.color, description=f'[Lenke]({url})') - embed.set_author(name=ctx.guild.name, icon_url=ctx.guild.icon) - embed.set_image(url=url) - embed = embed_templates.default_footer(ctx, embed) - await ctx.send(embed=embed) - - @commands.bot_has_permissions(embed_links=True) - @commands.guild_only() - @commands.cooldown(1, 2, commands.BucketType.guild) - @commands.command(aliases=['guildbanner', 'serverbanner']) - async def banner(self, ctx): - """ - Viser invite splash til serveren - """ - - if not ctx.guild.banner: - embed = embed_templates.error_warning(ctx, text='Serveren har ikke et banner :(') - return await ctx.send(embed=embed) - - url = ctx.guild.banner - - embed = discord.Embed(color=ctx.me.color, description=f'[Lenke]({url})') - embed.set_author(name=ctx.guild.name, icon_url=ctx.guild.icon) - embed.set_image(url=url) - embed = embed_templates.default_footer(ctx, embed) - await ctx.send(embed=embed) - - @commands.bot_has_permissions(embed_links=True, external_emojis=True) - @commands.guild_only() - @commands.cooldown(1, 2, commands.BucketType.guild) - @commands.command(aliases=['userinfo', 'ui', 'brukerinfo', 'user']) - async def bruker(self, ctx, *, bruker: discord.Member = None): - """ - Viser info om en bruker - """ + # Send first page + embed = discord.Embed(color=interaction.guild.me.color, title='Eldste brukere på serveren basert på når de ble med') + embed = self.__construct_oldest_embed(paginator, paginator.get_current_page(), embed) + await interaction.response.send_message(embed=embed, view=view) + @app_commands.checks.bot_has_permissions(embed_links=True, external_emojis=True) + @app_commands.guild_only() + @app_commands.checks.cooldown(1, 2) + @user_group.command(name="info", description="Hent informasjon om en bruker") + async def user_info(self, interaction: discord.Interaction, *, bruker: discord.Member | None = None): if not bruker: - bruker = ctx.author + bruker = interaction.user + # Get device(s) that is currently used by the user app = '' if str(bruker.mobile_status) != 'offline': app += '📱 ' @@ -299,48 +428,28 @@ class Info(commands.Cog): if str(bruker.desktop_status) != 'offline': app += '💻' - join_index = sorted(ctx.guild.members, key=lambda m: m.joined_at).index(bruker) + 1 - creation_index = sorted(ctx.guild.members, key=lambda m: m.created_at).index(bruker) + 1 + # Get index of join, creation and/or boost date in comparison to other users in the guild + join_index = sorted(interaction.guild.members, key=lambda m: m.joined_at).index(bruker) + 1 + creation_index = sorted(interaction.guild.members, key=lambda m: m.created_at).index(bruker) + 1 if bruker.premium_since: - premium_index = sorted(ctx.guild.premium_subscribers, key=lambda m: m.premium_since).index(bruker) + 1 + premium_index = sorted(interaction.guild.premium_subscribers, key=lambda m: m.premium_since).index(bruker) + 1 - bruker_joined_date = bruker.joined_at.strftime('%d. %b. %Y - %H:%M') - bruker_created_date = bruker.created_at.strftime('%d. %b. %Y - %H:%M') - since_joined_days = (ctx.message.created_at - bruker.joined_at).days - since_created_days = (ctx.message.created_at - bruker.created_at).days - if since_created_days == 1: - since_created_days_string = 'dag' - else: - since_created_days_string = 'dager' - if since_joined_days == 1: - since_joined_days_string = 'dag' - else: - since_joined_days_string = 'dager' + # Creation/join date & days ago + created_timestamp = discord.utils.format_dt(bruker.created_at, style='F') + joined_timestamp = discord.utils.format_dt(bruker.joined_at, style='F') + joined_days = (interaction.created_at - bruker.joined_at).days + created_days = (interaction.created_at - bruker.created_at).days + # Boost date & days ago if bruker.premium_since: - premium_since = bruker.premium_since.strftime('%d. %b. %Y - %H:%M') - premium_since_days = (ctx.message.created_at - bruker.premium_since).days - if since_joined_days == 1: - premium_since_days_string = 'dag' - else: - premium_since_days_string = 'dager' + premium_since = discord.utils.format_dt(bruker.premium_since, style='F') + premium_since_days = (interaction.message.created_at - bruker.premium_since).days - roles = [] - for role in bruker.roles: - if role.name != '@everyone': - roles.append(role.name) - roles.reverse() - roles = ', '.join(roles) + # Get user roles + roles = self.__construct_role_string(bruker.roles) if len(roles) > 1024: - roles = f'Skriv `{self.bot.prefix}{ctx.command}` for å se rollene' - if roles == '': - roles = '**Ingen roller**' - - if str(bruker.color) != '#000000': - color = bruker.color - else: - color = discord.Colour(0x99AAB5) + roles = f'Skriv `{self.bot.prefix}{interaction.command}` for å se rollene' statuses = { 'online': f'{self.bot.emoji["online"]} Pålogget', @@ -350,332 +459,65 @@ class Info(commands.Cog): } status = statuses[str(bruker.status)] - embed = discord.Embed(color=color, description=f'{bruker.mention}\nID: {bruker.id}\n{status}\n{app}') + embed = discord.Embed(color=discord_utils.get_color(bruker), description=f'{bruker.mention}\nID: {bruker.id}\n{status}\n{app}') if bruker.display_name == bruker.name: embed.set_author(name=f'{bruker.name}#{bruker.discriminator}', icon_url=bruker.display_avatar) else: embed.set_author(name=f'{bruker.name}#{bruker.discriminator} | {bruker.display_name}', icon_url=bruker.display_avatar) embed.set_thumbnail(url=bruker.display_avatar) - embed.add_field(name='Opprettet', value=f'{bruker_created_date}\n{since_created_days} ' + - f'{since_created_days_string} siden') - embed.add_field(name='Ble med i serveren', value=f'{bruker_joined_date}\n{since_joined_days} ' + - f'{since_joined_days_string} siden') + embed.add_field(name='Opprettet', value=f'{created_timestamp}\n{created_days} ' + + f'{"dag" if created_days == 1 else "dager"} siden') + embed.add_field(name='Ble med i serveren', value=f'{joined_timestamp}\n{joined_days} ' + + f'{"dag" if joined_days == 1 else "dager"} siden') if bruker.premium_since: embed.add_field(name='Boost', value=f'{premium_since}\n{premium_since_days} ' + - f'{premium_since_days_string} siden\n' + + f'{"dag" if premium_since_days == 1 else "dager"} siden\n' + f'Booster #{premium_index} av serveren', inline=False) - embed.add_field(name=f'Roller ({len(bruker.roles) - 1})', value=roles, inline=False) + embed.add_field(name=f'Roller ({len(bruker.roles)})', value=roles, inline=False) embed.set_footer(text=f'#{join_index} Medlem av serveren | #{creation_index} Eldste brukeren på serveren') + # Playing activity if bruker.activities: games = '' for activity in bruker.activities: games += f'{activity.name}\n' if games: embed.add_field(name='Spiller', value=games, inline=False) - await ctx.send(embed=embed) - @commands.bot_has_permissions(embed_links=True) - @commands.guild_only() - @commands.cooldown(1, 2, commands.BucketType.guild) - @commands.command(aliases=['userroles']) - async def brukerroller(self, ctx, bruker: discord.Member = None): - """ - Viser rollene til en bruker - """ + await interaction.response.send_message(embed=embed) + @app_commands.checks.bot_has_permissions(embed_links=True) + @app_commands.guild_only() + @app_commands.checks.cooldown(1, 2) + @user_group.command(name="roller", description="Hent roller til en bruker") + async def user_roles(self, interaction: discord.Interaction, bruker: discord.Member | None = None): if not bruker: - bruker = ctx.author + bruker = interaction.user - roles = [] - for role in bruker.roles: - if role.name != '@everyone': - roles.append(role.name) - roles.reverse() - roles = ', '.join(roles) + roles = self.__construct_role_string(bruker.roles) + # If the list of roles is too long, send it as a file if len(roles) > 2048: - txt_file = discord.File(f'./assets/temp/{ctx.guild.id}_{ctx.author.id}_roles.txt') - await ctx.send(file=txt_file) - - with misc_utils.ignore_exception(OSError): - remove(f'./assets/temp/{ctx.guild.id}_{ctx.author.id}_roles.txt') - - return - - if roles == '': - roles = '**Ingen roller**' - - if str(bruker.color) != '#000000': - color = bruker.color + self.__send_as_txt_file(interaction, f'./assets/temp/{interaction.guild.id}_{interaction.user.id}_roles.txt', roles) else: - color = discord.Colour(0x99AAB5) - - embed = discord.Embed(color=color, description=roles) - embed.set_author(name=f'Roller ({len(bruker.roles) - 1})', icon_url=bruker.display_avatar) - embed.set_footer(text=f'{bruker.name}#{bruker.discriminator}', icon_url=bruker.display_avatar) - await ctx.send(embed=embed) - - @commands.bot_has_permissions(embed_links=True) - @commands.cooldown(1, 2, commands.BucketType.guild) - @commands.command(aliases=['profilbilde', 'brukeravatar', 'useravatar']) - async def avatar(self, ctx, bruker: discord.Member = None): - """ - Viser avataren til en bruker - """ + embed = discord.Embed(color=discord_utils.get_color(bruker), description=roles) + embed.set_author(name=f'Roller ({len(bruker.roles)})', icon_url=bruker.display_avatar) + embed.set_footer(text=f'{bruker.name}#{bruker.discriminator}', icon_url=bruker.display_avatar) + await interaction.response.send_message(embed=embed) + @app_commands.checks.bot_has_permissions(embed_links=True) + @app_commands.checks.cooldown(1, 2) + @user_group.command(name="avatar", description="Hent avatar til en bruker") + async def user_avatar(self, interaction: discord.Interaction, bruker: discord.User | discord.Member | None = None): if not bruker: - bruker = ctx.author + bruker = interaction.user - if str(bruker.color) != '#000000': - color = bruker.color - else: - color = discord.Colour(0x99AAB5) - - url = bruker.display_avatar - - embed = discord.Embed(color=color, description=f'[Lenke]({url})') - embed.set_author(name=f'{bruker.name}#{bruker.discriminator}', icon_url=url) - embed.set_image(url=url) - embed = embed_templates.default_footer(ctx, embed) - await ctx.send(embed=embed) - - @commands.bot_has_permissions(embed_links=True) - @commands.guild_only() - @commands.cooldown(1, 2, commands.BucketType.guild) - @commands.command(aliases=['roleinfo', 'rolleinfo']) - async def rolle(self, ctx, *, rolle: discord.Role): - """ - Viser info om en rolle - """ - - if rolle.name == '@everyone': - embed = embed_templates.fatal(ctx, text='Skriv inn en annen rolle enn @everyone') - return await ctx.send(embed=embed) - - if str(rolle.color) != '#000000': - color = rolle.color - else: - color = discord.Colour(0x99AAB5) - - if rolle.mentionable: - mentionable = 'Ja' - else: - mentionable = 'Nei' - - if rolle.hoist: - hoisted = 'Ja' - else: - hoisted = 'Nei' - - rolle_created_date = rolle.created_at.strftime('%d. %b. %Y - %H:%M') - since_created_days = (ctx.message.created_at - rolle.created_at).days - - if since_created_days == 1: - since_created_days_string = 'dag' - else: - since_created_days_string = 'dager' - - members = [] - for member in rolle.members: - members.append(f'{member.name}#{member.discriminator}') - members = ', '.join(members) - - if len(members) > 1024: - members = 'For mange medlemmer for å vise her' - if len(members) == 0: - members = '**Ingen**' - - permissions = ', '.join([permission for permission, value in iter(rolle.permissions) if value is True]) - - embed = discord.Embed(title=rolle.name, description=f'{rolle.mention}\n**ID:** {rolle.id}', color=color) - embed.set_author(name=rolle.guild.name, icon_url=rolle.guild.icon) - embed.add_field(name='Fargekode', value=str(rolle.color)) - embed.add_field(name='Opprettet', value=f'{rolle_created_date}\n{since_created_days} ' + - f'{since_created_days_string} siden') - embed.add_field(name='Posisjon', value=rolle.position) - embed.add_field(name='Nevnbar', value=mentionable) - embed.add_field(name='Vises separat i medlemsliste', value=hoisted) - if permissions: - embed.add_field(name='Tillatelser', value=permissions, inline=False) - embed.add_field(name=f'Brukere med rollen ({len(rolle.members)})', value=members, inline=False) - embed = embed_templates.default_footer(ctx, embed) - await ctx.send(embed=embed) - - @commands.bot_has_permissions(embed_links=True) - @commands.guild_only() - @commands.cooldown(1, 5, commands.BucketType.guild) - @commands.command(aliases=['kanal', 'channel', 'channelinfo', 'textchannel']) - async def tekstkanal(self, ctx, *, kanal: discord.TextChannel): - """ - Viser info om en tekstkanal - """ - - nsfw = 'Nei' - if kanal.is_nsfw(): - nsfw = 'Ja' - - if kanal.slowmode_delay == 0: - saktemodus = 'Nei' - else: - saktemodus = f'Ja ({kanal.slowmode_delay} sekunder)' - - description = '**Ingen**' - if kanal.topic: - description = kanal.topic - - members = [] - for member in kanal.members: - members.append(f'{member.name}#{member.discriminator}') - members = ', '.join(members) - if len(members) > 1024: - members = 'For mange for å vise her' - - embed = discord.Embed(color=ctx.me.color, title=kanal.name, description=f'{kanal.mention}\nID: {kanal.id}') - embed.set_author(name=kanal.guild.name, icon_url=kanal.guild.icon) - embed.add_field(name='Beskrivelse', value=description, inline=False) - embed.add_field(name='Opprettet', value=kanal.created_at.strftime('%d. %b. %Y - %H:%M')) - embed.add_field(name='NSFW', value=nsfw) - embed.add_field(name='Saktemodus', value=saktemodus) - if kanal.category: - embed.add_field(name='Kategori', value=kanal.category.name) - embed.add_field(name=f'Antall med tilgang ({len(kanal.members)})', value=members) - embed = embed_templates.default_footer(ctx, embed) - await ctx.send(embed=embed) - - @commands.bot_has_permissions(embed_links=True) - @commands.guild_only() - @commands.cooldown(1, 5, commands.BucketType.guild) - @commands.command(aliases=['talekanalinfo', 'voicechannel']) - async def talekanal(self, ctx, *, kanal: discord.VoiceChannel): - """ - Viser info om en talekanal - """ - - if kanal.user_limit == 0: - limit = '∞ personer' - else: - limit = f'{kanal.user_limit} personer' - - embed = discord.Embed(color=ctx.me.color, title=kanal.name, description=f'ID: {kanal.id}') - embed.set_author(name=kanal.guild.name, icon_url=kanal.guild.icon) - embed.add_field(name='Opprettet', value=kanal.created_at.strftime('%d. %b. %Y - %H:%M')) - embed.add_field(name='Bitrate', value=f'{int(kanal.bitrate / 1000)}kbps') - embed.add_field(name='Maksgrense', value=limit) - if kanal.category: - embed.add_field(name='Kategori', value=kanal.category.name) - embed.add_field(name='Antall koblet til', value=len(kanal.members)) - embed = embed_templates.default_footer(ctx, embed) - await ctx.send(embed=embed) - - @commands.bot_has_permissions(embed_links=True) - @commands.guild_only() - @commands.cooldown(1, 5, commands.BucketType.guild) - @commands.command(aliases=['emote']) - async def emoji(self, ctx, emoji: discord.Emoji): - """ - Viser info om en CUSTOM emoji som tilhører serveren - """ - - animated = 'Nei' - if emoji.animated: - animated = 'Ja' - - emoji = await emoji.guild.fetch_emoji(emoji.id) - try: - emoji_creator = f'{emoji.user.mention}\n{emoji.user.name}#{emoji.user.discriminator}' - except AttributeError: - emoji_creator = 'Jeg trenger `manage_emojis`-tillatelsen på serveren den er fra for å hente dette' - - embed = discord.Embed(color=ctx.me.color, title=emoji.name, description=f'ID: {emoji.id}') - embed.set_author(name=emoji.guild.name, icon_url=emoji.guild.icon) - embed.add_field(name='Opprettet', value=emoji.created_at.strftime('%d. %b. %Y - %H:%M')) - embed.add_field(name='Animert', value=animated) - embed.add_field(name='Lagt til av', value=emoji_creator) - embed.set_image(url=emoji.url) - embed = embed_templates.default_footer(ctx, embed) - await ctx.send(embed=embed) - - @commands.bot_has_permissions(embed_links=True) - @commands.guild_only() - @commands.cooldown(1, 5, commands.BucketType.guild) - @commands.command(aliases=['serveremoji', 'serveremotes']) - async def guildemoji(self, ctx): - """ - Viser alle emoji som serveren har - """ - - embed = discord.Embed(colour=ctx.me.color) - embed.set_author(name=ctx.guild.name, icon_url=ctx.guild.icon) - - emoji_string = '' - for emoji in ctx.guild.emojis: - if len(emoji_string) > 2000: - embed.description = emoji_string - await ctx.send(embed=embed) - emoji_string = '' - emoji_string += f'{emoji} ' - - embed.description = emoji_string - await ctx.send(embed=embed) - - @commands.bot_has_permissions(embed_links=True) - @commands.guild_only() - @commands.cooldown(1, 5, commands.BucketType.guild) - @commands.command(aliases=['oldest']) - async def eldst(self, ctx, side=0): - """ - Liste over de eldste brukerene på serveren - """ - - members = sorted(ctx.guild.members, key=lambda m: m.created_at) - - formatted_members = [] - for member in members: - member_created_date = member.created_at.strftime('%d. %b. %Y - %H:%M') - member_index = (members.index(member) + 1) - formatted_members.append( - f'**#{member_index}** {member.name}#{member.discriminator} - {member_created_date}' - ) - - page_data = misc_utils.paginator(formatted_members, int(side)) - side = page_data['page'] - pagecount = page_data['pagecount'] - members = '\n'.join(page_data['page_content']) - - embed = discord.Embed(color=ctx.me.color) - embed.add_field(name='Eldste Discordbrukerene på serveren', value=members) - embed.set_footer(text=f'Side: {side}/{pagecount}') - await ctx.send(embed=embed) - - @commands.bot_has_permissions(embed_links=True) - @commands.guild_only() - @commands.cooldown(1, 5, commands.BucketType.guild) - @commands.command() - async def joinorder(self, ctx, side=0): - """ - Liste over de første medlemmene av serveren - """ - - members = sorted(ctx.guild.members, key=lambda m: m.joined_at) - - formatted_members = [] - for member in members: - member_joined_date = member.joined_at.strftime('%d. %b. %Y - %H:%M') - member_index = (members.index(member) + 1) - formatted_members.append(f'**#{member_index}** {member.name}#{member.discriminator} - {member_joined_date}') - - page_data = misc_utils.paginator(formatted_members, int(side)) - side = page_data['page'] - pagecount = page_data['pagecount'] - members = '\n'.join(page_data['page_content']) - - embed = discord.Embed(color=ctx.me.color) - embed.set_author(name=ctx.guild.name, icon_url=ctx.guild.icon) - embed.add_field(name='Første Discordbrukerene på serveren', value=members) - embed.set_footer(text=f'Side: {side}/{pagecount}') - await ctx.send(embed=embed) + embed = discord.Embed(color=discord_utils.get_color(bruker), description=f'[Lenke]({bruker.display_avatar})') + embed.set_author(name=f'{bruker.name}#{bruker.discriminator}', icon_url=bruker.display_avatar) + embed.set_image(url=bruker.display_avatar) + embed = embed_templates.default_footer(interaction, embed) + await interaction.response.send_message(embed=embed) async def setup(bot):