koishi-plugin-ciyi 1.2.5 → 1.2.7

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
@@ -1,7 +1,7 @@
1
- import { Context, Schema } from "koishi";
1
+ import { Context, Schema, Session } from "koishi";
2
2
  import { History } from "./view";
3
3
  export declare const name = "ciyi";
4
- export declare const usage = "# \u8BCD\u610F\n\n\u6309\u300C\u610F\u601D\u6709\u591A\u8FD1\u300D\u627E\u8BCD\uFF1A\u7CFB\u7EDF\u6BCF\u5929\u85CF\u8D77\u4E00\u4E2A\u4E24\u5B57\u8BCD\uFF0C\u4F60\u62A5\u8BCD\uFF0C\u5B83\u56DE\u4F60\u8FD9\u4E2A\u8BCD\u4E0E\u7B54\u6848\u7684\u8BED\u4E49\u6392\u540D\u3002\n\u540D\u6B21\u8D8A\u5C0F\u8D8A\u8FD1\uFF0C**#1 \u5C31\u662F\u7B54\u6848\u672C\u8EAB**\u3002\n\n## \u4F7F\u7528\n\n1. \u8BBE\u7F6E\u6307\u4EE4\u522B\u540D\uFF08\u63A8\u8350\u628A `ciyi.\u731C` \u8BBE\u4E3A `\u731C`\uFF09\u3002\n2. \u53D1\u9001 `ciyi.\u731C \u5C71\u6C34` \u76F4\u63A5\u5F00\u59CB\u4ECA\u65E5\u6E38\u620F\u5E76\u63D0\u4EA4\u7B2C\u4E00\u731C\u3002\n\n## \u56FE\u7247\n\n\u542F\u7528 Koishi Canvas \u670D\u52A1\u540E\u6E32\u67D3\u300C\u58A8\u4E0E\u7EB8\u300D\u98CE\u683C\u5361\u7247\uFF1BPuppeteer \u5DF2\u81EA\u5E26\u8BE5\u670D\u52A1\uFF0C\u65E0\u9700\u91CD\u590D\u5B89\u88C5\u7ED8\u56FE\u5E93\u3002\n\u6CA1\u6709\u7ED8\u56FE\u670D\u52A1\u3001\u6E32\u67D3\u5931\u8D25\u6216\u5173\u6389\u300C\u6E32\u67D3\u56FE\u7247\u300D\u65F6\uFF0C\u81EA\u52A8\u56DE\u9000\u4E3A\u7B49\u4EF7\u6587\u672C\uFF0C\u73A9\u6CD5\u4E0D\u53D7\u5F71\u54CD\u3002\n\n## QQ \u7FA4\n\n* 956758505";
4
+ export declare const usage = "## \u4F7F\u7528\n\n\u8BBE\u7F6E\u6307\u4EE4\u522B\u540D\u540E\uFF0C\u53D1\u9001 `ciyi` \u67E5\u770B\u73A9\u6CD5\u3002\u6BCF\u65E5\u85CF\u4E00\u4E2A\u4E24\u5B57\u8BCD\uFF0C\u4F7F\u7528 `ciyi.\u731C <\u8BCD>` \u63D0\u4EA4\u7B2C\u4E00\u6B21\u731C\u6D4B\u5E76\u5F00\u9898\uFF1B\u5F00\u9898\u540E\u53EF\u76F4\u63A5\u53D1\u9001\u4E24\u5B57\u8BCD\u7EE7\u7EED\u731C\u6D4B\u3002\n\n## \u6307\u4EE4\n\n| \u6307\u4EE4 | \u8BF4\u660E |\n| --- | --- |\n| `ciyi` | \u73A9\u6CD5\u8BF4\u660E |\n| `ciyi.\u731C <\u8BCD>` | \u5F00\u59CB\u4ECA\u65E5\u6E38\u620F\u5E76\u63D0\u4EA4\u731C\u6D4B |\n| `ciyi.\u6392\u884C\u699C` | \u731C\u4E2D\u6B21\u6570\u699C |";
5
5
  export declare const inject: {
6
6
  required: string[];
7
7
  optional: string[];
@@ -39,4 +39,11 @@ export interface CiyiRank {
39
39
  score: number;
40
40
  }
41
41
  export type { History };
42
+ /**
43
+ * 裸词中间件只接受一条完整、无修饰的两字中文纯文本消息。
44
+ * 引用、@、图片、富文本以及机器人消息都可能只是普通聊天的一部分,不能据此猜词。
45
+ */
46
+ export declare function getMiddlewareGuess(session: Session): string | null;
47
+ /** 裸词只能加入已开始且未封题的游戏,不能开题,也不重复提交旧猜测。 */
48
+ export declare function canHandleMiddlewareGuess(game: Ciyi | null | undefined, guess: string): boolean;
42
49
  export declare function apply(ctx: Context, cfg: Config): void;
package/lib/index.js CHANGED
@@ -22,6 +22,8 @@ var index_exports = {};
22
22
  __export(index_exports, {
23
23
  Config: () => Config,
24
24
  apply: () => apply,
25
+ canHandleMiddlewareGuess: () => canHandleMiddlewareGuess,
26
+ getMiddlewareGuess: () => getMiddlewareGuess,
25
27
  inject: () => inject,
26
28
  name: () => name,
27
29
  usage: () => usage
@@ -578,7 +580,7 @@ function renderIntroCard(service, opts) {
578
580
  textLeft(ctx, "ciyi.猜 山水", ix + s(96), y + s(24), `${s(13.5)}px ${FONT_NUM}`, C.ink);
579
581
  textLeftFit(
580
582
  ctx,
581
- `开题并报一个两字词${opts.middleware ? ",也可以直接把词发出来" : ""}`,
583
+ `开题并报一个两字词${opts.middleware ? ";开题后可直接发词" : ""}`,
582
584
  ix + s(230),
583
585
  y + s(24),
584
586
  iw - s(268),
@@ -858,33 +860,48 @@ __name(renderRankCard, "renderRankCard");
858
860
 
859
861
  // src/index.ts
860
862
  var name = "ciyi";
861
- var usage = `# 词意
863
+ var usage = `## 使用
862
864
 
863
- 按「意思有多近」找词:系统每天藏起一个两字词,你报词,它回你这个词与答案的语义排名。
864
- 名次越小越近,**#1 就是答案本身**。
865
+ 设置指令别名后,发送 \`ciyi\` 查看玩法。每日藏一个两字词,使用 \`ciyi.猜 <词>\` 提交第一次猜测并开题;开题后可直接发送两字词继续猜测。
865
866
 
866
- ## 使用
867
+ ## 指令
867
868
 
868
- 1. 设置指令别名(推荐把 \`ciyi.猜\` 设为 \`猜\`)。
869
- 2. 发送 \`ciyi.猜 山水\` 直接开始今日游戏并提交第一猜。
870
-
871
- ## 图片
872
-
873
- 启用 Koishi Canvas 服务后渲染「墨与纸」风格卡片;Puppeteer 已自带该服务,无需重复安装绘图库。
874
- 没有绘图服务、渲染失败或关掉「渲染图片」时,自动回退为等价文本,玩法不受影响。
875
-
876
- ## QQ 群
877
-
878
- * 956758505`;
869
+ | 指令 | 说明 |
870
+ | --- | --- |
871
+ | \`ciyi\` | 玩法说明 |
872
+ | \`ciyi.猜 <词>\` | 开始今日游戏并提交猜测 |
873
+ | \`ciyi.排行榜\` | 猜中次数榜 |`;
879
874
  var inject = { required: ["database"], optional: ["canvas"] };
880
875
  var Config = import_koishi.Schema.object({
881
876
  atReply: import_koishi.Schema.boolean().default(false).description("响应时 @"),
882
877
  quoteReply: import_koishi.Schema.boolean().default(false).description("响应时引用"),
883
- isEnableMiddleware: import_koishi.Schema.boolean().default(true).description("是否启用中间件(若启用,猜测词语时可以不使用指令直接猜测)"),
878
+ isEnableMiddleware: import_koishi.Schema.boolean().default(true).description("是否启用中间件(若启用,已开题时可以不使用指令直接猜测)"),
884
879
  renderImage: import_koishi.Schema.boolean().default(true).description("渲染图片(复用 Koishi Canvas 服务;不可用时使用等价文本)"),
885
880
  maxHistory: import_koishi.Schema.number().default(10).min(0).description("猜测板最多列出的历史条数(最新一次猜测始终会列出)"),
886
881
  maxRank: import_koishi.Schema.number().default(10).min(0).description("最大排行榜人数")
887
882
  });
883
+ function getMiddlewareGuess(session) {
884
+ const message = session.event.message;
885
+ if (!message || message.quote || session.event.user?.isBot || message.user?.isBot) {
886
+ return null;
887
+ }
888
+ const elements = message.elements ?? [];
889
+ if (elements.length !== 1 || elements[0].type !== "text") {
890
+ return null;
891
+ }
892
+ const text = elements[0].attrs.content;
893
+ if (typeof text !== "string" || text !== text.trim() || Array.from(text).length !== 2 || !/^\p{Script=Han}{2}$/u.test(text) || !allWords_default.includes(text)) {
894
+ return null;
895
+ }
896
+ return text;
897
+ }
898
+ __name(getMiddlewareGuess, "getMiddlewareGuess");
899
+ function canHandleMiddlewareGuess(game, guess) {
900
+ if (!game || game.isOver) return false;
901
+ if (game.guessedHistoryInOneGame?.includes(guess)) return false;
902
+ return guess === game.answer || game.rankList?.includes(guess) === true;
903
+ }
904
+ __name(canHandleMiddlewareGuess, "canHandleMiddlewareGuess");
888
905
  function apply(ctx, cfg) {
889
906
  ctx.model.extend(
890
907
  "ciyi",
@@ -916,14 +933,21 @@ function apply(ctx, cfg) {
916
933
  const RULE = "────────────";
917
934
  if (cfg.isEnableMiddleware) {
918
935
  ctx.middleware(async (session, next) => {
919
- const text = `${import_koishi.h.select(session.event.message.elements, "text")}`;
920
- if (text.length !== 2) {
921
- return await next();
922
- }
923
- if (!allWords_default.includes(text)) {
936
+ const guess = getMiddlewareGuess(session);
937
+ if (!guess || !session.channelId) return await next();
938
+ try {
939
+ const [game] = await ctx.database.get("ciyi", {
940
+ channelId: session.channelId
941
+ });
942
+ if (!canHandleMiddlewareGuess(game, guess)) return await next();
943
+ } catch (error) {
944
+ logger.warn(
945
+ "中间件读取游戏状态失败,本次消息不作猜测:%s",
946
+ error?.message ?? error
947
+ );
924
948
  return await next();
925
949
  }
926
- return await session.execute(`ciyi.猜 ${text}`);
950
+ return await session.execute(`ciyi.猜 ${guess}`);
927
951
  });
928
952
  }
929
953
  ctx.command("ciyi", "词意(猜词游戏)").action(async ({ session }) => {
@@ -1025,9 +1049,10 @@ function apply(ctx, cfg) {
1025
1049
  "词意 · 按意思远近找词",
1026
1050
  `每天藏起一个两字词。你报词,我回它与答案的语义排名 —— 名次越小越近,#1 就是答案本身。`,
1027
1051
  [
1028
- `开始 ciyi.猜 山水  开题并报一个两字词${cfg.isEnableMiddleware ? "(也可直接发词)" : ""}`,
1052
+ `开始 ciyi.猜 山水  开题并报一个两字词`,
1053
+ cfg.isEnableMiddleware ? `续猜 直接发送两字词 仅限已开题且未结束` : null,
1029
1054
  `排行 ciyi.排行榜  看谁猜中得最多`
1030
- ],
1055
+ ].filter(Boolean),
1031
1056
  [
1032
1057
  `读板 ?好)企业(地? #467 · 沾边`,
1033
1058
  `   #467 是「企业」与答案的相近名次`,
@@ -1293,6 +1318,8 @@ __name(apply, "apply");
1293
1318
  0 && (module.exports = {
1294
1319
  Config,
1295
1320
  apply,
1321
+ canHandleMiddlewareGuess,
1322
+ getMiddlewareGuess,
1296
1323
  inject,
1297
1324
  name,
1298
1325
  usage
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-ciyi",
3
- "description": "Koishi 的词意(猜词游戏)插件。根据词语的含义相似程度,猜测正确的词语。",
4
- "version": "1.2.5",
3
+ "description": "Koishi 的词意猜词插件。",
4
+ "version": "1.2.7",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [
@@ -41,7 +41,12 @@
41
41
  "词意"
42
42
  ],
43
43
  "devDependencies": {
44
- "@koishijs/canvas": "^0.2.0"
44
+ "@koishijs/canvas": "^0.2.0",
45
+ "koishi": "^4.18.11",
46
+ "tsx": "^4.23.13"
47
+ },
48
+ "scripts": {
49
+ "test": "tsx --test test/*.test.ts"
45
50
  },
46
51
  "peerDependencies": {
47
52
  "koishi": "^4.18.11"
package/readme.md CHANGED
@@ -8,7 +8,7 @@ Koishi 的词意猜词插件。
8
8
 
9
9
  ## 使用
10
10
 
11
- 设置指令别名后,发送 `ciyi` 查看玩法。每日藏一个两字词,第一次猜测会自动开题。
11
+ 设置指令别名后,发送 `ciyi` 查看玩法。每日藏一个两字词,使用 `ciyi.猜 <词>` 提交第一次猜测并开题;开题后可直接发送两字词继续猜测。
12
12
 
13
13
  ## 指令
14
14