koishi-plugin-forward-hime 1.2.0 → 1.2.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/lib/cache.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import { Context } from "koishi";
2
+ export interface MsgCache {
3
+ platform: string;
4
+ bot: string;
5
+ guild: string;
6
+ msgid: string;
7
+ uuid: string;
8
+ }
9
+ declare module "@koishijs/cache" {
10
+ interface Tables {
11
+ msgCache: MsgCache;
12
+ }
13
+ }
14
+ export declare function msgCache(ctx: Context, mc: MsgCache): Promise<void>;
15
+ export declare function msgCacheDelete(ctx: Context, key: string): Promise<void>;
16
+ export declare function msgCacheFindByKey(ctx: Context, key: string): Promise<MsgCache>;
17
+ export declare function msgCacheFindByUUID(ctx: Context, uuid: string): Promise<any[]>;
package/lib/index.d.ts CHANGED
@@ -1,7 +1,10 @@
1
1
  import { Context } from "koishi";
2
2
  import { ConfigSet } from "./config";
3
- export declare const reusable = true;
4
3
  export declare const name = "forward hime - \u8F6C\u53D1\u59EC";
5
- export declare const usage = "\n# forward hime - \u8F6C\u53D1\u59EC <sub>v1.2.0</sub>\n## \u914D\u7F6E\u8BF4\u660E\n1. \u6DFB\u52A0 `\u4E92\u901A\u8F6C\u53D1\u7EC4`\n2. \u4E3A\u6DFB\u52A0\u7684 `\u4E92\u901A\u8F6C\u53D1\u7EC4` \u914D\u7F6E\u8F6C\u53D1\u8282\u70B9\u3002\u6BCF\u4E2A\u8F6C\u53D1\u8282\u70B9\u5BF9\u5E94\u67D0\u4E2A\u5E73\u53F0\u7684\u4E00\u4E2A\u9891\u9053\u6216\u7FA4\u7EC4\n## \u7279\u6027\n- \u53EF\u4EE5\u914D\u7F6E\u591A\u4E2A `\u4E92\u901A\u8F6C\u53D1\u7EC4`\uFF0C\u6BCF\u4E2A `\u4E92\u901A\u8F6C\u53D1\u7EC4` \u4E4B\u95F4\u76F8\u4E92\u72EC\u7ACB\n- \u542F\u7528\u63D2\u4EF6\u540E\uFF0C\u5F53\u4E00\u4E2A `\u4E92\u901A\u8F6C\u53D1\u7EC4` \u4E2D\u7684\u4EFB\u610F\u8282\u70B9\u6536\u5230\u6D88\u606F\u65F6\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u5C06\u6D88\u606F\u8F6C\u53D1\u7ED9**\u8FD9\u4E2A**`\u4E92\u901A\u8F6C\u53D1\u7EC4`\u4E2D\u7684\u5176\u4ED6\u8282\u70B9\u3002\n---";
4
+ export declare const usage = "\n# forward hime - \u8F6C\u53D1\u59EC <sub>v1.2.1</sub>\n## \u914D\u7F6E\u8BF4\u660E\n1. \u6DFB\u52A0 `\u4E92\u901A\u8F6C\u53D1\u7EC4`\n2. \u4E3A\u6DFB\u52A0\u7684 `\u4E92\u901A\u8F6C\u53D1\u7EC4` \u914D\u7F6E\u8F6C\u53D1\u8282\u70B9\u3002\u6BCF\u4E2A\u8F6C\u53D1\u8282\u70B9\u5BF9\u5E94\u67D0\u4E2A\u5E73\u53F0\u7684\u4E00\u4E2A\u9891\u9053\u6216\u7FA4\u7EC4\n\n\u6CE8\u610F\uFF1A\u5F53\u672A\u914D\u7F6E`cache`\u65F6\uFF0C\u8DE8\u5E73\u53F0\u5220\u9664\u3001\u8DE8\u5E73\u53F0\u56DE\u590D\u7B49\u529F\u80FD\u5C06\u65E0\u6CD5\u6B63\u5E38\u5DE5\u4F5C\u3002\n## \u7279\u6027\n- \u53EF\u4EE5\u914D\u7F6E\u591A\u4E2A `\u4E92\u901A\u8F6C\u53D1\u7EC4`\uFF0C\u6BCF\u4E2A `\u4E92\u901A\u8F6C\u53D1\u7EC4` \u4E4B\u95F4\u76F8\u4E92\u72EC\u7ACB\n- \u542F\u7528\u63D2\u4EF6\u540E\uFF0C\u5F53\u4E00\u4E2A `\u4E92\u901A\u8F6C\u53D1\u7EC4` \u4E2D\u7684\u4EFB\u610F\u8282\u70B9\u6536\u5230\u6D88\u606F\u65F6\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u5C06\u6D88\u606F\u8F6C\u53D1\u7ED9**\u8FD9\u4E2A**`\u4E92\u901A\u8F6C\u53D1\u7EC4`\u4E2D\u7684\u5176\u4ED6\u8282\u70B9\u3002\n---";
5
+ export declare const reusable = true;
6
+ export declare const inject: {
7
+ optional: string[];
8
+ };
6
9
  export declare const Config: import("schemastery")<ConfigSet>;
