onebots 0.4.22 → 0.4.25

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.
Files changed (84) hide show
  1. package/README.md +129 -72
  2. package/lib/adapter.d.ts +55 -0
  3. package/lib/adapter.js +60 -0
  4. package/lib/adapters/icqq/index.d.ts +36 -0
  5. package/lib/adapters/icqq/index.js +300 -0
  6. package/lib/adapters/icqq/utils.d.ts +6 -0
  7. package/lib/adapters/icqq/utils.js +26 -0
  8. package/lib/adapters/qq/bot.d.ts +24 -0
  9. package/lib/adapters/qq/bot.js +20 -0
  10. package/lib/adapters/qq/constans.d.ts +69 -0
  11. package/lib/adapters/qq/constans.js +128 -0
  12. package/lib/adapters/qq/elements.d.ts +125 -0
  13. package/lib/adapters/qq/elements.js +8 -0
  14. package/lib/adapters/qq/entries/channel.d.ts +17 -0
  15. package/lib/adapters/qq/entries/channel.js +2 -0
  16. package/lib/adapters/qq/entries/friend.d.ts +8 -0
  17. package/lib/adapters/qq/entries/friend.js +2 -0
  18. package/lib/adapters/qq/entries/group.d.ts +6 -0
  19. package/lib/adapters/qq/entries/group.js +2 -0
  20. package/lib/adapters/qq/entries/groupMember.d.ts +7 -0
  21. package/lib/adapters/qq/entries/groupMember.js +2 -0
  22. package/lib/adapters/qq/entries/guild.d.ts +21 -0
  23. package/lib/adapters/qq/entries/guild.js +2 -0
  24. package/lib/adapters/qq/entries/guildMember.d.ts +9 -0
  25. package/lib/adapters/qq/entries/guildMember.js +2 -0
  26. package/lib/adapters/qq/entries/user.d.ts +9 -0
  27. package/lib/adapters/qq/entries/user.js +2 -0
  28. package/lib/adapters/qq/event.d.ts +28 -0
  29. package/lib/adapters/qq/event.js +24 -0
  30. package/lib/adapters/qq/index.d.ts +35 -0
  31. package/lib/adapters/qq/index.js +170 -0
  32. package/lib/adapters/qq/message.d.ts +83 -0
  33. package/lib/adapters/qq/message.js +272 -0
  34. package/lib/adapters/qq/qqBot.d.ts +122 -0
  35. package/lib/adapters/qq/qqBot.js +438 -0
  36. package/lib/adapters/qq/sessionManager.d.ts +33 -0
  37. package/lib/adapters/qq/sessionManager.js +257 -0
  38. package/lib/adapters/qq/types.d.ts +45 -0
  39. package/lib/adapters/qq/types.js +2 -0
  40. package/lib/adapters/qq/utils.d.ts +12 -0
  41. package/lib/adapters/qq/utils.js +86 -0
  42. package/lib/bin.js +17 -2
  43. package/lib/config.sample.yaml +11 -5
  44. package/lib/db.js +6 -6
  45. package/lib/index.d.ts +5 -5
  46. package/lib/onebot.d.ts +30 -22
  47. package/lib/onebot.js +42 -165
  48. package/lib/server/app.d.ts +22 -12
  49. package/lib/server/app.js +97 -71
  50. package/lib/service/V11/action/common.d.ts +11 -12
  51. package/lib/service/V11/action/common.js +19 -65
  52. package/lib/service/V11/action/friend.d.ts +6 -14
  53. package/lib/service/V11/action/friend.js +6 -16
  54. package/lib/service/V11/action/group.d.ts +20 -23
  55. package/lib/service/V11/action/group.js +20 -30
  56. package/lib/service/V11/action/index.d.ts +1 -1
  57. package/lib/service/V11/db_entities.d.ts +1 -1
  58. package/lib/service/V11/db_entities.js +1 -1
  59. package/lib/service/V11/db_sqlite.d.ts +1 -1
  60. package/lib/service/V11/db_sqlite.js +5 -7
  61. package/lib/service/V11/index.d.ts +46 -14
  62. package/lib/service/V11/index.js +163 -134
  63. package/lib/service/V12/action/common.d.ts +3 -67
  64. package/lib/service/V12/action/common.js +9 -63
  65. package/lib/service/V12/action/friend.d.ts +4 -10
  66. package/lib/service/V12/action/friend.js +4 -12
  67. package/lib/service/V12/action/group.d.ts +19 -21
  68. package/lib/service/V12/action/group.js +19 -27
  69. package/lib/service/V12/action/guild.d.ts +40 -13
  70. package/lib/service/V12/action/guild.js +99 -11
  71. package/lib/service/V12/action/index.d.ts +1 -1
  72. package/lib/service/V12/index.d.ts +37 -13
  73. package/lib/service/V12/index.js +63 -94
  74. package/lib/service.d.ts +7 -2
  75. package/lib/service.js +5 -1
  76. package/lib/types.d.ts +2 -2
  77. package/lib/types.js +3 -3
  78. package/lib/utils.d.ts +7 -4
  79. package/lib/utils.js +18 -1
  80. package/package.json +74 -70
  81. package/lib/service/V11/utils.d.ts +0 -9
  82. package/lib/service/V11/utils.js +0 -31
  83. package/lib/service/V12/utils.d.ts +0 -8
  84. package/lib/service/V12/utils.js +0 -47
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GuildMessageEvent = exports.DirectMessageEvent = exports.GroupMessageEvent = exports.PrivateMessageEvent = exports.Message = void 0;
4
+ const qqBot_1 = require("./qqBot");
5
+ const utils_1 = require("./utils");
6
+ const crypto_1 = require("crypto");
7
+ class Message {
8
+ get self_id() {
9
+ return this.bot.self_id;
10
+ }
11
+ constructor(bot, attrs) {
12
+ this.bot = bot;
13
+ Object.assign(this, attrs);
14
+ }
15
+ get [Symbol.unscopables]() {
16
+ return {
17
+ bot: true
18
+ };
19
+ }
20
+ toJSON() {
21
+ return Object.fromEntries(Object.keys(this)
22
+ .filter(key => {
23
+ return typeof this[key] !== "function" && !(this[key] instanceof qqBot_1.QQBot);
24
+ })
25
+ .map(key => [key, this[key]]));
26
+ }
27
+ }
28
+ exports.Message = Message;
29
+ class PrivateMessageEvent extends Message {
30
+ constructor(bot, payload) {
31
+ super(bot, payload);
32
+ this.sub_type = 'private';
33
+ }
34
+ async reply(message) {
35
+ return this.bot.sendPrivateMessage(this.user_id, message, this);
36
+ }
37
+ }
38
+ exports.PrivateMessageEvent = PrivateMessageEvent;
39
+ class GroupMessageEvent extends Message {
40
+ constructor(bot, payload) {
41
+ super(bot, payload);
42
+ this.sub_type = 'group';
43
+ }
44
+ async reply(message) {
45
+ return this.bot.sendGroupMessage(this.group_id, message, this);
46
+ }
47
+ }
48
+ exports.GroupMessageEvent = GroupMessageEvent;
49
+ class DirectMessageEvent extends Message {
50
+ constructor(bot, payload) {
51
+ super(bot, payload);
52
+ this.sub_type = 'direct';
53
+ }
54
+ reply(message) {
55
+ return this.bot.sendDirectMessage(this.guild_id, message, this);
56
+ }
57
+ }
58
+ exports.DirectMessageEvent = DirectMessageEvent;
59
+ class GuildMessageEvent extends Message {
60
+ constructor(bot, payload) {
61
+ super(bot, payload);
62
+ this.sub_type = 'guild';
63
+ }
64
+ async asAnnounce() {
65
+ return this.bot.setChannelAnnounce(this.guild_id, this.channel_id, this.message_id);
66
+ }
67
+ async pin() {
68
+ return this.bot.pinChannelMessage(this.channel_id, this.message_id);
69
+ }
70
+ async reply(message) {
71
+ return this.bot.sendGuildMessage(this.channel_id, message, this);
72
+ }
73
+ }
74
+ exports.GuildMessageEvent = GuildMessageEvent;
75
+ (function (Message) {
76
+ function parse(payload) {
77
+ let template = payload.content || '';
78
+ let result = [];
79
+ let brief = '';
80
+ // 1. 处理文字表情混排
81
+ const regex = /("[^"]*?"|'[^']*?'|`[^`]*?`|“[^”]*?”|‘[^’]*?’|<[^>]+?>)/;
82
+ while (template.length) {
83
+ const [match] = template.match(regex) || [];
84
+ if (!match)
85
+ break;
86
+ const index = template.indexOf(match);
87
+ const prevText = template.slice(0, index);
88
+ if (prevText) {
89
+ result.push({
90
+ type: 'text',
91
+ text: prevText
92
+ });
93
+ brief += prevText;
94
+ }
95
+ template = template.slice(index + match.length);
96
+ if (match.startsWith('<')) {
97
+ let [type, ...attrs] = match.slice(1, -1).split(',');
98
+ if (type.startsWith('faceType')) {
99
+ type = 'face';
100
+ attrs = attrs.map((attr) => attr.replace('faceId', 'id'));
101
+ }
102
+ else if (type.startsWith('@')) {
103
+ if (type.startsWith('@!')) {
104
+ const id = type.slice(2);
105
+ type = 'at';
106
+ attrs = Object.entries(payload.mentions.find((u) => u.id === id) || {})
107
+ .map(([key, value]) => `${key}=${value}`);
108
+ }
109
+ else if (type === '@everyone') {
110
+ type = 'at';
111
+ attrs = [['all', true]];
112
+ }
113
+ }
114
+ else if (/^[a-z]+:[0-9]+$/.test(type)) {
115
+ attrs = [['id', type.split(':')[1]]];
116
+ type = 'face';
117
+ }
118
+ result.push({
119
+ type,
120
+ ...Object.fromEntries(attrs.map((attr) => {
121
+ const [key, ...values] = attr.split('=');
122
+ return [key.toLowerCase(), (0, utils_1.trimQuote)(values.join('='))];
123
+ }))
124
+ });
125
+ brief += `<${type}:${attrs.join(',')}>`;
126
+ }
127
+ }
128
+ if (template) {
129
+ result.push({
130
+ type: 'text',
131
+ text: template
132
+ });
133
+ brief += template;
134
+ }
135
+ // 2. 将附件添加到消息中
136
+ if (payload.attachments) {
137
+ for (const attachment of payload.attachments) {
138
+ let { content_type, ...data } = attachment;
139
+ const [type] = content_type.split('/');
140
+ result.push({
141
+ type,
142
+ ...data,
143
+ src: data.src || data.url,
144
+ url: data.url || data.src
145
+ });
146
+ brief += `<$${type},${Object.entries(data).map(([key, value]) => `${key}=${value}`).join(',')}>`;
147
+ }
148
+ }
149
+ delete payload.attachments;
150
+ delete payload.mentions;
151
+ return [result, brief];
152
+ }
153
+ Message.parse = parse;
154
+ async function format(message, source = {}) {
155
+ const getType = (type) => {
156
+ return ['image', 'video', 'audio'].indexOf(type) + 1;
157
+ };
158
+ let brief = '';
159
+ const messages = {
160
+ msg_type: 0,
161
+ content: '',
162
+ msg_id: source?.message_id,
163
+ msg_seq: (0, crypto_1.randomInt)(1, 1000000),
164
+ timestamp: Number((Date.now() / 1000).toFixed(0))
165
+ };
166
+ const files = {
167
+ msg_id: source?.message_id,
168
+ msg_seq: (0, crypto_1.randomInt)(1, 1000000),
169
+ timestamp: Number((Date.now() / 1000).toFixed(0))
170
+ };
171
+ let hasMessages = false, hasFiles = false, buttons = [];
172
+ if (!Array.isArray(message))
173
+ message = [message];
174
+ for (let elem of message) {
175
+ if (typeof elem === 'string') {
176
+ elem = { type: 'text', text: elem };
177
+ }
178
+ switch (elem.type) {
179
+ case 'reply':
180
+ messages.msg_id = elem.message_id;
181
+ files.msg_id = elem.message_id;
182
+ brief += `<$reply,message_id=${elem.message_id}>`;
183
+ break;
184
+ case "at":
185
+ if (messages.content) {
186
+ messages.content += `<@${elem.id || 'everyone'}>`;
187
+ }
188
+ else {
189
+ messages.content = `<@${elem.id || 'everyone'}>`;
190
+ }
191
+ brief += `<$at,user=${elem.id || 'everyone'}>`;
192
+ break;
193
+ case 'link':
194
+ if (messages.content) {
195
+ messages.content += `<#${elem.channel_id}>`;
196
+ }
197
+ else {
198
+ messages.content = `<#${elem.channel_id}>`;
199
+ }
200
+ brief += `<$link,channel=${elem.channel_id}>`;
201
+ break;
202
+ case 'text':
203
+ if (messages.content) {
204
+ messages.content += elem.text;
205
+ }
206
+ else {
207
+ messages.content = elem.text;
208
+ }
209
+ hasMessages = true;
210
+ brief += elem.text;
211
+ break;
212
+ case 'face':
213
+ if (messages.content) {
214
+ messages.content += `<emoji:${elem.id}>`;
215
+ }
216
+ else {
217
+ messages.content = `<emoji:${elem.id}>`;
218
+ }
219
+ brief += `<$face,id=${elem.id}>`;
220
+ hasMessages = true;
221
+ break;
222
+ case 'image':
223
+ case 'audio':
224
+ case 'video':
225
+ files.file_type = getType(elem.type);
226
+ files.content = 'file';
227
+ files.url = elem.file;
228
+ files.event_id = source.event_id;
229
+ files.msg_id = source?.message_id;
230
+ files.srv_send_msg = true;
231
+ hasFiles = true;
232
+ brief += `<${elem.type},file=${elem.file}>`;
233
+ break;
234
+ case 'markdown':
235
+ messages.markdown = {
236
+ content: elem.content
237
+ };
238
+ messages.msg_type = 2;
239
+ hasMessages = true;
240
+ brief += `<#markdown,content=${elem.content}>`;
241
+ break;
242
+ case 'button':
243
+ buttons.push(elem.data);
244
+ brief += `<$button,data=${JSON.stringify(elem.data)}>`;
245
+ break;
246
+ }
247
+ }
248
+ if (buttons.length) {
249
+ const rows = [];
250
+ for (let i = 0; i < buttons.length; i += 4) {
251
+ rows.push(buttons.slice(i, i + 4));
252
+ }
253
+ messages.keyboard = {
254
+ content: {
255
+ rows: rows.map(row => {
256
+ return {
257
+ buttons: row
258
+ };
259
+ })
260
+ }
261
+ };
262
+ }
263
+ return {
264
+ messages: messages,
265
+ hasFiles,
266
+ hasMessages,
267
+ brief,
268
+ files
269
+ };
270
+ }
271
+ Message.format = format;
272
+ })(Message || (exports.Message = Message = {}));
@@ -0,0 +1,122 @@
1
+ /// <reference types="node" />
2
+ import { AxiosInstance } from "axios";
3
+ import { WebSocket } from "ws";
4
+ import * as log4js from 'log4js';
5
+ import { EventEmitter } from "events";
6
+ import { SessionManager } from "./sessionManager";
7
+ import { Quotable, Sendable } from "./elements";
8
+ import { ApiBaseInfo, Dict, LogLevel, UpdatePermissionParams } from "./types";
9
+ import { DirectMessageEvent, GroupMessageEvent, GuildMessageEvent, PrivateMessageEvent } from "./message";
10
+ import { EventMap } from "./event";
11
+ import { Channel } from "../../adapters/qq/entries/channel";
12
+ import { Guild } from "../../adapters/qq/entries/guild";
13
+ export declare class QQBot extends EventEmitter {
14
+ config: QQBot.Config;
15
+ request: AxiosInstance;
16
+ self_id: string;
17
+ nickname: string;
18
+ status: number;
19
+ logger: log4js.Logger;
20
+ ws: WebSocket;
21
+ sessionManager: SessionManager;
22
+ constructor(config: QQBot.Config);
23
+ removeAt(payload: Dict): void;
24
+ processPayload(event_id: string, event: string, payload: Dict): GroupMessageEvent | PrivateMessageEvent | GuildMessageEvent | DirectMessageEvent | Dict;
25
+ getSelfInfo(): Promise<any>;
26
+ getChannelPermissionOfRole(channel_id: string, role_id: string): Promise<any>;
27
+ setChannelAnnounce(guild_id: string, channel_id: string, message_id: string): Promise<any>;
28
+ updateChannelPermissionOfRole(channel_id: string, role_id: string, permission: UpdatePermissionParams): Promise<boolean>;
29
+ getChannelMemberPermission(channel_id: string, member_id: string): Promise<any>;
30
+ updateChannelMemberPermission(channel_id: string, member_id: string, permission: UpdatePermissionParams): Promise<boolean>;
31
+ getChannelPins(channel_id: string): Promise<string[]>;
32
+ pinChannelMessage(channel_id: string, message_id: string): Promise<any>;
33
+ unPinChannelMessage(channel_id: string, message_id: string): Promise<any>;
34
+ createChannel(guild_id: string, channelInfo: Omit<Channel.Info, 'id'>): Promise<Channel.Info>;
35
+ updateChannel({ channel_id, ...updateInfo }: {
36
+ channel_id: string;
37
+ } & Partial<Pick<Channel.Info, 'name' | 'position' | 'parent_id' | 'private_type' | 'speak_permission'>>): Promise<Channel.Info>;
38
+ deleteChannel(channel_id: string): Promise<boolean>;
39
+ getGuildRoles(guild_id: string): Promise<any>;
40
+ creatGuildRole(guild_id: string, role: Pick<Guild.Role, 'name' | 'color' | 'hoist'>): Promise<Guild.Role>;
41
+ updateGuildRole(guild_id: string, { id, ...role }: Pick<Guild.Role, 'id' | 'name' | 'color' | 'hoist'>): Promise<any>;
42
+ deleteGuildRole(role_id: string): Promise<boolean>;
43
+ getGuildAccessApis(guild_id: string): Promise<any>;
44
+ applyGuildAccess(guild_id: string, channel_id: string, apiInfo: ApiBaseInfo, desc?: string): Promise<any>;
45
+ unMuteGuild(guild_id: string): Promise<boolean>;
46
+ muteGuild(guild_id: string, seconds: number, end_time?: number): Promise<boolean>;
47
+ unMuteGuildMembers(guild_id: string, member_ids: string[]): Promise<boolean>;
48
+ muteGuildMembers(guild_id: string, member_ids: string[], seconds: number, end_time?: number): Promise<boolean>;
49
+ addGuildMemberRoles(guild_id: string, channel_id: string, member_id: string, role_id: string): Promise<boolean>;
50
+ removeGuildMemberRoles(guild_id: string, channel_id: string, member_id: string, role_id: string): Promise<boolean>;
51
+ kickGuildMember(guild_id: string, member_id: string, clean?: -1 | 0 | 3 | 7 | 15 | 30, blacklist?: boolean): Promise<boolean>;
52
+ unMuteGuildMember(guild_id: string, member_id: string): Promise<boolean>;
53
+ muteGuildMember(guild_id: string, member_id: string, seconds: number, end_time?: number): Promise<boolean>;
54
+ getGuildList(): Promise<any>;
55
+ getGuildMemberList(guild_id: string): Promise<any>;
56
+ getGuildMemberInfo(guild_id: string, member_id: string): Promise<any>;
57
+ getChannelInfo(channel_id: string): Promise<any>;
58
+ getGroupMemberList(group_id: string): Promise<void>;
59
+ getGroupMemberInfo(group_id: string, member_id: string): Promise<void>;
60
+ getFriendList(): Promise<void>;
61
+ getFriendInfo(friend_id: string): Promise<void>;
62
+ getChannelList(guild_id: string): Promise<any>;
63
+ sendPrivateMessage(user_id: string, message: Sendable, source?: Quotable): Promise<{
64
+ message_id: string;
65
+ timestamp: number;
66
+ }>;
67
+ createDirectSession(guild_id: string, user_id: string): Promise<any>;
68
+ sendDirectMessage(guild_id: string, message: Sendable, source?: Quotable): Promise<{
69
+ message_id: string;
70
+ timestamp: number;
71
+ }>;
72
+ sendGuildMessage(channel_id: string, message: Sendable, source?: Quotable): Promise<{
73
+ message_id: string;
74
+ timestamp: number;
75
+ }>;
76
+ sendGroupMessage(group_id: string, message: Sendable, source?: Quotable): Promise<{
77
+ message_id: string;
78
+ timestamp: number;
79
+ }>;
80
+ dispatchEvent(event: string, wsRes: any): void;
81
+ em(event: string, payload: Dict): void;
82
+ }
83
+ export interface QQBot {
84
+ on<T extends keyof EventMap>(event: T, callback: EventMap[T]): this;
85
+ on<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback: (...args: any[]) => void): this;
86
+ once<T extends keyof EventMap>(event: T, callback: EventMap[T]): this;
87
+ once<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback: (...args: any[]) => void): this;
88
+ off<T extends keyof EventMap>(event: T, callback?: EventMap[T]): this;
89
+ off<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback?: (...args: any[]) => void): this;
90
+ emit<T extends keyof EventMap>(event: T, ...args: Parameters<EventMap[T]>): boolean;
91
+ emit<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, ...args: any[]): boolean;
92
+ addListener<T extends keyof EventMap>(event: T, callback: EventMap[T]): this;
93
+ addListener<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback: (...args: any[]) => void): this;
94
+ addListenerOnce<T extends keyof EventMap>(event: T, callback: EventMap[T]): this;
95
+ addListenerOnce<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback: (...args: any[]) => void): this;
96
+ removeListener<T extends keyof EventMap>(event: T, callback?: EventMap[T]): this;
97
+ removeListener<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>, callback?: (...args: any[]) => void): this;
98
+ removeAllListeners<T extends keyof EventMap>(event: T): this;
99
+ removeAllListeners<S extends string | symbol>(event: S & Exclude<string | symbol, keyof EventMap>): this;
100
+ }
101
+ export declare namespace QQBot {
102
+ interface Token {
103
+ access_token: string;
104
+ expires_in: number;
105
+ cache: string;
106
+ }
107
+ interface Config {
108
+ appid: string;
109
+ secret: string;
110
+ token?: string;
111
+ sandbox?: boolean;
112
+ maxRetry?: number;
113
+ /**
114
+ * 是否移除第一个@
115
+ */
116
+ removeAt?: boolean;
117
+ delay?: Dict<number>;
118
+ intents?: string[];
119
+ logLevel?: LogLevel;
120
+ }
121
+ function getFullTargetId(message: GuildMessageEvent | GroupMessageEvent | PrivateMessageEvent): string;
122
+ }