Skip to content

Commit b5cec7f

Browse files
committed
NQN specific changes
Compute send message permissions in threads properly Flags should be optional
1 parent 038ca4a commit b5cec7f

File tree

7 files changed

+68
-45
lines changed

7 files changed

+68
-45
lines changed

discord/emoji.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ def __init__(self, *, guild: Snowflake, state: ConnectionState, data: EmojiPaylo
120120
self._from_data(data)
121121

122122
def _from_data(self, emoji: EmojiPayload) -> None:
123-
self.require_colons: bool = emoji.get('require_colons', False)
123+
self.require_colons: bool = emoji.get('require_colons', True)
124124
self.managed: bool = emoji.get('managed', False)
125125
self.id: int = int(emoji['id']) # type: ignore # This won't be None for full emoji objects.
126126
self.name: str = emoji['name'] # type: ignore # This won't be None for full emoji objects.

discord/guild.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -595,16 +595,8 @@ def _from_data(self, guild: GuildPayload) -> None:
595595
role = Role(guild=self, data=r, state=state)
596596
self._roles[role.id] = role
597597

598-
self.emojis: Tuple[Emoji, ...] = (
599-
tuple(map(lambda d: state.store_emoji(self, d), guild.get('emojis', [])))
600-
if state.cache_guild_expressions
601-
else ()
602-
)
603-
self.stickers: Tuple[GuildSticker, ...] = (
604-
tuple(map(lambda d: state.store_sticker(self, d), guild.get('stickers', [])))
605-
if state.cache_guild_expressions
606-
else ()
607-
)
598+
self.emojis: Tuple[Emoji, ...] = tuple(map(lambda d: state.store_emoji(self, d), guild.get('emojis', [])))
599+
self.stickers: Tuple[GuildSticker, ...] = ()
608600
self.features: List[GuildFeature] = guild.get('features', [])
609601
self._splash: Optional[str] = guild.get('splash')
610602
self._system_channel_id: Optional[int] = utils._get_as_snowflake(guild, 'system_channel_id')

discord/http.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,6 +1431,46 @@ def follow_webhook(
14311431
Route('POST', '/channels/{channel_id}/followers', channel_id=channel_id), json=payload, reason=reason
14321432
)
14331433

1434+
def edit_webhook_message(self, webhook_id, webhook_token, message_id, thread_id=None, **fields):
1435+
if thread_id is None:
1436+
r = Route(
1437+
'PATCH',
1438+
'/webhooks/{webhook_id}/{webhook_token}/messages/{message_id}',
1439+
webhook_id=webhook_id,
1440+
webhook_token=webhook_token,
1441+
message_id=message_id
1442+
)
1443+
else:
1444+
r = Route(
1445+
'PATCH',
1446+
'/webhooks/{webhook_id}/{webhook_token}/messages/{message_id}?thread_id={thread_id}',
1447+
webhook_id=webhook_id,
1448+
webhook_token=webhook_token,
1449+
message_id=message_id,
1450+
thread_id=thread_id
1451+
)
1452+
return self.request(r, json=fields)
1453+
1454+
def delete_webhook_message(self, webhook_id, webhook_token, message_id, thread_id=None):
1455+
if thread_id is None:
1456+
r = Route(
1457+
'DELETE',
1458+
'/webhooks/{webhook_id}/{webhook_token}/messages/{message_id}',
1459+
webhook_id=webhook_id,
1460+
webhook_token=webhook_token,
1461+
message_id=message_id
1462+
)
1463+
else:
1464+
r = Route(
1465+
'DELETE',
1466+
'/webhooks/{webhook_id}/{webhook_token}/messages/{message_id}?thread_id={thread_id}',
1467+
webhook_id=webhook_id,
1468+
webhook_token=webhook_token,
1469+
message_id=message_id,
1470+
thread_id=thread_id
1471+
)
1472+
return self.request(r)
1473+
14341474
# Guild management
14351475

14361476
def get_guilds(

discord/member.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ def __init__(self, *, data: MemberWithUserPayload, guild: Guild, state: Connecti
323323
self._avatar: Optional[str] = data.get('avatar')
324324
self._banner: Optional[str] = data.get('banner')
325325
self._permissions: Optional[int]
326-
self._flags: int = data['flags']
326+
self._flags: int = data.get('flags', 0)
327327
self._avatar_decoration_data: Optional[AvatarDecorationData] = data.get('avatar_decoration_data')
328328
try:
329329
self._permissions = int(data['permissions']) # pyright: ignore[reportTypedDictNotRequiredAccess]

discord/message.py

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
from .mixins import Hashable
6464
from .sticker import StickerItem, GuildSticker
6565
from .threads import Thread
66+
from .user import User
6667
from .channel import PartialMessageable
6768
from .poll import Poll
6869

@@ -2484,11 +2485,7 @@ def _handle_nonce(self, value: Union[str, int]) -> None:
24842485
self.nonce = value
24852486

24862487
def _handle_author(self, author: UserPayload) -> None:
2487-
self.author = self._state.store_user(author, cache=self.webhook_id is None)
2488-
if isinstance(self.guild, Guild):
2489-
found = self.guild.get_member(self.author.id)
2490-
if found is not None:
2491-
self.author = found
2488+
self.author = User(state=self._state, data=author)
24922489

24932490
def _handle_member(self, member: MemberPayload) -> None:
24942491
# The gateway now gives us full Member objects sometimes with the following keys
@@ -2529,14 +2526,8 @@ def _handle_mention_roles(self, role_mentions: List[int]) -> None:
25292526
if role is not None:
25302527
self.role_mentions.append(role)
25312528

2532-
def _handle_components(self, data: List[ComponentPayload]) -> None:
2533-
self.components = []
2534-
2535-
for component_data in data:
2536-
component = _component_factory(component_data)
2537-
2538-
if component is not None:
2539-
self.components.append(component)
2529+
def _handle_components(self, components: List[ComponentPayload]):
2530+
pass
25402531

25412532
def _handle_interaction(self, data: MessageInteractionPayload):
25422533
self._interaction = MessageInteraction(state=self._state, guild=self.guild, data=data)

discord/state.py

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -381,16 +381,10 @@ def _update_references(self, ws: DiscordWebSocket) -> None:
381381
for vc in self.voice_clients:
382382
vc.main_ws = ws # type: ignore # Silencing the unknown attribute (ok at runtime).
383383

384-
def store_user(self, data: Union[UserPayload, PartialUserPayload], *, cache: bool = True) -> User:
385-
# this way is 300% faster than `dict.setdefault`.
386-
user_id = int(data['id'])
387-
try:
388-
return self._users[user_id]
389-
except KeyError:
390-
user = User(state=self, data=data)
391-
if cache:
392-
self._users[user_id] = user
393-
return user
384+
def store_user(self, data: UserPayload) -> User:
385+
if isinstance(data, User):
386+
return data
387+
return User(state=self, data=data)
394388

395389
def store_user_no_intents(self, data: Union[UserPayload, PartialUserPayload], *, cache: bool = True) -> User:
396390
return User(state=self, data=data)
@@ -402,20 +396,13 @@ def get_user(self, id: int) -> Optional[User]:
402396
return self._users.get(id)
403397

404398
def store_emoji(self, guild: Guild, data: EmojiPayload) -> Emoji:
405-
# the id will be present here
406-
emoji_id = int(data['id']) # type: ignore
407-
self._emojis[emoji_id] = emoji = Emoji(guild=guild, state=self, data=data)
408-
return emoji
399+
return Emoji(guild=guild, state=self, data=data)
409400

410401
def store_sticker(self, guild: Guild, data: GuildStickerPayload) -> GuildSticker:
411-
sticker_id = int(data['id'])
412-
self._stickers[sticker_id] = sticker = GuildSticker(state=self, data=data)
413-
return sticker
402+
pass
414403

415404
def store_view(self, view: BaseView, message_id: Optional[int] = None, interaction_id: Optional[int] = None) -> None:
416-
if interaction_id is not None:
417-
self._view_store.remove_interaction_mapping(interaction_id)
418-
self._view_store.add_view(view, message_id)
405+
pass
419406

420407
def prevent_view_updates_for(self, message_id: int) -> Optional[BaseView]:
421408
return self._view_store.remove_message_tracking(message_id)

discord/threads.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,19 @@ def _update(self, data: ThreadPayload) -> None:
222222
except KeyError:
223223
pass
224224

225+
def overwrites_for(self, obj, /) -> PermissionOverwrite:
226+
parent = self.parent
227+
if parent is None:
228+
raise ClientException('Parent channel not found')
229+
return parent.overwrites_for(obj)
230+
231+
@property
232+
def _overwrites(self):
233+
parent = self.parent
234+
if parent is None:
235+
raise ClientException('Parent channel not found')
236+
return parent._overwrites
237+
225238
@property
226239
def type(self) -> ThreadChannelType:
227240
""":class:`ChannelType`: The channel's Discord type."""

0 commit comments

Comments
 (0)