diff --git a/cogs/userinfo.py b/cogs/userinfo.py new file mode 100644 index 0000000..276e158 --- /dev/null +++ b/cogs/userinfo.py @@ -0,0 +1,86 @@ +import discord +from discord.ext import commands +from discord import app_commands +from typing import Optional + +class UserInfoCog(commands.Cog): + def __init__(self, bot: commands.Bot): + self.bot = bot + + @app_commands.command(name="aboutuser", description="Display info about a user or yourself.") + @app_commands.describe(user="The user to get info about (optional)") + async def aboutuser(self, interaction: discord.Interaction, user: Optional[discord.Member] = None): + member = user or interaction.user + # Fetch up-to-date member info + if interaction.guild: + member = interaction.guild.get_member(member.id) or member + # Fetch user object for banner/profile + user_obj = member._user if hasattr(member, '_user') else member + # Banner fetching (API call) + banner_url = None + try: + user_obj = await self.bot.fetch_user(member.id) + if user_obj.banner: + banner_url = user_obj.banner.url + except Exception: + pass + # Devices + if isinstance(member, discord.Member): + status = str(member.status).title() + devices = [] + if hasattr(member, "devices"): + for dev in getattr(member, "devices", []): + devices.append(str(dev).title()) + else: + # Fallback for older discord.py + if member.desktop_status != discord.Status.offline: + devices.append("Desktop") + if member.mobile_status != discord.Status.offline: + devices.append("Mobile") + if member.web_status != discord.Status.offline: + devices.append("Web") + device_str = ", ".join(devices) if devices else "Unknown" + else: + status = "Unknown" + device_str = "Unknown" + # Activities + activities = [] + if hasattr(member, "activities"): + for activity in member.activities: + if isinstance(activity, discord.Game): + activities.append(f"Playing {activity.name}") + elif isinstance(activity, discord.Spotify): + activities.append(f"Listening to {activity.title} by {', '.join(activity.artists)}") + elif isinstance(activity, discord.Activity): + activities.append(f"{activity.type.name.title()}: {activity.name}") + activity_str = ", ".join(activities) if activities else "None" + # Roles + if isinstance(member, discord.Member) and interaction.guild: + roles = [role.mention for role in member.roles if role != interaction.guild.default_role] + roles_str = ", ".join(roles) if roles else "None" + else: + roles_str = "None" + # Embed + embed = discord.Embed( + title=f"User Info: {member.display_name}", + color=member.color if hasattr(member, 'color') else discord.Color.blurple(), + description=f"Profile of {member.mention}" + ) + if banner_url: + embed.set_image(url=banner_url) + embed.set_thumbnail(url=member.display_avatar.url) + embed.add_field(name="Nickname", value=member.nick or "None", inline=True) + embed.add_field(name="Username", value=f"{member.name}#{member.discriminator}", inline=True) + embed.add_field(name="User ID", value=member.id, inline=True) + embed.add_field(name="Status", value=status, inline=True) + embed.add_field(name="Device", value=device_str, inline=True) + embed.add_field(name="Activity", value=activity_str, inline=True) + embed.add_field(name="Roles", value=roles_str, inline=False) + embed.add_field(name="Account Created", value=member.created_at.strftime('%Y-%m-%d %H:%M:%S'), inline=True) + if hasattr(member, 'joined_at') and member.joined_at: + embed.add_field(name="Joined Server", value=member.joined_at.strftime('%Y-%m-%d %H:%M:%S'), inline=True) + embed.set_footer(text=f"Requested by {interaction.user.display_name}", icon_url=interaction.user.display_avatar.url) + await interaction.response.send_message(embed=embed) + +async def setup(bot: commands.Bot): + await bot.add_cog(UserInfoCog(bot))