Release beta 1.2.5.1019
check / local-gate (push) Failing after 1m49s

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