UNPKG

koishi-plugin-message-counter

Version:

Koishi 的消息数量统计插件。生成各种发言排行榜。

134 lines (133 loc) 11.9 kB
import { Context, Schema } from "koishi"; export declare const name = "message-counter"; export declare const inject: { required: string[]; optional: string[]; }; export declare const usage = "## \uD83D\uDCDD \u6CE8\u610F\u4E8B\u9879\n\n- \u53EA\u7EDF\u8BA1\u7FA4\u804A\u6D88\u606F\n- \u521D\u59CB\u5316\u9700\u6743\u9650\u7B49\u7EA7 3\n- \u4F9D\u8D56 database \u4E0E cron \u670D\u52A1\n- \u751F\u6210\u56FE\u7247\u65F6\uFF0C\u9700 puppeteer \u63D0\u4F9B canvas \u652F\u6301\n\n## \uD83D\uDD0D \u5173\u952E\u6307\u4EE4\n\n### `messageCounter.\u67E5\u8BE2 [\u6307\u5B9A\u7528\u6237]`\n\n\u67E5\u8BE2\u6307\u5B9A\u7528\u6237\u7684\u53D1\u8A00\u6B21\u6570\u4FE1\u606F\uFF08\u6B21\u6570[\u6392\u540D]\uFF09\u3002\u82E5\u4E0D\u5E26\u4EFB\u4F55\u9009\u9879\uFF0C\u5219\u663E\u793A\u6240\u6709\u65F6\u6BB5\u7684\u6570\u636E\u3002\n\n**\u9009\u9879:**\n\n| \u53C2\u6570 | \u8BF4\u660E |\n|------|------|\n| `-d, --day` | \u4ECA\u65E5\u53D1\u8A00\u6B21\u6570[\u6392\u540D] |\n| `--yd, --yesterday` | \u6628\u65E5\u53D1\u8A00\u6B21\u6570[\u6392\u540D] |\n| `-w, --week` | \u672C\u5468\u53D1\u8A00\u6B21\u6570[\u6392\u540D] |\n| `-m, --month` | \u672C\u6708\u53D1\u8A00\u6B21\u6570[\u6392\u540D] |\n| `-y, --year` | \u4ECA\u5E74\u53D1\u8A00\u6B21\u6570[\u6392\u540D] |\n| `-t, --total` | \u603B\u53D1\u8A00\u6B21\u6570[\u6392\u540D] |\n| `--dag` | \u8DE8\u7FA4\u4ECA\u65E5\u53D1\u8A00\u6B21\u6570[\u6392\u540D] |\n| `--ydag` | \u8DE8\u7FA4\u6628\u65E5\u53D1\u8A00\u6B21\u6570[\u6392\u540D] |\n| `--wag` | \u8DE8\u7FA4\u672C\u5468\u53D1\u8A00\u6B21\u6570[\u6392\u540D] |\n| `--mag` | \u8DE8\u7FA4\u672C\u6708\u53D1\u8A00\u6B21\u6570[\u6392\u540D] |\n| `--yag` | \u8DE8\u7FA4\u672C\u5E74\u53D1\u8A00\u6B21\u6570[\u6392\u540D] |\n| `-a, --across` | \u8DE8\u7FA4\u603B\u53D1\u8A00\u6B21\u6570[\u6392\u540D] |\n\n### `messageCounter.\u6392\u884C\u699C [\u663E\u793A\u7684\u4EBA\u6570]`\n\n\u53D1\u8A00\u6392\u884C\u699C\u3002\u9ED8\u8BA4\u4E3A\u4ECA\u65E5\u53D1\u8A00\u699C\u3002\n\n**\u9009\u9879:**\n\n| \u53C2\u6570 | \u8BF4\u660E |\n|------|------|\n| `--yd, --yesterday` | \u6628\u65E5\u53D1\u8A00\u6392\u884C\u699C |\n| `-w` | \u672C\u5468\u53D1\u8A00\u6392\u884C\u699C |\n| `-m` | \u672C\u6708\u53D1\u8A00\u6392\u884C\u699C |\n| `-y` | \u4ECA\u5E74\u53D1\u8A00\u6392\u884C\u699C |\n| `-t` | \u603B\u53D1\u8A00\u6392\u884C\u699C |\n| `--dag` | \u8DE8\u7FA4\u4ECA\u65E5\u53D1\u8A00\u6392\u884C\u699C |\n| `--ydag` | \u8DE8\u7FA4\u6628\u65E5\u53D1\u8A00\u6392\u884C\u699C |\n| `--wag` | \u8DE8\u7FA4\u672C\u5468\u53D1\u8A00\u6392\u884C\u699C |\n| `--mag` | \u8DE8\u7FA4\u672C\u6708\u53D1\u8A00\u6392\u884C\u699C |\n| `--yag` | \u8DE8\u7FA4\u4ECA\u5E74\u53D1\u8A00\u6392\u884C\u699C |\n| `--dragon` | \u8DE8\u7FA4\u603B\u53D1\u8A00\u6392\u884C\u699C\uFF08\u5723\u9F99\u738B\u699C\uFF09 |\n| `--whites` | \u767D\u540D\u5355\uFF0C\u53EA\u663E\u793A\u767D\u540D\u5355\u7528\u6237 |\n| `--blacks` | \u9ED1\u540D\u5355\uFF0C\u4E0D\u663E\u793A\u9ED1\u540D\u5355\u7528\u6237 |\n\n### `messageCounter.\u7FA4\u6392\u884C\u699C [number:number]`\n\n\u5404\u7FA4\u804A\u7684\u53D1\u8A00\u6392\u884C\u699C\u3002\u9ED8\u8BA4\u4E3A\u4ECA\u65E5\u53D1\u8A00\u699C\u3002\n\n**\u9009\u9879:**\n\n| \u53C2\u6570 | \u8BF4\u660E |\n|------|------|\n| `--yd, --yesterday` | \u6628\u65E5\u53D1\u8A00\u6392\u884C\u699C |\n| `-w, -m, -y, -t` | \u672C\u5468/\u672C\u6708/\u4ECA\u5E74/\u603B\u53D1\u8A00\u6392\u884C\u699C |\n| `-s` | \u6307\u5B9A\u7528\u6237\u7684\u7FA4\u53D1\u8A00\u6392\u884C\u699C |\n| `--whites` | \u767D\u540D\u5355\uFF0C\u53EA\u663E\u793A\u767D\u540D\u5355\u7FA4 |\n| `--blacks` | \u9ED1\u540D\u5355\uFF0C\u4E0D\u663E\u793A\u9ED1\u540D\u5355\u7FA4 |\n\n### `messageCounter.\u4E0A\u4F20\u67F1\u72B6\u6761\u80CC\u666F`\n\n- \u4E3A\u81EA\u5DF1\u4E0A\u4F20\u4E00\u5F20\u81EA\u5B9A\u4E49\u7684\u6C34\u5E73\u67F1\u72B6\u6761\u80CC\u666F\u56FE\u7247\n- \u65B0\u56FE\u7247\u4F1A\u8986\u76D6\u65E7\u7684\u56FE\u7247\u3002\u82E5\u4E0A\u4F20\u5931\u8D25\uFF0C\u65E7\u56FE\u7247\u4E5F\u4F1A\u88AB\u5220\u9664\n- \u4F7F\u7528\u6B64\u6307\u4EE4\u65F6\u9700\u9644\u5E26\u56FE\u7247\n\n### `messageCounter.\u91CD\u8F7D\u8D44\u6E90`\n\n- \u5B9E\u65F6\u91CD\u8F7D\u7528\u6237\u56FE\u6807\u3001\u67F1\u72B6\u6761\u80CC\u666F\u548C\u5B57\u4F53\u6587\u4EF6\uFF0C\u4F7F\u5176\u66F4\u6539\u5373\u65F6\u751F\u6548\uFF08\u9700\u8981\u6743\u9650\u7B49\u7EA7 2\uFF09\n\n### `messageCounter.\u6E05\u7406\u7F13\u5B58`\n\n- \u6E05\u7406\u8FC7\u671F\u7684\u5934\u50CF\u7F13\u5B58\u6587\u4EF6\uFF0C\u4EE5\u91CA\u653E\u78C1\u76D8\u7A7A\u95F4\uFF08\u9700\u8981\u6743\u9650\u7B49\u7EA7 3\uFF09\n- \u7528\u6237\u66F4\u6362\u5934\u50CF\u540E\uFF0C\u65E7\u7684\u5934\u50CF\u7F13\u5B58\u4F1A\u53D8\u6210\u201C\u5B64\u513F\u7F13\u5B58\u201D\u3002\u6B64\u6307\u4EE4\u53EF\u4EE5\u5B89\u5168\u5730\u79FB\u9664\u5B83\u4EEC\u3002\n\n## \uD83C\uDFA8 \u81EA\u5B9A\u4E49\u6C34\u5E73\u67F1\u72B6\u56FE\u6837\u5F0F\n\n- \u91CD\u8F7D\u63D2\u4EF6\u6216\u4F7F\u7528 `messageCounter.\u91CD\u8F7D\u8D44\u6E90` \u6307\u4EE4\u53EF\u4F7F\u65B0\u589E\u7684\u6587\u4EF6\u7ACB\u5373\u751F\u6548\u3002\n\n### 1. \u7528\u6237\u56FE\u6807\n\n- \u5728 `data/messageCounter/icons` \u6587\u4EF6\u5939\u4E0B\u6DFB\u52A0\u7528\u6237\u56FE\u6807\n- \u6587\u4EF6\u540D\u683C\u5F0F\u4E3A `\u7528\u6237ID.png`\uFF08\u4F8B\uFF1A`1234567890.png`\uFF09\n- \u652F\u6301\u591A\u56FE\u6807\uFF0C\u6587\u4EF6\u540D\u683C\u5F0F\u4E3A `\u7528\u6237ID-1.png`, `\u7528\u6237ID-2.png`\n\n### 2. \u67F1\u72B6\u6761\u80CC\u666F\n\n- **\u63A8\u8350\u65B9\u5F0F**\uFF1A\u4F7F\u7528 `messageCounter.\u4E0A\u4F20\u67F1\u72B6\u6761\u80CC\u666F` \u6307\u4EE4\n- **\u624B\u52A8\u65B9\u5F0F**\uFF1A\u5728 `data/messageCounter/barBgImgs` \u6587\u4EF6\u5939\u4E0B\u6DFB\u52A0\u80CC\u666F\u56FE\u7247\n- \u652F\u6301\u591A\u80CC\u666F\uFF08\u968F\u673A\u9009\u7528\uFF09\uFF0C\u6587\u4EF6\u540D\u683C\u5F0F\u4E3A `\u7528\u6237ID-1.png` \u7B49\n- \u5EFA\u8BAE\u5C3A\u5BF8 850x50 \u50CF\u7D20\uFF0C\u6587\u4EF6\u540D `\u7528\u6237ID.png`\n\n### 3. \u81EA\u5B9A\u4E49\u5B57\u4F53\n\n- \u63D2\u4EF6\u542F\u52A8\u65F6\uFF0C\u4F1A\u81EA\u52A8\u5C06\u5185\u7F6E\u5B57\u4F53 `HarmonyOS_Sans_Medium.ttf` \u62F7\u8D1D\u5230 `data/messageCounter/fonts/` \u76EE\u5F55\u4E0B\u3002\n- \u60A8\u53EF\u4EE5\u5C06\u81EA\u5DF1\u559C\u7231\u7684\u5B57\u4F53\u6587\u4EF6\u653E\u5165\u6B64\u6587\u4EF6\u5939\uFF0C\u5E76\u5728\u914D\u7F6E\u9879\u7684\u201C\u5B57\u4F53\u8BBE\u7F6E\u201D\u4E2D\u586B\u5165\u8BE5\u5B57\u4F53\u7684\u6587\u4EF6\u540D\u79F0\uFF08\u4E0D\u5E26\u540E\u7F00\uFF09\u3002\n\n---\n\n## \uD83D\uDCAC QQ \u7FA4\n\n- 956758505"; export interface Config { /** 是否统计 Bot 自己发送的消息。 */ isBotMessageTrackingEnabled: boolean; /** 排行榜默认显示的人数。 */ defaultMaxDisplayCount: number; /** 是否在显示排行榜时补充时间信息。 */ isTimeInfoSupplementEnabled: boolean; /** 是否在排行榜中显示用户消息占比。 */ isUserMessagePercentageVisible: boolean; /** 在排行榜中全局隐藏的用户 ID 列表。 */ hiddenUserIdsInLeaderboard: string[]; /** 在群排行榜中全局隐藏的频道 ID 列表。 */ hiddenChannelIdsInLeaderboard: string[]; /** 是否将文本排行榜转为 Markdown 图片。 */ isTextToImageConversionEnabled: boolean; /** 是否将排行榜渲染为水平柱状图。 */ isLeaderboardToHorizontalBarChartConversionEnabled: boolean; /** 生成的柱状图图片类型。 */ imageType: "png" | "jpeg" | "webp"; /** 头像缓存的有效期(秒)。设置为 0 可禁用缓存刷新。 */ avatarCacheTTL: number; /** 头像获取失败后的重试间隔(秒)。 */ avatarFailureCacheTTL: number; /** 页面加载等待事件,影响图片生成速度和稳定性。 */ waitUntil: "load" | "domcontentloaded" | "networkidle0" | "networkidle2"; /** * 生成水平柱状图时,渲染页面的视口宽度(像素)。 * @default 1080 */ chartViewportWidth: number; /** * 渲染时的设备像素比 (DPR)。 * 更高的值可以生成更清晰的图片(例如,设置为 2 相当于 2x 图),但也会增加图片文件体积。 * @default 1 */ deviceScaleFactor: number; /** 是否将自定义图标显示在柱状条的末端。 */ shouldMoveIconToBarEndLeft: boolean; /** 是否在生成水平柱状图时,在当前用户/群聊名称前显示★以高亮。 */ showStarInChart: boolean; /** 自定义背景图在进度条区域的不透明度。 */ horizontalBarBackgroundOpacity: number; /** 自定义背景图在整行背景的不透明度。 */ horizontalBarBackgroundFullOpacity: number; /** 允许上传的背景图最大宽度(像素)。 */ maxBarBgWidth: number; /** 允许上传的背景图最大高度(像素)。 */ maxBarBgHeight: number; /** 允许上传的背景图最大体积(MB)。 */ maxBarBgSize: number; /** 图片整体背景的类型。 */ backgroundType: string; /** API 背景配置。 */ apiBackgroundConfig: apiBackgroundConfig; /** 自定义背景的 CSS 代码。 */ backgroundValue: string; /** 水平柱状图 - 标题的字体。 */ chartTitleFont: string; /** 水平柱状图 - 成员昵称和发言次数的字体。 */ chartNicknameFont: string; /** 是否启用定时自动推送排行榜功能。 */ autoPush: boolean; /** 是否在每日 0 点自动发送昨日排行榜。 */ shouldSendDailyLeaderboardAtMidnight: boolean; /** 是否在每周一 0 点自动发送上周排行榜。 */ shouldSendWeeklyLeaderboard: boolean; /** 是否在每月第一天 0 点自动发送上月排行榜。 */ shouldSendMonthlyLeaderboard: boolean; /** 是否在每年第一天 0 点自动发送去年排行榜。 */ shouldSendYearlyLeaderboard: boolean; /** 其他定时发送今日排行榜的时间点(24小时制)。 */ dailyScheduledTimers: string[]; /** 发送排行榜前是否发送提示消息。 */ isGeneratingRankingListPromptVisible: boolean; /** 发送提示后等待多少秒再发送图片。 */ leaderboardGenerationWaitTime: number; /** 需要接收自动推送的频道 ID 列表。 */ pushChannelIds: string[]; /** 是否向机器人所在的所有群聊推送。 */ shouldSendLeaderboardNotificationsToAllChannels: boolean; /** "向所有群聊推送" 开启时的排除列表。 */ excludedLeaderboardChannels: string[]; /** 批量推送时,每个群之间的发送延迟(秒)。 */ delayBetweenGroupPushesInSeconds: number; /** 延迟时间的随机波动范围(秒)。 */ groupPushDelayRandomizationSeconds: number; /** 是否在每日 0 点自动禁言昨日发言最多的人。 */ enableMostActiveUserMuting: boolean; /** 0 点后,等待多少秒再执行禁言操作。 */ dragonKingDetainmentTime: number; /** 禁言时长(天)。 */ detentionDuration: number; /** 在哪些频道中执行“抓龙王”操作。 */ muteChannelIds: string[]; } export declare const Config: Schema<Config>; declare module "koishi" { interface Tables { message_counter_records: MessageCounterRecord; message_counter_state: MessageCounterState; } } interface apiBackgroundConfig { apiUrl: string; apiKey: string; responseType: string; } interface MessageCounterRecord { channelId: string; channelName: string; userId: string; username: string; userAvatar: string; todayPostCount: number; thisWeekPostCount: number; thisMonthPostCount: number; thisYearPostCount: number; totalPostCount: number; yesterdayPostCount: number; } interface MessageCounterState { key: string; value: Date; } export declare function apply(ctx: Context, config: Config): Promise<void>; export {};