4 changed files with 178 additions and 163 deletions
@ -0,0 +1,145 @@ |
|||
""" |
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2021-present Dolfies |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a |
|||
copy of this software and associated documentation files (the "Software"), |
|||
to deal in the Software without restriction, including without limitation |
|||
the rights to use, copy, modify, merge, publish, distribute, sublicense, |
|||
and/or sell copies of the Software, and to permit persons to whom the |
|||
Software is furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in |
|||
all copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
|||
DEALINGS IN THE SOFTWARE. |
|||
""" |
|||
|
|||
from __future__ import annotations |
|||
|
|||
from typing import List, Optional, Protocol, TYPE_CHECKING |
|||
|
|||
from .flags import PrivateUserFlags |
|||
from .member import Member |
|||
from .user import Note, User |
|||
from .utils import parse_time |
|||
|
|||
if TYPE_CHECKING: |
|||
from datetime import datetime |
|||
|
|||
from .guild import Guild |
|||
from .state import ConnectionState |
|||
|
|||
|
|||
class Profile: |
|||
"""Represents a Discord profile. |
|||
|
|||
Attributes |
|||
---------- |
|||
bio: Optional[:class:`str`] |
|||
The user's "about me" field. Could be ``None``. |
|||
premium_since: Optional[:class:`datetime.datetime`] |
|||
An aware datetime object that specifies how long a user has been premium (had Nitro). |
|||
``None`` if the user is not a premium user. |
|||
boosting_since: Optional[:class:`datetime.datetime`] |
|||
An aware datetime object that specifies when a user first boosted a guild. |
|||
connected_accounts: Optional[List[:class:`dict`]] |
|||
The connected accounts that show up on the profile. |
|||
These are currently just the raw json, but this will change in the future. |
|||
note: :class:`Note` |
|||
Represents the note on the profile. |
|||
mutual_guilds: Optional[List[:class:`Guild`]] |
|||
A list of guilds that you share with the user. |
|||
``None`` if you didn't fetch mutuals. |
|||
mutual_friends: Optional[List[:class:`User`]] |
|||
A list of friends that you share with the user. |
|||
``None`` if you didn't fetch mutuals. |
|||
""" |
|||
|
|||
if TYPE_CHECKING: |
|||
id: int |
|||
_state: ConnectionState |
|||
|
|||
def __init__(self, **kwargs) -> None: # TODO: type data |
|||
data = kwargs.pop('data') |
|||
user = data['user'] |
|||
|
|||
if (member := data.get('guild_member')) is not None: |
|||
member['user'] = user |
|||
kwargs['data'] = member |
|||
else: |
|||
kwargs['data'] = user |
|||
|
|||
super().__init__(**kwargs) |
|||
|
|||
self._flags: int = user.pop('flags', 0) |
|||
self.bio: Optional[str] = user.pop('bio') or None |
|||
self.note: Note = Note(kwargs['state'], self.id, user=self) |
|||
|
|||
self.premium_since: Optional[datetime] = parse_time(data['premium_since']) |
|||
self.boosting_since: Optional[datetime] = parse_time(data['premium_guild_since']) |
|||
self.connected_accounts: List[dict] = data['connected_accounts'] # TODO: parse these |
|||
|
|||
self.mutual_guilds: Optional[List[Guild]] = self._parse_mutual_guilds(data.get('mutual_guilds')) |
|||
self.mutual_friends: Optional[List[User]] = self._parse_mutual_friends(data.get('mutual_friends')) |
|||
|
|||
def _parse_mutual_guilds(self, mutual_guilds) -> Optional[List[Guild]]: |
|||
if mutual_guilds is None: |
|||
return |
|||
|
|||
state = self._state |
|||
|
|||
def get_guild(guild) -> Optional[Guild]: |
|||
return state._get_guild(int(guild['id'])) |
|||
|
|||
# Potential data loss if the gateway is not connected |
|||
return list(filter(None, map(get_guild, mutual_guilds))) |
|||
|
|||
def _parse_mutual_friends(self, mutual_friends) -> Optional[List[User]]: |
|||
if mutual_friends is None: |
|||
return |
|||
|
|||
state = self._state |
|||
|
|||
state = self._state |
|||
return [state.store_user(friend) for friend in mutual_friends] |
|||
|
|||
@property |
|||
def flags(self) -> PrivateUserFlags: |
|||
""":class:`PrivateUserFlags`: The flags the user has.""" |
|||
return PrivateUserFlags._from_value(self._flags) |
|||
|
|||
@property |
|||
def premium(self) -> bool: |
|||
""":class:`bool`: Indicates if the user is a premium user. |
|||
|
|||
There is an alias for this named :attr:`nitro`. |
|||
""" |
|||
return self.premium_since is not None |
|||
|
|||
@property |
|||
def nitro(self) -> bool: |
|||
""":class:`bool`: Indicates if the user is a premium user. |
|||
|
|||
This is an alias for :attr:`premium`. |
|||
""" |
|||
return self.premium |
|||
|
|||
class UserProfile(Profile, User): |
|||
def __repr__(self) -> str: |
|||
return f'<UserProfile id={self.id} name={self.name!r} discriminator={self.discriminator!r} bot={self.bot} system={self.system} premium={self.premium}>' |
|||
|
|||
|
|||
class MemberProfile(Profile, Member): |
|||
def __repr__(self) -> str: |
|||
return ( |
|||
f'<MemberProfile id={self._user.id} name={self._user.name!r} discriminator={self._user.discriminator!r}' |
|||
f' bot={self._user.bot} nick={self.nick!r} premium={self.premium} guild={self.guild!r}>' |
|||
) |
Loading…
Reference in new issue