Browse Source

Fix thread events, add a missing thread field, fix reason not being sent when editing threads

pull/10109/head
dolfies 3 years ago
parent
commit
627635cbc3
  1. 4
      discord/guild.py
  2. 8
      discord/state.py
  3. 26
      discord/threads.py
  4. 2
      discord/types/threads.py

4
discord/guild.py

@ -320,7 +320,8 @@ class Guild(Hashable):
'_stage_instances',
'_threads',
'_presence_count',
'_subscribing'
'_subscribing',
'_threads_synced',
)
_PREMIUM_GUILD_LIMITS: ClassVar[Dict[Optional[int], _GuildLimit]] = {
@ -341,6 +342,7 @@ class Guild(Hashable):
self._state: ConnectionState = state
self.notification_settings: Optional[GuildSettings] = None
self.command_counts: Optional[CommandCounts] = None
self._threads_synced = False
self._from_data(data)
# Get it running

8
discord/state.py

@ -1031,7 +1031,7 @@ class ConnectionState:
thread = Thread(guild=guild, state=self, data=data)
guild._add_thread(thread)
self.dispatch('thread_create', thread)
if self.self_id in thread.member_ids: # Thread was created by us/we were added to a private thread
if self.self_id in thread._member_ids: # Thread was created by us/we were added to a private thread
self.dispatch('thread_join', thread)
def parse_thread_update(self, data) -> None:
@ -1103,12 +1103,14 @@ class ConnectionState:
for k in new_threads.values():
guild._add_thread(k)
if guild._threads_synced:
self.dispatch('thread_create', k)
if self_id in k.member_ids:
self.dispatch('thread_join', k)
for k in old_threads:
del guild._threads[k.id]
if guild._threads_synced:
self.dispatch('thread_delete', k) # Did the thread get deleted or did we get yeeted?
for message in data.get('most_recent_messages', []):
@ -1122,6 +1124,8 @@ class ConnectionState:
if self._messages is not None:
self._messages.append(message)
guild._threads_synced = True
def parse_thread_member_update(self, data) -> None:
guild_id = int(data['guild_id'])
guild: Optional[Guild] = self._get_guild(guild_id)
@ -1167,6 +1171,8 @@ class ConnectionState:
if member_id != self_id:
if member is not None:
self.dispatch('thread_member_remove', member)
else:
self.dispatch('raw_thread_member_remove', thread, member_id)
else:
self.dispatch('thread_remove', thread)

26
discord/threads.py

@ -32,7 +32,7 @@ from .mixins import Hashable
from .abc import Messageable
from .enums import ChannelType, try_enum
from .errors import ClientException, InvalidData
from .utils import MISSING, parse_time, _get_as_snowflake
from .utils import MISSING, parse_time, snowflake_time, _get_as_snowflake
__all__ = (
'Thread',
@ -40,6 +40,8 @@ __all__ = (
)
if TYPE_CHECKING:
from datetime import datetime
from .types.threads import (
Thread as ThreadPayload,
ThreadMember as ThreadMemberPayload,
@ -135,7 +137,8 @@ class Thread(Messageable, Hashable):
'invitable',
'auto_archive_duration',
'archive_timestamp',
'member_ids',
'_member_ids',
'_created_at',
)
def __init__(self, *, guild: Guild, state: ConnectionState, data: ThreadPayload):
@ -166,7 +169,7 @@ class Thread(Messageable, Hashable):
self.slowmode_delay = data.get('rate_limit_per_user', 0)
self.message_count = data['message_count']
self.member_count = data['member_count']
self.member_ids = data['member_ids_preview']
self._member_ids = data['member_ids_preview']
self._unroll_metadata(data['thread_metadata'])
try:
@ -180,6 +183,7 @@ class Thread(Messageable, Hashable):
self.archived = data['archived']
self.auto_archive_duration = data['auto_archive_duration']
self.archive_timestamp = parse_time(data['archive_timestamp'])
self._created_at = parse_time(data.get('creation_timestamp'))
self.locked = data.get('locked', False)
self.invitable = data.get('invitable', True)
@ -198,7 +202,7 @@ class Thread(Messageable, Hashable):
if (member_count := data.get('member_count')) is not None:
self.member_count = member_count
if (member_ids := data.get('member_ids_preview')) is not None:
self.member_ids = member_ids
self._member_ids = member_ids
attrs = [x for x in self.__slots__ if not any(y in x for y in ('member', 'guild', 'state', 'count'))]
@ -236,6 +240,15 @@ class Thread(Messageable, Hashable):
""":class:`str`: The string that allows you to mention the thread."""
return f'<#{self.id}>'
@property
def created_at(self) -> datetime:
""":class:`datetime.datetime`: Returns the thread's creation time in UTC.
.. note::
This may be inaccurate for threads created before January 9th, 2022.
"""
return self._created_at or snowflake_time(self.id)
@property
def members(self) -> List[ThreadMember]:
"""List[:class:`ThreadMember`]: A list of thread members in this thread.
@ -564,7 +577,7 @@ class Thread(Messageable, Hashable):
if slowmode_delay is not MISSING:
payload['rate_limit_per_user'] = slowmode_delay
data = await self._state.http.edit_channel(self.id, **payload)
data = await self._state.http.edit_channel(self.id, **payload, reason=reason)
# The data payload will always be a Thread payload
return Thread(data=data, state=self._state, guild=self.guild) # type: ignore
@ -789,9 +802,8 @@ class ThreadMember(Hashable):
self.joined_at = parse_time(data.get('join_timestamp'))
self.flags = data.get('flags')
if (data := data.get('member')) is not None:
if (mdata := data.get('member')) is not None:
guild = self.parent.parent.guild # type: ignore
mdata = data['member']
mdata['guild_id'] = guild.id
self.id = user_id = int(data['user_id'])
mdata['presence'] = data.get('presence')

2
discord/types/threads.py

@ -42,6 +42,7 @@ class _ThreadMetadataOptional(TypedDict, total=False):
archiver_id: Snowflake
locked: bool
invitable: bool
creation_timestamp: str
class ThreadMetadata(_ThreadMetadataOptional):
@ -67,6 +68,7 @@ class Thread(_ThreadOptional):
message_count: int
rate_limit_per_user: int
thread_metadata: ThreadMetadata
member_ids_preview: List[Snowflake]
class ThreadPaginationPayload(TypedDict):

Loading…
Cancel
Save