npm package: @hambur/koishi-plugin-auto-kick
Description: 自动踢出黑名单用户的群管理插件
Author: hambur
Latest version: 1.4.1

# Auto-kick - 智能群管理插件

![Koishi](https://img.shields.io/badge/Koishi-v4+-blue.svg)
![Node.js](https://img.shields.io/badge/Node.js-16+-green.svg)
![TypeScript](https://img.shields.io/badge/TypeScript-4.7+-blue.svg)
![License](https://img.shields.io/badge/License-MIT-yellow.svg)

一个智能的 Koishi 群管理插件，支持自动踢出黑名单用户，特别针对用户进群后改名违规的行为进行检测。

## ✨ 主要特性

### 🎯 双重黑名单机制
- **QQ号黑名单**：直接通过QQ号识别和踢出指定用户
- **昵称关键词黑名单**：通过昵称关键词防止用户冒充群主、管理员等

### ⏰ 智能延迟检查
- **进群后昵称检查**：新用户进群5分钟后自动检查昵称是否变更
- **防改名违规**：有效防止用户进群后修改昵称为违规内容
- **单次检查机制**：每个用户只检查一次，避免重复处理

### ⚡ 高性能设计
- **O(1)查找算法**：使用Set数据结构，确保大规模黑名单下的高效查找
- **批量处理**：支持批量扫描群成员，适用于大群管理
- **并发控制**：智能并发控制，避免API调用过于频繁
- **错误重试**：自动重试机制，提高操作成功率

### 🛡️ 可靠性保障
- **踢人结果验证**：踢人后自动验证用户是否真的被踢出
- **权限检测**：自动检测机器人权限，提醒权限不足
- **详细日志**：提供清晰的操作日志，便于问题排查

## 📦 安装方法

### 方法一：通过 npm 安装（推荐）
```bash
npm install koishi-plugin-auto-kick
```

### 方法二：通过 Koishi 控制台安装
1. 进入 Koishi 控制台
2. 在插件市场搜索 "auto-kick"
3. 点击安装并启用

### 方法三：手动安装
1. 下载插件源码到 `external/auto-kick` 目录
2. 在控制台中启用插件

## ⚙️ 配置说明

### 基础配置

| 配置项 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `blacklist` | `string[]` | `[]` | QQ号黑名单列表 |
| `nicknameBlacklist` | `string[]` | `[]` | 昵称关键词黑名单列表 |
| `enableJoinScan` | `boolean` | `true` | 机器人进群时扫描现有成员 |
| `enableMemberJoin` | `boolean` | `true` | 监听新成员加入事件 |
| `enableDelayedNicknameCheck` | `boolean` | `true` | 新成员加入后延迟检查昵称变更 |
| `delayedCheckTime` | `number` | `300000` | 延迟检查时间(毫秒) |
| `notifyAdmins` | `boolean` | `false` | 是否通知管理员 |
| `logLevel` | `string` | `'info'` | 日志级别 |

### 性能优化配置

| 配置项 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `scanDelay` | `number` | `5000` | 机器人进群后延迟扫描时间(ms) |
| `batchSize` | `number` | `50` | 批量处理成员数量 |
| `maxConcurrent` | `number` | `3` | 最大并发踢人数量 |
| `kickDelay` | `number` | `2000` | 踢人操作间隔(ms) |
| `retryAttempts` | `number` | `3` | 失败重试次数 |

### 高级功能配置

| 配置项 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `verifyKickResult` | `boolean` | `true` | 验证踢人结果 |
| `verifyDelay` | `number` | `2000` | 踢人后验证延迟(ms) |
| `verifyTimeout` | `number` | `10000` | 验证超时时间(ms) |
| `nicknameMatchMode` | `string` | `'contains'` | 昵称匹配模式 |
| `skipBotMembers` | `boolean` | `true` | 跳过机器人成员 |

## 🚀 使用方法

### 1. 基础防护配置

```yaml
plugins:
  auto-kick:
    # QQ号黑名单
    blacklist:
      - "123456789"
      - "987654321"

    # 昵称关键词黑名单
    nicknameBlacklist:
      - "群主"
      - "管理员"
      - "群管"

    # 启用延迟检查（防改名）
    enableDelayedNicknameCheck: true
    delayedCheckTime: 300000  # 5分钟

    # 启用踢人验证
    verifyKickResult: true
```

### 2. 群组过滤器设置

```yaml
plugins:
  auto-kick:
    # 插件配置...
    filter:
      guild:
        - "876886091"  # 要监控的群号
        - "123456789"  # 可以添加多个群
```

### 3. 昵称匹配模式

#### 包含匹配模式（推荐）
```yaml
nicknameMatchMode: "contains"
nicknameBlacklist:
  - "群主"      # 匹配包含"群主"的昵称
  - "管理员"    # 匹配包含"管理员"的昵称
```

#### 正则表达式模式
```yaml
nicknameMatchMode: "regex"
nicknameBlacklist:
  - "^群主.*$"    # 匹配以"群主"开头的昵称
  - ".*管理.*"    # 匹配包含"管理"的昵称
```

## 📋 配置示例

### 示例1：基础防冒充配置
```yaml
plugins:
  auto-kick:
    # 防止冒充群主和管理员
    nicknameBlacklist:
      - "群主"
      - "管理员"
      - "群管"

    # 启用延迟检查
    enableDelayedNicknameCheck: true
    delayedCheckTime: 300000  # 5分钟

    # 基础设置
    enableJoinScan: true
    enableMemberJoin: true
    verifyKickResult: true

    # 群组过滤
    filter:
      guild:
        - "876886091"
```

### 示例2：大群高性能配置
```yaml
plugins:
  auto-kick:
    # 黑名单配置
    blacklist:
      - "123456789"
    nicknameBlacklist:
      - "群主"
      - "管理员"

    # 延迟检查设置
    enableDelayedNicknameCheck: true
    delayedCheckTime: 600000  # 10分钟（给大群更多时间）

    # 性能优化（适用于大群）
    batchSize: 100
    maxConcurrent: 5
    kickDelay: 1000
    scanDelay: 3000

    # 启用验证
    verifyKickResult: true
    verifyDelay: 3000

    # 通知设置
    notifyAdmins: true
    adminNotifyMessage: "⚠️ 检测到黑名单用户 {user}，原因：{reason}"
```

### 示例3：正则表达式高级配置
```yaml
plugins:
  auto-kick:
    # 正则表达式匹配
    nicknameMatchMode: "regex"
    nicknameBlacklist:
      - "^群主.*$"        # 以"群主"开头
      - ".*管理.*"        # 包含"管理"
      - "^[0-9]+$"        # 纯数字昵称
      - "[ღ♥♡❤]"         # 特殊符号

    # 延迟检查
    enableDelayedNicknameCheck: true
    delayedCheckTime: 180000  # 3分钟

    # 验证设置
    verifyKickResult: true
    retryAttempts: 5
```

## 🔧 工作原理

### 核心检测流程

```
新用户进群
    ↓
立即检查当前昵称
    ├─ 违规 → 立即踢出
    └─ 正常 → 缓存昵称，设置延迟检查
              ↓
          等待5分钟
              ↓
          重新获取昵称
              ↓
          对比昵称变化
              ├─ 未变化 → 结束检查
              └─ 变化且违规 → 踢出用户
```

### 延迟检查机制详解

1. **缓存机制**：
   - 用户进群时缓存初始昵称
   - 设置定时器在指定时间后检查
   - 自动清理过期缓存

2. **昵称对比**：
   - 获取用户当前昵称
   - 与缓存的初始昵称对比
   - 检测到变化时进行黑名单匹配

3. **智能处理**：
   - 每个用户只检查一次
   - 用户离群自动清理缓存
   - 插件重启不影响已设置的检查

### 批量扫描机制

- **机器人进群时**：延迟扫描避免冲突
- **分批处理**：避免一次性处理大量用户
- **并发控制**：限制同时进行的踢人操作
- **性能统计**：记录扫描效率和结果

## 🛠️ 权限要求

### 机器人权限
- **群管理员权限** 或 **踢人权限**
- 建议将机器人设置为管理员以确保功能正常

### 权限检查
插件会在运行时自动检查权限状态：
- ✅ 权限充足：正常运行
- ⚠️ 权限不足：会在群聊中发送提醒

## 📊 日志说明

### 正常运行日志
```
🚀 Auto-kick 插件启动成功
📋 QQ号黑名单: 2 个
👤 昵称关键词: 3 个 [群主, 管理员, 群管]
⚙️ 匹配模式: contains, 验证踢人: ✅
⏰ 延迟昵称检查: ✅ 300秒

👤 新成员加入: 123456
👤 新成员: 张三 (123456)
⏰ 设置用户 123456 延迟昵称检查 (300秒)
```

### 延迟检查日志
```
🔄 检测到用户昵称变更: 123456 "张三" -> "群主"
🎯 变更后的昵称 "群主" 违规 (匹配: 群主)
🎯 发现黑名单用户: 群主 (123456) - 昵称黑名单 (匹配: 群主)
✅ 成功踢出: 群主 (123456) - 昵称黑名单 (匹配: 群主)
```

### 批量扫描日志
```
🔍 开始扫描群 876886091
📊 扫描完成: 检查 156 人, 发现黑名单 1 人, 成功踢出 1 人, 失败 0 人, 耗时 2345ms
```

## ❓ 常见问题

### Q: 为什么要等5分钟才检查昵称变更？
**A:** 原因分析：
- QQ不会主动推送用户昵称变更事件
- 需要通过定时检查来发现昵称变化
- 5分钟是平衡检测效果和性能的最佳时间
- 可以通过 `delayedCheckTime` 配置调整检查间隔

### Q: 延迟检查会影响性能吗？
**A:** 性能影响很小：
- 只对新加入的用户设置检查
- 每个用户只检查一次
- 自动清理过期缓存
- 可以根据群规模调整检查时间

### Q: 如果用户在检查前就离群了怎么办？
**A:** 插件有完善的处理机制：
- 检查时会先验证用户是否还在群里
- 用户离群会自动清理相关缓存
- 不会对已离群的用户进行无效操作

### Q: 可以检测群名片变更吗？
**A:** 当前版本专注于QQ昵称检测：
- 延迟检查针对的是用户QQ昵称变更
- 群名片变更需要依赖特定的事件支持
- 如需群名片检测，可以考虑后续版本添加

### Q: 如何防止误踢正常用户？
**A:** 建议措施：
- 仔细配置昵称关键词，避免过于宽泛
- 使用正则表达式进行精确匹配
- 启用管理员通知功能
- 定期检查和调整黑名单配置
- 测试关键词匹配效果

### Q: 延迟检查时间可以设置多长？
**A:** 时间配置建议：
- **最短建议**：180秒（3分钟）
- **默认设置**：300秒（5分钟）
- **大群建议**：600秒（10分钟）
- **最长建议**：不超过1800秒（30分钟）

## 🔧 技术细节

### 架构设计
```
┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   Koishi Core   │ → │   Auto-kick      │ → │  BlacklistMgr   │
│                 │    │   Plugin         │    │                 │
│ Event System    │    │                  │    │ O(1) Lookup     │
└─────────────────┘    └──────────────────┘    └─────────────────┘
         │                        │                        │
         ▼                        ▼                        ▼
┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│ guild-member    │    │ Nickname Cache   │    │ Delayed Check   │
│ -added Event    │    │ Management       │    │ Timer System    │
└─────────────────┘    └──────────────────┘    └─────────────────┘
```

### 核心算法
- **黑名单查找**：使用 `Set<string>` 实现 O(1) 时间复杂度
- **昵称匹配**：支持字符串包含和正则表达式两种模式
- **缓存管理**：使用 `Map` 结构管理用户昵称缓存
- **并发控制**：队列机制控制踢人操作并发数

### 性能优化
- **智能批处理**：避免一次性处理大量成员
- **延迟机制**：防止API调用过于频繁
- **内存管理**：自动清理过期缓存和无用数据
- **错误恢复**：完善的重试和异常处理机制

## 📈 版本历史

### v1.1.0 (最新)
- ✅ 新增延迟昵称检查功能
- ✅ 优化昵称获取机制
- ✅ 简化配置和代码结构
- ✅ 移除不必要的成员更新事件监听
- ✅ 提升性能和稳定性

### v1.0.0
- ✅ 基础的QQ号和昵称黑名单功能
- ✅ 高性能批量处理机制
- ✅ 踢人结果验证功能
- ✅ 完善的错误处理和重试

## 🤝 贡献指南

欢迎提交Issue和Pull Request来帮助改进插件！

### 开发环境设置
```bash
# 克隆仓库
git clone <repository-url>

# 安装依赖
npm install

# 构建插件
npm run build

# 运行测试
npm test
```

### 提交规范
- 遵循 [Conventional Commits](https://conventionalcommits.org/) 规范
- 提供详细的测试用例
- 更新相关文档

## 📄 许可证

本项目采用 [MIT License](LICENSE) 许可证。

## 📞 支持与反馈

如果您在使用过程中遇到问题或有建议，请：

1. 查看本文档的常见问题部分
2. 在 GitHub 上提交 Issue
3. 加入 Koishi 官方群组寻求帮助

---

**Auto-kick v2.0** - 智能防护，让群管理更轻松！ 🚀

### 🎯 核心亮点

- **🔍 智能检测**：新用户进群后自动延迟检查昵称变更
- **⚡ 高性能**：针对大群优化，支持批量处理和并发控制
- **🛡️ 可靠性**：踢人验证机制，确保操作真正生效
- **🎛️ 灵活配置**：丰富的配置选项，适应不同群组需求
- **📊 详细日志**：清晰的日志输出，便于监控和调试

让群管理变得更智能、更高效！