mirror of
https://github.com/stoatchat/javascript-client-sdk.git
synced 2026-07-20 20:16:06 -04:00
feat: add emoji support
This commit is contained in:
+7
-3
@@ -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/"
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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 };
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user