@hambur/koishi-plugin-auto-kick
Version:
自动踢出黑名单用户的群管理插件
165 lines (164 loc) • 9.34 kB
TypeScript
import { Context, Schema } from 'koishi';
export declare const name = "auto-kick";
export declare const usage = "\n## \u529F\u80FD\u8BF4\u660E\n\u9AD8\u6027\u80FD\u81EA\u52A8\u8E22\u51FA\u6307\u5B9A\u7684\u9ED1\u540D\u5355\u7528\u6237\uFF0C\u652F\u6301\u5927\u89C4\u6A21\u7FA4\u7EC4\u76D1\u63A7\uFF1A\n- \u652F\u6301 QQ \u53F7\u9ED1\u540D\u5355\u548C\u6635\u79F0\u5173\u952E\u8BCD\u9ED1\u540D\u5355\n- **\u667A\u80FD\u8DF3\u8FC7\u7FA4\u4E3B\u548C\u7BA1\u7406\u5458\uFF0C\u907F\u514D\u8BEF\u8E22\u9AD8\u6743\u9650\u7528\u6237**\n- **\u65B0\u589E\uFF1A\u81EA\u52A8\u540C\u610F\u52A0\u7FA4\u8BF7\u6C42\u529F\u80FD\uFF0C\u81EA\u52A8\u62D2\u7EDD\u9ED1\u540D\u5355\u7528\u6237**\n- **\u65B0\u589E\uFF1AQQ\u673A\u5668\u4EBA\u79BB\u7EBF\u76D1\u63A7\u548C\u90AE\u4EF6\u901A\u77E5\u529F\u80FD\uFF08\u76F4\u63A5\u8C03\u7528NapCat API\u68C0\u6D4B\u771F\u5B9E\u8FDE\u63A5\u72B6\u6001\uFF09**\n- **\u4F18\u5148\u83B7\u53D6\u7FA4\u6635\u79F0\uFF0C\u786E\u4FDD\u51C6\u786E\u8BC6\u522B\u7FA4\u5185\u8FDD\u89C4\u6635\u79F0**\n- **\u65B0\u589E\uFF1A\u6269\u5C55\u6635\u79F0\u68C0\u67E5\u673A\u5236 - \u65B0\u6210\u5458\u8FDB\u7FA43\u5206\u949F\u540E\u68C0\u67E5\uFF0C\u7136\u540E\u6BCF\u5C0F\u65F6\u68C0\u67E5\u4E00\u6B21\uFF0C\u6301\u7EED12\u5C0F\u65F6**\n- \u4F18\u5316\u7684\u9ED1\u540D\u5355\u5339\u914D\u7B97\u6CD5 (O(1) \u67E5\u627E)\n- \u6635\u79F0\u652F\u6301\u7CBE\u786E\u5339\u914D\u3001\u5305\u542B\u5339\u914D\u548C\u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D\n- \u6279\u91CF\u626B\u63CF\u548C\u9650\u6D41\u63A7\u5236\n- \u5E76\u53D1\u63A7\u5236\u548C\u9519\u8BEF\u91CD\u8BD5\n- \u8E22\u4EBA\u7ED3\u679C\u9A8C\u8BC1\uFF0C\u9632\u6B62\u6743\u9650\u4E0D\u8DB3\u65F6\u7684\u8BEF\u62A5\n\n## \u4F7F\u7528\u65B9\u6CD5\n1. \u5728\u914D\u7F6E\u4E2D\u6DFB\u52A0\u8981\u5C4F\u853D\u7684 QQ \u53F7\n2. \u5728\u914D\u7F6E\u4E2D\u6DFB\u52A0\u8981\u5C4F\u853D\u7684\u6635\u79F0\u5173\u952E\u8BCD\uFF08\u5982 \"\u7FA4\u4E3B\"\u3001\"\u7BA1\u7406\u5458\"\uFF09\n3. **\u542F\u7528\u81EA\u52A8\u540C\u610F\u52A0\u7FA4\u529F\u80FD\uFF0C\u673A\u5668\u4EBA\u5C06\u81EA\u52A8\u5904\u7406\u52A0\u7FA4\u8BF7\u6C42**\n4. **\u914D\u7F6E\u90AE\u4EF6\u901A\u77E5\u670D\u52A1\u5668\u5730\u5740\u548CNapCat API\u5730\u5740\uFF0C\u542F\u7528\u79BB\u7EBF\u76D1\u63A7\u529F\u80FD**\n5. \u9009\u62E9\u6635\u79F0\u5339\u914D\u6A21\u5F0F\uFF1A\u5305\u542B\u5339\u914D\uFF08\u9ED8\u8BA4\uFF09\u6216\u6B63\u5219\u8868\u8FBE\u5F0F\n6. \u542F\u7528\u6269\u5C55\u6635\u79F0\u68C0\u67E5\u529F\u80FD\uFF0C\u65B0\u6210\u5458\u8FDB\u7FA4\u540E\u5C06\u57283\u5206\u949F\u30011\u5C0F\u65F6\u30012\u5C0F\u65F6...12\u5C0F\u65F6\u540E\u6301\u7EED\u68C0\u67E5\u6635\u79F0\u53D8\u66F4\n7. \u4F7F\u7528 Koishi \u7684\u7FA4\u7EC4\u8FC7\u6EE4\u5668\u9009\u62E9\u9700\u8981\u76D1\u63A7\u7684\u7FA4\n8. \u542F\u7528\u63D2\u4EF6\u5373\u53EF\u81EA\u52A8\u5DE5\u4F5C\n\n## \u5DE5\u4F5C\u539F\u7406\n- **\u7FA4\u6635\u79F0\u4F18\u5148**\uFF1A\u4F18\u5148\u83B7\u53D6\u548C\u68C0\u67E5\u7FA4\u6635\u79F0\uFF0C\u786E\u4FDD\u51C6\u786E\u8BC6\u522B\u7FA4\u5185\u8FDD\u89C4\u6635\u79F0\n- **\u79BB\u7EBF\u76D1\u63A7**\uFF1A\u76F4\u63A5\u8C03\u7528NapCat API\u68C0\u6D4B\u771F\u5B9EQQ\u8FDE\u63A5\u72B6\u6001\uFF0C\u79BB\u7EBF\u65F6\u81EA\u52A8\u53D1\u9001\u90AE\u4EF6\u901A\u77E5\n- **\u52A0\u7FA4\u8BF7\u6C42\u5904\u7406**\uFF1A\u81EA\u52A8\u540C\u610F\u975E\u9ED1\u540D\u5355\u7528\u6237\u7684\u52A0\u7FA4\u8BF7\u6C42\uFF0C\u62D2\u7EDD\u9ED1\u540D\u5355\u7528\u6237\n- **\u673A\u5668\u4EBA\u8FDB\u7FA4\u65F6**\uFF1A\u81EA\u52A8\u626B\u63CF\u73B0\u6709\u7FA4\u6210\u5458\uFF0C\u8E22\u51FA\u9ED1\u540D\u5355\u7528\u6237\n- **\u65B0\u6210\u5458\u52A0\u5165\u65F6**\uFF1A\u5B9E\u65F6\u68C0\u67E5\u65B0\u52A0\u5165\u7684\u6210\u5458\uFF0C\u53D1\u73B0\u9ED1\u540D\u5355\u7528\u6237\u7ACB\u5373\u8E22\u51FA\n- **\u6269\u5C55\u6635\u79F0\u68C0\u67E5**\uFF1A\u65B0\u6210\u5458\u8FDB\u7FA43\u5206\u949F\u540E\u9996\u6B21\u68C0\u67E5\uFF0C\u7136\u540E\u6BCF\u5C0F\u65F6\u68C0\u67E5\u4E00\u6B21\uFF0C\u6301\u7EED12\u5C0F\u65F6\u76D1\u63A7\u6635\u79F0\u53D8\u66F4\n- **\u9A8C\u8BC1\u673A\u5236**\uFF1A\u8E22\u4EBA\u540E\u9A8C\u8BC1\u7528\u6237\u662F\u5426\u771F\u7684\u88AB\u8E22\u51FA\uFF0C\u786E\u4FDD\u64CD\u4F5C\u6210\u529F\n";
/**
* 性能统计信息
*/
export interface Stats {
totalScanned: number;
totalKicked: number;
totalFailed: number;
totalApproved: number;
totalRejected: number;
lastScanTime: number;
averageScanTime: number;
totalOfflineNotifications: number;
lastOfflineTime: number;
totalExtendedChecks: number;
}
/**
* 扩展检查缓存信息
*/
export interface ExtendedCheckInfo {
nickname: string;
guildId: string;
joinTime: number;
checkCount: number;
maxChecks: number;
nextCheckTime: number;
isFirstCheck: boolean;
}
/**
* 插件配置接口
*/
export interface Config {
blacklist: string[];
nicknameBlacklist: string[];
enableJoinScan: boolean;
enableMemberJoin: boolean;
enableExtendedNicknameCheck: boolean;
firstCheckDelay: number;
extendedCheckInterval: number;
extendedCheckHours: number;
kickFailMessage: string;
notifyAdmins: boolean;
adminNotifyMessage: string;
logLevel: 'debug' | 'info' | 'warn' | 'error';
enableAutoApprove: boolean;
autoApproveMessage: string;
autoRejectMessage: string;
notifyAutoApprove: boolean;
autoApproveNotifyMessage: string;
autoRejectNotifyMessage: string;
enableOfflineMonitor: boolean;
emailServerUrl: string;
napCatApiUrl: string;
botName: string;
offlineCheckInterval: number;
maxOfflineNotifications: number;
offlineNotificationCooldown: number;
scanDelay: number;
batchSize: number;
maxConcurrent: number;
kickDelay: number;
retryAttempts: number;
retryDelay: number;
enableStats: boolean;
skipBotMembers: boolean;
skipAdmins: boolean;
verifyKickResult: boolean;
verifyDelay: number;
verifyTimeout: number;
nicknameMatchMode: 'exact' | 'contains' | 'regex';
}
/**
* 插件配置Schema
*/
export declare const Config: Schema<Schemastery.ObjectS<{
blacklist: Schema<string[], string[]>;
nicknameBlacklist: Schema<string[], string[]>;
enableJoinScan: Schema<boolean, boolean>;
enableMemberJoin: Schema<boolean, boolean>;
enableExtendedNicknameCheck: Schema<boolean, boolean>;
firstCheckDelay: Schema<number, number>;
extendedCheckInterval: Schema<number, number>;
extendedCheckHours: Schema<number, number>;
kickFailMessage: Schema<string, string>;
notifyAdmins: Schema<boolean, boolean>;
adminNotifyMessage: Schema<string, string>;
logLevel: Schema<"debug" | "info" | "warn" | "error", "debug" | "info" | "warn" | "error">;
}> | Schemastery.ObjectS<{
enableAutoApprove: Schema<boolean, boolean>;
autoApproveMessage: Schema<string, string>;
autoRejectMessage: Schema<string, string>;
notifyAutoApprove: Schema<boolean, boolean>;
autoApproveNotifyMessage: Schema<string, string>;
autoRejectNotifyMessage: Schema<string, string>;
}> | Schemastery.ObjectS<{
enableOfflineMonitor: Schema<boolean, boolean>;
emailServerUrl: Schema<string, string>;
napCatApiUrl: Schema<string, string>;
botName: Schema<string, string>;
offlineCheckInterval: Schema<number, number>;
maxOfflineNotifications: Schema<number, number>;
offlineNotificationCooldown: Schema<number, number>;
}> | Schemastery.ObjectS<{
scanDelay: Schema<number, number>;
batchSize: Schema<number, number>;
maxConcurrent: Schema<number, number>;
kickDelay: Schema<number, number>;
retryAttempts: Schema<number, number>;
retryDelay: Schema<number, number>;
}> | Schemastery.ObjectS<{
enableStats: Schema<boolean, boolean>;
skipBotMembers: Schema<boolean, boolean>;
skipAdmins: Schema<boolean, boolean>;
verifyKickResult: Schema<boolean, boolean>;
verifyDelay: Schema<number, number>;
verifyTimeout: Schema<number, number>;
nicknameMatchMode: Schema<"exact" | "contains" | "regex", "exact" | "contains" | "regex">;
}>, {
blacklist: string[];
nicknameBlacklist: string[];
enableJoinScan: boolean;
enableMemberJoin: boolean;
enableExtendedNicknameCheck: boolean;
firstCheckDelay: number;
extendedCheckInterval: number;
extendedCheckHours: number;
kickFailMessage: string;
notifyAdmins: boolean;
adminNotifyMessage: string;
logLevel: "debug" | "info" | "warn" | "error";
} & import("cosmokit").Dict & {
enableAutoApprove: boolean;
autoApproveMessage: string;
autoRejectMessage: string;
notifyAutoApprove: boolean;
autoApproveNotifyMessage: string;
autoRejectNotifyMessage: string;
} & {
enableOfflineMonitor: boolean;
emailServerUrl: string;
napCatApiUrl: string;
botName: string;
offlineCheckInterval: number;
maxOfflineNotifications: number;
offlineNotificationCooldown: number;
} & {
scanDelay: number;
batchSize: number;
maxConcurrent: number;
kickDelay: number;
retryAttempts: number;
retryDelay: number;
} & {
enableStats: boolean;
skipBotMembers: boolean;
skipAdmins: boolean;
verifyKickResult: boolean;
verifyDelay: number;
verifyTimeout: number;
nicknameMatchMode: "exact" | "contains" | "regex";
}>;
export declare function apply(ctx: Context, config: Config): void;