悲伤记录器回滚插件(GLRA)

悲伤记录器回滚插件(GLRA)

DAQUEM 的 GriefLogger 插件,用于回滚命令 + 网页界面

管理

Grieflogger 回滚插件

这个 NeoForge 插件从 SQLite(默认)或 MySQL/MariaDB 读取 GriefLogger 数据,并通过命令在游戏内还原方块操作。它面向 NeoForge 21.1.213 / Minecraft 1.21.1,且仅限服务端使用:任何已记录的方块放置或破坏都可以被选择性地撤销。它就像 CoreProtect,但适用于模组服务器。

功能

  • 从 GriefLogger 数据库回滚方块更改和容器/物品栏更改(blocks + containers 表,并与 materials、users、levels 进行连接)。
  • 按时间窗口、可选玩家名称以及围绕命令执行者的可选半径进行筛选。
  • 在更改方块前确保目标区块已加载。
  • 进度日志记录和每 tick 批处理,以保持服务器响应流畅。
  • 所有命令和通知都有权限节点(支持 LuckPerms/权限模组,默认回退到 op 等级 3)。
  • 对游戏内启动的回滚、通过 Web UI/API 触发的回滚以及被阻止/未授权的 Web 访问尝试进行广播通知。
  • 如果启动时没有可用的数据库连接,则自动禁用自身。
  • 可通过 griefloggerrollbackaddon-common.toml 高度配置:数据库后端/凭据、Web UI/API 绑定/端口/令牌、回滚批大小、进度间隔以及未授权访问日志记录选项。

要求

  • NeoForge 21.1.213 / Minecraft 1.21.1。
  • 一个 GriefLogger 数据库(可以是 GriefLogger 写入的 SQLite 数据库文件,也可以是具有 GriefLogger 架构的 MySQL/MariaDB 数据库)。
  • 具有读取权限的数据库凭据(用于 MySQL/MariaDB)。
  • 首次服务器启动生成的配置文件 config/grieflogger/griefloggerrollbackaddon-common.toml(设置数据库类型/连接、Web 选项和批大小)。
  • 如果启用了 Web UI/API:在绑定地址(webApiBindAddress,默认 0.0.0.0)上有一个空闲 TCP 端口(默认 8765),并且如果暴露在 localhost 之外,还需要配置令牌(webApiToken)以及适当的防火墙/端口转发。
  • 权限模组(例如 LuckPerms)可选;没有它时,只有管理员(op 等级 3)可以运行命令/接收通知。

安装

  1. 将模组 JAR 和你的后端 JDBC 驱动(SQLite、MySQL 或 MariaDB)放入服务器的 mods/ 文件夹。
  2. 启动服务器一次以生成 config/grieflogger/griefloggerrollbackaddon-common.toml。
  3. 通过 dbType 选择后端(不区分大小写,默认 SQLITE)。对于 SQLite,设置 dbFile;对于 MySQL/MariaDB,设置主机/端口/名称/用户/密码。
  4. 检查日志中的 [griefloggerrollbackaddon] Database connection succeeded。如果失败,该插件将保持禁用,直到连接成功。

配置(config/grieflogger/griefloggerrollbackaddon-common.toml)

  • dbType(枚举,默认 SQLITE):选择 SQLITE、MYSQL 或 MARIADB(不区分大小写)。
  • dbFile(字符串,默认 config/grieflogger/grieflogger.sqlite):当 dbType=SQLITE 时的 SQLite 数据库文件路径。
  • dbHost(字符串,默认 localhost):MySQL/MariaDB 主机。
  • dbPort(整数,默认 3306):MySQL/MariaDB 端口。
  • dbName(字符串,默认 grieflogger):MySQL/MariaDB 的数据库名称。
  • dbUser(字符串,默认 root):MySQL/MariaDB 的数据库用户。
  • dbPassword(字符串,默认空):MySQL/MariaDB 的数据库密码。
  • rollbackBatchSize(整数,默认 200):每 tick 处理的操作数量。
  • progressTickInterval(整数,默认 20):进度日志消息之间的 tick 间隔。
  • webApiEnabled(布尔值,默认 false):启动一个带有 Web UI 的小型 HTTP 服务器以触发回滚。
  • requireApiToken(布尔值,默认 false):如果为 true 且 webApiToken 为空,则禁用 Web UI/API;否则每个请求都必须包含令牌。
  • webApiBindAddress(字符串,默认 0.0.0.0):Web UI/API 的绑定地址。
  • webApiPort(整数,默认 8765):Web UI/API 的端口。
  • webApiToken(字符串,默认空):Web 请求所需的可选共享密钥。仅在 localhost 上才可留空。
  • logUnauthorizedWebAccess.enabled(布尔值,默认 false):将未授权的 Web 请求记录到数据库表 glra_web_unauthorized(保留最新 1000 条记录)。
  • logUnauthorizedWebAccess.logHeaders(布尔值,默认 false):存储未授权 Web 请求的请求头。
  • logUnauthorizedWebAccess.logBody(布尔值,默认 false):存储未授权 Web 请求的请求体(可能包含令牌)。
  • logUnauthorizedWebAccess.logQuery(布尔值,默认 true):存储未授权 Web 请求的查询字符串。