7
10
  export declare function apply(ctx: Context, cfg: ConfigSet): void;
package/lib/index.js CHANGED
@@ -22,6 +22,7 @@ var src_exports = {};
22
22
  __export(src_exports, {
23
23
  Config: () => Config,
24
24
  apply: () => apply,
25
+ inject: () => inject,
25
26
  name: () => name,
26
27
  reusable: () => reusable,
27
28
  usage: () => usage
@@ -156,35 +157,107 @@ function at2Name({ head, content }) {
156
157
  }
157
158
  __name(at2Name, "at2Name");
158
159
 
160
+ // src/cache.ts
161
+ function cacheNotEnabled(ctx) {
162
+ if (!ctx.cache) {
163
+ return true;
164
+ }
165
+ return false;
166
+ }
167
+ __name(cacheNotEnabled, "cacheNotEnabled");
168
+ async function msgCache(ctx, mc) {
169
+ if (cacheNotEnabled(ctx)) {
170
+ return;
171
+ }
172
+ const key = mc.guild + ":" + mc.msgid;
173
+ logger.debug("[message-cache]", key, mc);
174
+ await ctx.cache.set("msgCache", key, mc, 7200 * 1e3);
175
+ }
176
+ __name(msgCache, "msgCache");
177
+ async function msgCacheDelete(ctx, key) {
178
+ if (cacheNotEnabled(ctx)) {
179
+ return;
180
+ }
181
+ await ctx.cache.delete("msgCache", key);
182
+ }
183
+ __name(msgCacheDelete, "msgCacheDelete");
184
+ async function msgCacheFindByKey(ctx, key) {
185
+ if (cacheNotEnabled(ctx)) {
186
+ return;
187
+ }
188
+ return await ctx.cache.get("msgCache", key);
189
+ }
190
+ __name(msgCacheFindByKey, "msgCacheFindByKey");
191
+ async function msgCacheFindByUUID(ctx, uuid) {
192
+ if (cacheNotEnabled(ctx)) {
193
+ return;
194
+ }
195
+ let caches = await ctx.cache.entries("msgCache");
196
+ let result = [];
197
+ for await (const item of caches) {
198
+ if (item[1].uuid === uuid) {
199
+ result.push(item);
200
+ }
201
+ }
202
+ return result;
203
+ }
204
+ __name(msgCacheFindByUUID, "msgCacheFindByUUID");
205
+
159
206
  // src/message.ts
160
207
  async function MessageForward(ctx, node, session) {
161
208
  try {
162
- if (ctx.bots[`${node.Platform}:${node.BotID}`] == void 0) {
163
- throw new Error("Bot Not Found");
164
- }
165
- await ctx.bots[`${node.Platform}:${node.BotID}`].sendMessage(
166
- node.Guild,
167
- MsgDecorator(session, node)
168
- );
209
+ botExistsCheck(ctx, node);
210
+ const uuid = session.channelId + ":" + session.messageId;
211
+ await ctx.bots[`${node.Platform}:${node.BotID}`].sendMessage(node.Guild, MsgDecorator(session, node)).then((res) => {
212
+ let mc = {
213
+ platform: node.Platform,
214
+ bot: node.BotID,
215
+ guild: node.Guild,
216
+ msgid: res[0],
217
+ uuid
218
+ };
219
+ msgCache(ctx, mc);
220
+ logger.debug("Forward", mc);
221
+ });
169
222
  } catch (error) {
170
223
  logger.error(`ERROR:<MessageSend> ${error}`);
171
224
  }
172
225
  }
173
226
  __name(MessageForward, "MessageForward");
227
+ async function MessageDelete(ctx, msg) {
228
+ try {
229
+ botExistsCheck(ctx, { Platform: msg.platform, BotID: msg.bot, Guild: msg.guild });
230
+ await ctx.bots[`${msg.platform}:${msg.bot}`].deleteMessage(msg.guild, msg.msgid);
231
+ } catch (error) {
232
+ logger.error(`ERROR:<MessageDelete> ${error}`);
233
+ }
234
+ }
235
+ __name(MessageDelete, "MessageDelete");
236
+ function botExistsCheck(ctx, node) {
237
+ if (ctx.bots[`${node.Platform}:${node.BotID}`] == void 0) {
238
+ throw new Error("Bot Not Found");
239
+ }
240
+ }
241
+ __name(botExistsCheck, "botExistsCheck");
174
242
 
175
243
  // src/index.ts
176
- var reusable = true;
177
244
  var name = `forward hime - 转发姬`;
178
- var version = `<sub>v1.2.0</sub>`;
245
+ var version = `<sub>v1.2.1</sub>`;
179
246
  var usage = `
180
247
  # ${name} ${version}
181
248
  ## 配置说明
182
249
  1. 添加 \`互通转发组\`
183
250
  2. 为添加的 \`互通转发组\` 配置转发节点。每个转发节点对应某个平台的一个频道或群组
251
+
252
+ 注意:当未配置\`cache\`时,跨平台删除、跨平台回复等功能将无法正常工作。
184
253
  ## 特性
185
254
  - 可以配置多个 \`互通转发组\`,每个 \`互通转发组\` 之间相互独立
186
255
  - 启用插件后,当一个 \`互通转发组\` 中的任意节点收到消息时,插件会自动将消息转发给**这个**\`互通转发组\`中的其他节点。
187
256
  ---`;
257
+ var reusable = true;
258
+ var inject = {
259
+ optional: ["cache"]
260
+ };
188
261
  var Config = createConfig();
189
262
  function apply(ctx, cfg) {
190
263
  ctx.on("message-created", async (session) => {
@@ -195,9 +268,16 @@ function apply(ctx, cfg) {
195
268
  if (group.Nodes[k].Guild === session.channelId && group.Nodes[k].Platform === session.platform && group.Nodes[k].BotID !== session.userId) {
196
269
  logger.debug(
197
270
  "[message-created]",
198
- session.messageId,
199
- session.elements
271
+ session.channelId + ":" + session.messageId
200
272
  );
273
+ let uuid = session.channelId + ":" + session.messageId;
274
+ msgCache(ctx, {
275
+ platform: session.platform,
276
+ bot: group.Nodes[k].BotID,
277
+ guild: session.channelId,
278
+ msgid: session.messageId,
279
+ uuid
280
+ });
201
281
  hitGroup.push(g);
202
282
  break;
203
283
  }
@@ -213,7 +293,25 @@ function apply(ctx, cfg) {
213
293
  }
214
294
  });
215
295
  ctx.on("message-deleted", async (session) => {
216
- logger.debug("[message-deleted]", session.messageId);
296
+ const cacheKey = session.channelId + ":" + session.messageId;
297
+ logger.debug("[message-deleted]", cacheKey);
298
+ msgCacheFindByKey(ctx, cacheKey).then((res) => {
299
+ if (res) {
300
+ logger.debug("[msgCacheFindByKey]", res);
301
+ msgCacheDelete(ctx, cacheKey);
302
+ const uuid = res.uuid;
303
+ msgCacheFindByUUID(ctx, uuid).then((res2) => {
304
+ if (res2) {
305
+ for (const k in res2) {
306
+ logger.debug("[message-delete]", res2[k][1]);
307
+ msgCacheDelete(ctx, res2[k][0]).then(() => {
308
+ MessageDelete(ctx, res2[k][1]);
309
+ });
310
+ }
311
+ }
312
+ });
313
+ }
314
+ });
217
315
  });
218
316
  ctx.on("message-updated", async (session) => {
219
317
  logger.debug("[message-updated]", session.messageId, session);
@@ -224,6 +322,7 @@ __name(apply, "apply");
224
322
  0 && (module.exports = {
225
323
  Config,
226
324
  apply,
325
+ inject,
227
326
  name,
228
327
  reusable,
229
328
  usage
package/lib/message.d.ts CHANGED
@@ -1,3 +1,6 @@
1
1
  import { Context, Session } from "koishi";
2
2
  import { ForwardNode } from "./config";
3
+ import { MsgCache } from "./cache";
3
4
  export declare function MessageForward(ctx: Context, node: ForwardNode, session: Session): Promise<void>;
5
+ export declare function MessageDelete(ctx: Context, msg: MsgCache): Promise<void>;
6
+ export declare function MessageEdit(ctx: Context, node: ForwardNode, session: Session): Promise<void>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-forward-hime",
3
3
  "description": "多群组消息互通",
4
- "version": "1.2.0",
4
+ "version": "1.2.1",
5
5
  "author": {
6
6
  "name": "xianii",
7
7
  "email": "jiyucheng007@gmail.com"
@@ -12,7 +12,6 @@
12
12
  "lib"
13
13
  ],
14
14
  "koishi": {
15
- "preview": true,
16
15
  "browser": true
17
16
  },
18
17
  "license": "MIT",