koishi-plugin-message-counter
Version:
Koishi 的消息数量统计插件。生成各种发言排行榜。
134 lines (133 loc) • 11.9 kB
TypeScript
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 {};