feat: add emoji support

This commit is contained in:
Paul Makles
2022-07-07 14:36:47 +01:00
parent aaf44c8db5
commit 8a5ee2caee
7 changed files with 131 additions and 8 deletions
+7 -3
View File
@@ -1,6 +1,6 @@
{
"name": "revolt.js",
"version": "6.0.3",
"version": "6.0.4",
"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-7",
"revolt-api": "0.5.4",
"ulid": "^2.3.0",
"ws": "^8.2.2"
},
@@ -44,8 +44,12 @@
},
"eslintConfig": {
"parser": "@typescript-eslint/parser",
"plugins": [
"mobx"
],
"extends": [
"plugin:@typescript-eslint/recommended"
"plugin:@typescript-eslint/recommended",
"plugin:mobx/recommended"
],
"ignorePatterns": [
"build/"
+11
View File
@@ -16,6 +16,7 @@ import Members, { Member } from "./maps/Members";
import Messages, { Message } from "./maps/Messages";
import Servers, { Server } from "./maps/Servers";
import Users, { User } from "./maps/Users";
import Emojis, { Emoji } from "./maps/Emojis";
import { WebSocketClient } from "./websocket/client";
import { ClientboundNotification } from "./websocket/notifications";
@@ -99,6 +100,12 @@ export declare interface Client {
on(event: "member/leave", listener: (id: MemberCompositeKey) => void): this;
on(event: "user/relationship", listener: (user: User) => void): this;
on(event: "emoji/create", listener: (emoji: Emoji) => void): this;
on(
event: "emoji/delete",
listener: (id: string, emoji?: Emoji) => void,
): this;
}
/**
@@ -139,6 +146,7 @@ export class Client extends EventEmitter {
members: Members;
messages: Messages;
bots: Bots;
emojis: Emojis;
unreads?: Unreads;
@@ -151,6 +159,7 @@ export class Client extends EventEmitter {
this.members = new Members(this);
this.messages = new Messages(this);
this.bots = new Bots(this);
this.emojis = new Emojis(this);
makeObservable(
this,
@@ -161,6 +170,7 @@ export class Client extends EventEmitter {
servers: observable,
members: observable,
messages: observable,
emojis: observable,
reset: action,
},
{
@@ -429,6 +439,7 @@ export class Client extends EventEmitter {
this.servers = new Servers(this);
this.members = new Members(this);
this.messages = new Messages(this);
this.emojis = new Emojis(this);
}
/**
+1
View File
@@ -3,6 +3,7 @@ export { Member } from "./maps/Members";
export { Message } from "./maps/Messages";
export { Server } from "./maps/Servers";
export { User } from "./maps/Users";
export { Emoji } from "./maps/Emojis";
export * from "./Client";
export * from "./config";
+88
View File
@@ -0,0 +1,88 @@
import type { Emoji as EmojiI, EmojiParent } from "revolt-api";
import { makeAutoObservable, runInAction } from "mobx";
import Collection from "./Collection";
import { Client } from "..";
import { decodeTime } from "ulid";
export class Emoji {
client: Client;
_id: string;
name: string;
creator_id: string;
parent: EmojiParent;
animated: boolean;
/**
* Get timestamp when this message was created.
*/
get createdAt() {
return decodeTime(this._id);
}
/**
* Get creator of this emoji.
*/
get creator() {
return this.client.users.get(this.creator_id);
}
constructor(client: Client, data: EmojiI) {
this.client = client;
this._id = data._id;
this.name = data.name;
this.creator_id = data.creator_id;
this.parent = data.parent;
this.animated = data.animated;
makeAutoObservable(this, {
_id: false,
client: false,
});
}
/**
* Delete a message
*/
async delete() {
return await this.client.api.delete(`/custom/emoji/${this._id as ""}`);
}
/**
* Generate emoji URL
*/
get imageURL() {
return `${this.client.configuration?.features.autumn.url}/emojis/${
this._id
}${this.animated ? "" : "?max_side=128"}`;
}
}
export default class Emojis extends Collection<string, Emoji> {
constructor(client: Client) {
super(client);
this.createObj = this.createObj.bind(this);
}
/**
* Create an emoji object.
* This is meant for internal use only.
* @param data Emoji Data
* @param emit Whether to emit creation event
* @returns Emoji
*/
createObj(data: EmojiI, emit?: boolean | number) {
if (this.has(data._id)) return this.get(data._id)!;
const emoji = new Emoji(this.client, data);
runInAction(() => {
this.set(data._id, emoji);
});
if (emit === true) this.client.emit("emoji/create", emoji);
return emoji;
}
}
+15
View File
@@ -147,6 +147,10 @@ export class WebSocketClient {
for (const member of packet.members) {
this.client.members.createObj(member);
}
for (const emoji of packet.emojis!) {
this.client.emojis.createObj(emoji);
}
});
this.client.user = this.client.users.get(
@@ -575,6 +579,17 @@ export class WebSocketClient {
break;
}
case "EmojiCreate": {
this.client.emojis.createObj(packet, true);
break;
}
case "EmojiDelete": {
const emoji = this.client.emojis.get(packet.id);
this.client.emit("emoji/delete", packet.id, emoji);
break;
}
case "Pong": {
this.ping = +new Date() - packet.data;
break;
+5 -1
View File
@@ -1,4 +1,5 @@
import type {
Emoji,
FieldsChannel,
FieldsMember,
FieldsServer,
@@ -30,6 +31,7 @@ export type ReadyPacket = {
servers: Server[];
channels: Channel[];
members: Member[];
emojis?: Emoji[];
};
export type ClientboundNotification =
@@ -107,4 +109,6 @@ export type ClientboundNotification =
type: "UserSettingsUpdate";
id: string;
update: { [key: string]: [number, string] };
};
}
| ({ type: "EmojiCreate" } & Emoji)
| { type: "EmojiDelete"; id: string };
+4 -4
View File
@@ -1015,10 +1015,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-7:
version "0.5.3-7"
resolved "https://registry.yarnpkg.com/revolt-api/-/revolt-api-0.5.3-7.tgz#d6123654ed39321b1d745fdcec9f1c0bd4018bce"
integrity sha512-mBpM30OufJCS+6u1H/k0t8hbtFTur4eX6MtlEpCwBw/69FwMnO//isSwMMGnhGtwYiSM8o7xOlhF9Pb4OlKA0A==
revolt-api@0.5.4:
version "0.5.4"
resolved "https://registry.yarnpkg.com/revolt-api/-/revolt-api-0.5.4.tgz#cefbb05cbeeb7deb437aca9efb80ce277b8c04e4"
integrity sha512-JBoEzakPn11lq43BN2VMwyfeU8pC11Q6O07BuWjagMqBrjY8GdMdQIdmtmvudSiTogux6VsbGkV+0eVUUZ44xw==
dependencies:
"@insertish/oapi" "0.1.16"
axios "^0.26.1"