Browse Source

Implement channel affinities

pull/10109/head
Dolfies 4 months ago
parent
commit
4cbd9dde57
  1. 55
      discord/affinity.py
  2. 23
      discord/client.py
  3. 3
      discord/http.py
  4. 9
      discord/types/user.py
  5. 3
      docs/api.rst

55
discord/affinity.py

@ -29,11 +29,16 @@ from .mixins import Hashable
if TYPE_CHECKING: if TYPE_CHECKING:
from .state import ConnectionState from .state import ConnectionState
from .types.user import UserAffinity as UserAffinityPayload, GuildAffinity as GuildAffinityPayload from .types.user import (
UserAffinity as UserAffinityPayload,
GuildAffinity as GuildAffinityPayload,
ChannelAffinity as ChannelAffinityPayload,
)
__all__ = ( __all__ = (
'UserAffinity', 'UserAffinity',
'GuildAffinity', 'GuildAffinity',
'ChannelAffinity',
) )
@ -137,3 +142,51 @@ class GuildAffinity(Hashable):
def guild(self): def guild(self):
"""Optional[:class:`Guild`]: The guild being compared.""" """Optional[:class:`Guild`]: The guild being compared."""
return self._state._get_guild(self.guild_id) return self._state._get_guild(self.guild_id)
class ChannelAffinity(Hashable):
"""Represents a user's affinity with a channel.
.. container:: operations
.. describe:: x == y
Checks if two affinities are equal.
.. describe:: x != y
Checks if two affinities are not equal.
.. describe:: hash(x)
Return the affinity's hash.
.. versionadded:: 2.1
Attributes
----------
channel_id: :class:`int`
The ID of the channel being compared.
affinity: :class:`float`
The affinity score.
"""
__slots__ = ('_state', 'channel_id', 'affinity')
def __init__(self, *, state: ConnectionState, data: ChannelAffinityPayload):
self._state = state
self.channel_id = int(data['channel_id'])
self.affinity = data['affinity']
def __repr__(self) -> str:
return f'<ChannelAffinity guild_id={self.channel_id} affinity={self.affinity}>'
@property
def id(self) -> int:
""":class:`int`: The ID of the channel being compared."""
return self.channel_id
@property
def channel(self):
"""Optional[Union[:class:`.abc.GuildChannel`, :class:`.Thread`, :class:`.abc.PrivateChannel`]]: The channel being compared."""
return self._state.get_channel(self.channel_id)

23
discord/client.py

@ -5114,6 +5114,29 @@ class Client:
data = await state.http.get_guild_affinities() data = await state.http.get_guild_affinities()
return [GuildAffinity(data=d, state=state) for d in data['guild_affinities']] return [GuildAffinity(data=d, state=state) for d in data['guild_affinities']]
async def channel_affinities(self) -> List[ChannelAffinity]:
"""|coro|
Retrieves the channel affinities for the current user.
Channel affinities are the channels you interact with most frecently.
.. versionadded:: 2.1
Raises
------
HTTPException
Retrieving the channel affinities failed.
Returns
-------
List[:class:`.ChannelAffinity`]
The channel affinities.
"""
state = self._connection
data = await state.http.get_channel_affinities()
return [ChannelAffinity(data=d, state=state) for d in data['channel_affinities']]
async def join_active_developer_program(self, *, application: Snowflake, channel: Snowflake) -> int: async def join_active_developer_program(self, *, application: Snowflake, channel: Snowflake) -> int:
"""|coro| """|coro|

3
discord/http.py

@ -4570,6 +4570,9 @@ class HTTPClient:
def get_guild_affinities(self) -> Response[user.GuildAffinities]: def get_guild_affinities(self) -> Response[user.GuildAffinities]:
return self.request(Route('GET', '/users/@me/affinities/guilds')) return self.request(Route('GET', '/users/@me/affinities/guilds'))
def get_channel_affinities(self) -> Response[user.ChannelAffinities]:
return self.request(Route('GET', '/users/@me/affinities/channels'))
def get_country_code(self) -> Response[subscriptions.CountryCode]: def get_country_code(self) -> Response[subscriptions.CountryCode]:
return self.request(Route('GET', '/users/@me/billing/country-code')) return self.request(Route('GET', '/users/@me/billing/country-code'))

9
discord/types/user.py

@ -230,6 +230,15 @@ class GuildAffinities(TypedDict):
guild_affinities: List[GuildAffinity] guild_affinities: List[GuildAffinity]
class ChannelAffinity(TypedDict):
channel_id: Snowflake
affinity: float
class ChannelAffinities(TypedDict):
channel_affinities: List[ChannelAffinity]
class Note(TypedDict): class Note(TypedDict):
note: str note: str
user_id: Snowflake user_id: Snowflake

3
docs/api.rst

@ -7044,6 +7044,9 @@ Affinity
.. autoclass:: GuildAffinity() .. autoclass:: GuildAffinity()
:members: :members:
.. autoclass:: ChannelAffinity()
:members:
Billing Billing
~~~~~~~ ~~~~~~~

Loading…
Cancel
Save