Skip to content

Commit

Permalink
add bulk message delete
Browse files Browse the repository at this point in the history
  • Loading branch information
Zomatree committed Mar 26, 2023
1 parent 35a4614 commit df9893a
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 4 deletions.
2 changes: 1 addition & 1 deletion revolt/channel.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ async def delete(self):
def server(self) -> Server:
""":class:`Server` The server this voice channel belongs too"""
if not self.server_id:
raise IndexError
raise LookupError

return self.state.get_server(self.server_id)

Expand Down
5 changes: 4 additions & 1 deletion revolt/http.py
Original file line number Diff line number Diff line change
Expand Up @@ -425,5 +425,8 @@ async def create_emoji(self, name: str, file: File, nsfw: bool, parent: EmojiPar

return await self.request("PUT", f"/custom/emoji/{asset['id']}", json={"name": name, "parent": parent, "nsfw": nsfw})

async def edit_member(self, server_id: str, member_id: str, remove: list[str] | None, values: dict[str, Any]) -> Request[MemberPayload]:
def edit_member(self, server_id: str, member_id: str, remove: list[str] | None, values: dict[str, Any]) -> Request[MemberPayload]:
return self.request("PATCH", f"/servers/{server_id}/members/{member_id}", json={"remove": remove, **values})

def delete_messages(self, channel_id: str, messages: list[str]):
return self.request("DELETE", f"/channels/{channel_id}/messages/bulk", json={"ids": messages})
13 changes: 13 additions & 0 deletions revolt/messageable.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,3 +137,16 @@ async def search(self, query: str, *, sort: SortType = SortType.latest, limit: i

payloads = await self.state.http.search_messages(await self._get_channel_id(), query, sort=sort, limit=limit, before=before, after=after)
return [Message(payload, self.state) for payload in payloads]

async def delete_messages(self, messages: list[Message]):
"""Bulk deletes messages from the channel
.. note:: The messages must have been sent in the last 7 days.
Parameters
-----------
messages: list[:class:`Message`]
The messages for deletion, this can be up to 100 messages
"""

await self.state.http.delete_messages(await self._get_channel_id(), [message.id for message in messages])
7 changes: 6 additions & 1 deletion revolt/types/gateway.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@
"ServerCreateEventPayload",
"MessageReactEventPayload",
"MessageUnreactEventPayload",
"MessageRemoveReactionEventPayload"
"MessageRemoveReactionEventPayload",
"BulkMessageDeleteEventPayload"
)

class BasePayload(TypedDict):
Expand Down Expand Up @@ -198,3 +199,7 @@ class MessageRemoveReactionEventPayload(BasePayload):
id: str
channel_id: str
emoji_id: str

class BulkMessageDeleteEventPayload(BasePayload):
channel: str
ids: list[str]
27 changes: 26 additions & 1 deletion revolt/websocket.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
ServerUpdateEventPayload, UserRelationshipEventPayload,
UserUpdateEventPayload, MessageReactEventPayload, MessageUnreactEventPayload, MessageRemoveReactionEventPayload, ChannelCreateEventPayload, ChannelDeleteEventPayload,
ChannelDeleteTypingEventPayload,
ChannelStartTypingEventPayload, ChannelUpdateEventPayload)
ChannelStartTypingEventPayload, ChannelUpdateEventPayload, BulkMessageDeleteEventPayload)

from .user import Status, UserProfile
from . import utils
Expand Down Expand Up @@ -422,6 +422,31 @@ async def handle_messageremovereaction(self, payload: MessageRemoveReactionEvent

self.dispatch("reaction_clear", message, users, payload["emoji_id"])

async def handle_bulkmessagedelete(self, payload: BulkMessageDeleteEventPayload):
channel = self.state.get_channel(payload["channel"])

self.dispatch("raw_bulk_message_delete", payload)

messages = []

for message_id in payload["ids"]:
if server_id := channel.server_id:
await self._wait_for_server_ready(server_id)

self.dispatch("raw_message_delete", MessageDeleteEventPayload(type="messagedelete", channel=payload["channel"], id=message_id))

try:
message = self.state.get_message(message_id)
except LookupError:
pass
else:
self.state.messages.remove(message)
self.dispatch("message_delete", message)

messages.append(message)

self.dispatch("bulk_message_delete", messages)

async def start(self):
if use_msgpack:
url = f"{self.ws_url}?format=msgpack"
Expand Down

0 comments on commit df9893a

Please sign in to comment.