diff --git a/package.json b/package.json index 2e8cac3d..fcc8d2cc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "revolt.js", - "version": "6.0.0-rc.26", + "version": "6.0.0-rc.27", "main": "dist/index.js", "typings": "dist/index.d.ts", "module": "esm/index.js", @@ -17,7 +17,7 @@ "lodash.isequal": "^4.5.0", "long": "^5.2.0", "mobx": "^6.3.2", - "revolt-api": "0.5.3-rc.16", + "revolt-api": "0.5.3", "ulid": "^2.3.0", "ws": "^8.2.2" }, diff --git a/src/maps/Channels.ts b/src/maps/Channels.ts index a86e1ca3..9db52e7f 100644 --- a/src/maps/Channels.ts +++ b/src/maps/Channels.ts @@ -565,6 +565,15 @@ export class Channel { return { deprecated: ids }; } + async deleteMessages(ids: string[]) { + await this.client.api.post( + // @ts-expect-error .delete does not support params + `/channels/${this._id as ""}/messages/bulk`, + { ids }, + { method: "DELETE" }, + ); + } + /** * Create an invite to the channel * @returns Newly created invite code diff --git a/src/websocket/client.ts b/src/websocket/client.ts index 7cbbde65..5b1d9e69 100644 --- a/src/websocket/client.ts +++ b/src/websocket/client.ts @@ -150,8 +150,9 @@ export class WebSocketClient { }); this.client.user = this.client.users.get( - packet.users.find((x) => x.relationship === "User")! - ._id, + packet.users.find( + (x) => x.relationship === "User", + )!._id, )!; this.client.emit("ready"); @@ -191,7 +192,9 @@ export class WebSocketClient { ); this.disconnect(); - this.connect(disallowReconnect); + this.connect( + disallowReconnect, + ); } } }, this.client.options.pongTimeout * 1000); @@ -231,17 +234,21 @@ export class WebSocketClient { } } } else { - await this.client.users.fetch(packet.author); + await this.client.users.fetch( + packet.author, + ); } - const channel = await this.client.channels.fetch( - packet.channel, - ); + const channel = + await this.client.channels.fetch( + packet.channel, + ); if (channel.channel_type === "TextChannel") { - const server = await this.client.servers.fetch( - channel.server_id!, - ); + const server = + await this.client.servers.fetch( + channel.server_id!, + ); if ( packet.author !== "00000000000000000000000000" @@ -249,18 +256,30 @@ export class WebSocketClient { await server.fetchMember(packet.author); } - const message = this.client.messages.createObj(packet, true); + const message = this.client.messages.createObj( + packet, + true, + ); runInAction(() => { - if (channel.channel_type === "DirectMessage") { + if ( + channel.channel_type === "DirectMessage" + ) { channel.active = true; } channel.last_message_id = message._id; - if (this.client.unreads && - message.mention_ids?.includes(this.client.user!._id)) { - this.client.unreads.markMention(message.channel_id, message._id); + if ( + this.client.unreads && + message.mention_ids?.includes( + this.client.user!._id, + ) + ) { + this.client.unreads.markMention( + message.channel_id, + message._id, + ); } }); } @@ -292,6 +311,17 @@ export class WebSocketClient { break; } + case "MessageBulkDelete": { + runInAction(() => { + for (const id of packet.ids) { + const msg = this.client.messages.get(id); + this.client.messages.delete(id); + this.client.emit("message/delete", id, msg); + } + }); + break; + } + case "ChannelCreate": { runInAction(async () => { if (packet.type !== "ChannelCreate") throw 0; @@ -300,9 +330,10 @@ export class WebSocketClient { packet.channel_type === "TextChannel" || packet.channel_type === "VoiceChannel" ) { - const server = await this.client.servers.fetch( - packet.server, - ); + const server = + await this.client.servers.fetch( + packet.server, + ); server.channel_ids.push(packet._id); } @@ -323,7 +354,11 @@ export class WebSocketClient { case "ChannelDelete": { const channel = this.client.channels.get(packet.id); channel?.delete(true); - this.client.emit("channel/delete", packet.id, channel); + this.client.emit( + "channel/delete", + packet.id, + channel, + ); break; } @@ -352,12 +387,20 @@ export class WebSocketClient { runInAction(async () => { const channels = []; for (const channel of packet.channels) { - channels.push(await this.client.channels.fetch(channel._id, channel)); + channels.push( + await this.client.channels.fetch( + channel._id, + channel, + ), + ); } - await this.client.servers.fetch(packet.id, packet.server); + await this.client.servers.fetch( + packet.id, + packet.server, + ); }); - + break; } @@ -373,12 +416,18 @@ export class WebSocketClient { case "ServerDelete": { const server = this.client.servers.get(packet.id); server?.delete(true); - this.client.emit("server/delete", packet.id, server); + this.client.emit( + "server/delete", + packet.id, + server, + ); break; } case "ServerMemberUpdate": { - const member = this.client.members.getKey(packet.id); + const member = this.client.members.getKey( + packet.id, + ); if (member) { member.update(packet.data, packet.clear); this.client.emit("member/update", member); @@ -415,7 +464,8 @@ export class WebSocketClient { [...this.client.members.keys()].forEach( (key) => { if ( - JSON.parse(key).server === server_id + JSON.parse(key).server === + server_id ) { this.client.members.delete(key); } @@ -484,7 +534,7 @@ export class WebSocketClient { if (user) { user.update({ ...packet.user, - relationship: packet.status + relationship: packet.status, }); } else { this.client.users.createObj(packet.user); @@ -536,7 +586,7 @@ export class WebSocketClient { `Warning: Unhandled packet! ${packet.type}`, ); } - } catch(e) { + } catch (e) { console.error(e); } }; diff --git a/src/websocket/notifications.ts b/src/websocket/notifications.ts index 27175c22..3c8ed184 100644 --- a/src/websocket/notifications.ts +++ b/src/websocket/notifications.ts @@ -1,11 +1,12 @@ -import type { FieldsChannel, FieldsMember, FieldsServer, FieldsUser, Session } from "revolt-api"; -import type { Channel, Message } from "revolt-api"; import type { - Member, - MemberCompositeKey, - Role, - Server, + FieldsChannel, + FieldsMember, + FieldsServer, + FieldsUser, + Session, } from "revolt-api"; +import type { Channel, Message } from "revolt-api"; +import type { Member, MemberCompositeKey, Role, Server } from "revolt-api"; import type { RelationshipStatus, User } from "revolt-api"; type WebSocketError = { @@ -47,12 +48,13 @@ export type ClientboundNotification = data: Partial; } | { - type: "MessageAppend"; - id: string; - channel: string; - append: Pick, 'embeds'>; + type: "MessageAppend"; + id: string; + channel: string; + append: Pick, "embeds">; } | { type: "MessageDelete"; id: string; channel: string } + | { type: "MessageBulkDelete"; channel: string; ids: string[] } | ({ type: "ChannelCreate" } & Channel) | { type: "ChannelUpdate"; @@ -67,11 +69,11 @@ export type ClientboundNotification = | { type: "ChannelStopTyping"; id: string; user: string } | { type: "ChannelAck"; id: string; user: string; message_id: string } | { - type: "ServerCreate"; - id: string; - server: Server; - channels: Channel[]; - } + type: "ServerCreate"; + id: string; + server: Server; + channels: Channel[]; + } | { type: "ServerUpdate"; id: string; @@ -102,4 +104,8 @@ export type ClientboundNotification = } | { type: "UserRelationship"; user: User; status: RelationshipStatus } | { type: "UserPresence"; id: string; online: boolean } - | { type: "UserSettingsUpdate"; id: string; update: { [key: string]: [number, string] } }; + | { + type: "UserSettingsUpdate"; + id: string; + update: { [key: string]: [number, string] }; + }; diff --git a/yarn.lock b/yarn.lock index 5a8ed4d9..e6ff3482 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1018,10 +1018,10 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -revolt-api@0.5.3-rc.16: - version "0.5.3-rc.16" - resolved "https://registry.yarnpkg.com/revolt-api/-/revolt-api-0.5.3-rc.16.tgz#7c6ecab99286fd54e8b19a878afafda0bea9e6f3" - integrity sha512-KMTMMaJxf9MsWFHjkcL0/I+5gaa4NDnR0yTC6BZ3eObTxLmAHUAD8OsCB/aewGR7zKDSyuNWBVXHDpLjb+6JrA== +revolt-api@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/revolt-api/-/revolt-api-0.5.3.tgz#e0ec2dcf812ea4338247b2eb77d67fc731d71b8a" + integrity sha512-hYdyStQiDZFvD+0dlf6SgQSiOk+JiEmQo0qIQHaqYRtrFN6FQBbGVNaiv7b5LzHHMPq7vks6ZVVA7hSNpcwlkA== dependencies: "@insertish/oapi" "0.1.15" axios "^0.26.1"