@zhin.js/plugin-answers 0.0.7 → 0.0.8
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/commands//345/245/275/346/227/240/350/201/212/index.js +1 -1
- package/commands//345/245/275/346/227/240/350/201/212/index.ts +1 -1
- package/commands//347/247/221/347/233/256/344/270/200/index.js +1 -1
- package/commands//347/247/221/347/233/256/344/270/200/index.ts +1 -1
- package/lib/quiz.d.ts +14 -1
- package/lib/quiz.d.ts.map +1 -1
- package/lib/quiz.js +5 -4
- package/lib/quiz.js.map +1 -1
- package/package.json +6 -6
- package/src/quiz.ts +16 -4
|
@@ -14,7 +14,7 @@ export default defineCommand({
|
|
|
14
14
|
if (!key)
|
|
15
15
|
return messages(locale, 'conversation');
|
|
16
16
|
const settings = resolveAnswersConfig(config);
|
|
17
|
-
const question = use(quizServiceToken).ask(key, 'fun', FUN_QUESTIONS, settings.quizTimeoutSeconds, Date.now(), locale);
|
|
17
|
+
const question = use(quizServiceToken).ask({ key: key, kind: 'fun', bank: FUN_QUESTIONS, timeoutSeconds: settings.quizTimeoutSeconds, now: Date.now(), locale: locale });
|
|
18
18
|
return formatQuestion('fun', question, settings.quizTimeoutSeconds, locale);
|
|
19
19
|
},
|
|
20
20
|
});
|
|
@@ -13,7 +13,7 @@ export default defineCommand<AnswersConfig>({
|
|
|
13
13
|
const key = quizKey(input);
|
|
14
14
|
if (!key) return messages(locale, 'conversation');
|
|
15
15
|
const settings = resolveAnswersConfig(config);
|
|
16
|
-
const question = use(quizServiceToken).ask(key, 'fun', FUN_QUESTIONS, settings.quizTimeoutSeconds, Date.now(), locale);
|
|
16
|
+
const question = use(quizServiceToken).ask({ key: key, kind: 'fun', bank: FUN_QUESTIONS, timeoutSeconds: settings.quizTimeoutSeconds, now: Date.now(), locale: locale });
|
|
17
17
|
return formatQuestion('fun', question, settings.quizTimeoutSeconds, locale);
|
|
18
18
|
},
|
|
19
19
|
});
|
|
@@ -16,7 +16,7 @@ export default defineCommand({
|
|
|
16
16
|
const key = quizKey(input);
|
|
17
17
|
if (!key)
|
|
18
18
|
return messages(locale, 'conversation');
|
|
19
|
-
const question = use(quizServiceToken).ask(key, 'driving', DRIVING_QUESTIONS, settings.quizTimeoutSeconds, Date.now(), locale);
|
|
19
|
+
const question = use(quizServiceToken).ask({ key: key, kind: 'driving', bank: DRIVING_QUESTIONS, timeoutSeconds: settings.quizTimeoutSeconds, now: Date.now(), locale: locale });
|
|
20
20
|
return formatQuestion('driving', question, settings.quizTimeoutSeconds, locale);
|
|
21
21
|
},
|
|
22
22
|
});
|
|
@@ -14,7 +14,7 @@ export default defineCommand<AnswersConfig>({
|
|
|
14
14
|
if (!settings.enableDrivingQuiz) return messages(locale, 'disabled');
|
|
15
15
|
const key = quizKey(input);
|
|
16
16
|
if (!key) return messages(locale, 'conversation');
|
|
17
|
-
const question = use(quizServiceToken).ask(key, 'driving', DRIVING_QUESTIONS, settings.quizTimeoutSeconds, Date.now(), locale);
|
|
17
|
+
const question = use(quizServiceToken).ask({ key: key, kind: 'driving', bank: DRIVING_QUESTIONS, timeoutSeconds: settings.quizTimeoutSeconds, now: Date.now(), locale: locale });
|
|
18
18
|
return formatQuestion('driving', question, settings.quizTimeoutSeconds, locale);
|
|
19
19
|
},
|
|
20
20
|
});
|
package/lib/quiz.d.ts
CHANGED
|
@@ -11,6 +11,10 @@ export interface QuizConversationInput {
|
|
|
11
11
|
readonly kind?: string;
|
|
12
12
|
readonly id?: string;
|
|
13
13
|
readonly threadId?: string;
|
|
14
|
+
readonly parent?: {
|
|
15
|
+
readonly kind: 'private' | 'group' | 'channel';
|
|
16
|
+
readonly id: string;
|
|
17
|
+
};
|
|
14
18
|
};
|
|
15
19
|
readonly sender?: {
|
|
16
20
|
readonly id?: string;
|
|
@@ -39,10 +43,19 @@ export declare function parseQuizLetter(raw: string | undefined): QuizLetter | u
|
|
|
39
43
|
export declare function pickQuestion(bank: readonly QuizQuestion[], exceptId?: string): QuizQuestion;
|
|
40
44
|
export declare function formatQuestion(kind: QuizKind, question: QuizQuestion, timeoutSeconds: number, locale?: Locale): string;
|
|
41
45
|
export declare function formatJudgement(judgement: QuizJudgement): string;
|
|
46
|
+
export interface AskQuizRequest {
|
|
47
|
+
/** Complete conversation-and-actor key from conversationKey(). */
|
|
48
|
+
readonly key: string;
|
|
49
|
+
readonly kind: QuizKind;
|
|
50
|
+
readonly bank: readonly QuizQuestion[];
|
|
51
|
+
readonly timeoutSeconds: number;
|
|
52
|
+
readonly now?: number;
|
|
53
|
+
readonly locale?: Locale;
|
|
54
|
+
}
|
|
42
55
|
/** Generation-owned, in-memory only: pending questions vanish on reload, which is acceptable for a party game. */
|
|
43
56
|
export declare class QuizService {
|
|
44
57
|
#private;
|
|
45
|
-
ask(
|
|
58
|
+
ask(input: AskQuizRequest): QuizQuestion;
|
|
46
59
|
peek(key: string, now?: number): PendingQuiz | undefined;
|
|
47
60
|
/** Judge and consume the pending question; letters beyond the option count are ignored (undefined). */
|
|
48
61
|
answer(key: string, letter: QuizLetter, now?: number): QuizJudgement | undefined;
|
package/lib/quiz.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quiz.d.ts","sourceRoot":"","sources":["../src/quiz.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"quiz.d.ts","sourceRoot":"","sources":["../src/quiz.ts"],"names":[],"mappings":"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"}
|
package/lib/quiz.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { conversationRefKey } from 'zhin.js';
|
|
1
2
|
import { resolveLocale } from 'zhin.js/i18n';
|
|
2
3
|
import { messages } from './messages.js';
|
|
3
4
|
import { randomInt } from 'node:crypto';
|
|
@@ -11,10 +12,9 @@ export const MAX_PENDING_QUIZZES = 1000;
|
|
|
11
12
|
export function quizKey(input) {
|
|
12
13
|
const conversation = input?.conversation;
|
|
13
14
|
const sender = typeof input?.sender === 'string' ? input.sender : input?.sender?.id;
|
|
14
|
-
if (!conversation?.id || !conversation.kind || !sender)
|
|
15
|
+
if (!conversation?.id || !conversation.kind || !conversation.endpoint?.adapter || !conversation.endpoint.id || !sender)
|
|
15
16
|
return undefined;
|
|
16
|
-
return JSON.stringify(['answers-quiz-
|
|
17
|
-
conversation.kind, conversation.id, conversation.threadId ?? null, sender]);
|
|
17
|
+
return JSON.stringify(['answers-quiz-v2', conversationRefKey(conversation), sender]);
|
|
18
18
|
}
|
|
19
19
|
/** 只接受单个选项字母(大小写、全角均可),其余文本一律放行给后续中间件。 */
|
|
20
20
|
export function parseQuizLetter(raw) {
|
|
@@ -54,7 +54,8 @@ export class QuizService {
|
|
|
54
54
|
#pending = new Map();
|
|
55
55
|
#lastQuestion = new Map();
|
|
56
56
|
#disposed = false;
|
|
57
|
-
ask(
|
|
57
|
+
ask(input) {
|
|
58
|
+
const { key, kind, bank, timeoutSeconds, now = Date.now(), locale = 'zh-CN' } = input;
|
|
58
59
|
this.#assertLive();
|
|
59
60
|
this.sweep(now);
|
|
60
61
|
const question = pickQuestion(bank, this.#lastQuestion.get(key));
|
package/lib/quiz.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quiz.js","sourceRoot":"","sources":["../src/quiz.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAe,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,YAAY,EAAsC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"quiz.js","sourceRoot":"","sources":["../src/quiz.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/plugin-answers",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8",
|
|
4
4
|
"description": "Zhin.js 答案之书、趣味选择题与交规小测(原创内容,Plugin Runtime)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -37,12 +37,12 @@
|
|
|
37
37
|
},
|
|
38
38
|
"license": "MIT",
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@zhin.js/core": "1.1.
|
|
40
|
+
"@zhin.js/core": "1.1.54"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"typescript": "^6.0.3",
|
|
44
44
|
"vitest": "^4.1.10",
|
|
45
|
-
"zhin.js": "1.1.
|
|
45
|
+
"zhin.js": "1.1.19"
|
|
46
46
|
},
|
|
47
47
|
"repository": {
|
|
48
48
|
"type": "git",
|
|
@@ -75,9 +75,9 @@
|
|
|
75
75
|
"plugins": []
|
|
76
76
|
},
|
|
77
77
|
"peerDependencies": {
|
|
78
|
-
"@zhin.js/command": "^1.1.
|
|
79
|
-
"@zhin.js/middleware": "^1.1.
|
|
80
|
-
"zhin.js": "^1.1.
|
|
78
|
+
"@zhin.js/command": "^1.1.12",
|
|
79
|
+
"@zhin.js/middleware": "^1.1.11",
|
|
80
|
+
"zhin.js": "^1.1.19"
|
|
81
81
|
},
|
|
82
82
|
"peerDependenciesMeta": {
|
|
83
83
|
"@zhin.js/command": {
|
package/src/quiz.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { conversationRefKey, type ConversationRef } from 'zhin.js';
|
|
1
2
|
import { resolveLocale, type Locale } from 'zhin.js/i18n';
|
|
2
3
|
import { messages } from './messages.js';
|
|
3
4
|
import { randomInt } from 'node:crypto';
|
|
@@ -12,6 +13,7 @@ export interface QuizConversationInput {
|
|
|
12
13
|
readonly kind?: string;
|
|
13
14
|
readonly id?: string;
|
|
14
15
|
readonly threadId?: string;
|
|
16
|
+
readonly parent?: { readonly kind: 'private' | 'group' | 'channel'; readonly id: string };
|
|
15
17
|
};
|
|
16
18
|
readonly sender?: { readonly id?: string } | string;
|
|
17
19
|
}
|
|
@@ -39,9 +41,8 @@ export const MAX_PENDING_QUIZZES = 1000;
|
|
|
39
41
|
export function quizKey(input: QuizConversationInput | undefined): string | undefined {
|
|
40
42
|
const conversation = input?.conversation;
|
|
41
43
|
const sender = typeof input?.sender === 'string' ? input.sender : input?.sender?.id;
|
|
42
|
-
if (!conversation?.id || !conversation.kind || !sender) return undefined;
|
|
43
|
-
return JSON.stringify(['answers-quiz-
|
|
44
|
-
conversation.kind, conversation.id, conversation.threadId ?? null, sender]);
|
|
44
|
+
if (!conversation?.id || !conversation.kind || !conversation.endpoint?.adapter || !conversation.endpoint.id || !sender) return undefined;
|
|
45
|
+
return JSON.stringify(['answers-quiz-v2', conversationRefKey(conversation as ConversationRef), sender]);
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
/** 只接受单个选项字母(大小写、全角均可),其余文本一律放行给后续中间件。 */
|
|
@@ -77,13 +78,24 @@ export function formatJudgement(judgement: QuizJudgement): string {
|
|
|
77
78
|
return `${verdict}\n💡 ${question.explanation}${footer}`;
|
|
78
79
|
}
|
|
79
80
|
|
|
81
|
+
export interface AskQuizRequest {
|
|
82
|
+
/** Complete conversation-and-actor key from conversationKey(). */
|
|
83
|
+
readonly key: string;
|
|
84
|
+
readonly kind: QuizKind;
|
|
85
|
+
readonly bank: readonly QuizQuestion[];
|
|
86
|
+
readonly timeoutSeconds: number;
|
|
87
|
+
readonly now?: number;
|
|
88
|
+
readonly locale?: Locale;
|
|
89
|
+
}
|
|
90
|
+
|
|
80
91
|
/** Generation-owned, in-memory only: pending questions vanish on reload, which is acceptable for a party game. */
|
|
81
92
|
export class QuizService {
|
|
82
93
|
readonly #pending = new Map<string, PendingQuiz>();
|
|
83
94
|
readonly #lastQuestion = new Map<string, string>();
|
|
84
95
|
#disposed = false;
|
|
85
96
|
|
|
86
|
-
ask(
|
|
97
|
+
ask(input: AskQuizRequest): QuizQuestion {
|
|
98
|
+
const { key, kind, bank, timeoutSeconds, now = Date.now(), locale = 'zh-CN' } = input;
|
|
87
99
|
this.#assertLive();
|
|
88
100
|
this.sweep(now);
|
|
89
101
|
const question = pickQuestion(bank, this.#lastQuestion.get(key));
|