80 lines
2.7 KiB
Python
80 lines
2.7 KiB
Python
|
from discord import Forbidden, HTTPException, InvalidData, NotFound
|
||
|
from redbot.core.bot import Red
|
||
|
|
||
|
from aurora.models.base import AuroraBaseModel, AuroraGuildModel
|
||
|
|
||
|
|
||
|
class PartialUser(AuroraBaseModel):
|
||
|
id: int
|
||
|
username: str
|
||
|
discriminator: int
|
||
|
|
||
|
@property
|
||
|
def name(self):
|
||
|
return f"{self.username}#{self.discriminator}" if self.discriminator != 0 else self.username
|
||
|
|
||
|
def __str__(self):
|
||
|
return self.name
|
||
|
|
||
|
@classmethod
|
||
|
async def from_id(cls, bot: Red, user_id: int) -> "PartialUser":
|
||
|
user = bot.get_user(user_id)
|
||
|
if not user:
|
||
|
try:
|
||
|
user = await bot.fetch_user(user_id)
|
||
|
return cls(bot=bot, id=user.id, username=user.name, discriminator=user.discriminator)
|
||
|
except NotFound:
|
||
|
return cls(bot=bot, id=user_id, username="Deleted User", discriminator=0)
|
||
|
return cls(bot=bot, id=user.id, username=user.name, discriminator=user.discriminator)
|
||
|
|
||
|
|
||
|
class PartialChannel(AuroraGuildModel):
|
||
|
id: int
|
||
|
name: str
|
||
|
|
||
|
@property
|
||
|
def mention(self):
|
||
|
if self.name in ["Deleted Channel", "Forbidden Channel"]:
|
||
|
return self.name
|
||
|
return f"<#{self.id}>"
|
||
|
|
||
|
def __str__(self):
|
||
|
return self.mention
|
||
|
|
||
|
@classmethod
|
||
|
async def from_id(cls, bot: Red, channel_id: int) -> "PartialChannel":
|
||
|
channel = bot.get_channel(channel_id)
|
||
|
if not channel:
|
||
|
try:
|
||
|
channel = await bot.fetch_channel(channel_id)
|
||
|
return cls(bot=bot, guild_id=channel.guild.id, id=channel.id, username=channel.name)
|
||
|
except (NotFound, InvalidData, HTTPException, Forbidden) as e:
|
||
|
if e == Forbidden:
|
||
|
return cls(bot=bot, guild_id=0, id=channel_id, name="Forbidden Channel")
|
||
|
return cls(bot=bot, guild_id=0, id=channel_id, name="Deleted Channel")
|
||
|
return cls(bot=bot, guild_id=channel.guild.id, id=channel.id, username=channel.name)
|
||
|
|
||
|
class PartialRole(AuroraGuildModel):
|
||
|
id: int
|
||
|
name: str
|
||
|
|
||
|
@property
|
||
|
def mention(self):
|
||
|
if self.name in ["Deleted Role", "Forbidden Role"]:
|
||
|
return self.name
|
||
|
return f"<@&{self.id}>"
|
||
|
|
||
|
def __str__(self):
|
||
|
return self.mention
|
||
|
|
||
|
@classmethod
|
||
|
async def from_id(cls, bot: Red, guild_id: int, role_id: int) -> "PartialRole":
|
||
|
try:
|
||
|
guild = await bot.fetch_guild(guild_id, with_counts=False)
|
||
|
except (Forbidden, HTTPException):
|
||
|
return cls(bot=bot, guild_id=guild_id, id=role_id, name="Forbidden Role")
|
||
|
role = guild.get_role(role_id)
|
||
|
if not role:
|
||
|
return cls(bot=bot, guild_id=guild_id, id=role_id, name="Deleted Role")
|
||
|
return cls(bot=bot, guild_id=guild_id, id=role.id, name=role.name)
|