import { Context, Query } from 'koishi'; export type CountField = 'todayPostCount' | 'yesterdayPostCount' | 'thisWeekPostCount' | 'thisMonthPostCount' | 'thisYearPostCount' | 'totalPostCount'; export interface RankRow { /** 用户榜是 userId,群榜是 channelId。 */ key: string; name: string; avatar: string; count: number; } export interface RankResult { rows: RankRow[]; /** 参与统计的全部消息数,用于算占比。 */ total: number; /** 被置顶的那一行在完整榜单里的名次,未上榜时为 undefined。 */ pinnedRank?: number; } export interface RankQuery { field: CountField; /** 限定频道(本群榜)。 */ channelId?: string; /** 限定用户(某人的群榜)。 */ userId?: string; whites?: string[]; blacks?: string[]; /** 取前几名,0 表示全部。 */ limit: number; /** 即便没上榜也要出现在结果里的 key。 */ pin?: string; } /** * 这一张榜列多少名:指令给了就用指令的,没给用默认值;再收进上限。 * * 返回 0 表示「全部」(`RankQuery.limit` 的约定)。默认值配成 0 时,有上限就列到 * 上限为止——「全部」在一个几千人的频道里是一张翻不到底的长图,排行榜也画不动。 * 上限配成 0 表示不设上限,保留从前的行为。 */ export declare function displayLimit(requested: number | undefined, fallback: number, max: number): number; export declare const rankUsers: (ctx: Context, query: RankQuery) => Promise; export declare const rankChannels: (ctx: Context, query: RankQuery) => Promise; /** 某人在指定范围内的名次与发言数。 */ export declare function lookup(ctx: Context, query: RankQuery & { pin: string; }): Promise<{ count: number; rank: number; total: number; }>; export declare const PERIODS: { readonly yesterday: { readonly field: "yesterdayPostCount"; readonly label: "昨日"; }; readonly today: { readonly field: "todayPostCount"; readonly label: "今日"; }; readonly week: { readonly field: "thisWeekPostCount"; readonly label: "本周"; }; readonly month: { readonly field: "thisMonthPostCount"; readonly label: "本月"; }; readonly year: { readonly field: "thisYearPostCount"; readonly label: "全年"; }; readonly total: { readonly field: "totalPostCount"; readonly label: "总计"; }; }; export type PeriodKey = keyof typeof PERIODS; export type Summary = { userId: string; } & Record; /** * 一次查询拿到范围内每个用户六个时段的发言数。 * 求和在数据库里完成,返回的是每人一行,而不是每人每群一行。 */ export declare function summarize(ctx: Context, where: Query.Expr): Promise; /** 从 summarize 的结果里取出某人在某时段的发言数、占比分母与名次。 */ export declare function statOf(rows: Summary[], userId: string, period: PeriodKey): { count: number; total: number; rank: number | null; };