diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e9e331..637b5ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## beta 1.2.5.1019 - 2026-10-19 22:12:52 + +- 冷门知识问答题库改为中文展示:题干、选项和解释不再混用英文词。 +- Keep trivia answer letters unchanged while localizing displayed trivia + domains, prompts, choices, and explanations. + ## beta 1.2.4.1019 - 2026-10-19 18:15:01 - 增强 Taffy 对本地游戏结果的理解:闲聊上下文扩大到 25 轮,并明确标注本地命令结果的发送者和类型。 diff --git a/README.md b/README.md index b0bf3e3..41404ff 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ JWeBot 是运行于 Linux 的单群微信自动回复系统。它通过本地 OC 观察选定的微信窗口,将消息写入持久化 Edge 账本,调用经过审核的命令插件, 并通过带视觉确认的 GUI 发送链路回复。 -当前版本:`beta 1.2.4.1019`,更新时间:2026-10-19 18:15:01。 +当前版本:`beta 1.2.5.1019`,更新时间:2026-10-19 22:12:52。 1.0 Beta 收口了当前稳定功能:本地命令插件、人物与上下文索引、 Steam 状态与时长查询、虚拟摩拉游戏、多人彩票、21 点、CS Major @@ -270,10 +270,10 @@ visually confirmed GUI bridge. Current version: ```text -beta 1.2.4.1019 +beta 1.2.5.1019 ``` -Updated: 2026-10-19 18:15:01. +Updated: 2026-10-19 22:12:52. The 1.0 Beta baseline consolidates the stable local command set, person and context indexes, Steam presence/playtime queries, virtual coin games, diff --git a/VERSION b/VERSION index 263200e..3dada0e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -beta 1.2.4.1019 +beta 1.2.5.1019 diff --git a/docs/command-catalog.md b/docs/command-catalog.md index 51e9821..7946329 100644 --- a/docs/command-catalog.md +++ b/docs/command-catalog.md @@ -1,6 +1,6 @@ # JWeBot Command Catalog -Current baseline: `beta 1.2.4.1019`. +Current baseline: `beta 1.2.5.1019`. This catalog records the reviewed commands shipped with the built-in local extensions. Runtime ownership is frozen at startup from the generated diff --git a/packages/jwebot-config/pyproject.toml b/packages/jwebot-config/pyproject.toml index 03d0cb0..4c4a81b 100644 --- a/packages/jwebot-config/pyproject.toml +++ b/packages/jwebot-config/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "jwebot-config" -version = "1.2.4b1+1019" +version = "1.2.5b1+1019" description = "Profile-based configuration compiler for JWeBot" requires-python = ">=3.9" dependencies = [ diff --git a/packages/jwebot-config/src/jwebot_config/__init__.py b/packages/jwebot-config/src/jwebot_config/__init__.py index 64ff353..f502ffb 100644 --- a/packages/jwebot-config/src/jwebot_config/__init__.py +++ b/packages/jwebot-config/src/jwebot_config/__init__.py @@ -36,4 +36,4 @@ __all__ = [ "write_default_profile", ] -__version__ = "1.2.4b1+1019" +__version__ = "1.2.5b1+1019" diff --git a/packages/jwebot-extension-host/pyproject.toml b/packages/jwebot-extension-host/pyproject.toml index b0741c0..6b7eb5d 100644 --- a/packages/jwebot-extension-host/pyproject.toml +++ b/packages/jwebot-extension-host/pyproject.toml @@ -4,12 +4,12 @@ build-backend = "setuptools.build_meta" [project] name = "jwebot-extension-host" -version = "1.2.4b1+1019" +version = "1.2.5b1+1019" description = "Single-release, single-invocation process host for JWeBot extensions" requires-python = ">=3.9" dependencies = [ - "jwebot-sdk==1.2.4b1+1019", - "jwebot-kernel==1.2.4b1+1019", + "jwebot-sdk==1.2.5b1+1019", + "jwebot-kernel==1.2.5b1+1019", ] [project.scripts] diff --git a/packages/jwebot-extension-host/src/jwebot_extension_host/__init__.py b/packages/jwebot-extension-host/src/jwebot_extension_host/__init__.py index 56cb76c..012c8da 100644 --- a/packages/jwebot-extension-host/src/jwebot_extension_host/__init__.py +++ b/packages/jwebot-extension-host/src/jwebot_extension_host/__init__.py @@ -16,4 +16,4 @@ __all__ = [ "process_request", ] -__version__ = "1.2.4b1+1019" +__version__ = "1.2.5b1+1019" diff --git a/packages/jwebot-kernel/pyproject.toml b/packages/jwebot-kernel/pyproject.toml index c562d2b..80f5a23 100644 --- a/packages/jwebot-kernel/pyproject.toml +++ b/packages/jwebot-kernel/pyproject.toml @@ -4,13 +4,13 @@ build-backend = "setuptools.build_meta" [project] name = "jwebot-kernel" -version = "1.2.4b1+1019" +version = "1.2.5b1+1019" description = "Stable routing and extension authority for JWeBot" requires-python = ">=3.9" dependencies = [ - "jwebot-config==1.2.4b1+1019", - "jwebot-sdk==1.2.4b1+1019", - "jwebot-official-extensions==1.2.4b1+1019", + "jwebot-config==1.2.5b1+1019", + "jwebot-sdk==1.2.5b1+1019", + "jwebot-official-extensions==1.2.5b1+1019", "tomli>=2; python_version < '3.11'", ] diff --git a/packages/jwebot-kernel/src/jwebot_kernel/__init__.py b/packages/jwebot-kernel/src/jwebot_kernel/__init__.py index 036c6dd..6701f13 100644 --- a/packages/jwebot-kernel/src/jwebot_kernel/__init__.py +++ b/packages/jwebot-kernel/src/jwebot_kernel/__init__.py @@ -107,4 +107,4 @@ __all__ = [ "verify_installed_release_signature", ] -__version__ = "1.2.4b1+1019" +__version__ = "1.2.5b1+1019" diff --git a/packages/jwebot-kernel/src/jwebot_kernel/edge_runtime.py b/packages/jwebot-kernel/src/jwebot_kernel/edge_runtime.py index c3d8734..7c1be6f 100644 --- a/packages/jwebot-kernel/src/jwebot_kernel/edge_runtime.py +++ b/packages/jwebot-kernel/src/jwebot_kernel/edge_runtime.py @@ -268,102 +268,102 @@ PROFILE_ALIAS_REPAIR_CANONICALS: frozenset[str] = frozenset() TRIVIA_QUESTIONS: tuple[dict[str, object], ...] = ( { "id": "cs2-smoke-he", - "domain": "CS", - "question": "CS2 里哪种投掷物可以把烟雾短暂炸开一个缺口?", + "domain": "反恐精英", + "question": "反恐精英2 里哪种投掷物可以把烟雾短暂炸开一个缺口?", "options": ("燃烧弹", "高爆手雷", "诱饵弹", "闪光弹"), "answer": "B", - "explanation": "CS2 的体积烟会被 HE 爆炸短暂驱散,子弹也能打出小洞。", + "explanation": "反恐精英2 的体积烟会被高爆手雷短暂驱散,子弹也能打出小洞。", }, { "id": "csgo-danger-zone", - "domain": "CS", - "question": "CS:GO 最早的 Danger Zone 大逃杀地图叫什么?", - "options": ("Blacksite", "Basalt", "Breach", "Anubis"), + "domain": "反恐精英", + "question": "反恐精英:全球攻势最早的危险区域模式地图叫什么?", + "options": ("黑场", "玄武岩", "突破", "阿努比斯"), "answer": "A", - "explanation": "Danger Zone 随 Blacksite 首发,后来才有 Sirocco 等地图。", + "explanation": "危险区域模式随黑场首发,后来才有锡洛科等地图。", }, { "id": "apex-ash-name", - "domain": "Apex", - "question": "Apex 里 Ash 变成 Simulacrum 之前的人类名字是?", - "options": ("Amelie Paquette", "Ashleigh Reid", "Mary Somers", "Anita Williams"), + "domain": "顶点英雄", + "question": "顶点英雄里艾许变成机械仿生人之前的人类名字是?", + "options": ("艾蜜莉·帕凯特", "阿什莉·里德", "玛丽·萨默斯", "安妮塔·威廉姆斯"), "answer": "B", - "explanation": "Ash 的人类身份是 Dr. Ashleigh Reid,和 Horizon 的过去有关。", + "explanation": "艾许的人类身份是阿什莉·里德博士,和地平线的过去有关。", }, { "id": "apex-horizon-son", - "domain": "Apex", - "question": "Apex 里 Horizon 一直想回去见到的儿子叫什么?", - "options": ("Newton", "Elliott", "Jackson", "D.O.C."), + "domain": "顶点英雄", + "question": "顶点英雄里地平线一直想回去见到的儿子叫什么?", + "options": ("牛顿", "艾略特", "杰克逊", "医疗无人机"), "answer": "A", - "explanation": "Horizon 的儿子叫 Newton,名字也呼应了她的科学家设定。", + "explanation": "地平线的儿子叫牛顿,名字也呼应了她的科学家设定。", }, { "id": "overwatch-sigma-name", - "domain": "Overwatch", - "question": "Overwatch 里 Sigma 的本名是?", - "options": ("Jamison Fawkes", "Siebren de Kuiper", "Tekhartha Mondatta", "Akande Ogundimu"), + "domain": "守望先锋", + "question": "守望先锋里西格玛的本名是?", + "options": ("杰米森·福克斯", "西布伦·德·柯伊伯", "泰哈撒·孟达塔", "阿坎德·奥贡迪穆"), "answer": "B", - "explanation": "Sigma 的本名是 Siebren de Kuiper,事故前是天体物理学家。", + "explanation": "西格玛的本名是西布伦·德·柯伊伯,事故前是天体物理学家。", }, { "id": "overwatch-zen-title", - "domain": "Overwatch", - "question": "Zenyatta 名字前常见的 Tekhartha 更接近什么?", + "domain": "守望先锋", + "question": "禅雅塔名字前常见的“泰哈撒”更接近什么?", "options": ("家族姓氏", "僧侣称号", "武器型号", "出生地名"), "answer": "B", - "explanation": "Tekhartha 是香巴里僧侣相关称号,不是普通意义的姓。", + "explanation": "泰哈撒是香巴里僧侣相关称号,不是普通意义的姓。", }, { "id": "lol-ivern-cruel", - "domain": "LoL", - "question": "LoL 里 Ivern 成为绿树朋友前曾被称为什么?", - "options": ("Ivern the Cruel", "Ivern the Lost", "Ivern the Silent", "Ivern the First"), + "domain": "英雄联盟", + "question": "英雄联盟里艾翁成为绿树朋友前曾被称为什么?", + "options": ("残忍者艾翁", "迷失者艾翁", "沉默者艾翁", "初始者艾翁"), "answer": "A", - "explanation": "Ivern 过去是 Ivern the Cruel,后来在神树事件后完全转变。", + "explanation": "艾翁过去是残酷的战士,后来在神树事件后完全转变。", }, { "id": "lol-aurelion-crown", - "domain": "LoL", - "question": "Aurelion Sol 被巨神族控制主要靠什么东西束缚?", + "domain": "英雄联盟", + "question": "奥瑞利安·索尔被巨神族控制主要靠什么东西束缚?", "options": ("星界锁链", "一顶冠冕", "暮光长矛", "世界符文"), "answer": "B", - "explanation": "巨神族用冠冕诱骗并束缚了 Aurelion Sol,这也是他怨气来源之一。", + "explanation": "巨神族用冠冕诱骗并束缚了奥瑞利安·索尔,这也是他怨气来源之一。", }, ) TRIVIA_FACTS: tuple[tuple[str, str, str, str, tuple[str, str, str], str, int], ...] = ( - ("cs-zeus", "CS", "哪件装备是一次性近距离电击武器?", "Zeus x27", ("P250", "XM1014", "Nova"), "Zeus x27 命中后通常只能打一发,是 CS 里很有梗的电击武器。", 3), - ("cs-defuse-kit", "CS", "哪件道具能缩短 CT 拆包时间?", "Defuse Kit", ("Kevlar", "Rescue Kit", "Tactical Shield"), "拆弹钳能把拆包时间从 10 秒缩短到 5 秒。", 2), - ("cs-blacksite", "CS", "CS:GO Danger Zone 首发地图是哪张?", "Blacksite", ("Sirocco", "Ember", "Basalt"), "Blacksite 是 Danger Zone 上线时的首发地图。", 4), - ("cs-he-smoke", "CS", "CS2 里能短暂驱散体积烟的爆炸物是?", "高爆手雷", ("燃烧弹", "诱饵弹", "闪光弹"), "CS2 体积烟会被 HE 爆炸短暂炸开缺口。", 4), - ("cs-subtick", "CS", "CS2 官方重点宣传的输入结算机制叫?", "Sub-tick", ("SourceTV", "Panorama", "Prime"), "CS2 用 Sub-tick 记录动作发生时刻,和传统 tick 观感不同。", 3), - ("cs-office", "CS", "Office 在 CS 系列里属于哪类经典模式地图?", "人质救援", ("爆破", "军备竞赛", "死亡竞赛"), "Office 是经典 hostage rescue 地图,不是拆包图。", 2), - ("cs-cache", "CS", "Cache 的主题环境最接近哪个区域?", "切尔诺贝利周边", ("威尼斯水城", "摩洛哥集市", "月球基地"), "Cache 的视觉主题来自切尔诺贝利/普里皮亚季工业区域。", 4), - ("apex-ash", "Apex", "Ash 成为 Simulacrum 前的人类名字是?", "Ashleigh Reid", ("Amelie Paquette", "Mary Somers", "Anita Williams"), "Ash 的旧身份是 Dr. Ashleigh Reid。", 4), - ("apex-horizon", "Apex", "Horizon 一直想回去见到的儿子叫什么?", "Newton", ("Elliott", "Jackson", "Crypto"), "Newton 是 Horizon 的儿子。", 3), - ("apex-crypto", "Apex", "Crypto 的本名是?", "Tae Joon Park", ("Octavio Silva", "Walter Fitzroy", "Makoa Gibraltar"), "Crypto 的本名是 Tae Joon Park。", 3), - ("apex-caustic", "Apex", "Caustic 的本名是?", "Alexander Nox", ("Elliott Witt", "Obi Edolasim", "Ajay Che"), "Caustic 是 Alexander Nox,背景里是毒气科学家。", 3), - ("apex-wattson", "Apex", "Wattson 的本名是?", "Natalie Paquette", ("Loba Andrade", "Mary Somers", "Anita Williams"), "Wattson 是 Natalie Paquette,和竞技场电力系统有关。", 3), - ("apex-fuse", "Apex", "Fuse 的本名是?", "Walter Fitzroy", ("Kaleb Cross", "Elliott Witt", "Tae Joon Park"), "Fuse 的本名是 Walter Fitzroy。", 3), - ("apex-seer", "Apex", "Seer 的本名是?", "Obi Edolasim", ("Makoa Gibraltar", "Octavio Silva", "Jackson Williams"), "Seer 的本名是 Obi Edolasim。", 4), - ("overwatch-sigma", "Overwatch", "Sigma 的本名是?", "Siebren de Kuiper", ("Akande Ogundimu", "Jamison Fawkes", "Mako Rutledge"), "Sigma 是 Siebren de Kuiper,事故前是天体物理学家。", 3), - ("overwatch-doomfist", "Overwatch", "Doomfist 的本名是?", "Akande Ogundimu", ("Tekhartha Zenyatta", "Gabriel Reyes", "Niran Pruksamanee"), "Doomfist 的本名是 Akande Ogundimu。", 3), - ("overwatch-junkrat", "Overwatch", "Junkrat 的本名是?", "Jamison Fawkes", ("Mako Rutledge", "Cole Cassidy", "Lúcio Correia dos Santos"), "Junkrat 的本名是 Jamison Fawkes。", 2), - ("overwatch-roadhog", "Overwatch", "Roadhog 的本名是?", "Mako Rutledge", ("Jamison Fawkes", "Baptiste Augustin", "Siebren de Kuiper"), "Roadhog 的本名是 Mako Rutledge。", 2), - ("overwatch-bastion", "Overwatch", "Bastion 的机体型号是?", "SST Laboratories Siege Automaton E54", ("MEKA Tokki", "R-7000 Ravager", "OR15 Defense Unit"), "Bastion 属于 E54 堡垒机器人。", 5), - ("overwatch-ramattra", "Overwatch", "Ramattra 领导的组织是?", "Null Sector", ("Talon", "Overwatch", "Vishkar"), "Ramattra 是 Null Sector 的核心领袖。", 3), - ("lol-ivern", "LoL", "Ivern 转变前曾被称为什么?", "Ivern the Cruel", ("Ivern the Lost", "Ivern the First", "Ivern the Quiet"), "Ivern 原本是残酷战士,后来因神树事件转变。", 4), - ("lol-aurelion", "LoL", "Aurelion Sol 被巨神族控制主要靠什么?", "一顶冠冕", ("世界符文", "暮光长矛", "暗裔剑"), "巨神族用冠冕束缚了 Aurelion Sol。", 4), - ("lol-swain", "LoL", "Swain 体内/身边关联的恶魔名字是?", "Raum", ("Tahm", "Evelynn", "Nocturne"), "Swain 与秘密恶魔 Raum 绑定。", 5), - ("lol-jhin", "LoL", "Jhin 的全名是?", "Khada Jhin", ("Shieda Kayn", "Jericho Swain", "Tobias Felix"), "Jhin 的名字是 Khada Jhin。", 3), - ("lol-rengar", "LoL", "Rengar 属于哪个瓦斯塔亚部族?", "Kiilash", ("Marai", "Lhotlan", "Oovi-Kat"), "Rengar 来自 Kiilash 部族。", 5), - ("lol-zac", "LoL", "Zac 名字常被解释为什么缩写?", "Zaun Amorphous Combatant", ("Zaun Arcane Core", "Z Drive Automaton", "Zaunite Acid Creature"), "Zac 是 Zaun Amorphous Combatant 的缩写梗。", 4), - ("lol-kindred", "LoL", "Kindred 由哪两个化身组成?", "Lamb 和 Wolf", ("Crow 和 Stag", "Fox 和 Owl", "Sun 和 Moon"), "Kindred 是 Lamb 与 Wolf 两个死亡化身。", 2), - ("lol-ryze", "LoL", "Ryze 长期收集并封存的危险物是什么?", "世界符文", ("暗裔武器", "海克斯核心", "虚空碎片"), "Ryze 的主线目标是阻止世界符文失控。", 3), + ("cs-zeus", "反恐精英", "哪件装备是一次性近距离电击武器?", "宙斯电击枪", ("轻型手枪", "连喷霰弹枪", "新星霰弹枪"), "宙斯电击枪命中后通常只能打一发,是反恐精英里很有梗的电击武器。", 3), + ("cs-defuse-kit", "反恐精英", "哪件道具能缩短防守方拆包时间?", "拆弹钳", ("防弹衣", "救援套装", "战术盾"), "拆弹钳能把拆包时间从 10 秒缩短到 5 秒。", 2), + ("cs-blacksite", "反恐精英", "反恐精英:全球攻势危险区域模式首发地图是哪张?", "黑场", ("锡洛科", "余烬", "玄武岩"), "黑场是危险区域模式上线时的首发地图。", 4), + ("cs-he-smoke", "反恐精英", "反恐精英2 里能短暂驱散体积烟的爆炸物是?", "高爆手雷", ("燃烧弹", "诱饵弹", "闪光弹"), "反恐精英2 的体积烟会被高爆手雷短暂炸开缺口。", 4), + ("cs-subtick", "反恐精英", "反恐精英2 官方重点宣传的输入结算机制叫?", "子刻输入", ("观战电视", "全景界面", "优先状态"), "反恐精英2 用子刻输入记录动作发生时刻,和传统刷新刻观感不同。", 3), + ("cs-office", "反恐精英", "办公室在反恐精英系列里属于哪类经典模式地图?", "人质救援", ("爆破", "军备竞赛", "死亡竞赛"), "办公室是经典人质救援地图,不是拆包图。", 2), + ("cs-cache", "反恐精英", "死城之谜的主题环境最接近哪个区域?", "切尔诺贝利周边", ("威尼斯水城", "摩洛哥集市", "月球基地"), "死城之谜的视觉主题来自切尔诺贝利和普里皮亚季工业区域。", 4), + ("apex-ash", "顶点英雄", "艾许成为机械仿生人前的人类名字是?", "阿什莉·里德", ("艾蜜莉·帕凯特", "玛丽·萨默斯", "安妮塔·威廉姆斯"), "艾许的旧身份是阿什莉·里德博士。", 4), + ("apex-horizon", "顶点英雄", "地平线一直想回去见到的儿子叫什么?", "牛顿", ("艾略特", "杰克逊", "密客"), "牛顿是地平线的儿子。", 3), + ("apex-crypto", "顶点英雄", "密客的本名是?", "朴泰俊", ("奥克塔维奥·席尔瓦", "沃尔特·菲茨罗伊", "马科阿·直布罗陀"), "密客的本名是朴泰俊。", 3), + ("apex-caustic", "顶点英雄", "腐蚀的本名是?", "亚历山大·诺克斯", ("艾略特·威特", "奥比·艾多拉西姆", "阿杰·切"), "腐蚀是亚历山大·诺克斯,背景里是毒气科学家。", 3), + ("apex-wattson", "顶点英雄", "华森的本名是?", "娜塔莉·帕凯特", ("洛芭·安德拉德", "玛丽·萨默斯", "安妮塔·威廉姆斯"), "华森是娜塔莉·帕凯特,和竞技场电力系统有关。", 3), + ("apex-fuse", "顶点英雄", "暴雷的本名是?", "沃尔特·菲茨罗伊", ("卡莱布·克罗斯", "艾略特·威特", "朴泰俊"), "暴雷的本名是沃尔特·菲茨罗伊。", 3), + ("apex-seer", "顶点英雄", "希尔的本名是?", "奥比·艾多拉西姆", ("马科阿·直布罗陀", "奥克塔维奥·席尔瓦", "杰克逊·威廉姆斯"), "希尔的本名是奥比·艾多拉西姆。", 4), + ("overwatch-sigma", "守望先锋", "西格玛的本名是?", "西布伦·德·柯伊伯", ("阿坎德·奥贡迪穆", "杰米森·福克斯", "马可·拉特利奇"), "西格玛是西布伦·德·柯伊伯,事故前是天体物理学家。", 3), + ("overwatch-doomfist", "守望先锋", "末日铁拳的本名是?", "阿坎德·奥贡迪穆", ("泰哈撒·禅雅塔", "加布里埃尔·雷耶斯", "尼兰·普鲁克萨玛尼"), "末日铁拳的本名是阿坎德·奥贡迪穆。", 3), + ("overwatch-junkrat", "守望先锋", "狂鼠的本名是?", "杰米森·福克斯", ("马可·拉特利奇", "科尔·卡西迪", "卢西奥·科雷亚·多斯桑托斯"), "狂鼠的本名是杰米森·福克斯。", 2), + ("overwatch-roadhog", "守望先锋", "路霸的本名是?", "马可·拉特利奇", ("杰米森·福克斯", "巴蒂斯特·奥古斯丁", "西布伦·德·柯伊伯"), "路霸的本名是马可·拉特利奇。", 2), + ("overwatch-bastion", "守望先锋", "堡垒的机体型号更接近哪一个?", "五十四型堡垒攻城机", ("韩国兔机甲", "七千型掠夺者", "十五型防御机"), "堡垒属于五十四型攻城自动机。", 5), + ("overwatch-ramattra", "守望先锋", "拉玛刹领导的组织是?", "归零者", ("黑爪", "守望先锋", "费斯卡集团"), "拉玛刹是归零者的核心领袖。", 3), + ("lol-ivern", "英雄联盟", "艾翁转变前曾被称为什么?", "残忍者艾翁", ("迷失者艾翁", "初始者艾翁", "沉默者艾翁"), "艾翁原本是残酷战士,后来因神树事件转变。", 4), + ("lol-aurelion", "英雄联盟", "奥瑞利安·索尔被巨神族控制主要靠什么?", "一顶冠冕", ("世界符文", "暮光长矛", "暗裔剑"), "巨神族用冠冕束缚了奥瑞利安·索尔。", 4), + ("lol-swain", "英雄联盟", "斯维因体内或身边关联的恶魔名字是?", "拉姆", ("塔姆", "伊芙琳", "魔腾"), "斯维因与秘密恶魔拉姆绑定。", 5), + ("lol-jhin", "英雄联盟", "烬的全名是?", "卡达·烬", ("影流凯隐", "杰里柯·斯维因", "托拜厄斯·菲利克斯"), "烬的名字是卡达·烬。", 3), + ("lol-rengar", "英雄联盟", "雷恩加尔属于哪个瓦斯塔亚部族?", "基拉什", ("玛莱", "洛特兰", "奥维卡特"), "雷恩加尔来自基拉什部族。", 5), + ("lol-zac", "英雄联盟", "扎克名字常被解释为什么缩写?", "祖安无定形战斗体", ("祖安奥术核心", "时间装置自动体", "祖安酸液生物"), "扎克的名字常被当作祖安无定形战斗体的缩写梗。", 4), + ("lol-kindred", "英雄联盟", "永猎双子由哪两个化身组成?", "羊灵和狼灵", ("乌鸦和雄鹿", "狐狸和猫头鹰", "太阳和月亮"), "永猎双子是羊灵与狼灵两个死亡化身。", 2), + ("lol-ryze", "英雄联盟", "瑞兹长期收集并封存的危险物是什么?", "世界符文", ("暗裔武器", "海克斯核心", "虚空碎片"), "瑞兹的主线目标是阻止世界符文失控。", 3), ) TRIVIA_TEMPLATES = ( "【{domain} 冷知识】{prompt}", - "Taffy 冷门题:{prompt}", + "塔菲冷门题:{prompt}", "不查资料猜一下:{prompt}", "这个有点偏:{prompt}", "冷知识选项题:{prompt}", diff --git a/packages/jwebot-official-extensions/pyproject.toml b/packages/jwebot-official-extensions/pyproject.toml index e4f1749..a352de8 100644 --- a/packages/jwebot-official-extensions/pyproject.toml +++ b/packages/jwebot-official-extensions/pyproject.toml @@ -4,11 +4,11 @@ build-backend = "setuptools.build_meta" [project] name = "jwebot-official-extensions" -version = "1.2.4b1+1019" +version = "1.2.5b1+1019" description = "Reviewed local command adapters and broker implementation for JWeBot" requires-python = ">=3.9" dependencies = [ - "jwebot-sdk==1.2.4b1+1019", + "jwebot-sdk==1.2.5b1+1019", ] [tool.setuptools.packages.find] diff --git a/packages/jwebot-official-extensions/src/jwebot_official_extensions/__init__.py b/packages/jwebot-official-extensions/src/jwebot_official_extensions/__init__.py index 1bdfc0c..10ac972 100644 --- a/packages/jwebot-official-extensions/src/jwebot_official_extensions/__init__.py +++ b/packages/jwebot-official-extensions/src/jwebot_official_extensions/__init__.py @@ -90,4 +90,4 @@ __all__ = [ "render_feature_list", ] -__version__ = "1.2.4b1+1019" +__version__ = "1.2.5b1+1019" diff --git a/packages/jwebot-sdk/pyproject.toml b/packages/jwebot-sdk/pyproject.toml index 9dcba7c..daa8fbe 100644 --- a/packages/jwebot-sdk/pyproject.toml +++ b/packages/jwebot-sdk/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "jwebot-sdk" -version = "1.2.4b1+1019" +version = "1.2.5b1+1019" description = "Typed, capability-limited extension API for JWeBot plugins" requires-python = ">=3.9" dependencies = [] diff --git a/packages/jwebot-sdk/src/jwebot_sdk/__init__.py b/packages/jwebot-sdk/src/jwebot_sdk/__init__.py index 007c05a..874d279 100644 --- a/packages/jwebot-sdk/src/jwebot_sdk/__init__.py +++ b/packages/jwebot-sdk/src/jwebot_sdk/__init__.py @@ -38,4 +38,4 @@ __all__ = [ "SingleGroupContext", ] -__version__ = "1.2.4b1+1019" +__version__ = "1.2.5b1+1019" diff --git a/pyproject.toml b/pyproject.toml index caba993..b0340b0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [tool.jwebot] -release = "beta 1.2.4.1019" +release = "beta 1.2.5.1019" production_deployments_enabled_by_default = false [tool.jwebot.workspace] diff --git a/tests/test_jwebot_edge.py b/tests/test_jwebot_edge.py index a1c6b62..23cb225 100644 --- a/tests/test_jwebot_edge.py +++ b/tests/test_jwebot_edge.py @@ -1035,9 +1035,9 @@ class LedgerAndApplicationTests(unittest.TestCase): self.assertEqual(version["route"], "local") self.assertIn("JWeBot 版本", version["text"]) self.assertIn("kernel", version["text"]) - self.assertIn("最新版本:beta 1.2.4.1019", version["text"]) - self.assertIn("更新时间:2026-10-19 18:15:01", version["text"]) - self.assertIn("更新摘要:增强 Taffy 对本地游戏结果的理解", version["text"]) + self.assertIn("最新版本:beta 1.2.5.1019", version["text"]) + self.assertIn("更新时间:2026-10-19 22:12:52", version["text"]) + self.assertIn("更新摘要:冷门知识问答题库改为中文展示", version["text"]) self.assertEqual(debug["route"], "local") self.assertIn("调试埋点", debug["text"]) self.assertEqual(balance["route"], "local") @@ -1317,7 +1317,21 @@ class LedgerAndApplicationTests(unittest.TestCase): ) def test_trivia_quiz_broadcast_and_answer_rewards_mora(self): - self.assertGreater(len(MODULE.trivia_question_bank()), 200) + bank = MODULE.trivia_question_bank() + self.assertGreater(len(bank), 200) + display_text = "\n".join( + "\n".join( + [ + str(question["domain"]), + str(question["question"]), + *[str(option) for option in question["options"]], + str(question["explanation"]), + ] + ) + for question in bank + ) + self.assertFalse(any("A" <= character <= "Z" for character in display_text)) + self.assertFalse(any("a" <= character <= "z" for character in display_text)) ledger = self.application.ledger observed_at = MODULE.datetime( 2026, diff --git a/tests/test_release_update.py b/tests/test_release_update.py index 079c31e..15f6c1a 100644 --- a/tests/test_release_update.py +++ b/tests/test_release_update.py @@ -20,7 +20,7 @@ SPEC.loader.exec_module(MODULE) class ReleaseUpdateTests(unittest.TestCase): - release = "beta 1.2.4.1019" + release = "beta 1.2.5.1019" def setUp(self): self.temporary = tempfile.TemporaryDirectory()