yanhy的学习记录匣 - 编程
https://www.yanhy.top/index.php/tag/%E7%BC%96%E7%A8%8B/
-
QuizzerBot 插件Wiki
https://www.yanhy.top/index.php/archives/456/
2025-05-16T13:31:00+08:00
QuizzerBot 插件Wiki文档1. 插件概述1.1 基本介绍欢迎使用 QuizzerBot!这是一个给服务器增加趣味答题活动的插件。支持Paper/Bukkit/Spigot等服务端核心。当前稳定支持API版本1.21.6及以上(已通过1.21.6-1.21.8版本测试,低于1.21.6尚未测试,但由于低版本不支持对话框API因此可能会出问题)。本文档会尽量覆盖所有功能进行介绍,并区分新旧版本。当前文档对应版本:1.2.01.2 核心功能QuizzerBot 核心就是“答题”。它提供了两种完全独立的答题模式:经典聊天答题 (所有版本均可使用)插件会按你设定的时间间隔,在聊天框自动发起全服答题。题目和选项会显示在公屏,玩家通过点击选项或输入指令来抢答。图形界面答题 (1.2.0+ 新增, 需 MC 1.21.6+)利用 Paper 1.21.6+ 新增的 Dialog API,提供了一个可交互的答题菜单。玩家可以随时使用 /quiz dialog 指令拉起这个菜单,按自己的节奏答题。这个功能使用独立的题库和排行榜,适合用来做“背单词CET4\6”、“MC知识问答”等额外挑战。1.3 运行机制插件安装后会自动生成:config.yml配置文件quizzerBook.db H2格式数据库文件数据库存储:题目数据(QuizzerBook表)玩家统计数据(PlayerStats表)附加题目数据(extraQuizBook表)玩家附加统计数据(PlayerExtraStats表)警告:请勿手动删除数据库文件,否则将导致数据丢失1.4 版本兼容性说明1.2.0+ 版本 (最新):为了支持“图形界面答题”,此版本必须在 Paper 1.21.6 及更高版本上运行。如果你是 1.21.6+ 的服务器,请使用这个版本。1.1.x 版本:这些版本不包含“图形界面答题”和“CSV导入导出”功能。它们适用于 1.21 ~ 1.21.5 版本的服务器。如果你不打算升级服务器到 1.21.6,请继续使用 1.1.x 版本的插件。(备注:1.1.x版本可能存在时常无法自动触发答题bug,如有需求可联系作者更新修复)2. 安装与初始化2.1 安装步骤将插件jar文件放入服务器plugins目录重启服务器检查启动日志确认加载成功2.2 成功加载标志正常启动时会显示如下日志信息(具体内容可能因版本不同略有差异):[11:15:17 INFO]: [QuizzerBot] 数据库初始化完成
[11:15:17 INFO]: [QuizzerBot] 配置项:最低玩家限制: 1
[11:15:17 INFO]: [QuizzerBot] 配置项:答题时间: 20
[11:15:17 INFO]: [QuizzerBot] 答题系统已成功启动插件第一次运行时,会自动在 plugins/QuizzerBot/ 目录下生成 config.yml 配置文件和 quizzerBook.db 数据库文件。1.2.0版本为了读写 .db 数据库,插件会自动从网上下载 H2 数据库驱动,下载速度取决于服务端所在服务器网络情况。3. 功能详解3.1 自动答题3.1.1 触发机制插件会根据 config.yml 里的 trigger_interval_sec: [最小值, 最大值] 配置,在这个时间范围内随机挑一个秒数,倒计时触发答题。(如果把最小值和最大值设成一样的,就是固定时间触发)。触发时,会检查当前在线人数是否满足 min_players 的最低要求。3.1.2 答题过程条件满足后,题目和选项会发到公屏。玩家有 answer_reveal_delay_sec 秒的时间来作答(比如配置 60 秒)。玩家可以通过直接点击聊天框里的选项或使用 /quiz ans <答案> 来提交。3.1.3 结算与奖励时间一到,插件停止接收答案并开始结算。插件会看 player_QuickAnswer_limit (抢答名额) 和 player_reward_limit (奖励名额) 这两个配置。“抢答成功”: 最先答对的前 player_QuickAnswer_limit 名玩家,会被标记为“抢答成功”。“获得奖励”: 插件会从“抢答成功”的玩家里,按先后顺序发奖励,最多发 player_reward_limit 份。特殊情况: 如果抢答名额内的玩家答错了,奖励会顺延给后面答对的玩家 (哪怕他不是抢答玩家),直到发满 player_reward_limit 份奖励为止。3.2 图形界面答题 (1.2.0+ 新增)独立题库: 它使用一个叫 extra_questions 的独立题库,管理指令是 /quiz extra ...。独立统计: 它的排行榜、玩家数据也是独立计算的。玩法: 玩家输入 /quiz dialog 打开菜单,就可以自己选择题库(如果你未来做了分类)或开始答题。应用场景: 非常适合做服主定制的内容,比如英语四六级单词(就像你开发的初衷!)、服务器趣味知识问答等。3.3 题库管理 (1.2.0+ 新增)为了方便服主编辑大量题目,1.2.0 版增加了 CSV 导入导出功能。数据表列表(区分大小写):QuizzerBook extraQuizBook PlayerStats PlayerExtraStats导出: /quiz database export <表名>例如: /quiz database export QuizzerBook (导出自动答题的题库)例如: /quiz database export PlayerExtraStats (导出附加题库)导出的 .csv 文件会放在 plugins/QuizzerBot/ 目录下,并与数据表名同名,如“QuizzerBook.csv”导入: /quiz database import <表名>导入前需要保证要导入的表格文件名和数据表名一模一样(区分大小写),并放在plugins/QuizzerBot/目录中。危险操作警告:导入时,插件会先清空数据库里原有的整张表,然后再把你 .csv 文件里的内容全部写进去!这意味着任何在游戏里用指令添加的题目都会被覆盖!操作前建议先备份 quizzerBook.db 文件!3.4 答题流程概览触发机制:服务器启动后开始计时在配置的随机时间间隔(默认60-70秒)后检查触发条件满足最低玩家数要求后开始答题活动题目展示:[11:31:02 INFO]: [答题Bot] 答题时间到~
===========问题编号: 1================
工作台需要几个木板合成?
A: 2 B: 4 C: 5 D: 7
=======================================
[11:31:02 INFO]: 答案在10秒后揭晓,【点击选项】即可答题作答方式:点击聊天框中的选项使用命令/quiz ans <选项>抢答机制:前N名回答的玩家标记为抢答(N可在配置中设置)抢答成功后全服公告:[11:32:37 INFO]: [答题Bot] yanhy2000 抢答成功![1/3]结果公布:[11:32:41 INFO]: [答题Bot] 答案揭晓: 【B】!
抢答正确: 1人, 普通回答正确: 0人, 共发放奖励: 1人4. 配置详解4.1 配置文件说明quiz:
# 配置文件版本,不要动
conf_version: 1
# (旧版配置,1.2.0+ 已移除语言文件,默认为 zh_CN)
# language: zh
# 触发聊天答题的最低在线玩家数
min_players: 1
# 答题触发间隔时间(秒),[最小值, 最大值]
# 在这个范围内随机一个时间点触发
trigger_interval_sec: [60, 120]
# 聊天答题开始后,玩家有多长时间作答(秒)
answer_reveal_delay_sec: 60
# 答对后给的奖励指令,%player% 会被替换成玩家名
reward_commands:
- 'say %player% 在答题中获胜!'
- 'give %player% diamond 1'
# 每人每天最多从聊天答题中获取多少次奖励
daily_reward_limit: 5
# 每轮聊天答题,最多发多少份奖励
player_reward_limit: 3
# 每轮聊天答题,前多少个回答的玩家算作“抢答”
# (答错了也算抢答名额)
player_QuickAnswer_limit: 35. 数据库结构5.1 题目表(QuizzerBook)字段类型说明idINTEGER自增主键quizTEXT题目内容(必填)optA-optDTEXT选项内容(可空)answerTEXT正确答案(A/B/C/D)isEnableBOOLEAN是否启用(默认TRUE)showCountINTEGER题目出现次数统计5.2 玩家统计表(PlayerStats)字段类型说明uuidTEXT玩家唯一标识usernameTEXT玩家名total_attemptsINTEGER总答题次数correct_answersINTEGER答对次数quick_answersINTEGER抢答成功次数daily_rewardsINTEGER当日获得奖励数last_played_dateTEXT最后参与日期(YYYY-MM-DD)5.3 附加题目表(QuizzerBook)字段类型说明idINTEGER自增主键typeTEXT题目类型(必填)quizTEXT题目内容(必填)optA-optDTEXT选项内容(可空)answerTEXT正确答案(A/B/C/D)isEnableBOOLEAN是否启用(默认TRUE)showCountINTEGER题目出现次数统计5.4 玩家附加统计表(PlayerStats)字段类型说明uuidTEXT玩家唯一标识usernameTEXT玩家名total_attemptsINTEGER总答题次数correct_answersINTEGER答对次数last_played_dateTEXT最后参与日期(YYYY-MM-DD)6. 命令手册权限:标有 (管理员) 的指令需要 OP 权限。6.1 玩家命令命令说明/quiz ans <答案>提交“聊天答题”的答案 (A/B/C/D)/quiz me查看你自己的答题统计 (聊天答题)/quiz query <玩家>查看其他玩家的统计 (聊天答题)/quiz top [类别]查看聊天答题的排行榜 (类别: total, correct, quick, rewards)/quiz dialog(1.2.0+) 打开“图形界面答题”菜单6.2 管理员命令 (通用)命令说明/quiz reload(管理员) 重载 config.yml 配置文件/quiz reset <玩家>(管理员) 重置指定玩家的所有答题数据 (包括聊天和图形界面)/quiz help(管理员) 显示帮助菜单6.3 管理员命令 (经典聊天答题)命令说明/quiz startnow(管理员) 立即开始一轮聊天答题/quiz stop(管理员) 停止自动答题的调度器/quiz enable <true/false>(管理员) 启用或禁用自动答题调度器/quiz add <问题> <正确答案>(管理员) 添加一道聊天答题 (答案是A/B/C/D)/quiz delete (管理员) 删除指定 ID 的聊天题目/quiz modify <字段> <新值>(管理员) 修改聊天题目 (字段如: quiz, optA, answer...)/quiz toggle <true/false>(管理员) 启用或禁用一道聊天题目/quiz list [页码](管理员) 列出所有聊天答题的题目/quiz detail (管理员) 查看聊天题目的详细信息6.4 管理员命令 (图形界面答题)命令说明/quiz extra add ...(管理员) 添加题目到“图形界面”题库 (参数同上)/quiz extra delete (管理员) 删除“图形界面”题目/quiz extra modify ...(管理员) 修改“图形界面”题目/quiz extra toggle ...(管理员) 启用/禁用“图形界面”题目/quiz extra list(管理员) 列出所有“图形界面”题目/quiz extra detail (管理员) 查看“图形界面”题目详情6.5 管理员命令 (数据库)命令说明/quiz database export <表名>(管理员) 导出数据表到 CSV (表名: questions 或 extra_questions)/quiz database import <表名>(管理员) (危险操作) 从 CSV 导入数据,覆盖原表1.1.x 旧版本不包含 extra, database新指令。7. 常见问题7.1 答题未触发检查min_players设置确认题库中有启用状态的问题查看日志是否有错误信息7.2 题目管理添加题目示例:/quiz add 低版本中Minecraft中钻石在第几层最多? 1-5 5-12 12-20 20+ b可使用"-"作为空选项占位符8. 注意事项数据备份: 插件的数据库文件 quizzerBook.db 存着你所有的题目和玩家数据,建议定期备份问题反馈: 遇到 Bug 或有啥好建议,欢迎联系 yanhy2000@foxmail.com本Wiki文档随插件版本更新,最新版请以实际发布为准
-
CLion使用Visual Studio2022编译器环境
https://www.yanhy.top/index.php/archives/261/
2022-07-28T01:20:00+08:00
如题,刚接触CLion,要编译一个小项目,需要引入外部的头文件和静态库.lib,奈何查了半天发现MinGW64不支持.lib库,只能用.a或者.dll,因此准备添加个VS2022编译器备用...添加VS2022编译器打开CLion并进入设置选择自定义-所有设置,即可打开设置页面新增工具链选择 构建、执行、部署 - 工具链 ,点左上角的加号新增编译器,选择Visual studio,然后指定电脑内安装的路径(2022社区版要选到...Microsoft Visual Studio2022Community),其他选项默认即可,点击应用添加VS2022调试环境添加配置文件在前面的界面下,点击左侧CMake,点击左上角加号添加配置文件,添加后默认会显示为Release,手动重命名并将构建类型更换为Debug,将工具链修改为Visual Studio(也可以将下面MinGW也重命名一下便于辨认),然后点击确定即可。新建工程测试新建一个c++可执行文件,指定存放位置后点击创建打开工程后,可以看到左侧工程列表内多了一个配置文件,并且可以手动在右上角切换Debug配置文件,这里默认设置为VS2022为默认配置,点右上角的运行按钮即可编译运行工程
-
CLion编译C++动态链接库时引入外部静态库
https://www.yanhy.top/index.php/archives/260/
2022-07-28T01:17:00+08:00
简单记录一下用CLion编译C++动态链接库时引入外部静态库遇到的问题,查了很久的cMakeList.txt文件用法,终于把外部的头文件和静态库.lib一起编译了进来...(刚接触CLion,MinGW用不惯,给换成了VS2022编译器环境)创建动态链接库选择C++库,指定位置后,库类型设置为shared(本次演示使用动态链接库而非静态库),点击创建工程编写代码示例代码:library.cpp#include <iostream>
#include "plugin.h"
#include <unordered_map>
cspLogger logger("eoe");
void func(std::unordered_map<std::string, std::string> data){
std::cout<<"data-size:"<<data.size()<<std::endl;
}
void PluginInit(){
std::cout<<"test_plugin loaded!"<<std::endl;
logger.info("test_plugin loaded!");
SetListener(EventCode::onServerStart,func);
}代码部分为某项目半成品,无参考价值,仅示例引用外部依赖并编译文件导入手动将目标SDK文件夹中的head、lib文件夹放到项目根目录编辑CMakeLists.txt主要修改:5-7行cmake_minimum_required(VERSION 3.22)
project(test_1)
set(CMAKE_CXX_STANDARD 14)
include_directories("Head")#引入外部头文件路径
link_directories("Lib")#引入外部依赖库路径
link_libraries(a)#引入依赖文件名
add_library(test_1 SHARED library.cpp)重新加载CMake构建工程点击上方构建,选择第三个构建当前工程,待显示构建 已完成,即可在对应配置目录内找到构建成功的的动态数据库,本项目生成文件为test_1.dll,可用于给其他项目加载。
-
记录一次简单的C语言考试
https://www.yanhy.top/index.php/archives/70/
2021-06-17T19:09:00+08:00
很快啊,就期末考试了...简单记录一下这次C语言考试的内容,以供后来参考...Program 1:定义一个函数,用于实现两个int类型数据的求和功能,并将求和结果返回给调用者。在主函数中分别以变量作实参、常量作实参调用此求和函数#include<stdio.h>
int sum(int a,int b)
{
int c;
c=a+b;
return c;
}
int main()
{
int x,y,s=0;
scanf("%d%d",&x,&y);
s=sum(x,y);
printf("%d",s);
return 0;
} Program 2:编程实现:输出100~300之间不能被3整除的数,每行显示5个数。#include<stdio.h>
int main()
{
int i,j,a;
for(i=100;i<=300;i++)
{
if(i%3!=0)
{
printf("%d ",i);
a=(a+1)%5;
if(a==0)
{
printf("\n");
}
}
}
return 0;
}Program 3:编程实现:已知arr数组中有n个无序整数,请对arr数组进行降序排序,然后输出结果。#include<stdio.h>
int main()
{
int arr[999]={0},n,temp;
scanf("%d",&n);//题目没有指定长度,手动输入一个长度
for(int i=0;i<n;i++)//输入数组
{
scanf("%d",&arr[i]);
}
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{
if(arr[j]<arr[j+1])//冒泡降序
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
for(int i=0;i<n;i++)//输出数组
{
printf("%d ",arr[i]);
}
return 0;
}