命令:/gl rollback

语法:/gl rollback t:<time> [u:<player>] [r:<radius|c<chunks>>] [i|b]

  • t: 必需,要回滚的时间窗口。支持的单位:s、m、h、d、M(30 天)、y。示例:t:30m、t:12h、t:90s。
  • u: 可选,精确的玩家名称(匹配 users 表)。
  • r: 可选半径。默认使用方块(r:25)。前缀 c 切换到区块(r:c4 = 4 个区块的半径)。前缀 b 强制使用方块(r:b40)。
  • i 可选标志:仅回滚物品栏/容器更改(物品)。
  • b 可选标志:仅回滚方块更改。如果既没有给出 i 也没有给出 b,则两者都会回滚。

示例

  • /gl rollback t:2h - 回滚过去 2 小时内的所有操作。
  • /gl rollback t:1d u:Griefer123 - 仅回滚该玩家在过去 24 小时内的操作。
  • /gl rollback t:30m r:c2 - 回滚执行者周围 2 个区块内的操作。
  • /gl rollback t:10m u:User r:20 - 玩家筛选加 20 个方块的半径。
  • /gl rollback t:45m i - 仅回滚过去 45 分钟内的物品栏/容器更改。
  • /gl rollback t:10m b r:15 - 仅回滚过去 10 分钟内 15 个方块范围内的方块更改。

其他命令

  • /gl web token add <player> — 为玩家创建/替换 Web API 令牌(可在聊天中复制)。
  • /gl web token remove <player> — 删除玩家的 Web API 令牌。
  • /gl web token list [page] — 列出令牌并带有复制到剪贴板的提示。
  • /gl web start / /gl web stop — 启动/停止内置 Web UI/API(遵循配置开关和令牌要求)。
  • /gl config reload — 无需重启即可重新加载插件配置(griefloggerrollbackaddon-common.toml)。

Web UI / HTTP API

  • 在配置中通过 webApiEnabled=true 启用。默认为 0.0.0.0:8765;根据需要更改 webApiBindAddress/webApiPort。
  • 可选安全性:设置 webApiToken 并将其作为请求头 X-Auth-Token 或表单字段 token 传递。
  • 打开 http://<bind>:<port>/ 可看到一个极简表单:时间窗口(例如 30m)、可选玩家、方块/物品复选框、可选半径以及中心 X/Z/Y 和维度。该表单会 POST 到 /api/rollback。
  • API 端点 /api/rollback 接受 application/x-www-form-urlencoded,字段相同,并返回一个小型 JSON 状态。
  • 未授权的请求可以记录到数据库(可配置),并将以可读消息通知符合条件的玩家/管理员。

权限

  • 默认回退:如果没有权限模组,则为 op 等级 3。
  • 节点(命名空间 griefloggerrollbackaddon):
    • command.rollback
    • command.web.token
    • command.web.server
    • command.config.reload
    • notify.rollback(游戏内回滚命令)
    • notify.web.rollback(Web 触发的回滚)
    • notify.web.unauthorized(被阻止的 Web 请求) 使用你的权限模组(例如 LuckPerms)来授予/拒绝;否则只有管理员(等级 3)可以运行命令并接收通知。

工作原理

  1. 服务器启动:立即测试数据库连接。失败时,插件会禁用自身(无命令/事件)。
  2. 命令:/gl rollback ... 启动一个任务:
    • 在后台线程中从 blocks 和 containers 加载自给定时间以来的匹配条目,可选地按玩家和/或半径筛选。
  • 为每个坐标重建先前的方块状态(oldMaterialName),以便正确反转放置和破坏。
  • 将所有操作(方块 + 物品栏操作)加入队列进行处理,最新的优先,以便最新的更改先被撤销。
  1. 服务器 tick:每个 tick 最多处理 rollbackBatchSize 个操作:
    • BREAK 日志从数据库条目恢复被破坏的方块。
    • PLACE 日志恢复先前的方块状态。
    • 容器日志移除已插入的物品,并加回已取走的物品(包括存储的 NBT)。如果容器已满,溢出物品会掉落在容器位置。
    • 未知/其他代码回退到恢复先前状态(或空气)。
    • 在设置方块之前加载目标区块。
  2. 进度:每 progressTickInterval 个 tick,记录队列大小和已处理数量。当队列为空时,任务完成。

注意事项和限制

  • 如果在恢复物品时容器没有空间,溢出物品会作为物品实体掉落在容器旁边。
  • 维度映射使用 levels.name(ResourceLocation),或者回退到 ID 1/2/3(主世界/末地/下界)。
  • 无效或未知的方块名称默认为 minecraft:air,并发出警告。
  • JDBC 驱动未捆绑在模组 JAR 中;必须单独提供。
  • 较大的时间窗口可能产生大量队列。调整 rollbackBatchSize 和半径以控制服务器负载。

开发/构建

  • Java 21,包含 Gradle wrapper。使用 ./gradlew build 在本地构建(Windows 上为 gradlew.bat build)。
  • MariaDB、MySQL 和 SQLite 驱动被声明为 localRuntime;生产环境中请单独提供驱动 JAR。