@nerimity/nerimity.js 1.15.2 → 1.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/settings.json +2 -1
- package/build/Attachment.d.ts +6 -6
- package/build/Client.d.ts +222 -202
- package/build/EventNames.d.ts +7 -2
- package/build/EventNames.d.ts.map +1 -1
- package/build/EventNames.js.map +1 -1
- package/build/bitwise.d.ts.map +1 -1
- package/build/classes/Attachment.d.ts +8 -0
- package/build/classes/Attachment.d.ts.map +1 -0
- package/{src/Attachment.ts → build/classes/Attachment.js} +41 -50
- package/build/classes/Attachment.js.map +1 -0
- package/build/classes/Button.d.ts +19 -0
- package/build/classes/Button.d.ts.map +1 -0
- package/build/classes/Button.js +29 -0
- package/build/classes/Button.js.map +1 -0
- package/build/classes/Channel.d.ts +19 -0
- package/build/classes/Channel.d.ts.map +1 -0
- package/build/classes/Channel.js +43 -0
- package/build/classes/Channel.js.map +1 -0
- package/build/classes/Channels.d.ts +13 -0
- package/build/classes/Channels.d.ts.map +1 -0
- package/build/classes/Channels.js +18 -0
- package/build/classes/Channels.js.map +1 -0
- package/build/classes/Client.d.ts +42 -0
- package/build/classes/Client.d.ts.map +1 -0
- package/build/classes/Client.js +220 -0
- package/build/classes/Client.js.map +1 -0
- package/build/classes/ClientUser.d.ts +18 -0
- package/build/classes/ClientUser.d.ts.map +1 -0
- package/build/classes/ClientUser.js +15 -0
- package/build/classes/ClientUser.js.map +1 -0
- package/build/classes/Collection.d.ts +4 -0
- package/build/classes/Collection.d.ts.map +1 -0
- package/build/classes/Collection.js +10 -0
- package/build/classes/Collection.js.map +1 -0
- package/build/classes/Message.d.ts +36 -0
- package/build/classes/Message.d.ts.map +1 -0
- package/build/classes/Message.js +72 -0
- package/build/classes/Message.js.map +1 -0
- package/build/classes/MessageButton.d.ts +19 -0
- package/build/classes/MessageButton.d.ts.map +1 -0
- package/build/classes/MessageButton.js +29 -0
- package/build/classes/MessageButton.js.map +1 -0
- package/build/classes/Post.d.ts +50 -0
- package/build/classes/Post.d.ts.map +1 -0
- package/build/classes/Post.js +64 -0
- package/build/classes/Post.js.map +1 -0
- package/build/classes/RPCClient.d.ts +24 -0
- package/build/classes/RPCClient.d.ts.map +1 -0
- package/build/classes/RPCClient.js +72 -0
- package/build/classes/RPCClient.js.map +1 -0
- package/build/classes/Server.d.ts +26 -0
- package/build/classes/Server.d.ts.map +1 -0
- package/build/classes/Server.js +42 -0
- package/build/classes/Server.js.map +1 -0
- package/build/classes/ServerChannel.d.ts +14 -0
- package/build/classes/ServerChannel.d.ts.map +1 -0
- package/build/classes/ServerChannel.js +17 -0
- package/build/classes/ServerChannel.js.map +1 -0
- package/build/classes/ServerMember.d.ts +29 -0
- package/build/classes/ServerMember.d.ts.map +1 -0
- package/build/classes/ServerMember.js +69 -0
- package/build/classes/ServerMember.js.map +1 -0
- package/build/classes/ServerRole.d.ts +22 -0
- package/build/classes/ServerRole.d.ts.map +1 -0
- package/build/classes/ServerRole.js +30 -0
- package/build/classes/ServerRole.js.map +1 -0
- package/build/classes/User.d.ts +24 -0
- package/build/classes/User.d.ts.map +1 -0
- package/build/classes/User.js +35 -0
- package/build/classes/User.js.map +1 -0
- package/build/classes/Webhooks.d.ts +73 -0
- package/build/classes/Webhooks.d.ts.map +1 -0
- package/{src/Webhooks.ts → build/classes/Webhooks.js} +122 -148
- package/build/classes/Webhooks.js.map +1 -0
- package/build/example.js +9 -9
- package/build/example.js.map +1 -1
- package/build/factory/ChannelFactory.d.ts +7 -0
- package/build/factory/ChannelFactory.d.ts.map +1 -0
- package/build/factory/ChannelFactory.js +18 -0
- package/build/factory/ChannelFactory.js.map +1 -0
- package/build/index.d.ts +4 -4
- package/build/index.d.ts.map +1 -1
- package/build/index.js +4 -4
- package/build/index.js.map +1 -1
- package/build/services/ApplicationService.js +1 -2
- package/build/services/ApplicationService.js.map +1 -1
- package/build/services/MessageService.d.ts +1 -1
- package/build/services/MessageService.d.ts.map +1 -1
- package/build/services/MessageService.js +6 -7
- package/build/services/MessageService.js.map +1 -1
- package/build/services/PostsService.d.ts +2 -2
- package/build/services/PostsService.d.ts.map +1 -1
- package/build/services/PostsService.js +17 -14
- package/build/services/PostsService.js.map +1 -1
- package/build/services/ServerService.d.ts +3 -1
- package/build/services/ServerService.d.ts.map +1 -1
- package/build/services/ServerService.js +23 -2
- package/build/services/ServerService.js.map +1 -1
- package/build/services/serviceEndpoints.d.ts +1 -0
- package/build/services/serviceEndpoints.d.ts.map +1 -1
- package/build/services/serviceEndpoints.js +2 -0
- package/build/services/serviceEndpoints.js.map +1 -1
- package/build/types.d.ts +4 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +3 -0
- package/build/types.js.map +1 -0
- package/eslint.config.mjs +37 -0
- package/package.json +11 -10
- package/src/EventNames.ts +7 -10
- package/src/classes/Attachment.ts +50 -0
- package/src/classes/Channel.ts +53 -0
- package/src/classes/Channels.ts +20 -0
- package/src/classes/Client.ts +339 -0
- package/src/classes/ClientUser.ts +26 -0
- package/src/classes/Collection.ts +5 -0
- package/src/classes/Message.ts +102 -0
- package/src/classes/MessageButton.ts +48 -0
- package/src/classes/Post.ts +100 -0
- package/src/{RPCClient.ts → classes/RPCClient.ts} +4 -4
- package/src/classes/Server.ts +57 -0
- package/src/classes/ServerChannel.ts +24 -0
- package/src/classes/ServerMember.ts +95 -0
- package/src/classes/ServerRole.ts +40 -0
- package/src/classes/User.ts +46 -0
- package/src/classes/Webhooks.ts +144 -0
- package/src/example.ts +15 -17
- package/src/factory/ChannelFactory.ts +22 -0
- package/src/index.ts +4 -4
- package/src/services/MessageService.ts +2 -2
- package/src/services/PostsService.ts +55 -51
- package/src/services/ServerService.ts +30 -1
- package/src/services/serviceEndpoints.ts +4 -0
- package/src/types.ts +4 -0
- package/.eslintrc.js +0 -21
- package/src/Client.ts +0 -875
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { RawChannel } from "../RawData";
|
|
2
|
+
import { Channel } from "./Channel";
|
|
3
|
+
import { Client } from "./Client";
|
|
4
|
+
import { Server } from "./Server";
|
|
5
|
+
|
|
6
|
+
export class ServerChannel extends Channel {
|
|
7
|
+
createdById: string;
|
|
8
|
+
name: string;
|
|
9
|
+
serverId: string;
|
|
10
|
+
permissions: number;
|
|
11
|
+
categoryId?: string;
|
|
12
|
+
server: Server;
|
|
13
|
+
|
|
14
|
+
constructor(client: Client, channel: RawChannel) {
|
|
15
|
+
super(client, channel);
|
|
16
|
+
this.name = channel.name;
|
|
17
|
+
this.permissions = channel.permissions!;
|
|
18
|
+
this.createdById = channel.createdById!;
|
|
19
|
+
this.serverId = channel.serverId!;
|
|
20
|
+
this.categoryId = channel.categoryId!;
|
|
21
|
+
|
|
22
|
+
this.server = this.client.servers.cache.get(this.serverId)!;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import {
|
|
2
|
+
addBit,
|
|
3
|
+
AvailablePermissions,
|
|
4
|
+
hasBit,
|
|
5
|
+
RolePermissions,
|
|
6
|
+
} from "../bitwise";
|
|
7
|
+
import { RawServerMember } from "../RawData";
|
|
8
|
+
import {
|
|
9
|
+
banServerMember,
|
|
10
|
+
kickServerMember,
|
|
11
|
+
unbanServerMember,
|
|
12
|
+
} from "../services/ServerService";
|
|
13
|
+
import { Client } from "./Client";
|
|
14
|
+
import { Collection } from "./Collection";
|
|
15
|
+
import { Server } from "./Server";
|
|
16
|
+
import { User } from "./User";
|
|
17
|
+
|
|
18
|
+
export class ServerMembers {
|
|
19
|
+
client: Client;
|
|
20
|
+
cache: Collection<string, ServerMember>;
|
|
21
|
+
constructor(client: Client) {
|
|
22
|
+
this.client = client;
|
|
23
|
+
this.cache = new Collection();
|
|
24
|
+
}
|
|
25
|
+
setCache(rawMember: RawServerMember) {
|
|
26
|
+
const member = new ServerMember(this.client, rawMember);
|
|
27
|
+
this.cache.set(member.user.id, member);
|
|
28
|
+
return member;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export class ServerMember {
|
|
33
|
+
client: Client;
|
|
34
|
+
id: string;
|
|
35
|
+
user: User;
|
|
36
|
+
server: Server;
|
|
37
|
+
roleIds: string[];
|
|
38
|
+
nickname?: string | null;
|
|
39
|
+
|
|
40
|
+
constructor(client: Client, member: RawServerMember) {
|
|
41
|
+
this.client = client;
|
|
42
|
+
this.id = member.user.id;
|
|
43
|
+
this.roleIds = member.roleIds;
|
|
44
|
+
this.nickname = member.nickname;
|
|
45
|
+
|
|
46
|
+
this.user = this.client.users.cache.get(member.user.id)!;
|
|
47
|
+
this.server = this.client.servers.cache.get(member.serverId)!;
|
|
48
|
+
}
|
|
49
|
+
toString() {
|
|
50
|
+
return `[@:${this.id}]`;
|
|
51
|
+
}
|
|
52
|
+
async ban() {
|
|
53
|
+
return banServerMember(this.client, this.server.id, this.user.id);
|
|
54
|
+
}
|
|
55
|
+
async unban() {
|
|
56
|
+
return unbanServerMember(this.client, this.server.id, this.user.id);
|
|
57
|
+
}
|
|
58
|
+
async kick() {
|
|
59
|
+
return kickServerMember(this.client, this.server.id, this.user.id);
|
|
60
|
+
}
|
|
61
|
+
get roles() {
|
|
62
|
+
return this.roleIds
|
|
63
|
+
.map((id) => this.server.roles.cache.get(id)!)
|
|
64
|
+
.filter(Boolean);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
permissions(this: ServerMember) {
|
|
68
|
+
const defaultRoleId = this.server?.defaultRoleId;
|
|
69
|
+
const defaultRole = this.server.roles.cache.get(defaultRoleId!);
|
|
70
|
+
|
|
71
|
+
let currentPermissions = defaultRole?.permissions || 0;
|
|
72
|
+
|
|
73
|
+
const memberRoles = this.roles;
|
|
74
|
+
for (let i = 0; i < memberRoles.length; i++) {
|
|
75
|
+
const role = memberRoles[i];
|
|
76
|
+
currentPermissions = addBit(currentPermissions, role?.permissions || 0);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return currentPermissions;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
hasPermission(
|
|
83
|
+
permission: AvailablePermissions,
|
|
84
|
+
ignoreAdmin = false,
|
|
85
|
+
ignoreCreator = false
|
|
86
|
+
) {
|
|
87
|
+
if (!ignoreCreator) {
|
|
88
|
+
if (this.server.createdById === this.user.id) return true;
|
|
89
|
+
}
|
|
90
|
+
if (!ignoreAdmin) {
|
|
91
|
+
if (hasBit(this.permissions(), RolePermissions.ADMIN)) return true;
|
|
92
|
+
}
|
|
93
|
+
return hasBit(this.permissions(), permission);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { RawServerRole } from "../RawData";
|
|
2
|
+
import { Client } from "./Client";
|
|
3
|
+
import { Collection } from "./Collection";
|
|
4
|
+
import { Server } from "./Server";
|
|
5
|
+
|
|
6
|
+
export class ServerRoles {
|
|
7
|
+
client: Client;
|
|
8
|
+
cache: Collection<string, ServerRole>;
|
|
9
|
+
constructor(client: Client) {
|
|
10
|
+
this.client = client;
|
|
11
|
+
this.cache = new Collection();
|
|
12
|
+
}
|
|
13
|
+
setCache(rawServerRole: RawServerRole) {
|
|
14
|
+
const server = new ServerRole(this.client, rawServerRole);
|
|
15
|
+
this.cache.set(server.id, server);
|
|
16
|
+
return server;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export class ServerRole {
|
|
21
|
+
client: Client;
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
permissions: number;
|
|
25
|
+
hexColor: string;
|
|
26
|
+
server: Server;
|
|
27
|
+
order: number;
|
|
28
|
+
isDefaultRole?: boolean;
|
|
29
|
+
constructor(client: Client, role: RawServerRole) {
|
|
30
|
+
this.client = client;
|
|
31
|
+
this.server = this.client.servers.cache.get(role.serverId)!;
|
|
32
|
+
|
|
33
|
+
this.id = role.id;
|
|
34
|
+
this.name = role.name;
|
|
35
|
+
this.permissions = role.permissions;
|
|
36
|
+
this.hexColor = role.hexColor;
|
|
37
|
+
this.order = role.order;
|
|
38
|
+
this.isDefaultRole = this.server.defaultRoleId === this.id;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { RawUser } from "../RawData";
|
|
2
|
+
import { Client } from "./Client";
|
|
3
|
+
import { Collection } from "./Collection";
|
|
4
|
+
|
|
5
|
+
export class Users {
|
|
6
|
+
client: Client;
|
|
7
|
+
cache: Collection<string, User>;
|
|
8
|
+
constructor(client: Client) {
|
|
9
|
+
this.client = client;
|
|
10
|
+
this.cache = new Collection();
|
|
11
|
+
}
|
|
12
|
+
setCache(rawUser: RawUser) {
|
|
13
|
+
const user = new User(this.client, rawUser);
|
|
14
|
+
this.cache.set(rawUser.id, user);
|
|
15
|
+
return user;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class User {
|
|
19
|
+
client: Client;
|
|
20
|
+
id: string;
|
|
21
|
+
avatar?: string;
|
|
22
|
+
banner?: string;
|
|
23
|
+
username: string;
|
|
24
|
+
hexColor: string;
|
|
25
|
+
tag: string;
|
|
26
|
+
badges: number;
|
|
27
|
+
joinedAt?: number;
|
|
28
|
+
bot?: boolean;
|
|
29
|
+
constructor(client: Client, user: RawUser) {
|
|
30
|
+
this.client = client;
|
|
31
|
+
|
|
32
|
+
this.id = user.id;
|
|
33
|
+
this.username = user.username;
|
|
34
|
+
this.tag = user.tag;
|
|
35
|
+
|
|
36
|
+
this.hexColor = user.hexColor;
|
|
37
|
+
this.badges = user.badges;
|
|
38
|
+
this.joinedAt = user.joinedAt;
|
|
39
|
+
this.avatar = user.avatar;
|
|
40
|
+
this.banner = user.banner;
|
|
41
|
+
this.bot = user.bot;
|
|
42
|
+
}
|
|
43
|
+
toString() {
|
|
44
|
+
return `[@:${this.id}]`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for sending a webhook message.
|
|
3
|
+
*/
|
|
4
|
+
export interface WebhookOptions {
|
|
5
|
+
/** Message content. */
|
|
6
|
+
content?: string;
|
|
7
|
+
/** Username to display. */
|
|
8
|
+
username?: string;
|
|
9
|
+
/** Avatar URL to display. */
|
|
10
|
+
avatarUrl?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Nerimity.js implementation for sending Nerimity webhooks.
|
|
15
|
+
*/
|
|
16
|
+
export class WebhookBuilder {
|
|
17
|
+
private channelId: string = "";
|
|
18
|
+
private token: string = "";
|
|
19
|
+
private options: WebhookOptions;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Creates a new WebhookBuilder instance.
|
|
23
|
+
*
|
|
24
|
+
* @param webhook - The webhook identifier. Can be:
|
|
25
|
+
* - Full URL: `"https://nerimity.com/api/webhooks/{channelId}/{token}"`
|
|
26
|
+
* @param options - Optional webhook message options (content, username, avatarUrl).
|
|
27
|
+
*
|
|
28
|
+
* @throws If the webhook format is invalid or missing required fields.
|
|
29
|
+
*/
|
|
30
|
+
constructor(
|
|
31
|
+
webhook: string | { channelId: string; token: string },
|
|
32
|
+
options: WebhookOptions = {}
|
|
33
|
+
) {
|
|
34
|
+
this.options = options;
|
|
35
|
+
|
|
36
|
+
if (typeof webhook === "object") {
|
|
37
|
+
if (!webhook.channelId || !webhook.token)
|
|
38
|
+
throw new Error("Webhook object must have channelId and token");
|
|
39
|
+
this.channelId = webhook.channelId;
|
|
40
|
+
this.token = webhook.token;
|
|
41
|
+
} else {
|
|
42
|
+
this.parseWebhookString(webhook);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
this.validateOptions(this.options);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Parse webhook string format and extract channelId + token.
|
|
50
|
+
*
|
|
51
|
+
* @param webhook - Webhook string in one of the accepted formats.
|
|
52
|
+
* @throws If the string is not a valid webhook format.
|
|
53
|
+
*/
|
|
54
|
+
private parseWebhookString(webhook: string) {
|
|
55
|
+
if (!webhook || typeof webhook !== "string")
|
|
56
|
+
throw new Error("Webhook must be a non-empty string");
|
|
57
|
+
|
|
58
|
+
if (webhook.startsWith("http")) {
|
|
59
|
+
const match = webhook.match(/\/webhooks\/(\d+)\/(.+)$/);
|
|
60
|
+
if (!match) throw new Error(`Invalid webhook URL: ${webhook}`);
|
|
61
|
+
this.channelId = match[1];
|
|
62
|
+
this.token = match[2];
|
|
63
|
+
} else {
|
|
64
|
+
throw new Error(`Unrecognized webhook format: ${webhook}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Validate message options (content, username, avatarUrl).
|
|
70
|
+
*
|
|
71
|
+
* @param options - The options object to validate.
|
|
72
|
+
* @throws If an option type is invalid.
|
|
73
|
+
*/
|
|
74
|
+
private validateOptions(options: WebhookOptions) {
|
|
75
|
+
if (options.username && typeof options.username !== "string")
|
|
76
|
+
throw new Error("Webhook option 'username' must be a string");
|
|
77
|
+
if (options.avatarUrl && typeof options.avatarUrl !== "string")
|
|
78
|
+
throw new Error("Webhook option 'avatarUrl' must be a string");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Set the username override for the webhook.
|
|
83
|
+
*
|
|
84
|
+
* @param username - The custom username.
|
|
85
|
+
* @returns The current WebhookBuilder instance (for chaining).
|
|
86
|
+
*
|
|
87
|
+
* @throws If username is not a string.
|
|
88
|
+
*/
|
|
89
|
+
public setUsername(username: string) {
|
|
90
|
+
if (typeof username !== "string")
|
|
91
|
+
throw new Error("Username must be a string");
|
|
92
|
+
this.options.username = username;
|
|
93
|
+
return this;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Set the avatar image for the webhook.
|
|
98
|
+
*
|
|
99
|
+
* @param avatarUrl - The avatar image URL.
|
|
100
|
+
* @returns The current WebhookBuilder instance (for chaining).
|
|
101
|
+
*
|
|
102
|
+
* @throws If avatarUrl is not a string.
|
|
103
|
+
*/
|
|
104
|
+
public setAvatar(avatarUrl: string) {
|
|
105
|
+
if (typeof avatarUrl !== "string")
|
|
106
|
+
throw new Error("Avatar URL must be a string");
|
|
107
|
+
this.options.avatarUrl = avatarUrl;
|
|
108
|
+
return this;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Sends the webhook request to Nerimity's API.
|
|
113
|
+
*
|
|
114
|
+
* @returns A Promise resolving with the JSON response from the API.
|
|
115
|
+
*
|
|
116
|
+
* @throws If the request fails, is unauthorized, or returns invalid JSON.
|
|
117
|
+
*/
|
|
118
|
+
public async send(content: string): Promise<any> {
|
|
119
|
+
const url = `https://nerimity.com/api/webhooks/${this.channelId}/${this.token}`;
|
|
120
|
+
|
|
121
|
+
try {
|
|
122
|
+
const res = await fetch(url, {
|
|
123
|
+
method: "POST",
|
|
124
|
+
headers: { "Content-Type": "application/json" },
|
|
125
|
+
body: JSON.stringify({ content, ...this.options }),
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
if (!res.ok) {
|
|
129
|
+
const body = await res.text().catch(() => "");
|
|
130
|
+
throw new Error(
|
|
131
|
+
`HTTP ${res.status} ${res.statusText}${body ? ` - ${body}` : ""}`
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const json = await res.json().catch(() => {
|
|
136
|
+
throw new Error("Webhook returned invalid JSON");
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
return json;
|
|
140
|
+
} catch (err: any) {
|
|
141
|
+
throw new Error(`Failed to send webhook: ${err.message}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
package/src/example.ts
CHANGED
|
@@ -1,27 +1,25 @@
|
|
|
1
|
-
import { Client, Events } from
|
|
1
|
+
import { Client, Events } from "./classes/Client";
|
|
2
2
|
|
|
3
3
|
const client = new Client();
|
|
4
4
|
|
|
5
|
-
|
|
6
5
|
client.on(Events.Ready, () => {
|
|
7
|
-
|
|
6
|
+
console.log(`Connected as ${client.user?.username}!`);
|
|
8
7
|
});
|
|
9
8
|
|
|
10
|
-
client.on(Events.MessageCreate, message => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
client.on(Events.MessageCreate, (message) => {
|
|
10
|
+
console.log(message.content);
|
|
11
|
+
if (message.content === "!ping") {
|
|
12
|
+
message.reply("Pong!", { buttons: [{ id: "hello", label: "Hello!" }] });
|
|
13
|
+
}
|
|
15
14
|
});
|
|
16
15
|
|
|
17
|
-
client.on(Events.MessageButtonClick, button => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
16
|
+
client.on(Events.MessageButtonClick, (button) => {
|
|
17
|
+
if (button.id === "hello") {
|
|
18
|
+
button.respond({
|
|
19
|
+
title: "Hey!",
|
|
20
|
+
content: `Hey there **${button.user?.username}**!`,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
25
23
|
});
|
|
26
24
|
|
|
27
|
-
client.login(
|
|
25
|
+
client.login("token");
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Import the base class and the subclass for runtime construction
|
|
2
|
+
|
|
3
|
+
import { Channel } from "../classes/Channel";
|
|
4
|
+
import { Client } from "../classes/Client";
|
|
5
|
+
import { ServerChannel } from "../classes/ServerChannel";
|
|
6
|
+
import { RawChannel } from "../RawData";
|
|
7
|
+
import { AllChannel } from "../types";
|
|
8
|
+
|
|
9
|
+
// Define the function that decides which class to instantiate
|
|
10
|
+
export function createChannel(
|
|
11
|
+
client: Client,
|
|
12
|
+
rawChannel: { id: string } & Partial<RawChannel>
|
|
13
|
+
): AllChannel {
|
|
14
|
+
const channelData = rawChannel as RawChannel; // Cast once for convenience
|
|
15
|
+
|
|
16
|
+
if (channelData.serverId) {
|
|
17
|
+
// Here, ServerChannel is imported as a runtime value and is available
|
|
18
|
+
return new ServerChannel(client, channelData);
|
|
19
|
+
} else {
|
|
20
|
+
return new Channel(client, channelData);
|
|
21
|
+
}
|
|
22
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { Client, Events } from "./Client";
|
|
2
|
-
export { AttachmentBuilder } from "./Attachment";
|
|
3
|
-
export { RPCClient, EmitPayload } from "./RPCClient";
|
|
4
|
-
export { WebhookBuilder } from "./Webhooks";
|
|
1
|
+
export { Client, Events } from "./classes/Client";
|
|
2
|
+
export { AttachmentBuilder } from "./classes/Attachment";
|
|
3
|
+
export { RPCClient, EmitPayload } from "./classes/RPCClient";
|
|
4
|
+
export { WebhookBuilder } from "./classes/Webhooks";
|
|
5
5
|
export { RolePermissions } from "./bitwise";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Client } from "../Client";
|
|
1
|
+
import { Client } from "../classes/Client";
|
|
2
2
|
import { RawMessage, RawMessageButton } from "../RawData";
|
|
3
3
|
import { ServiceEndpoints } from "./serviceEndpoints";
|
|
4
4
|
import fetch from "node-fetch";
|
|
@@ -184,7 +184,7 @@ export async function request<T>(opts: RequestOpts): Promise<T> {
|
|
|
184
184
|
return Promise.reject(json);
|
|
185
185
|
}
|
|
186
186
|
return json;
|
|
187
|
-
} catch
|
|
187
|
+
} catch {
|
|
188
188
|
throw { message: text };
|
|
189
189
|
}
|
|
190
190
|
}
|
|
@@ -1,71 +1,75 @@
|
|
|
1
|
-
import { Client } from
|
|
2
|
-
import { RawPost } from
|
|
3
|
-
import { request } from
|
|
4
|
-
import { ServiceEndpoints } from
|
|
1
|
+
import { Client } from "../classes/Client";
|
|
2
|
+
import { RawPost } from "../RawData";
|
|
3
|
+
import { request } from "./MessageService";
|
|
4
|
+
import { ServiceEndpoints } from "./serviceEndpoints";
|
|
5
5
|
|
|
6
6
|
interface PostPostOpts {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
client: Client;
|
|
8
|
+
postId?: string;
|
|
9
|
+
content: string;
|
|
10
|
+
nerimityCdnFileId?: string;
|
|
11
|
+
poll?: {
|
|
12
|
+
choices: string[];
|
|
13
|
+
};
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
interface EditPostOpts {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
client: Client;
|
|
18
|
+
postId: string;
|
|
19
|
+
content: string;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
interface DeletePostOpts {
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
client: Client;
|
|
24
|
+
postId: string;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
export async function getPosts(client: Client) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
28
|
+
return await request<RawPost[]>({
|
|
29
|
+
client: client,
|
|
30
|
+
url: ServiceEndpoints.GetPosts(),
|
|
31
|
+
method: "GET",
|
|
32
|
+
useToken: true,
|
|
33
|
+
}).catch((err) => {
|
|
34
|
+
throw new Error(`Failed to get posts. ${err.message}`);
|
|
35
|
+
});
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
export async function postPost(opts: PostPostOpts) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
39
|
+
return await request<RawPost>({
|
|
40
|
+
client: opts.client,
|
|
41
|
+
url: ServiceEndpoints.PostPost(),
|
|
42
|
+
method: "POST",
|
|
43
|
+
body: {
|
|
44
|
+
content: opts.content,
|
|
45
|
+
nerimityCdnFileId: opts.nerimityCdnFileId,
|
|
46
|
+
poll: opts.poll,
|
|
47
|
+
},
|
|
48
|
+
useToken: true,
|
|
49
|
+
}).catch((err) => {
|
|
50
|
+
throw new Error(`Failed to send post. ${err.message}`);
|
|
51
|
+
});
|
|
48
52
|
}
|
|
49
53
|
|
|
50
54
|
export async function editPost(opts: EditPostOpts) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
return await request<RawPost>({
|
|
56
|
+
client: opts.client,
|
|
57
|
+
url: ServiceEndpoints.EditPost(opts.postId),
|
|
58
|
+
method: "PATCH",
|
|
59
|
+
body: { content: opts.content },
|
|
60
|
+
useToken: true,
|
|
61
|
+
}).catch((err) => {
|
|
62
|
+
throw new Error(`Failed to edit post. ${err.message}`);
|
|
63
|
+
});
|
|
60
64
|
}
|
|
61
65
|
|
|
62
66
|
export async function deletePost(opts: DeletePostOpts) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
67
|
+
return await request({
|
|
68
|
+
client: opts.client,
|
|
69
|
+
url: ServiceEndpoints.DeletePost(opts.postId),
|
|
70
|
+
method: "DELETE",
|
|
71
|
+
useToken: true,
|
|
72
|
+
}).catch((err) => {
|
|
73
|
+
throw new Error(`Failed to delete post. ${err.message}`);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Client } from "../Client";
|
|
1
|
+
import { Client } from "../classes/Client";
|
|
2
2
|
import { request } from "./MessageService";
|
|
3
3
|
import { ServiceEndpoints } from "./serviceEndpoints";
|
|
4
4
|
|
|
@@ -16,3 +16,32 @@ export async function banServerMember(
|
|
|
16
16
|
throw new Error(`Failed to ban server member. ${err.message}`);
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
|
+
|
|
20
|
+
export async function unbanServerMember(
|
|
21
|
+
client: Client,
|
|
22
|
+
serverId: string,
|
|
23
|
+
userId: string
|
|
24
|
+
) {
|
|
25
|
+
return await request<any>({
|
|
26
|
+
client: client,
|
|
27
|
+
url: ServiceEndpoints.serverMemberBan(serverId, userId),
|
|
28
|
+
method: "DELETE",
|
|
29
|
+
useToken: true,
|
|
30
|
+
}).catch((err) => {
|
|
31
|
+
throw new Error(`Failed to unban server member. ${err.message}`);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export async function kickServerMember(
|
|
35
|
+
client: Client,
|
|
36
|
+
serverId: string,
|
|
37
|
+
userId: string
|
|
38
|
+
) {
|
|
39
|
+
return await request<any>({
|
|
40
|
+
client: client,
|
|
41
|
+
url: ServiceEndpoints.serverMemberKick(serverId, userId),
|
|
42
|
+
method: "DELETE",
|
|
43
|
+
useToken: true,
|
|
44
|
+
}).catch((err) => {
|
|
45
|
+
throw new Error(`Failed to kick server member. ${err.message}`);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
@@ -31,6 +31,9 @@ const ButtonClickCallback = (
|
|
|
31
31
|
const serverMemberBan = (serverId: string, userId: string) =>
|
|
32
32
|
`${BaseUrl}/servers/${serverId}/bans/${userId}`;
|
|
33
33
|
|
|
34
|
+
const serverMemberKick = (serverId: string, userId: string) =>
|
|
35
|
+
`${BaseUrl}/servers/${serverId}/members/${userId}/kick`;
|
|
36
|
+
|
|
34
37
|
export const ServiceEndpoints = {
|
|
35
38
|
GetMessages,
|
|
36
39
|
PostMessage,
|
|
@@ -42,4 +45,5 @@ export const ServiceEndpoints = {
|
|
|
42
45
|
BotCommands,
|
|
43
46
|
ButtonClickCallback,
|
|
44
47
|
serverMemberBan,
|
|
48
|
+
serverMemberKick,
|
|
45
49
|
};
|
package/src/types.ts
ADDED
package/.eslintrc.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
env: {
|
|
3
|
-
browser: true,
|
|
4
|
-
es2021: true,
|
|
5
|
-
node: true,
|
|
6
|
-
},
|
|
7
|
-
extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
|
|
8
|
-
overrides: [],
|
|
9
|
-
parser: "@typescript-eslint/parser",
|
|
10
|
-
parserOptions: {
|
|
11
|
-
ecmaVersion: "latest",
|
|
12
|
-
sourceType: "module",
|
|
13
|
-
},
|
|
14
|
-
plugins: ["@typescript-eslint"],
|
|
15
|
-
rules: {
|
|
16
|
-
indent: ["error", 2],
|
|
17
|
-
"linebreak-style": ["error", "windows"],
|
|
18
|
-
quotes: ["error", "multi"],
|
|
19
|
-
semi: ["error", "always"],
|
|
20
|
-
},
|
|
21
|
-
};
|