Files
ChatLab/packages/chart-message/types.ts
T
2026-04-12 00:52:51 +08:00

115 lines
2.4 KiB
TypeScript

/**
* chart-message 插件本地类型定义
*/
/** 消息类型枚举 */
export enum MessageType {
TEXT = 0,
IMAGE = 1,
VOICE = 2,
VIDEO = 3,
FILE = 4,
EMOJI = 5,
LINK = 6,
LOCATION = 7,
RED_PACKET = 20,
TRANSFER = 21,
POKE = 22,
CALL = 30,
SHARE = 31,
REPLY = 32,
FORWARD = 33,
CONTACT = 34,
SYSTEM = 80,
RECALL = 81,
OTHER = 99,
}
/** 消息类型 i18n key 映射 */
const MESSAGE_TYPE_KEYS: Record<number, string> = {
// 基础消息类型
[MessageType.TEXT]: 'text',
[MessageType.IMAGE]: 'image',
[MessageType.VOICE]: 'voice',
[MessageType.VIDEO]: 'video',
[MessageType.FILE]: 'file',
[MessageType.EMOJI]: 'emoji',
[MessageType.LINK]: 'link',
[MessageType.LOCATION]: 'location',
// 交互消息类型
[MessageType.RED_PACKET]: 'redPacket',
[MessageType.TRANSFER]: 'transfer',
[MessageType.POKE]: 'poke',
[MessageType.CALL]: 'call',
[MessageType.SHARE]: 'share',
[MessageType.REPLY]: 'reply',
[MessageType.FORWARD]: 'forward',
[MessageType.CONTACT]: 'contact',
// 系统消息类型
[MessageType.SYSTEM]: 'system',
[MessageType.RECALL]: 'recall',
// 其他
[MessageType.OTHER]: 'other',
}
/**
* 获取消息类型名称
* @param type 消息类型
* @param t 可选的 i18n t 函数,传入时使用 common.messageType.* 键
*/
export function getMessageTypeName(type: MessageType | number, t?: (key: string) => string): string {
const key = MESSAGE_TYPE_KEYS[type]
if (t && key) return t(`common.messageType.${key}`)
return t ? t('common.messageType.unknown') : '未知'
}
/** 小时活跃度 */
export interface HourlyActivity {
hour: number
messageCount: number
}
/** 日期活跃度 */
export interface DailyActivity {
date: string
messageCount: number
}
/** 星期活跃度 */
export interface WeekdayActivity {
weekday: number
messageCount: number
}
/** 月份活跃度 */
export interface MonthlyActivity {
month: number
messageCount: number
}
/** 年份活跃度 */
export interface YearlyActivity {
year: number
messageCount: number
}
/** 消息类型分布 */
export interface MessageTypeCount {
type: number
count: number
}
/** 消息长度分布 */
export interface LengthDistribution {
detail: Array<{ len: number; count: number }>
grouped: Array<{ range: string; count: number }>
}
/** 文字消息统计 */
export interface TextStats {
textCount: number
avgLength: number
maxLength: number
shortCount: number
}