[TOC]
# Minecraft MOTD 插件
用于查询一系列 Minecraft 服务器状态并生成在一张图片上的 NoneBot 插件。支持多群聊隔离、私聊策略配置等高级功能。
思路参考自 [lgc-NB2Dev/nonebot-plugin-picmcstat](https://github.com/lgc-NB2Dev/nonebot-plugin-picmcstat)
## 工作模式
插件支持两种工作模式,可通过 `MC_MOTD_MULTI_GROUP_MODE` 配置项切换:
```mermaid
graph TD
A[插件启动] --> B{MC_MOTD_MULTI_GROUP_MODE}
B -->|false| C[传统模式]
B -->|true| D[多群聊隔离模式]
C --> C1[全局共享服务器列表]
C --> C2[所有群聊使用相同列表]
C --> C3[简单权限管理]
D --> D1[独立服务器列表]
D --> D2[群聊隔离]
D --> D3[群组共享]
D --> D4[个人列表]
D --> D5[动态策略]
```
### 传统模式(默认)
所有群聊和私聊共享同一个全局服务器列表,适合简单场景。
### 多群聊隔离模式
不同群聊、私聊可以拥有独立的服务器列表,支持:
- **群聊隔离**:每个群独立的服务器列表
- **群组共享**:多个群共享同一服务器列表
- **个人列表**:用户在私聊中拥有独立列表(可自己管理)
- **动态策略**:群临时会话可跟随来源群
## 权限说明
权限管理根据工作模式有所不同:
```mermaid
graph TD
A[用户类型] -->|管理所有作用域| B[超级管理员]
A -->|管理特定作用域| C[QQ群管理员/群主]
A --> D[普通用户]
B --> B1[NoneBot 超级管理员<br/>SUPERUSERS]
B --> B2[插件超级管理员<br/>MC_MOTD_SUPERUSERS]
B --> B3[跨作用域操作权限]
C --> C2{MC_MOTD_GROUP_ADMIN_PERMISSION}
C2 -->|true| C3[管理本群服务器列表]
C2 -->|false| C4[无管理权限]
D --> D1{模式判断}
D1 -->|传统模式| D2[无管理权限]
D1 -->|多群聊模式<br/>personal策略| D3[管理个人列表]
```
### 传统模式权限
管理员权限包括:
- NoneBot 超级管理员 (SUPERUSERS)
- 插件超级管理员 (MC_MOTD_SUPERUSERS)
- 群管理员或群主(需开启群管理员权限)
### 多群聊隔离模式权限
权限规则:
- **超级管理员**:管理所有作用域的服务器,可使用跨作用域命令
- **群管理员**:只能管理所在群的服务器列表
- **普通用户**:在 personal 模式下可管理自己的个人列表
## 配置项说明
### 基础配置
| 配置项 | 类型 | 默认值 | 作用 |
| -------------------------------- | --------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| `MC_MOTD_SUPERUSERS` | List[str] | `[]` | 插件超级管理员QQ号列表 |
| `MC_MOTD_TIMEOUT` | float | `5.0` | 服务器查询超时时间(秒) |
| `MC_MOTD_FILTER_BOTS` | bool | `true` | 是否启用假人过滤 |
| `MC_MOTD_BOT_NAMES` | List[str] | `["Anonymous Player"]` | 假人名称列表(精确匹配) |
| `MC_MOTD_BOT_PATTERNS` | List[str] | `["^player_\\d+$", "^bot_\\d+$", "^fake_\\d+$", "^\\[Bot\\]", "^\\[Fake\\]"]` | 假人正则表达式列表(设为 `[]` 则不使用正则匹配) |
| `MC_MOTD_ALLOW_PRIVATE` | bool | `true` | 允许私聊使用插件(仅传统模式有效) |
| `MC_MOTD_ALLOWED_GROUPS` | List[str] | `[]` | 允许使用插件的群聊列表(空列表表示所有群聊都允许,仅传统模式有效) |
| `MC_MOTD_GROUP_ADMIN_PERMISSION` | bool | `true` | 是否允许群管理员执行管理操作 |
### 多群聊隔离配置
| 配置项 | 类型 | 默认值 | 作用 |
| ------------------------------------- | --------------- | ---------------- | ------------------------------------------------------------ |
| `MC_MOTD_MULTI_GROUP_MODE` | bool | `false` | 是否启用多群聊隔离模式 |
| `MC_MOTD_GROUP_CLUSTERS` | Dict[str, List] | `{}` | 群聊分组配置,同组群共享服务器列表<br />格式:`{"组名": ["群号1", "群号2"]}`<br />留空则每个群都是独立的作用域,各群的服务器列表互不影响<br />**注意**:组名不能使用保留字 `all` |
| `MC_MOTD_PRIVATE_FRIEND_STRATEGY` | str | `"personal"` | 好友私聊策略:`disabled`/`global`/`personal` |
| `MC_MOTD_PRIVATE_GROUP_TEMP_STRATEGY` | str | `"follow_group"` | 群临时会话策略:`disabled`/`global`/`personal`/`follow_group` |
| `MC_MOTD_TRACK_USER_ACTIVITY` | bool | `true` | 是否追踪用户活跃群(用于 follow_group 策略) |
| `MC_MOTD_FOLLOW_GROUP_FALLBACK` | str | `"personal"` | follow_group 无法确定来源群时的降级策略:`personal`/`global` |
| `MC_MOTD_PERSONAL_SERVER_LIMIT` | int | `10` | personal 模式下用户可添加的服务器数量上限(0 表示不限制) |
#### 私聊策略决策流程
```mermaid
flowchart TD
A[用户私聊] --> B{消息类型}
B -->|好友私聊| C{PRIVATE_FRIEND_STRATEGY}
B -->|群临时会话| D{PRIVATE_GROUP_TEMP_STRATEGY}
C -->|disabled| E1[功能禁用]
C -->|global| E2[使用全局列表]
C -->|personal| E3[使用个人列表]
D -->|disabled| F1[功能禁用]
D -->|global| F2[使用全局列表]
D -->|personal| F3[使用个人列表]
D -->|follow_group| G{能否确定来源群?}
G -->|是| H[使用来源群列表]
G -->|否| I{FOLLOW_GROUP_FALLBACK}
I -->|personal| J[降级到个人列表]
I -->|global| K[降级到全局列表]
```
### 图片渲染配置
| 配置项 | 类型 | 默认值 | 作用 |
| ----------------------------- | -------------- | ------------------------ | ------------------------------------------------------------ |
| `MC_MOTD_IMAGE_WIDTH` | int | `1000` | 图片宽度(像素) |
| `MC_MOTD_ITEM_HEIGHT` | int | `160` | 每个服务器项目高度(像素) |
| `MC_MOTD_MARGIN` | int | `30` | 图片边距(像素) |
| `MC_MOTD_TITLE` | str | `"Minecraft 服务器状态"` | 图片默认标题 |
| `MC_MOTD_SCOPE_TITLES` | Dict[str, str] | `{}` | 自定义作用域标题<br />格式:`{"scope": "标题"}`<br />未配置的作用域使用 MC_MOTD_TITLE |
| `MC_MOTD_CUSTOM_FONT` | str | `""` | 自定义字体路径(相对/绝对,相对路径根目录为机器人根目录) |
| `MC_MOTD_ENABLE_COMPRESSION` | bool | `false` | 是否启用图片压缩(PNG 转 WebP) |
| `MC_MOTD_COMPRESSION_QUALITY` | int | `80` | 图片压缩质量(1-100 百分比) |
### 配置示例
#### 传统模式(默认)
```env
# 权限管理
MC_MOTD_SUPERUSERS=["123456789", "987654321"]
# 权限控制
MC_MOTD_ALLOW_PRIVATE=true
MC_MOTD_GROUP_ADMIN_PERMISSION=true
MC_MOTD_ALLOWED_GROUPS=["114514"]
```
#### 多群聊隔离模式 - 完全隔离
```env
# 启用多群聊模式
MC_MOTD_MULTI_GROUP_MODE=true
# 群A和群B共享服务器列表
MC_MOTD_GROUP_CLUSTERS='{"cluster_a": ["123456789", "987654321"]}'
# 好友私聊:每人独立列表(可自己管理,最多10个)
MC_MOTD_PRIVATE_FRIEND_STRATEGY=personal
MC_MOTD_PERSONAL_SERVER_LIMIT=10
# 群临时会话:跟随所属群
MC_MOTD_PRIVATE_GROUP_TEMP_STRATEGY=follow_group
MC_MOTD_TRACK_USER_ACTIVITY=true
MC_MOTD_FOLLOW_GROUP_FALLBACK=personal
# 权限管理
MC_MOTD_SUPERUSERS=["123456789"]
MC_MOTD_GROUP_ADMIN_PERMISSION=true
# 自定义作用域标题
MC_MOTD_SCOPE_TITLES='{"global": "公共服务器", "cluster_a": "朋友圈服务器", "group_114514": "测试群服务器"}'
```
#### 多群聊隔离模式 - 简化配置
```env
# 启用多群聊模式
MC_MOTD_MULTI_GROUP_MODE=true
# 好友私聊:使用全局列表(适合公共服务器)
MC_MOTD_PRIVATE_FRIEND_STRATEGY=global
# 群临时会话:跟随所属群
MC_MOTD_PRIVATE_GROUP_TEMP_STRATEGY=follow_group
```
## 使用方法
### 用户命令
| 命令 | 功能 |
| ---------------- | ------------------------ |
| `/motd` | 查询所有服务器状态 |
| `/motd --detail` | 显示详细信息包括玩家列表 |
| `/motd help` | 显示帮助 |
### 管理员命令
管理员命令只会应用在当前作用域,无法跨作用域
| 命令 | 功能 | 权限要求 |
| ------------------------------------- | ---------------------- | -------- |
| `/motd add ip:port 标签` | 添加服务器 | 管理员 |
| `/motd del ip:port` | 删除指定服务器 | 管理员 |
| `/motd del -rf` | 删除所有服务器 | 管理员 |
| `/motd render allocate ip:port 位置` | 调整服务器显示顺序 | 管理员 |
| `/motd render swap ip1:port ip2:port` | 交换两个服务器显示顺序 | 管理员 |
### 超级管理员专用命令
```mermaid
graph TD
A[跨作用域命令] --> B[查询命令]
A --> C[管理命令]
B --> B1[/motd scope list<br>查看所有作用域/]
B --> B2[/motd --scope=xxx<br>查询指定作用域/]
B --> B3[/motd --scope=all<br>查询所有作用域合并/]
C --> C1[/motd add --scope=xxx ip:port 标签<br>向指定作用域添加/]
C --> C2[/motd del --scope=xxx ip:port<br>从指定作用域删除/]
C --> C3[/motd add --scope=all ip:port 标签<br>向所有作用域批量添加/]
C --> C4[/motd del --scope=all -rf<br>删除所有作用域的所有服务器/]
```
#### 跨作用域命令说明
特殊的`scope`有`global`和`all`,在传统模式下的数据默认储存在`global`作用域
| 命令 | 功能 | 说明 |
| ------------------------------------------- | ---------------------------------- | -------------------------------- |
| `/motd scope list` | 列出所有存在服务器的作用域 | 显示作用域名称和友好名称 |
| `/motd --scope=xxx` | 查询指定作用域的服务器 | 使用作用域自定义标题(如已配置) |
| `/motd --scope=all` | 查询所有作用域的服务器(合并显示) | 使用默认标题 MC_MOTD_TITLE |
| `/motd --scope=xxx add ip:port 标签` | 向指定作用域添加服务器 | 支持任意作用域名称 |
| `/motd --scope=all add ip:port 标签` | 向所有现有作用域批量添加服务器 | 对每个作用域执行添加操作 |
| `/motd --scope=xxx del ip:port` | 从指定作用域删除服务器 | 仅影响指定作用域 |
| `/motd --scope=all del ip:port` | 从所有作用域删除指定服务器 | 批量删除操作 |
| `/motd --scope=xxx del -rf` | 清空指定作用域的所有服务器 | 危险操作,需要 -rf 参数确认 |
| `/motd --scope=all del -rf` | 清空所有作用域的所有服务器 | 极度危险操作,需要 -rf 参数确认 |
| `/motd --scope=xxx render allocate ip 位置` | 调整指定作用域内的服务器顺序 | 跨作用域调整顺序 |
| `/motd --scope=xxx render swap ip1 ip2` | 交换指定作用域内两个服务器的顺序 | 跨作用域交换顺序 |
#### scope 参数位置
`--scope` 参数支持灵活放置:
```bash
# 以下格式都支持
/motd --scope=group_123456 add mc.hypixel.net Hypixel
/motd add --scope=group_123456 mc.hypixel.net Hypixel
/motd --scope=all
/motd --scope=global del -rf
```
### 使用示例
#### 传统模式示例
```bash
# 任何群聊
/motd add hypixel.net Hypixel服务器
/motd add play.example.com:25566 我的服务器
/motd
/motd --detail
```
#### 多群聊隔离模式示例
**在群A中:**
```bash
/motd add mc.hypixel.net Hypixel
# 添加到群A的服务器列表
/motd
# 查询群A的服务器
```
**在群B中(与群A共享):**
```bash
/motd
# 看到与群A相同的服务器列表(因为在同一 cluster)
```
**在群C中(独立):**
```bash
/motd
# 还没有添加任何服务器(独立列表)
/motd add localhost:25565 测试服
# 添加到群C的独立列表
```
**好友私聊(personal 模式):**
```bash
/motd add play.myserver.com:25566 我的私人服务器
# 添加到你的个人列表(不影响任何群)
/motd
# 查询你的个人服务器列表
```
**群临时会话(follow_group 策略):**
```bash
# 通过群A发起临时会话
/motd
# 显示群A的服务器列表
# 通过群B发起临时会话
/motd
# 显示群B的服务器列表
```
**超级管理员跨作用域操作:**
```bash
# 查看所有作用域
/motd scope list
# 输出示例:
# - global (全局)
# - group_123456 (群 123456)
# - cluster_friends (群组 friends)
# - private_friend_789 (好友 789 的个人列表)
# 查看指定作用域
/motd --scope=group_123456
/motd --scope=cluster_friends --detail
# 查看所有作用域的服务器(合并显示)
/motd --scope=all
# 向指定作用域添加服务器
/motd --scope=group_123456 add mc.hypixel.net Hypixel
# 向所有作用域批量添加
/motd --scope=all add play.example.com:25565 公共服务器
# 从指定作用域删除
/motd --scope=group_123456 del mc.hypixel.net
# 清空指定作用域
/motd --scope=group_123456 del -rf
# 清空所有作用域(危险)
/motd --scope=all del -rf
```
## 多群聊模式说明
### 作用域(Scope)架构
```mermaid
graph TD
A[作用域类型] --> B[全局 global]
A --> C[单群 group_xxx]
A --> D[群组共享 cluster_xxx]
A --> E[好友私聊 private_friend_xxx]
A --> F[群临时会话 private_temp_xxx]
A --> G[特殊作用域 all]
B --> B1[传统模式/全局列表<br/>示例: global]
C --> C1[单个群独立列表<br/>示例: group_123456]
D --> D2[多个群共享列表<br/>示例: cluster_friends]
E --> E1[好友私聊个人列表<br/>示例: private_friend_789]
F --> F1[临时会话个人列表<br/>示例: private_temp_789]
G --> G1[超级管理员专用<br/>操作所有现有作用域]
```
### 权限管理架构
```mermaid
graph TD
A[权限等级] --> B[超级管理员]
A --> C[群管理员]
A --> D[普通用户]
B --> B1[管理范围: 所有作用域]
B --> B2[SUPERUSERS + MC_MOTD_SUPERUSERS]
B --> B3[可使用 --scope 参数]
B --> B4[可使用 scope list 命令]
C --> C1[管理范围: 本群作用域]
C --> C2[group_xxx 或所属 cluster_xxx]
C --> C3[需开启 MC_MOTD_GROUP_ADMIN_PERMISSION]
C --> C4[不能使用跨作用域命令]
D --> D1[管理范围: 个人作用域]
D --> D2[private_friend_xxx<br/>private_temp_xxx]
D --> D3[仅在 personal 模式下]
```
### 假人过滤机制
假人过滤功能通过两种方式识别:
```mermaid
flowchart TD
A[玩家名称] --> B{MC_MOTD_FILTER_BOTS}
B -->|false| C[不过滤,显示所有玩家]
B -->|true| D[启用假人过滤]
D --> E[精确名称匹配]
D --> F[正则表达式匹配]
E --> E1[MC_MOTD_BOT_NAMES<br/>默认: Anonymous Player]
F --> F1[MC_MOTD_BOT_PATTERNS<br/>匹配 player_123, bot_456 等]
E1 --> G{匹配结果}
F1 --> G
G -->|匹配| H[标记为假人,不显示]
G -->|不匹配| I[显示真实玩家]
```
默认正则规则会匹配:
- `player_123`、`player_456` 等
- `bot_789`、`bot_001` 等
- `fake_111`、`fake_222` 等
- `[Bot]xxx`、`[Fake]xxx` 等带标签的假人
如需关闭正则匹配但保留名称匹配,可设置:
```env
MC_MOTD_BOT_PATTERNS=[]
```
## 常见问题
**Q: 如何从传统模式切换到多群聊模式?**
A: 设置 `MC_MOTD_MULTI_GROUP_MODE=true` 即可。旧数据会自动归入 `global` 作用域,不会丢失。
**Q: 群临时会话显示"无法确定来源群"?**
A: 用户需要先在群内发言,插件才能追踪其活跃群。或将 `MC_MOTD_FOLLOW_GROUP_FALLBACK` 设为 `global` 使用全局列表。
**Q: personal 模式下如何限制用户添加服务器数量?**
A: 设置 `MC_MOTD_PERSONAL_SERVER_LIMIT`,例如 `10` 表示最多 10 个服务器,`0` 表示不限制。
**Q: 如何让多个群共享同一个服务器列表?**
A: 使用 `MC_MOTD_GROUP_CLUSTERS` 配置,例如:
```env
MC_MOTD_GROUP_CLUSTERS='{"cluster_a": ["123456", "789012"]}'
```
但是请注意,设置 CLUSTERS 后,原来群 `"123456"` 和 `"789012"` 设置的服务器仍然储存在各自 `group_xxx` 作用域内,而此时群 `"123456"` 和 `"789012"` 作用域变为 `cluster_a`,此时相当于创建了一张全新的数据表。因此查询会为空白,需要重新添加服务器。
**Q: 如何为不同作用域设置不同的标题?**
A: 使用 `MC_MOTD_SCOPE_TITLES` 配置:
```env
MC_MOTD_SCOPE_TITLES='{"global": "公共服务器", "cluster_main": "主服务器集群", "group_123456": "测试群"}'
```
未配置的作用域会使用 `MC_MOTD_TITLE` 作为默认标题。
**Q: --scope=all 是什么?**
A: `all` 是超级管理员专用的特殊作用域标识符,用于操作所有现有作用域:
- 查询时:合并显示所有作用域的服务器
- 添加时:向所有作用域批量添加服务器
- 删除时:从所有作用域批量删除服务器
**Q: 为什么不能创建名为 "all" 的群组?**
A: `all` 是系统保留字,用于超级管理员的跨作用域操作。尝试在 `MC_MOTD_GROUP_CLUSTERS` 中使用 `all` 作为群组名会导致启动失败。
**Q: 如何设置命令前缀和参数分隔?**
A: 读取的是 Nonebot 全局配置,推荐项如下:
```env
COMMAND_START=["/"]
COMMAND_SEP=[" "]
```
## 注意事项
- 必须配置管理员权限后才可使用管理功能
- 多群聊模式下,普通用户在 personal 模式可管理自己的列表
- 数据库文件会自动创建在插件数据目录
- 假人过滤/显示详细信息仅对支持玩家列表的服务器有效
- 建议适当调整超时时间以适应网络环境
- 添加服务器时自动排在列表末尾,删除服务器后顺序自动调整
- 群临时会话使用 follow_group 策略需要用户在群内有发言记录
- `MC_MOTD_GROUP_CLUSTERS` 配置中不能使用保留字 `all` 作为群组名
- 跨作用域命令(`--scope` 参数)仅超级管理员可用
- `--scope=all` 操作会影响所有现有作用域,使用时需谨慎
## 图片示例

Raw data
{
"_id": null,
"home_page": null,
"name": "nonebot-plugin-mcmotd",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "minecraft, motd, nonebot, nonebot2, qq-bot, server-status",
"author": null,
"author_email": "AquaOH <aquaoh@outlook.com>",
"download_url": "https://files.pythonhosted.org/packages/6f/92/d6e016e8a5ca1e93b11a9cd0313c40b2a2d07113a65ba3a507b197cc7356/nonebot_plugin_mcmotd-2.0.0.tar.gz",
"platform": null,
"description": "[TOC]\n\n# Minecraft MOTD \u63d2\u4ef6\n\n\u7528\u4e8e\u67e5\u8be2\u4e00\u7cfb\u5217 Minecraft \u670d\u52a1\u5668\u72b6\u6001\u5e76\u751f\u6210\u5728\u4e00\u5f20\u56fe\u7247\u4e0a\u7684 NoneBot \u63d2\u4ef6\u3002\u652f\u6301\u591a\u7fa4\u804a\u9694\u79bb\u3001\u79c1\u804a\u7b56\u7565\u914d\u7f6e\u7b49\u9ad8\u7ea7\u529f\u80fd\u3002\n\n\u601d\u8def\u53c2\u8003\u81ea [lgc-NB2Dev/nonebot-plugin-picmcstat](https://github.com/lgc-NB2Dev/nonebot-plugin-picmcstat)\n\n\n\n## \u5de5\u4f5c\u6a21\u5f0f\n\n\u63d2\u4ef6\u652f\u6301\u4e24\u79cd\u5de5\u4f5c\u6a21\u5f0f\uff0c\u53ef\u901a\u8fc7 `MC_MOTD_MULTI_GROUP_MODE` \u914d\u7f6e\u9879\u5207\u6362\uff1a\n\n```mermaid\ngraph TD\n A[\u63d2\u4ef6\u542f\u52a8] --> B{MC_MOTD_MULTI_GROUP_MODE}\n B -->|false| C[\u4f20\u7edf\u6a21\u5f0f]\n B -->|true| D[\u591a\u7fa4\u804a\u9694\u79bb\u6a21\u5f0f]\n \n C --> C1[\u5168\u5c40\u5171\u4eab\u670d\u52a1\u5668\u5217\u8868]\n C --> C2[\u6240\u6709\u7fa4\u804a\u4f7f\u7528\u76f8\u540c\u5217\u8868]\n C --> C3[\u7b80\u5355\u6743\u9650\u7ba1\u7406]\n \n D --> D1[\u72ec\u7acb\u670d\u52a1\u5668\u5217\u8868]\n D --> D2[\u7fa4\u804a\u9694\u79bb]\n D --> D3[\u7fa4\u7ec4\u5171\u4eab]\n D --> D4[\u4e2a\u4eba\u5217\u8868]\n D --> D5[\u52a8\u6001\u7b56\u7565]\n```\n\n\n### \u4f20\u7edf\u6a21\u5f0f\uff08\u9ed8\u8ba4\uff09\n\n\u6240\u6709\u7fa4\u804a\u548c\u79c1\u804a\u5171\u4eab\u540c\u4e00\u4e2a\u5168\u5c40\u670d\u52a1\u5668\u5217\u8868\uff0c\u9002\u5408\u7b80\u5355\u573a\u666f\u3002\n\n### \u591a\u7fa4\u804a\u9694\u79bb\u6a21\u5f0f\n\n\u4e0d\u540c\u7fa4\u804a\u3001\u79c1\u804a\u53ef\u4ee5\u62e5\u6709\u72ec\u7acb\u7684\u670d\u52a1\u5668\u5217\u8868\uff0c\u652f\u6301\uff1a\n\n- **\u7fa4\u804a\u9694\u79bb**\uff1a\u6bcf\u4e2a\u7fa4\u72ec\u7acb\u7684\u670d\u52a1\u5668\u5217\u8868\n- **\u7fa4\u7ec4\u5171\u4eab**\uff1a\u591a\u4e2a\u7fa4\u5171\u4eab\u540c\u4e00\u670d\u52a1\u5668\u5217\u8868\n- **\u4e2a\u4eba\u5217\u8868**\uff1a\u7528\u6237\u5728\u79c1\u804a\u4e2d\u62e5\u6709\u72ec\u7acb\u5217\u8868\uff08\u53ef\u81ea\u5df1\u7ba1\u7406\uff09\n- **\u52a8\u6001\u7b56\u7565**\uff1a\u7fa4\u4e34\u65f6\u4f1a\u8bdd\u53ef\u8ddf\u968f\u6765\u6e90\u7fa4\n\n## \u6743\u9650\u8bf4\u660e\n\n\u6743\u9650\u7ba1\u7406\u6839\u636e\u5de5\u4f5c\u6a21\u5f0f\u6709\u6240\u4e0d\u540c\uff1a\n\n```mermaid\ngraph TD\n A[\u7528\u6237\u7c7b\u578b] -->|\u7ba1\u7406\u6240\u6709\u4f5c\u7528\u57df| B[\u8d85\u7ea7\u7ba1\u7406\u5458]\n A -->|\u7ba1\u7406\u7279\u5b9a\u4f5c\u7528\u57df| C[QQ\u7fa4\u7ba1\u7406\u5458/\u7fa4\u4e3b]\n A --> D[\u666e\u901a\u7528\u6237]\n \n B --> B1[NoneBot \u8d85\u7ea7\u7ba1\u7406\u5458<br/>SUPERUSERS]\n B --> B2[\u63d2\u4ef6\u8d85\u7ea7\u7ba1\u7406\u5458<br/>MC_MOTD_SUPERUSERS]\n B --> B3[\u8de8\u4f5c\u7528\u57df\u64cd\u4f5c\u6743\u9650]\n\n C --> C2{MC_MOTD_GROUP_ADMIN_PERMISSION}\n C2 -->|true| C3[\u7ba1\u7406\u672c\u7fa4\u670d\u52a1\u5668\u5217\u8868]\n C2 -->|false| C4[\u65e0\u7ba1\u7406\u6743\u9650]\n \n D --> D1{\u6a21\u5f0f\u5224\u65ad}\n D1 -->|\u4f20\u7edf\u6a21\u5f0f| D2[\u65e0\u7ba1\u7406\u6743\u9650]\n D1 -->|\u591a\u7fa4\u804a\u6a21\u5f0f<br/>personal\u7b56\u7565| D3[\u7ba1\u7406\u4e2a\u4eba\u5217\u8868]\n```\n\n### \u4f20\u7edf\u6a21\u5f0f\u6743\u9650\n\n\u7ba1\u7406\u5458\u6743\u9650\u5305\u62ec\uff1a\n\n- NoneBot \u8d85\u7ea7\u7ba1\u7406\u5458 (SUPERUSERS)\n- \u63d2\u4ef6\u8d85\u7ea7\u7ba1\u7406\u5458 (MC_MOTD_SUPERUSERS)\n- \u7fa4\u7ba1\u7406\u5458\u6216\u7fa4\u4e3b\uff08\u9700\u5f00\u542f\u7fa4\u7ba1\u7406\u5458\u6743\u9650\uff09\n\n### \u591a\u7fa4\u804a\u9694\u79bb\u6a21\u5f0f\u6743\u9650\n\n\u6743\u9650\u89c4\u5219\uff1a\n\n- **\u8d85\u7ea7\u7ba1\u7406\u5458**\uff1a\u7ba1\u7406\u6240\u6709\u4f5c\u7528\u57df\u7684\u670d\u52a1\u5668\uff0c\u53ef\u4f7f\u7528\u8de8\u4f5c\u7528\u57df\u547d\u4ee4\n- **\u7fa4\u7ba1\u7406\u5458**\uff1a\u53ea\u80fd\u7ba1\u7406\u6240\u5728\u7fa4\u7684\u670d\u52a1\u5668\u5217\u8868\n- **\u666e\u901a\u7528\u6237**\uff1a\u5728 personal \u6a21\u5f0f\u4e0b\u53ef\u7ba1\u7406\u81ea\u5df1\u7684\u4e2a\u4eba\u5217\u8868\n\n## \u914d\u7f6e\u9879\u8bf4\u660e\n\n### \u57fa\u7840\u914d\u7f6e\n\n| \u914d\u7f6e\u9879 | \u7c7b\u578b | \u9ed8\u8ba4\u503c | \u4f5c\u7528 |\n| -------------------------------- | --------- | ------------------------------------------------------------ | ------------------------------------------------------------ |\n| `MC_MOTD_SUPERUSERS` | List[str] | `[]` | \u63d2\u4ef6\u8d85\u7ea7\u7ba1\u7406\u5458QQ\u53f7\u5217\u8868 |\n| `MC_MOTD_TIMEOUT` | float | `5.0` | \u670d\u52a1\u5668\u67e5\u8be2\u8d85\u65f6\u65f6\u95f4\uff08\u79d2\uff09 |\n| `MC_MOTD_FILTER_BOTS` | bool | `true` | \u662f\u5426\u542f\u7528\u5047\u4eba\u8fc7\u6ee4 |\n| `MC_MOTD_BOT_NAMES` | List[str] | `[\"Anonymous Player\"]` | \u5047\u4eba\u540d\u79f0\u5217\u8868\uff08\u7cbe\u786e\u5339\u914d\uff09 |\n| `MC_MOTD_BOT_PATTERNS` | List[str] | `[\"^player_\\\\d+$\", \"^bot_\\\\d+$\", \"^fake_\\\\d+$\", \"^\\\\[Bot\\\\]\", \"^\\\\[Fake\\\\]\"]` | \u5047\u4eba\u6b63\u5219\u8868\u8fbe\u5f0f\u5217\u8868\uff08\u8bbe\u4e3a `[]` \u5219\u4e0d\u4f7f\u7528\u6b63\u5219\u5339\u914d\uff09 |\n| `MC_MOTD_ALLOW_PRIVATE` | bool | `true` | \u5141\u8bb8\u79c1\u804a\u4f7f\u7528\u63d2\u4ef6\uff08\u4ec5\u4f20\u7edf\u6a21\u5f0f\u6709\u6548\uff09 |\n| `MC_MOTD_ALLOWED_GROUPS` | List[str] | `[]` | \u5141\u8bb8\u4f7f\u7528\u63d2\u4ef6\u7684\u7fa4\u804a\u5217\u8868\uff08\u7a7a\u5217\u8868\u8868\u793a\u6240\u6709\u7fa4\u804a\u90fd\u5141\u8bb8\uff0c\u4ec5\u4f20\u7edf\u6a21\u5f0f\u6709\u6548\uff09 |\n| `MC_MOTD_GROUP_ADMIN_PERMISSION` | bool | `true` | \u662f\u5426\u5141\u8bb8\u7fa4\u7ba1\u7406\u5458\u6267\u884c\u7ba1\u7406\u64cd\u4f5c |\n\n### \u591a\u7fa4\u804a\u9694\u79bb\u914d\u7f6e\n\n| \u914d\u7f6e\u9879 | \u7c7b\u578b | \u9ed8\u8ba4\u503c | \u4f5c\u7528 |\n| ------------------------------------- | --------------- | ---------------- | ------------------------------------------------------------ |\n| `MC_MOTD_MULTI_GROUP_MODE` | bool | `false` | \u662f\u5426\u542f\u7528\u591a\u7fa4\u804a\u9694\u79bb\u6a21\u5f0f |\n| `MC_MOTD_GROUP_CLUSTERS` | Dict[str, List] | `{}` | \u7fa4\u804a\u5206\u7ec4\u914d\u7f6e\uff0c\u540c\u7ec4\u7fa4\u5171\u4eab\u670d\u52a1\u5668\u5217\u8868<br />\u683c\u5f0f\uff1a`{\"\u7ec4\u540d\": [\"\u7fa4\u53f71\", \"\u7fa4\u53f72\"]}`<br />\u7559\u7a7a\u5219\u6bcf\u4e2a\u7fa4\u90fd\u662f\u72ec\u7acb\u7684\u4f5c\u7528\u57df\uff0c\u5404\u7fa4\u7684\u670d\u52a1\u5668\u5217\u8868\u4e92\u4e0d\u5f71\u54cd<br />**\u6ce8\u610f**\uff1a\u7ec4\u540d\u4e0d\u80fd\u4f7f\u7528\u4fdd\u7559\u5b57 `all` |\n| `MC_MOTD_PRIVATE_FRIEND_STRATEGY` | str | `\"personal\"` | \u597d\u53cb\u79c1\u804a\u7b56\u7565\uff1a`disabled`/`global`/`personal` |\n| `MC_MOTD_PRIVATE_GROUP_TEMP_STRATEGY` | str | `\"follow_group\"` | \u7fa4\u4e34\u65f6\u4f1a\u8bdd\u7b56\u7565\uff1a`disabled`/`global`/`personal`/`follow_group` |\n| `MC_MOTD_TRACK_USER_ACTIVITY` | bool | `true` | \u662f\u5426\u8ffd\u8e2a\u7528\u6237\u6d3b\u8dc3\u7fa4\uff08\u7528\u4e8e follow_group \u7b56\u7565\uff09 |\n| `MC_MOTD_FOLLOW_GROUP_FALLBACK` | str | `\"personal\"` | follow_group \u65e0\u6cd5\u786e\u5b9a\u6765\u6e90\u7fa4\u65f6\u7684\u964d\u7ea7\u7b56\u7565\uff1a`personal`/`global` |\n| `MC_MOTD_PERSONAL_SERVER_LIMIT` | int | `10` | personal \u6a21\u5f0f\u4e0b\u7528\u6237\u53ef\u6dfb\u52a0\u7684\u670d\u52a1\u5668\u6570\u91cf\u4e0a\u9650\uff080 \u8868\u793a\u4e0d\u9650\u5236\uff09 |\n\n#### \u79c1\u804a\u7b56\u7565\u51b3\u7b56\u6d41\u7a0b\n\n```mermaid\nflowchart TD\n A[\u7528\u6237\u79c1\u804a] --> B{\u6d88\u606f\u7c7b\u578b}\n B -->|\u597d\u53cb\u79c1\u804a| C{PRIVATE_FRIEND_STRATEGY}\n B -->|\u7fa4\u4e34\u65f6\u4f1a\u8bdd| D{PRIVATE_GROUP_TEMP_STRATEGY}\n \n C -->|disabled| E1[\u529f\u80fd\u7981\u7528]\n C -->|global| E2[\u4f7f\u7528\u5168\u5c40\u5217\u8868]\n C -->|personal| E3[\u4f7f\u7528\u4e2a\u4eba\u5217\u8868]\n \n D -->|disabled| F1[\u529f\u80fd\u7981\u7528]\n D -->|global| F2[\u4f7f\u7528\u5168\u5c40\u5217\u8868]\n D -->|personal| F3[\u4f7f\u7528\u4e2a\u4eba\u5217\u8868]\n D -->|follow_group| G{\u80fd\u5426\u786e\u5b9a\u6765\u6e90\u7fa4?}\n \n G -->|\u662f| H[\u4f7f\u7528\u6765\u6e90\u7fa4\u5217\u8868]\n G -->|\u5426| I{FOLLOW_GROUP_FALLBACK}\n I -->|personal| J[\u964d\u7ea7\u5230\u4e2a\u4eba\u5217\u8868]\n I -->|global| K[\u964d\u7ea7\u5230\u5168\u5c40\u5217\u8868]\n```\n\n### \u56fe\u7247\u6e32\u67d3\u914d\u7f6e\n\n| \u914d\u7f6e\u9879 | \u7c7b\u578b | \u9ed8\u8ba4\u503c | \u4f5c\u7528 |\n| ----------------------------- | -------------- | ------------------------ | ------------------------------------------------------------ |\n| `MC_MOTD_IMAGE_WIDTH` | int | `1000` | \u56fe\u7247\u5bbd\u5ea6\uff08\u50cf\u7d20\uff09 |\n| `MC_MOTD_ITEM_HEIGHT` | int | `160` | \u6bcf\u4e2a\u670d\u52a1\u5668\u9879\u76ee\u9ad8\u5ea6\uff08\u50cf\u7d20\uff09 |\n| `MC_MOTD_MARGIN` | int | `30` | \u56fe\u7247\u8fb9\u8ddd\uff08\u50cf\u7d20\uff09 |\n| `MC_MOTD_TITLE` | str | `\"Minecraft \u670d\u52a1\u5668\u72b6\u6001\"` | \u56fe\u7247\u9ed8\u8ba4\u6807\u9898 |\n| `MC_MOTD_SCOPE_TITLES` | Dict[str, str] | `{}` | \u81ea\u5b9a\u4e49\u4f5c\u7528\u57df\u6807\u9898<br />\u683c\u5f0f\uff1a`{\"scope\": \"\u6807\u9898\"}`<br />\u672a\u914d\u7f6e\u7684\u4f5c\u7528\u57df\u4f7f\u7528 MC_MOTD_TITLE |\n| `MC_MOTD_CUSTOM_FONT` | str | `\"\"` | \u81ea\u5b9a\u4e49\u5b57\u4f53\u8def\u5f84\uff08\u76f8\u5bf9/\u7edd\u5bf9\uff0c\u76f8\u5bf9\u8def\u5f84\u6839\u76ee\u5f55\u4e3a\u673a\u5668\u4eba\u6839\u76ee\u5f55\uff09 |\n| `MC_MOTD_ENABLE_COMPRESSION` | bool | `false` | \u662f\u5426\u542f\u7528\u56fe\u7247\u538b\u7f29(PNG \u8f6c WebP) |\n| `MC_MOTD_COMPRESSION_QUALITY` | int | `80` | \u56fe\u7247\u538b\u7f29\u8d28\u91cf\uff081-100 \u767e\u5206\u6bd4\uff09 |\n\n### \u914d\u7f6e\u793a\u4f8b\n\n#### \u4f20\u7edf\u6a21\u5f0f\uff08\u9ed8\u8ba4\uff09\n\n```env\n# \u6743\u9650\u7ba1\u7406\nMC_MOTD_SUPERUSERS=[\"123456789\", \"987654321\"]\n\n# \u6743\u9650\u63a7\u5236\nMC_MOTD_ALLOW_PRIVATE=true\nMC_MOTD_GROUP_ADMIN_PERMISSION=true\nMC_MOTD_ALLOWED_GROUPS=[\"114514\"]\n```\n\n#### \u591a\u7fa4\u804a\u9694\u79bb\u6a21\u5f0f - \u5b8c\u5168\u9694\u79bb\n\n```env\n# \u542f\u7528\u591a\u7fa4\u804a\u6a21\u5f0f\nMC_MOTD_MULTI_GROUP_MODE=true\n\n# \u7fa4A\u548c\u7fa4B\u5171\u4eab\u670d\u52a1\u5668\u5217\u8868\nMC_MOTD_GROUP_CLUSTERS='{\"cluster_a\": [\"123456789\", \"987654321\"]}'\n\n# \u597d\u53cb\u79c1\u804a\uff1a\u6bcf\u4eba\u72ec\u7acb\u5217\u8868\uff08\u53ef\u81ea\u5df1\u7ba1\u7406\uff0c\u6700\u591a10\u4e2a\uff09\nMC_MOTD_PRIVATE_FRIEND_STRATEGY=personal\nMC_MOTD_PERSONAL_SERVER_LIMIT=10\n\n# \u7fa4\u4e34\u65f6\u4f1a\u8bdd\uff1a\u8ddf\u968f\u6240\u5c5e\u7fa4\nMC_MOTD_PRIVATE_GROUP_TEMP_STRATEGY=follow_group\nMC_MOTD_TRACK_USER_ACTIVITY=true\nMC_MOTD_FOLLOW_GROUP_FALLBACK=personal\n\n# \u6743\u9650\u7ba1\u7406\nMC_MOTD_SUPERUSERS=[\"123456789\"]\nMC_MOTD_GROUP_ADMIN_PERMISSION=true\n\n# \u81ea\u5b9a\u4e49\u4f5c\u7528\u57df\u6807\u9898\nMC_MOTD_SCOPE_TITLES='{\"global\": \"\u516c\u5171\u670d\u52a1\u5668\", \"cluster_a\": \"\u670b\u53cb\u5708\u670d\u52a1\u5668\", \"group_114514\": \"\u6d4b\u8bd5\u7fa4\u670d\u52a1\u5668\"}'\n```\n\n#### \u591a\u7fa4\u804a\u9694\u79bb\u6a21\u5f0f - \u7b80\u5316\u914d\u7f6e\n\n```env\n# \u542f\u7528\u591a\u7fa4\u804a\u6a21\u5f0f\nMC_MOTD_MULTI_GROUP_MODE=true\n\n# \u597d\u53cb\u79c1\u804a\uff1a\u4f7f\u7528\u5168\u5c40\u5217\u8868\uff08\u9002\u5408\u516c\u5171\u670d\u52a1\u5668\uff09\nMC_MOTD_PRIVATE_FRIEND_STRATEGY=global\n\n# \u7fa4\u4e34\u65f6\u4f1a\u8bdd\uff1a\u8ddf\u968f\u6240\u5c5e\u7fa4\nMC_MOTD_PRIVATE_GROUP_TEMP_STRATEGY=follow_group\n```\n\n## \u4f7f\u7528\u65b9\u6cd5\n\n### \u7528\u6237\u547d\u4ee4\n\n| \u547d\u4ee4 | \u529f\u80fd |\n| ---------------- | ------------------------ |\n| `/motd` | \u67e5\u8be2\u6240\u6709\u670d\u52a1\u5668\u72b6\u6001 |\n| `/motd --detail` | \u663e\u793a\u8be6\u7ec6\u4fe1\u606f\u5305\u62ec\u73a9\u5bb6\u5217\u8868 |\n| `/motd help` | \u663e\u793a\u5e2e\u52a9 |\n\n### \u7ba1\u7406\u5458\u547d\u4ee4\n\n\u7ba1\u7406\u5458\u547d\u4ee4\u53ea\u4f1a\u5e94\u7528\u5728\u5f53\u524d\u4f5c\u7528\u57df\uff0c\u65e0\u6cd5\u8de8\u4f5c\u7528\u57df\n\n| \u547d\u4ee4 | \u529f\u80fd | \u6743\u9650\u8981\u6c42 |\n| ------------------------------------- | ---------------------- | -------- |\n| `/motd add ip:port \u6807\u7b7e` | \u6dfb\u52a0\u670d\u52a1\u5668 | \u7ba1\u7406\u5458 |\n| `/motd del ip:port` | \u5220\u9664\u6307\u5b9a\u670d\u52a1\u5668 | \u7ba1\u7406\u5458 |\n| `/motd del -rf` | \u5220\u9664\u6240\u6709\u670d\u52a1\u5668 | \u7ba1\u7406\u5458 |\n| `/motd render allocate ip:port \u4f4d\u7f6e` | \u8c03\u6574\u670d\u52a1\u5668\u663e\u793a\u987a\u5e8f | \u7ba1\u7406\u5458 |\n| `/motd render swap ip1:port ip2:port` | \u4ea4\u6362\u4e24\u4e2a\u670d\u52a1\u5668\u663e\u793a\u987a\u5e8f | \u7ba1\u7406\u5458 |\n\n### \u8d85\u7ea7\u7ba1\u7406\u5458\u4e13\u7528\u547d\u4ee4\n\n```mermaid\ngraph TD\n A[\u8de8\u4f5c\u7528\u57df\u547d\u4ee4] --> B[\u67e5\u8be2\u547d\u4ee4]\n A --> C[\u7ba1\u7406\u547d\u4ee4]\n \n B --> B1[/motd scope list<br>\u67e5\u770b\u6240\u6709\u4f5c\u7528\u57df/]\n B --> B2[/motd --scope=xxx<br>\u67e5\u8be2\u6307\u5b9a\u4f5c\u7528\u57df/]\n B --> B3[/motd --scope=all<br>\u67e5\u8be2\u6240\u6709\u4f5c\u7528\u57df\u5408\u5e76/]\n \n C --> C1[/motd add --scope=xxx ip:port \u6807\u7b7e<br>\u5411\u6307\u5b9a\u4f5c\u7528\u57df\u6dfb\u52a0/]\n C --> C2[/motd del --scope=xxx ip:port<br>\u4ece\u6307\u5b9a\u4f5c\u7528\u57df\u5220\u9664/]\n C --> C3[/motd add --scope=all ip:port \u6807\u7b7e<br>\u5411\u6240\u6709\u4f5c\u7528\u57df\u6279\u91cf\u6dfb\u52a0/]\n C --> C4[/motd del --scope=all -rf<br>\u5220\u9664\u6240\u6709\u4f5c\u7528\u57df\u7684\u6240\u6709\u670d\u52a1\u5668/]\n```\n\n#### \u8de8\u4f5c\u7528\u57df\u547d\u4ee4\u8bf4\u660e\n\n\u7279\u6b8a\u7684`scope`\u6709`global`\u548c`all`\uff0c\u5728\u4f20\u7edf\u6a21\u5f0f\u4e0b\u7684\u6570\u636e\u9ed8\u8ba4\u50a8\u5b58\u5728`global`\u4f5c\u7528\u57df\n\n| \u547d\u4ee4 | \u529f\u80fd | \u8bf4\u660e |\n| ------------------------------------------- | ---------------------------------- | -------------------------------- |\n| `/motd scope list` | \u5217\u51fa\u6240\u6709\u5b58\u5728\u670d\u52a1\u5668\u7684\u4f5c\u7528\u57df | \u663e\u793a\u4f5c\u7528\u57df\u540d\u79f0\u548c\u53cb\u597d\u540d\u79f0 |\n| `/motd --scope=xxx` | \u67e5\u8be2\u6307\u5b9a\u4f5c\u7528\u57df\u7684\u670d\u52a1\u5668 | \u4f7f\u7528\u4f5c\u7528\u57df\u81ea\u5b9a\u4e49\u6807\u9898\uff08\u5982\u5df2\u914d\u7f6e\uff09 |\n| `/motd --scope=all` | \u67e5\u8be2\u6240\u6709\u4f5c\u7528\u57df\u7684\u670d\u52a1\u5668\uff08\u5408\u5e76\u663e\u793a\uff09 | \u4f7f\u7528\u9ed8\u8ba4\u6807\u9898 MC_MOTD_TITLE |\n| `/motd --scope=xxx add ip:port \u6807\u7b7e` | \u5411\u6307\u5b9a\u4f5c\u7528\u57df\u6dfb\u52a0\u670d\u52a1\u5668 | \u652f\u6301\u4efb\u610f\u4f5c\u7528\u57df\u540d\u79f0 |\n| `/motd --scope=all add ip:port \u6807\u7b7e` | \u5411\u6240\u6709\u73b0\u6709\u4f5c\u7528\u57df\u6279\u91cf\u6dfb\u52a0\u670d\u52a1\u5668 | \u5bf9\u6bcf\u4e2a\u4f5c\u7528\u57df\u6267\u884c\u6dfb\u52a0\u64cd\u4f5c |\n| `/motd --scope=xxx del ip:port` | \u4ece\u6307\u5b9a\u4f5c\u7528\u57df\u5220\u9664\u670d\u52a1\u5668 | \u4ec5\u5f71\u54cd\u6307\u5b9a\u4f5c\u7528\u57df |\n| `/motd --scope=all del ip:port` | \u4ece\u6240\u6709\u4f5c\u7528\u57df\u5220\u9664\u6307\u5b9a\u670d\u52a1\u5668 | \u6279\u91cf\u5220\u9664\u64cd\u4f5c |\n| `/motd --scope=xxx del -rf` | \u6e05\u7a7a\u6307\u5b9a\u4f5c\u7528\u57df\u7684\u6240\u6709\u670d\u52a1\u5668 | \u5371\u9669\u64cd\u4f5c\uff0c\u9700\u8981 -rf \u53c2\u6570\u786e\u8ba4 |\n| `/motd --scope=all del -rf` | \u6e05\u7a7a\u6240\u6709\u4f5c\u7528\u57df\u7684\u6240\u6709\u670d\u52a1\u5668 | \u6781\u5ea6\u5371\u9669\u64cd\u4f5c\uff0c\u9700\u8981 -rf \u53c2\u6570\u786e\u8ba4 |\n| `/motd --scope=xxx render allocate ip \u4f4d\u7f6e` | \u8c03\u6574\u6307\u5b9a\u4f5c\u7528\u57df\u5185\u7684\u670d\u52a1\u5668\u987a\u5e8f | \u8de8\u4f5c\u7528\u57df\u8c03\u6574\u987a\u5e8f |\n| `/motd --scope=xxx render swap ip1 ip2` | \u4ea4\u6362\u6307\u5b9a\u4f5c\u7528\u57df\u5185\u4e24\u4e2a\u670d\u52a1\u5668\u7684\u987a\u5e8f | \u8de8\u4f5c\u7528\u57df\u4ea4\u6362\u987a\u5e8f |\n\n#### scope \u53c2\u6570\u4f4d\u7f6e\n\n`--scope` \u53c2\u6570\u652f\u6301\u7075\u6d3b\u653e\u7f6e\uff1a\n\n```bash\n# \u4ee5\u4e0b\u683c\u5f0f\u90fd\u652f\u6301\n/motd --scope=group_123456 add mc.hypixel.net Hypixel\n/motd add --scope=group_123456 mc.hypixel.net Hypixel\n\n/motd --scope=all\n/motd --scope=global del -rf\n```\n\n### \u4f7f\u7528\u793a\u4f8b\n\n#### \u4f20\u7edf\u6a21\u5f0f\u793a\u4f8b\n\n```bash\n# \u4efb\u4f55\u7fa4\u804a\n/motd add hypixel.net Hypixel\u670d\u52a1\u5668\n/motd add play.example.com:25566 \u6211\u7684\u670d\u52a1\u5668\n/motd\n/motd --detail\n```\n\n#### \u591a\u7fa4\u804a\u9694\u79bb\u6a21\u5f0f\u793a\u4f8b\n\n**\u5728\u7fa4A\u4e2d\uff1a**\n\n```bash\n/motd add mc.hypixel.net Hypixel\n# \u6dfb\u52a0\u5230\u7fa4A\u7684\u670d\u52a1\u5668\u5217\u8868\n\n/motd\n# \u67e5\u8be2\u7fa4A\u7684\u670d\u52a1\u5668\n```\n\n**\u5728\u7fa4B\u4e2d\uff08\u4e0e\u7fa4A\u5171\u4eab\uff09\uff1a**\n\n```bash\n/motd\n# \u770b\u5230\u4e0e\u7fa4A\u76f8\u540c\u7684\u670d\u52a1\u5668\u5217\u8868\uff08\u56e0\u4e3a\u5728\u540c\u4e00 cluster\uff09\n```\n\n**\u5728\u7fa4C\u4e2d\uff08\u72ec\u7acb\uff09\uff1a**\n\n```bash\n/motd\n# \u8fd8\u6ca1\u6709\u6dfb\u52a0\u4efb\u4f55\u670d\u52a1\u5668\uff08\u72ec\u7acb\u5217\u8868\uff09\n\n/motd add localhost:25565 \u6d4b\u8bd5\u670d\n# \u6dfb\u52a0\u5230\u7fa4C\u7684\u72ec\u7acb\u5217\u8868\n```\n\n**\u597d\u53cb\u79c1\u804a\uff08personal \u6a21\u5f0f\uff09\uff1a**\n\n```bash\n/motd add play.myserver.com:25566 \u6211\u7684\u79c1\u4eba\u670d\u52a1\u5668\n# \u6dfb\u52a0\u5230\u4f60\u7684\u4e2a\u4eba\u5217\u8868\uff08\u4e0d\u5f71\u54cd\u4efb\u4f55\u7fa4\uff09\n\n/motd\n# \u67e5\u8be2\u4f60\u7684\u4e2a\u4eba\u670d\u52a1\u5668\u5217\u8868\n```\n\n**\u7fa4\u4e34\u65f6\u4f1a\u8bdd\uff08follow_group \u7b56\u7565\uff09\uff1a**\n\n```bash\n# \u901a\u8fc7\u7fa4A\u53d1\u8d77\u4e34\u65f6\u4f1a\u8bdd\n/motd\n# \u663e\u793a\u7fa4A\u7684\u670d\u52a1\u5668\u5217\u8868\n\n# \u901a\u8fc7\u7fa4B\u53d1\u8d77\u4e34\u65f6\u4f1a\u8bdd\n/motd\n# \u663e\u793a\u7fa4B\u7684\u670d\u52a1\u5668\u5217\u8868\n```\n\n**\u8d85\u7ea7\u7ba1\u7406\u5458\u8de8\u4f5c\u7528\u57df\u64cd\u4f5c\uff1a**\n\n```bash\n# \u67e5\u770b\u6240\u6709\u4f5c\u7528\u57df\n/motd scope list\n# \u8f93\u51fa\u793a\u4f8b\uff1a\n# - global (\u5168\u5c40)\n# - group_123456 (\u7fa4 123456)\n# - cluster_friends (\u7fa4\u7ec4 friends)\n# - private_friend_789 (\u597d\u53cb 789 \u7684\u4e2a\u4eba\u5217\u8868)\n\n# \u67e5\u770b\u6307\u5b9a\u4f5c\u7528\u57df\n/motd --scope=group_123456\n/motd --scope=cluster_friends --detail\n\n# \u67e5\u770b\u6240\u6709\u4f5c\u7528\u57df\u7684\u670d\u52a1\u5668\uff08\u5408\u5e76\u663e\u793a\uff09\n/motd --scope=all\n\n# \u5411\u6307\u5b9a\u4f5c\u7528\u57df\u6dfb\u52a0\u670d\u52a1\u5668\n/motd --scope=group_123456 add mc.hypixel.net Hypixel\n\n# \u5411\u6240\u6709\u4f5c\u7528\u57df\u6279\u91cf\u6dfb\u52a0\n/motd --scope=all add play.example.com:25565 \u516c\u5171\u670d\u52a1\u5668\n\n# \u4ece\u6307\u5b9a\u4f5c\u7528\u57df\u5220\u9664\n/motd --scope=group_123456 del mc.hypixel.net\n\n# \u6e05\u7a7a\u6307\u5b9a\u4f5c\u7528\u57df\n/motd --scope=group_123456 del -rf\n\n# \u6e05\u7a7a\u6240\u6709\u4f5c\u7528\u57df\uff08\u5371\u9669\uff09\n/motd --scope=all del -rf\n```\n\n## \u591a\u7fa4\u804a\u6a21\u5f0f\u8bf4\u660e\n\n### \u4f5c\u7528\u57df\uff08Scope\uff09\u67b6\u6784\n\n```mermaid\ngraph TD\n A[\u4f5c\u7528\u57df\u7c7b\u578b] --> B[\u5168\u5c40 global]\n A --> C[\u5355\u7fa4 group_xxx]\n A --> D[\u7fa4\u7ec4\u5171\u4eab cluster_xxx]\n A --> E[\u597d\u53cb\u79c1\u804a private_friend_xxx]\n A --> F[\u7fa4\u4e34\u65f6\u4f1a\u8bdd private_temp_xxx]\n A --> G[\u7279\u6b8a\u4f5c\u7528\u57df all]\n \n B --> B1[\u4f20\u7edf\u6a21\u5f0f/\u5168\u5c40\u5217\u8868<br/>\u793a\u4f8b: global]\n C --> C1[\u5355\u4e2a\u7fa4\u72ec\u7acb\u5217\u8868<br/>\u793a\u4f8b: group_123456]\n D --> D2[\u591a\u4e2a\u7fa4\u5171\u4eab\u5217\u8868<br/>\u793a\u4f8b: cluster_friends]\n E --> E1[\u597d\u53cb\u79c1\u804a\u4e2a\u4eba\u5217\u8868<br/>\u793a\u4f8b: private_friend_789]\n F --> F1[\u4e34\u65f6\u4f1a\u8bdd\u4e2a\u4eba\u5217\u8868<br/>\u793a\u4f8b: private_temp_789]\n G --> G1[\u8d85\u7ea7\u7ba1\u7406\u5458\u4e13\u7528<br/>\u64cd\u4f5c\u6240\u6709\u73b0\u6709\u4f5c\u7528\u57df]\n```\n\n### \u6743\u9650\u7ba1\u7406\u67b6\u6784\n\n```mermaid\ngraph TD\n A[\u6743\u9650\u7b49\u7ea7] --> B[\u8d85\u7ea7\u7ba1\u7406\u5458]\n A --> C[\u7fa4\u7ba1\u7406\u5458] \n A --> D[\u666e\u901a\u7528\u6237]\n \n B --> B1[\u7ba1\u7406\u8303\u56f4: \u6240\u6709\u4f5c\u7528\u57df]\n B --> B2[SUPERUSERS + MC_MOTD_SUPERUSERS]\n B --> B3[\u53ef\u4f7f\u7528 --scope \u53c2\u6570]\n B --> B4[\u53ef\u4f7f\u7528 scope list \u547d\u4ee4]\n \n C --> C1[\u7ba1\u7406\u8303\u56f4: \u672c\u7fa4\u4f5c\u7528\u57df]\n C --> C2[group_xxx \u6216\u6240\u5c5e cluster_xxx]\n C --> C3[\u9700\u5f00\u542f MC_MOTD_GROUP_ADMIN_PERMISSION]\n C --> C4[\u4e0d\u80fd\u4f7f\u7528\u8de8\u4f5c\u7528\u57df\u547d\u4ee4]\n \n D --> D1[\u7ba1\u7406\u8303\u56f4: \u4e2a\u4eba\u4f5c\u7528\u57df]\n D --> D2[private_friend_xxx<br/>private_temp_xxx]\n D --> D3[\u4ec5\u5728 personal \u6a21\u5f0f\u4e0b]\n```\n\n### \u5047\u4eba\u8fc7\u6ee4\u673a\u5236\n\n\u5047\u4eba\u8fc7\u6ee4\u529f\u80fd\u901a\u8fc7\u4e24\u79cd\u65b9\u5f0f\u8bc6\u522b\uff1a\n\n```mermaid\nflowchart TD\n A[\u73a9\u5bb6\u540d\u79f0] --> B{MC_MOTD_FILTER_BOTS}\n B -->|false| C[\u4e0d\u8fc7\u6ee4\uff0c\u663e\u793a\u6240\u6709\u73a9\u5bb6]\n B -->|true| D[\u542f\u7528\u5047\u4eba\u8fc7\u6ee4]\n \n D --> E[\u7cbe\u786e\u540d\u79f0\u5339\u914d]\n D --> F[\u6b63\u5219\u8868\u8fbe\u5f0f\u5339\u914d]\n \n E --> E1[MC_MOTD_BOT_NAMES<br/>\u9ed8\u8ba4: Anonymous Player]\n F --> F1[MC_MOTD_BOT_PATTERNS<br/>\u5339\u914d player_123, bot_456 \u7b49]\n \n E1 --> G{\u5339\u914d\u7ed3\u679c}\n F1 --> G\n G -->|\u5339\u914d| H[\u6807\u8bb0\u4e3a\u5047\u4eba\uff0c\u4e0d\u663e\u793a]\n G -->|\u4e0d\u5339\u914d| I[\u663e\u793a\u771f\u5b9e\u73a9\u5bb6]\n```\n\n\u9ed8\u8ba4\u6b63\u5219\u89c4\u5219\u4f1a\u5339\u914d\uff1a\n\n- `player_123`\u3001`player_456` \u7b49\n- `bot_789`\u3001`bot_001` \u7b49\n- `fake_111`\u3001`fake_222` \u7b49\n- `[Bot]xxx`\u3001`[Fake]xxx` \u7b49\u5e26\u6807\u7b7e\u7684\u5047\u4eba\n\n\u5982\u9700\u5173\u95ed\u6b63\u5219\u5339\u914d\u4f46\u4fdd\u7559\u540d\u79f0\u5339\u914d\uff0c\u53ef\u8bbe\u7f6e\uff1a\n\n```env\nMC_MOTD_BOT_PATTERNS=[]\n```\n\n## \u5e38\u89c1\u95ee\u9898\n\n**Q: \u5982\u4f55\u4ece\u4f20\u7edf\u6a21\u5f0f\u5207\u6362\u5230\u591a\u7fa4\u804a\u6a21\u5f0f\uff1f**\n\nA: \u8bbe\u7f6e `MC_MOTD_MULTI_GROUP_MODE=true` \u5373\u53ef\u3002\u65e7\u6570\u636e\u4f1a\u81ea\u52a8\u5f52\u5165 `global` \u4f5c\u7528\u57df\uff0c\u4e0d\u4f1a\u4e22\u5931\u3002\n\n**Q: \u7fa4\u4e34\u65f6\u4f1a\u8bdd\u663e\u793a\"\u65e0\u6cd5\u786e\u5b9a\u6765\u6e90\u7fa4\"\uff1f**\n\nA: \u7528\u6237\u9700\u8981\u5148\u5728\u7fa4\u5185\u53d1\u8a00\uff0c\u63d2\u4ef6\u624d\u80fd\u8ffd\u8e2a\u5176\u6d3b\u8dc3\u7fa4\u3002\u6216\u5c06 `MC_MOTD_FOLLOW_GROUP_FALLBACK` \u8bbe\u4e3a `global` \u4f7f\u7528\u5168\u5c40\u5217\u8868\u3002\n\n**Q: personal \u6a21\u5f0f\u4e0b\u5982\u4f55\u9650\u5236\u7528\u6237\u6dfb\u52a0\u670d\u52a1\u5668\u6570\u91cf\uff1f**\n\nA: \u8bbe\u7f6e `MC_MOTD_PERSONAL_SERVER_LIMIT`\uff0c\u4f8b\u5982 `10` \u8868\u793a\u6700\u591a 10 \u4e2a\u670d\u52a1\u5668\uff0c`0` \u8868\u793a\u4e0d\u9650\u5236\u3002\n\n**Q: \u5982\u4f55\u8ba9\u591a\u4e2a\u7fa4\u5171\u4eab\u540c\u4e00\u4e2a\u670d\u52a1\u5668\u5217\u8868\uff1f**\n\nA: \u4f7f\u7528 `MC_MOTD_GROUP_CLUSTERS` \u914d\u7f6e\uff0c\u4f8b\u5982\uff1a\n\n```env\nMC_MOTD_GROUP_CLUSTERS='{\"cluster_a\": [\"123456\", \"789012\"]}'\n```\n\n\u4f46\u662f\u8bf7\u6ce8\u610f\uff0c\u8bbe\u7f6e CLUSTERS \u540e\uff0c\u539f\u6765\u7fa4 `\"123456\"` \u548c `\"789012\"` \u8bbe\u7f6e\u7684\u670d\u52a1\u5668\u4ecd\u7136\u50a8\u5b58\u5728\u5404\u81ea `group_xxx` \u4f5c\u7528\u57df\u5185\uff0c\u800c\u6b64\u65f6\u7fa4 `\"123456\"` \u548c `\"789012\"` \u4f5c\u7528\u57df\u53d8\u4e3a `cluster_a`\uff0c\u6b64\u65f6\u76f8\u5f53\u4e8e\u521b\u5efa\u4e86\u4e00\u5f20\u5168\u65b0\u7684\u6570\u636e\u8868\u3002\u56e0\u6b64\u67e5\u8be2\u4f1a\u4e3a\u7a7a\u767d\uff0c\u9700\u8981\u91cd\u65b0\u6dfb\u52a0\u670d\u52a1\u5668\u3002\n\n**Q: \u5982\u4f55\u4e3a\u4e0d\u540c\u4f5c\u7528\u57df\u8bbe\u7f6e\u4e0d\u540c\u7684\u6807\u9898\uff1f**\n\nA: \u4f7f\u7528 `MC_MOTD_SCOPE_TITLES` \u914d\u7f6e\uff1a\n\n```env\nMC_MOTD_SCOPE_TITLES='{\"global\": \"\u516c\u5171\u670d\u52a1\u5668\", \"cluster_main\": \"\u4e3b\u670d\u52a1\u5668\u96c6\u7fa4\", \"group_123456\": \"\u6d4b\u8bd5\u7fa4\"}'\n```\n\n\u672a\u914d\u7f6e\u7684\u4f5c\u7528\u57df\u4f1a\u4f7f\u7528 `MC_MOTD_TITLE` \u4f5c\u4e3a\u9ed8\u8ba4\u6807\u9898\u3002\n\n**Q: --scope=all \u662f\u4ec0\u4e48\uff1f**\n\nA: `all` \u662f\u8d85\u7ea7\u7ba1\u7406\u5458\u4e13\u7528\u7684\u7279\u6b8a\u4f5c\u7528\u57df\u6807\u8bc6\u7b26\uff0c\u7528\u4e8e\u64cd\u4f5c\u6240\u6709\u73b0\u6709\u4f5c\u7528\u57df\uff1a\n\n- \u67e5\u8be2\u65f6\uff1a\u5408\u5e76\u663e\u793a\u6240\u6709\u4f5c\u7528\u57df\u7684\u670d\u52a1\u5668\n- \u6dfb\u52a0\u65f6\uff1a\u5411\u6240\u6709\u4f5c\u7528\u57df\u6279\u91cf\u6dfb\u52a0\u670d\u52a1\u5668\n- \u5220\u9664\u65f6\uff1a\u4ece\u6240\u6709\u4f5c\u7528\u57df\u6279\u91cf\u5220\u9664\u670d\u52a1\u5668\n\n**Q: \u4e3a\u4ec0\u4e48\u4e0d\u80fd\u521b\u5efa\u540d\u4e3a \"all\" \u7684\u7fa4\u7ec4\uff1f**\n\nA: `all` \u662f\u7cfb\u7edf\u4fdd\u7559\u5b57\uff0c\u7528\u4e8e\u8d85\u7ea7\u7ba1\u7406\u5458\u7684\u8de8\u4f5c\u7528\u57df\u64cd\u4f5c\u3002\u5c1d\u8bd5\u5728 `MC_MOTD_GROUP_CLUSTERS` \u4e2d\u4f7f\u7528 `all` \u4f5c\u4e3a\u7fa4\u7ec4\u540d\u4f1a\u5bfc\u81f4\u542f\u52a8\u5931\u8d25\u3002\n\n**Q: \u5982\u4f55\u8bbe\u7f6e\u547d\u4ee4\u524d\u7f00\u548c\u53c2\u6570\u5206\u9694\uff1f**\n\nA: \u8bfb\u53d6\u7684\u662f Nonebot \u5168\u5c40\u914d\u7f6e\uff0c\u63a8\u8350\u9879\u5982\u4e0b\uff1a\n\n```env\nCOMMAND_START=[\"/\"]\nCOMMAND_SEP=[\" \"]\n```\n\n## \u6ce8\u610f\u4e8b\u9879\n\n- \u5fc5\u987b\u914d\u7f6e\u7ba1\u7406\u5458\u6743\u9650\u540e\u624d\u53ef\u4f7f\u7528\u7ba1\u7406\u529f\u80fd\n- \u591a\u7fa4\u804a\u6a21\u5f0f\u4e0b\uff0c\u666e\u901a\u7528\u6237\u5728 personal \u6a21\u5f0f\u53ef\u7ba1\u7406\u81ea\u5df1\u7684\u5217\u8868\n- \u6570\u636e\u5e93\u6587\u4ef6\u4f1a\u81ea\u52a8\u521b\u5efa\u5728\u63d2\u4ef6\u6570\u636e\u76ee\u5f55\n- \u5047\u4eba\u8fc7\u6ee4/\u663e\u793a\u8be6\u7ec6\u4fe1\u606f\u4ec5\u5bf9\u652f\u6301\u73a9\u5bb6\u5217\u8868\u7684\u670d\u52a1\u5668\u6709\u6548\n- \u5efa\u8bae\u9002\u5f53\u8c03\u6574\u8d85\u65f6\u65f6\u95f4\u4ee5\u9002\u5e94\u7f51\u7edc\u73af\u5883\n- \u6dfb\u52a0\u670d\u52a1\u5668\u65f6\u81ea\u52a8\u6392\u5728\u5217\u8868\u672b\u5c3e\uff0c\u5220\u9664\u670d\u52a1\u5668\u540e\u987a\u5e8f\u81ea\u52a8\u8c03\u6574\n- \u7fa4\u4e34\u65f6\u4f1a\u8bdd\u4f7f\u7528 follow_group \u7b56\u7565\u9700\u8981\u7528\u6237\u5728\u7fa4\u5185\u6709\u53d1\u8a00\u8bb0\u5f55\n- `MC_MOTD_GROUP_CLUSTERS` \u914d\u7f6e\u4e2d\u4e0d\u80fd\u4f7f\u7528\u4fdd\u7559\u5b57 `all` \u4f5c\u4e3a\u7fa4\u7ec4\u540d\n- \u8de8\u4f5c\u7528\u57df\u547d\u4ee4\uff08`--scope` \u53c2\u6570\uff09\u4ec5\u8d85\u7ea7\u7ba1\u7406\u5458\u53ef\u7528\n- `--scope=all` \u64cd\u4f5c\u4f1a\u5f71\u54cd\u6240\u6709\u73b0\u6709\u4f5c\u7528\u57df\uff0c\u4f7f\u7528\u65f6\u9700\u8c28\u614e\n\n## \u56fe\u7247\u793a\u4f8b\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A NoneBot2 plugin for querying Minecraft server status and generating status images",
"version": "2.0.0",
"project_urls": {
"changelog": "https://github.com/AquaOH/nonebot-plugin-mcmotd/releases",
"documentation": "https://github.com/AquaOH/nonebot-plugin-mcmotd#readme",
"homepage": "https://github.com/AquaOH/nonebot-plugin-mcmotd",
"issues": "https://github.com/AquaOH/nonebot-plugin-mcmotd/issues",
"repository": "https://github.com/AquaOH/nonebot-plugin-mcmotd"
},
"split_keywords": [
"minecraft",
" motd",
" nonebot",
" nonebot2",
" qq-bot",
" server-status"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "7230bc20c0e55a5777f4c903fa9b9b9fa7758075ce0dff2e397d65e0f39e7cc2",
"md5": "a6b718f2faf86b268181714d4e980843",
"sha256": "60cc9b6ebc7658c20377858f4e13623a110b50798b7aa25c44138013d0d0f7d8"
},
"downloads": -1,
"filename": "nonebot_plugin_mcmotd-2.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a6b718f2faf86b268181714d4e980843",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 31329,
"upload_time": "2025-10-09T18:11:56",
"upload_time_iso_8601": "2025-10-09T18:11:56.842665Z",
"url": "https://files.pythonhosted.org/packages/72/30/bc20c0e55a5777f4c903fa9b9b9fa7758075ce0dff2e397d65e0f39e7cc2/nonebot_plugin_mcmotd-2.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6f92d6e016e8a5ca1e93b11a9cd0313c40b2a2d07113a65ba3a507b197cc7356",
"md5": "266c78f5e43d77b1704c501f63a4cba4",
"sha256": "bdd3d97fda56d2a84765dbb0cdbd78acefb13aae93f4e32234a928afcb6546bc"
},
"downloads": -1,
"filename": "nonebot_plugin_mcmotd-2.0.0.tar.gz",
"has_sig": false,
"md5_digest": "266c78f5e43d77b1704c501f63a4cba4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 27712,
"upload_time": "2025-10-09T18:12:00",
"upload_time_iso_8601": "2025-10-09T18:12:00.149194Z",
"url": "https://files.pythonhosted.org/packages/6f/92/d6e016e8a5ca1e93b11a9cd0313c40b2a2d07113a65ba3a507b197cc7356/nonebot_plugin_mcmotd-2.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-09 18:12:00",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "AquaOH",
"github_project": "nonebot-plugin-mcmotd",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "nonebot-plugin-mcmotd"
}