koishi-plugin-mcdle 0.0.2 → 0.0.4

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/index.d.ts CHANGED
@@ -9,6 +9,8 @@ export interface Config {
9
9
  isEnableMiddleware: boolean;
10
10
  maxRank: number;
11
11
  dailyPlayLimit: number;
12
+ retractDelay: number;
13
+ allowRepeatedGuesses: boolean;
12
14
  }
13
15
  export declare const Config: Schema<Config>;
14
16
  declare module "koishi" {
package/lib/index.js CHANGED
@@ -14647,7 +14647,11 @@ var Config = import_koishi.Schema.object({
14647
14647
  quoteReply: import_koishi.Schema.boolean().default(true).description("响应时引用消息"),
14648
14648
  isEnableMiddleware: import_koishi.Schema.boolean().default(false).description("启用中间件(无需指令直接猜测)"),
14649
14649
  maxRank: import_koishi.Schema.number().default(10).min(0).description("排行榜最大显示人数"),
14650
- dailyPlayLimit: import_koishi.Schema.number().default(1).min(1).description("每日游玩次数上限")
14650
+ dailyPlayLimit: import_koishi.Schema.number().default(1).min(1).description("每日游玩次数上限"),
14651
+ retractDelay: import_koishi.Schema.number().min(0).default(0).description(
14652
+ `撤回上一条消息的等待时间,单位是秒。值为 0 时不启用自动撤回功能。`
14653
+ ),
14654
+ allowRepeatedGuesses: import_koishi.Schema.boolean().default(false).description("允许重复猜测已猜过的词语(防止撤回时历史不可见)")
14651
14655
  });
14652
14656
  function apply(ctx, cfg) {
14653
14657
  ctx.model.extend(
@@ -14681,6 +14685,7 @@ function apply(ctx, cfg) {
14681
14685
  primary: "userId"
14682
14686
  }
14683
14687
  );
14688
+ const logger = ctx.logger("mcdle");
14684
14689
  if (cfg.isEnableMiddleware) {
14685
14690
  ctx.middleware(async (session, next) => {
14686
14691
  let gameRecords = await ctx.database.get("mcdle", { channelId: session.channelId });
@@ -14693,7 +14698,7 @@ function apply(ctx, cfg) {
14693
14698
  }
14694
14699
  const content = session.content.trim();
14695
14700
  if (content.length > 10 || /[,。!?;:'"“”‘’【】()《》.,!?;:'"\[\]()<>]/.test(content)) return next();
14696
- if (game.guessedChineseTitles.includes(content)) {
14701
+ if (!cfg.allowRepeatedGuesses && game.guessedChineseTitles.includes(content)) {
14697
14702
  return next();
14698
14703
  }
14699
14704
  let dataSource = [];
@@ -14711,8 +14716,13 @@ function apply(ctx, cfg) {
14711
14716
  return;
14712
14717
  });
14713
14718
  }
14714
- ctx.command("mcdle", "我的世界猜谜游戏").action(() => {
14715
- return [
14719
+ ctx.command("mcdle", "我的世界猜谜游戏").action(async ({ session }) => mcdle(session));
14720
+ ctx.command("mcdle.猜 [guess:string]").action(async ({ session }, guess) => c(session, guess?.trim()));
14721
+ ctx.command("mcdle.帮助").action(async ({ session }) => bz(session));
14722
+ ctx.command("mcdle.排行榜").action(async ({ session }) => phb(session));
14723
+ ctx.command("mcdle.词库").action(async ({ session }) => ck(session));
14724
+ async function mcdle(session) {
14725
+ await sendMsg(session, [
14716
14726
  "欢迎使用 MCDLE",
14717
14727
  "",
14718
14728
  "猜生物 物品 方块",
@@ -14727,56 +14737,35 @@ function apply(ctx, cfg) {
14727
14737
  " mcdle.排行榜",
14728
14738
  "",
14729
14739
  "愿你洞察世界万象"
14730
- ].join("\n");
14731
- });
14732
- ctx.command("mcdle.猜 [guess:string]").action(async ({ session }, guess) => c(session, guess?.trim()));
14733
- ctx.command("mcdle.帮助").action(async ({ session }) => bz(session));
14734
- ctx.command("mcdle.排行榜").action(async ({ session }) => phb(session));
14735
- ctx.command("mcdle.词库").action(async ({ session }) => ck(session));
14740
+ ].join("\n"));
14741
+ }
14742
+ __name(mcdle, "mcdle");
14736
14743
  async function ck(session) {
14737
- if (session.bot?.platform === "onebot" && session.bot?.internal?.sendForwardMsg) {
14738
- const nodes = [
14739
- {
14740
- type: "node",
14741
- data: {
14742
- name: "MCDLE词库",
14743
- uin: session.bot.selfId,
14744
- content: `生物词库:
14745
- ${mobChineseTitle.join(" ")}`
14746
- }
14747
- },
14748
- {
14749
- type: "node",
14750
- data: {
14751
- name: "MCDLE词库",
14752
- uin: session.bot.selfId,
14753
- content: `方块词库:
14754
- ${blockChineseTitle.join(" ")}`
14755
- }
14756
- },
14757
- {
14758
- type: "node",
14759
- data: {
14760
- name: "MCDLE词库",
14761
- uin: session.bot.selfId,
14762
- content: `物品词库:
14763
- ${itemChineseTitle.join(" ")}`
14764
- }
14765
- }
14744
+ if (["red", "onebot"].includes(session.platform)) {
14745
+ const allContentNodes = [
14746
+ (0, import_koishi.h)("message", { userId: session.userId }, `生物词库:
14747
+ ${mobChineseTitle.join(" ")}`),
14748
+ (0, import_koishi.h)("message", { userId: session.userId }, `方块词库:
14749
+ ${blockChineseTitle.join(" ")}`),
14750
+ (0, import_koishi.h)("message", { userId: session.userId }, `物品词库:
14751
+ ${itemChineseTitle.join(" ")}`)
14766
14752
  ];
14767
14753
  try {
14768
- await session.bot.internal.sendForwardMsg(session.channelId, nodes);
14754
+ await session.send((0, import_koishi.h)("figure", {}, allContentNodes));
14769
14755
  return;
14770
14756
  } catch (error) {
14771
- console.warn("合并转发失败,降级为普通消息:", error);
14757
+ logger.warn("合并转发失败,降级为普通消息:", error);
14772
14758
  }
14773
14759
  }
14774
- await sendMsg(session, `生物词库:
14775
- ${mobChineseTitle.join(" ")}`);
14776
- await sendMsg(session, `方块词库:
14777
- ${blockChineseTitle.join(" ")}`);
14778
- await sendMsg(session, `物品词库:
14779
- ${itemChineseTitle.join(" ")}`);
14760
+ const combinedMessage = [
14761
+ `生物词库:
14762
+ ${mobChineseTitle.join(" ")}`,
14763
+ `方块词库:
14764
+ ${blockChineseTitle.join(" ")}`,
14765
+ `物品词库:
14766
+ ${itemChineseTitle.join(" ")}`
14767
+ ].join("\n\n");
14768
+ await sendMsg(session, combinedMessage);
14780
14769
  }
14781
14770
  __name(ck, "ck");
14782
14771
  async function c(session, guess) {
@@ -14929,7 +14918,7 @@ ${itemChineseTitle.join(" ")}`);
14929
14918
  await sendMsg(session, `模式数据异常`);
14930
14919
  return;
14931
14920
  }
14932
- if (record.guessedChineseTitles.includes(guess)) {
14921
+ if (!cfg.allowRepeatedGuesses && record.guessedChineseTitles.includes(guess)) {
14933
14922
  await sendMsg(session, `${guess} 已猜过`);
14934
14923
  return;
14935
14924
  }
@@ -14940,11 +14929,11 @@ ${itemChineseTitle.join(" ")}`);
14940
14929
  ).slice(0, 3);
14941
14930
  if (fuzzyMatches.length > 0) {
14942
14931
  const suggestions = fuzzyMatches.map((d) => d.chinese_title).join("、");
14943
- await sendMsg(session, `${guess} 不在词库中
14932
+ await sendMsg(session, `${guess} 不在${record.gameMode === "mob" ? "生物" : record.gameMode === "item" ? "物品" : "方块"}词库中
14944
14933
 
14945
14934
  是否想猜:${suggestions}?`);
14946
14935
  } else {
14947
- await sendMsg(session, `${guess} 不在词库中`);
14936
+ await sendMsg(session, `${guess} 不在${record.gameMode === "mob" ? "生物" : record.gameMode === "item" ? "物品" : "方块"}词库中`);
14948
14937
  }
14949
14938
  return;
14950
14939
  }
@@ -15163,6 +15152,7 @@ ${itemChineseTitle.join(" ")}`);
15163
15152
  return versionString;
15164
15153
  }
15165
15154
  __name(normalizeVersion, "normalizeVersion");
15155
+ const lastMessageInfo = /* @__PURE__ */ new Map();
15166
15156
  async function sendMsg(session, msg) {
15167
15157
  if (cfg.atReply) {
15168
15158
  msg = `${import_koishi.h.at(session.userId)}${(0, import_koishi.h)("p", "")}${msg}`;
@@ -15170,7 +15160,24 @@ ${itemChineseTitle.join(" ")}`);
15170
15160
  if (cfg.quoteReply) {
15171
15161
  msg = `${import_koishi.h.quote(session.messageId)}${msg}`;
15172
15162
  }
15173
- await session.send(msg);
15163
+ const [messageId] = await session.send(msg);
15164
+ if (cfg.retractDelay > 0 && messageId) {
15165
+ const prevMessage = lastMessageInfo.get(session.channelId);
15166
+ if (prevMessage) {
15167
+ const timePassed = Date.now() - prevMessage.timestamp;
15168
+ const remainingDelay = cfg.retractDelay * 1e3 - timePassed;
15169
+ if (timePassed < 118e3) {
15170
+ setTimeout(async () => {
15171
+ try {
15172
+ await session.bot.deleteMessage(session.channelId, prevMessage.id);
15173
+ } catch (error) {
15174
+ logger.warn(`Failed to retract message ${prevMessage.id}: ${error.message}`);
15175
+ }
15176
+ }, remainingDelay);
15177
+ }
15178
+ }
15179
+ lastMessageInfo.set(session.channelId, { id: messageId, timestamp: Date.now() });
15180
+ }
15174
15181
  }
15175
15182
  __name(sendMsg, "sendMsg");
15176
15183
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-mcdle",
3
3
  "description": "Koishi 的 Minecraft 猜词游戏插件。根据 Minecraft 物品、生物和方块的属性特征,猜测正确的名称。",
4
- "version": "0.0.2",
4
+ "version": "0.0.4",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [