为 MaiBot 设计的 Java 程序阅读题插件。用户通过指令获取一道给出代码段的题目,猜测程序输出或运行结果,答完后查看答案和解析。题目由 LLM 动态生成,内置题库作为兜底,不限制每日做题次数。
架构参考 c-daily-problem,题型改为 Java 程序阅读。
- LLM 动态出题:优先调用 Bot 绑定的 LLM 模型生成新题,风格参考牛客网、面试题的程序阅读题型
- 题库兜底:LLM 不可用(网络异常、模型未配置等)时自动回退到内置题库,保证功能始终可用
- 不限制次数:提供
/J每日一题和/J再来一题两条指令,无需等待次日刷新 - 与 C 插件并存:所有指令带
J前缀,不和 C 插件的/每日一题等指令冲突 - 群组隔离:每个群的题目、答题状态独立存储,互不影响
- 答案匹配宽松:忽略大小写、首尾标点、多余空格、引号包裹等差异,降低格式原因导致的误判
- 安全输出:消息中的尖括号等特殊字符会被转义,避免 QQ 平台意外解析
- 题目基线:Java 17 LTS,完整可编译类
Main,不使用 preview 特性
| 指令 | 说明 | 示例 |
|---|---|---|
/J每日一题 |
获取一道 Java 阅读题 | /J每日一题 |
/J再来一题 |
换一道新题 | /J再来一题 |
/J答 <答案> |
提交答案,提示正确或错误 | /J答 11 |
/J答案 |
查看当前题目的正确答案和解析 | /J答案 |
/J题解 |
查看当前题目的详细解析 | /J题解 |
指令前缀支持 / 和 !;J 大小写均可(即 /j每日一题 同样有效)。
配置文件位于 config.toml,亦可在 MaiBot WebUI 中修改。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled |
bool | true |
是否启用插件 |
config_version |
str | "1.0.0" |
配置版本,由插件自动管理,无需手动修改 |
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled |
bool | true |
是否启用 Java 编程一题功能 |
llm_first |
bool | true |
优先使用 LLM 生成题目。关闭后仅从内置题库抽取 |
reveal_on_wrong |
bool | false |
答错后是否立即显示正确答案和解析。开启后答错可见完整解析;关闭后需通过 /J答案 或 /J题解 查看 |
[plugin]
enabled = true
config_version = "1.0.0"
[daily_problem]
enabled = true
reveal_on_wrong = false
llm_first = true插件通过 self.ctx.llm.generate() 调用 Bot 绑定的 LLM 模型,使用结构化 prompt 要求模型生成 JSON 格式的题目数据(代码、问题、答案、提示、解析)。生成失败时静默回退到题库,不影响用户体验。
Prompt 要求生成 Java 17 下可直接编译运行的完整 Main 类,输出尽量为单行,答案必须确定且不依赖具体 JVM/平台。提示词也会要求避免只考 i++/++i、&& 短路、switch 穿透等过于常见且单调的题目。
内置 42 道精选题目,覆盖以下知识点:
- 运算符/自增(优先级、整数除法、前缀后缀自增)
- String/常量池/StringBuilder(不可变、拼接方向、
new String与equals) - 自动装箱/Integer 缓存(
-128~127缓存、拆箱 NPE) - 类型转换/三目/溢出(截断、
byte强转、三目数值提升、int 溢出、Math.abs) - 异常/finally(
finally先执行、返回值保存、运行时异常捕获) - 继承多态/静态隐藏/字段隐藏(动态分派、静态方法按编译期类型、字段无多态)
- 静态/实例初始化顺序(静态块、父类先初始化、实例初始化块)
- 循环/break/continue/label(
continue、break、标签跳出外层循环) - 数组/集合/泛型(数组引用、
ArrayList.remove(int)、Arrays.asList视图、边删边遍历) - 位运算/移位(按位与、带符号右移、无符号右移)
- 浮点/NaN/精度(
0.1+0.2、除以 0、NaN、-0.0)
每个群独立追踪已出过的题库题目,避免短期内重复。
在 MaiBot WebUI → 插件市场中搜索 java-daily-problem,点击安装即可。
把本目录放到 MaiBot 的 plugins/java-daily-problem 下(保持目录名与 manifest id 一致),重启 MaiBot 后插件自动加载。
# 示例:在 maibot/plugins 下直接放置
# java-daily-problem/ 包含 plugin.py、_manifest.json、config.toml 等| 项目 | 最低版本 | 最高版本 |
|---|---|---|
| MaiBot | 1.0.0 | 1.99.99 |
| MaiBot SDK | 2.0.0 | 2.99.99 |
本插件除 maibot_sdk(由 MaiBot 宿主提供)外无额外 Python 依赖。插件运行时不调用 javac/java,不依赖本机 JDK。
python -m pytest -q测试覆盖答案标准化、QQ 安全转义、题库完整性、题库不重复抽取和消息格式化,不依赖 MaiBot 宿主。
Q: 发 /J每日一题 没反应?
A: 确认 Bot 在线、插件已启用([plugin].enabled = true)。检查日志中是否有 java-daily-problem 相关错误。
Q: 和 C 插件的指令会冲突吗?
A: 不会。C 插件使用 /每日一题 等指令,本插件使用 /J每日一题 等指令。
Q: 题目一直出题库的,没有 LLM 生成?
A: 检查 [daily_problem].llm_first 是否为 true,并确认 Bot 已配置有效的 LLM 模型。LLM 生成失败不会报错,会静默回退到题库。可查看日志中的 debug 信息确认原因。
Q: 答对了但是判错了? A: 答案匹配会做标准化处理(去大小写、去标点、去引号、去多余空格)。如果仍误判,可能是题目的预期答案格式特殊,欢迎提 Issue。
Q: 状态文件在哪?
A: 插件目录下的 java_daily_state.json,存储各群的已出题列表和当前题目缓存。删除此文件可重置所有群的题目状态。
- 本插件通过宿主 Bot 的 LLM 模型动态生成题目,AI 生成的答案可能存在误差。如发现错误,欢迎提 Issue 反馈。
- LLM 调用由宿主 Bot 统一管理,API 费用由 Bot 部署者承担。
- 插件状态数据(
java_daily_state.json)仅存储各群的出题进度,不记录用户聊天内容。
MIT