wdiscordbotserver/cogs/userinfo.py

128 lines
6.2 KiB
Python

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
# Status
if isinstance(member, discord.Member):
status = str(member.status).capitalize()
else:
status = "Unknown"
# Devices (accurate for discord.py 2.3+)
device_map = {
"desktop": "Desktop",
"mobile": "Mobile",
"web": "Web"
}
devices = set()
if hasattr(member, "devices") and member.devices:
for dev in member.devices:
devices.add(device_map.get(str(dev), str(dev).capitalize()))
else:
# Fallback for older discord.py
if hasattr(member, "desktop_status") and member.desktop_status != discord.Status.offline:
devices.add("Desktop")
if hasattr(member, "mobile_status") and member.mobile_status != discord.Status.offline:
devices.add("Mobile")
if hasattr(member, "web_status") and member.web_status != discord.Status.offline:
devices.add("Web")
device_str = ", ".join(devices) if devices else "Offline/Unknown"
# Activities (show all, including custom, game, music, etc.)
activities = []
if hasattr(member, "activities") and 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.CustomActivity):
if activity.name:
activities.append(f"Custom Status: {activity.name}")
elif isinstance(activity, discord.Activity):
# General fallback for other activity types
act_type = getattr(activity.type, 'name', str(activity.type)).title()
activities.append(f"{act_type}: {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"
# Badges
badge_map = {
"staff": "Discord Staff 🛡️",
"partner": "Partner ⭐",
"hypesquad": "HypeSquad Event 🏆",
"bug_hunter": "Bug Hunter 🐛",
"hypesquad_bravery": "Bravery 🦁",
"hypesquad_brilliance": "Brilliance 🧠",
"hypesquad_balance": "Balance ⚖️",
"early_supporter": "Early Supporter 🕰️",
"team_user": "Team User 👥",
"system": "System 🤖",
"bug_hunter_level_2": "Bug Hunter Level 2 🐞",
"verified_bot": "Verified Bot 🤖",
"verified_developer": "Early Verified Bot Dev 🛠️",
"discord_certified_moderator": "Certified Mod 🛡️",
"active_developer": "Active Developer 🧑‍💻"
}
user_flags = getattr(user_obj, 'public_flags', None)
badges = []
if user_flags:
for flag in badge_map:
if getattr(user_flags, flag, False):
badges.append(badge_map[flag])
badge_str = ", ".join(badges) if badges else ""
if member.id == 1141746562922459136:
badge_str = (badge_str + ", " if badge_str else "") + "Bot Developer 🛠️"
# 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 badge_str:
embed.add_field(name="Badge", value=badge_str, inline=False)
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)
# Account created
embed.add_field(name="Account Created", value=member.created_at.strftime('%Y-%m-%d %H:%M:%S UTC'), 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 UTC'), 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))