35 lines
1.2 KiB
Python
35 lines
1.2 KiB
Python
|
|
"""
|
||
|
|
Utilities for command parsing and common operations
|
||
|
|
"""
|
||
|
|
|
||
|
|
import discord
|
||
|
|
|
||
|
|
async def parse_user_mention(bot, target_mention, message):
|
||
|
|
"""
|
||
|
|
Parse a user mention, username, or ID to get the user ID and member object.
|
||
|
|
Returns (user_id, member) or (None, None) if not found.
|
||
|
|
"""
|
||
|
|
if target_mention.startswith('<@') and target_mention.endswith('>'):
|
||
|
|
user_id = int(target_mention[2:-1]) if not target_mention.startswith('<@!') else int(target_mention[3:-1])
|
||
|
|
elif target_mention.startswith('@'):
|
||
|
|
# Handle @username
|
||
|
|
username = target_mention[1:].lower()
|
||
|
|
member = discord.utils.find(lambda m: username in m.name.lower() or username in m.display_name.lower(), message.guild.members)
|
||
|
|
if not member:
|
||
|
|
return None, None
|
||
|
|
user_id = member.id
|
||
|
|
else:
|
||
|
|
try:
|
||
|
|
user_id = int(target_mention)
|
||
|
|
except ValueError:
|
||
|
|
return None, None
|
||
|
|
|
||
|
|
member = message.guild.get_member(user_id)
|
||
|
|
if not member:
|
||
|
|
try:
|
||
|
|
user = await bot.fetch_user(user_id)
|
||
|
|
return user_id, None # User exists but not in guild
|
||
|
|
except discord.NotFound:
|
||
|
|
return None, None
|
||
|
|
return user_id, member
|