Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Java每日一题

为 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 中修改。

[plugin]

参数 类型 默认值 说明
enabled bool true 是否启用插件
config_version str "1.0.0" 配置版本,由插件自动管理,无需手动修改

[daily_problem]

参数 类型 默认值 说明
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

题目来源

LLM 生成(默认优先)

插件通过 self.ctx.llm.generate() 调用 Bot 绑定的 LLM 模型,使用结构化 prompt 要求模型生成 JSON 格式的题目数据(代码、问题、答案、提示、解析)。生成失败时静默回退到题库,不影响用户体验。

Prompt 要求生成 Java 17 下可直接编译运行的完整 Main 类,输出尽量为单行,答案必须确定且不依赖具体 JVM/平台。提示词也会要求避免只考 i++/++i&& 短路、switch 穿透等过于常见且单调的题目。

内置题库(兜底)

内置 42 道精选题目,覆盖以下知识点:

  • 运算符/自增(优先级、整数除法、前缀后缀自增)
  • String/常量池/StringBuilder(不可变、拼接方向、new Stringequals
  • 自动装箱/Integer 缓存(-128~127 缓存、拆箱 NPE)
  • 类型转换/三目/溢出(截断、byte 强转、三目数值提升、int 溢出、Math.abs
  • 异常/finally(finally 先执行、返回值保存、运行时异常捕获)
  • 继承多态/静态隐藏/字段隐藏(动态分派、静态方法按编译期类型、字段无多态)
  • 静态/实例初始化顺序(静态块、父类先初始化、实例初始化块)
  • 循环/break/continue/label(continuebreak、标签跳出外层循环)
  • 数组/集合/泛型(数组引用、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

About

Java每日一题 MaiBot 插件(程序阅读题,LLM+题库)

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages