|
1 | | -from typing import Any, Self |
| 1 | +from typing import Any, Self, cast |
2 | 2 | from discord import utils |
| 3 | +from discord.abc import Snowflake |
3 | 4 | from discord.app.event_emitter import Event |
4 | 5 | from discord.app.state import ConnectionState |
| 6 | +from discord.raw_models import RawThreadDeleteEvent, RawThreadUpdateEvent |
5 | 7 | from discord.threads import Thread, ThreadMember |
| 8 | +from discord.types.raw_models import ThreadDeleteEvent, ThreadUpdateEvent |
6 | 9 |
|
7 | 10 |
|
8 | 11 | class ThreadCreate(Event, Thread): |
@@ -40,7 +43,64 @@ async def __load__(cls, data: dict[str, Any], state: ConnectionState) -> Self | |
40 | 43 | ) |
41 | 44 | ) |
42 | 45 | self.just_joined = False |
| 46 | + self.__dict__.update(thread.__dict__) |
43 | 47 | else: |
| 48 | + self.__dict__.update(cached_thread.__dict__) |
44 | 49 | self.just_joined = True |
45 | 50 |
|
46 | 51 | return self |
| 52 | + |
| 53 | +class ThreadUpdate(Event, Thread): |
| 54 | + __event_name__ = "THREAD_UPDATE" |
| 55 | + |
| 56 | + def __init__(self) -> None: |
| 57 | + ... |
| 58 | + |
| 59 | + old: Thread |
| 60 | + |
| 61 | + @classmethod |
| 62 | + async def __load__(cls, data: ThreadUpdateEvent, state: ConnectionState) -> Self | None: |
| 63 | + guild_id = int(data["guild_id"]) |
| 64 | + guild = await state._get_guild(guild_id) |
| 65 | + raw = RawThreadUpdateEvent(data) |
| 66 | + if guild is None: |
| 67 | + return |
| 68 | + |
| 69 | + self = cls() |
| 70 | + |
| 71 | + thread = guild.get_thread(raw.thread_id) |
| 72 | + if thread: |
| 73 | + self.old = thread |
| 74 | + await thread._update(thread) |
| 75 | + if thread.archived: |
| 76 | + guild._remove_thread(cast(Snowflake, raw.thread_id)) |
| 77 | + else: |
| 78 | + thread = Thread(guild=guild, state=guild._state, data=data) # type: ignore |
| 79 | + if not thread.archived: |
| 80 | + guild._add_thread(thread) |
| 81 | + |
| 82 | + self.__dict__.update(thread.__dict__) |
| 83 | + return self |
| 84 | + |
| 85 | +class ThreadDelete(Event, Thread): |
| 86 | + __event_name__ = "THREAD_DELETE" |
| 87 | + |
| 88 | + def __init__(self) -> None: |
| 89 | + ... |
| 90 | + |
| 91 | + @classmethod |
| 92 | + async def __load__(cls, data: ThreadDeleteEvent, state: ConnectionState) -> Self | None: |
| 93 | + raw = RawThreadDeleteEvent(data) |
| 94 | + guild = await state._get_guild(raw.guild_id) |
| 95 | + if guild is None: |
| 96 | + return |
| 97 | + |
| 98 | + self = cls() |
| 99 | + |
| 100 | + thread = guild.get_thread(raw.thread_id) |
| 101 | + if thread: |
| 102 | + guild._remove_thread(cast(Snowflake, thread.id)) |
| 103 | + if (msg := await thread.get_starting_message()) is not None: |
| 104 | + msg.thread = None # type: ignore |
| 105 | + |
| 106 | + return cast(Self, thread) |
0 commit comments