import type { Op } from 'quill' import type { EmojiValue } from '@/components/chat_input/formats/emoji_blot' import type { ImageValue } from '@/components/chat_input/formats/image_blot' import type { ReplyBlockValue } from '@/components/chat_input/formats/reply_blot' import { type AllOB11WsResponse, type OB11AllEvent, type OB11GroupMessage, type OB11Message, type OB11Notice, OB11NoticeType, type OB11PrivateMessage, type OB11Segment, type OneBot11Lifecycle, type RequestResponse } from '../types/onebot' /** * 获取事件名称 * @param event 事件类型 * @returns 事件名称 * @description 用于获取事件的名称 */ export const getEventName = (event: OB11AllEvent['post_type']): string => { switch (event) { case 'message': return '消息' case 'notice': return '通知' case 'request': return '请求' case 'meta_event': return '元事件' case 'message_sent': return '消息上报' default: return '未知' } } /** * 获取生命周期事件名称 * @param event 生命周期事件类型 * @returns 生命周期事件名称 * @description 用于获取生命周期事件的名称 */ export const getLifecycleName = ( event: OneBot11Lifecycle['sub_type'] ): string => { switch (event) { case 'enable': return '启用' case 'disable': return '停用' case 'connect': return '连接' default: return '未知' } } /** * 获取生命周期事件Chip颜色 * @param event 生命周期事件类型 * @returns 生命周期事件颜色 * @description 用于获取生命周期事件的颜色 */ export const getLifecycleColor = ( event: OneBot11Lifecycle['sub_type'] ): 'success' | 'danger' | 'default' => { switch (event) { case 'enable': return 'success' case 'disable': return 'danger' case 'connect': return 'success' default: return 'default' } } /** * 判断 OneBot WS 返回值是否为事件 * @param data OneBot WS 返回值 * @returns 是否为事件 * @description 用于判断 OneBot WS 返回值是否为事件 */ export const isOB11Event = (data: AllOB11WsResponse): data is OB11AllEvent => { return 'post_type' in data } /** * 判断 OneBot WS 返回值是否为请求响应 * @param data OneBot WS 返回值 * @returns 是否为请求响应 * @description 用于判断 OneBot WS 返回值是否为请求响应 */ export const isOB11RequestResponse = ( data: AllOB11WsResponse ): data is RequestResponse => { return 'status' in data && 'retcode' in data } /** * 获取请求响应状态文本 * @param status 请求响应状态 * @returns 请求响应状态文本 * @description 用于获取请求响应状态的文本 */ export const getResponseStatusText = ( status: RequestResponse['status'] ): string => { switch (status) { case 'ok': return '成功' case 'failed': return '失败' case 'async': return '异步' default: return '未知' } } /** * 获取请求响应状态颜色 * @param status 请求响应状态 * @returns 请求响应状态颜色 * @description 用于获取请求响应状态的颜色 */ export const getResponseStatusColor = ( status: RequestResponse['status'] ): 'success' | 'danger' | 'warning' | 'default' => { switch (status) { case 'ok': return 'success' case 'failed': return 'danger' case 'async': return 'warning' default: return 'default' } } /** * 获取通知类型名称 * @param type 通知类型 * @returns 通知类型名称 * @description 用于获取通知类型的名称 */ export const getNoticeTypeName = (type: OB11Notice['notice_type']): string => { switch (type) { case OB11NoticeType.GroupUpload: return '群文件上传' case OB11NoticeType.GroupAdmin: return '群管理员变动' case OB11NoticeType.GroupDecrease: return '群成员减少' case OB11NoticeType.GroupIncrease: return '群成员增加' case OB11NoticeType.GroupBan: return '群禁言' case OB11NoticeType.FriendAdd: return '好友添加' case OB11NoticeType.GroupRecall: return '群消息撤回' case OB11NoticeType.FriendRecall: return '好友消息撤回' case OB11NoticeType.Notify: return '通知' case OB11NoticeType.GroupMsgEmojiLike: return '群消息表情回应' case OB11NoticeType.GroupEssence: return '群消息精华' case OB11NoticeType.GroupCard: return '群名片更新' default: return '未知' } } /** * 判断 OneBot 消息是否为私聊消息 * @param data OneBot 消息 * @returns 是否为私聊消息 * @description 用于判断 OneBot 消息是否为私聊消息 */ export const isOB11PrivateMessage = ( data: OB11Message ): data is OB11PrivateMessage => { return data.message_type === 'private' } /** * 判断 OneBot 消息是否为群消息 * @param data OneBot 消息 * @returns 是否为群消息 * @description 用于判断 OneBot 消息是否为群消息 */ export const isOB11GroupMessage = ( data: OB11Message ): data is OB11GroupMessage => { return data.message_type === 'group' } /** * 将 Quill Delta 转换为 OneBot 消息 * @param op Quill Delta * @returns OneBot 消息 * @description 用于将 Quill Delta 转换为 OneBot 消息 */ export const quillToMessage = (op: Op) => { let message: OB11Segment = { type: 'text', data: { text: op.insert as string } } if (typeof op.insert !== 'string') { if (op.insert?.image) { message = { type: 'image', data: { file: (op.insert.image as ImageValue).src } } } else if (op.insert?.emoji) { message = { type: 'face', data: { id: (op.insert.emoji as EmojiValue).id } } } else if (op.insert?.reply) { message = { type: 'reply', data: { id: (op.insert.reply as ReplyBlockValue).messageId } } } } return message }