mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2026-02-13 00:10:27 +00:00
270 lines
8.6 KiB
TypeScript
270 lines
8.6 KiB
TypeScript
import { z } from 'zod'
|
||
|
||
import { baseResponseSchema, commonResponseDataSchema } from '../response'
|
||
import oneBotHttpApiMessageGroup from './group'
|
||
import messageNodeSchema from './node'
|
||
import oneBotHttpApiMessagePrivate from './private'
|
||
|
||
const fileSchema = z
|
||
.object({
|
||
file: z.string().describe('路径或链接'),
|
||
url: z.string().describe('路径或链接'),
|
||
file_size: z.string().describe('文件大小'),
|
||
file_name: z.string().describe('文件名'),
|
||
base64: z.string().describe('文件base64编码')
|
||
})
|
||
.describe('文件')
|
||
const messageSchema = z
|
||
.object({
|
||
self_id: z.number().describe('自己QQ号'),
|
||
user_id: z.number().describe('发送人QQ号'),
|
||
time: z.number().describe('发送时间'),
|
||
message_id: z.number().describe('消息ID'),
|
||
message_seq: z.number().describe('消息序号'),
|
||
real_id: z.number().describe('?ID'),
|
||
message_type: z.string().describe('消息类型'),
|
||
sender: z
|
||
.object({
|
||
user_id: z.number().describe('发送人QQ号'),
|
||
nickname: z.string().describe('昵称'),
|
||
sex: z.enum(['male', 'female', 'unknown']).describe('性别'),
|
||
age: z.number().describe('年龄'),
|
||
card: z.string().describe('名片'),
|
||
role: z.enum(['owner', 'admin', 'member']).describe('角色')
|
||
})
|
||
.describe('发送人信息'),
|
||
raw_message: z.string().describe('原始消息'),
|
||
font: z.number().describe('字体'),
|
||
sub_type: z.string().describe('子类型'),
|
||
message: z.array(messageNodeSchema).describe('消息内容'),
|
||
message_format: z.string().describe('消息格式'),
|
||
post_type: z.string().describe('?'),
|
||
message_sent_type: z.string().describe('消息发送类型'),
|
||
group_id: z.number().describe('群号')
|
||
})
|
||
.describe('消息')
|
||
|
||
const oneBotHttpApiMessage = {
|
||
...oneBotHttpApiMessagePrivate,
|
||
...oneBotHttpApiMessageGroup,
|
||
'/mark_msg_as_read': {
|
||
description: '标记消息已读',
|
||
request: z
|
||
.object({
|
||
group_id: z
|
||
.union([z.string(), z.number()])
|
||
.optional()
|
||
.describe('群号,与 user_id 二选一'),
|
||
user_id: z
|
||
.union([z.string(), z.number()])
|
||
.optional()
|
||
.describe('用户QQ号,与 group_id 二选一')
|
||
})
|
||
.refine(
|
||
(data) =>
|
||
(data.group_id && !data.user_id) || (!data.group_id && data.user_id),
|
||
{
|
||
message: 'group_id 和 user_id 必须二选一,且不能同时存在或同时为空',
|
||
path: ['group_id', 'user_id']
|
||
}
|
||
),
|
||
response: baseResponseSchema
|
||
},
|
||
'/mark_group_msg_as_read': {
|
||
description: '标记群消息已读',
|
||
request: z.object({
|
||
group_id: z.union([z.string(), z.number()]).describe('群号')
|
||
}),
|
||
response: baseResponseSchema
|
||
},
|
||
'/mark_private_msg_as_read': {
|
||
description: '标记私聊消息已读',
|
||
request: z.object({
|
||
user_id: z.union([z.string(), z.number()]).describe('用户QQ号')
|
||
}),
|
||
response: baseResponseSchema
|
||
},
|
||
'/_mark_all_as_read': {
|
||
description: '标记所有消息已读',
|
||
request: z.object({}),
|
||
response: baseResponseSchema
|
||
},
|
||
'/delete_msg': {
|
||
description: '撤回消息',
|
||
request: z.object({
|
||
message_id: z.union([z.string(), z.number()]).describe('消息ID')
|
||
}),
|
||
response: baseResponseSchema
|
||
},
|
||
'/get_msg': {
|
||
description: '获取消息',
|
||
request: z.object({
|
||
message_id: z.union([z.string(), z.number()]).describe('消息ID')
|
||
}),
|
||
response: baseResponseSchema.extend({
|
||
data: z.object({})
|
||
})
|
||
},
|
||
'/get_image': {
|
||
description: '获取图片',
|
||
request: z.object({
|
||
file_id: z.string().describe('文件ID')
|
||
}),
|
||
response: baseResponseSchema.extend({
|
||
data: fileSchema
|
||
})
|
||
},
|
||
'/get_record': {
|
||
description: '获取语音',
|
||
request: z.object({
|
||
file_id: z.string().describe('文件ID'),
|
||
out_format: z
|
||
.enum(['mp3', 'amr', 'wma', 'm4a', 'spx', 'ogg', 'wav', 'flac'])
|
||
.describe('输出格式')
|
||
}),
|
||
response: baseResponseSchema.extend({
|
||
data: fileSchema
|
||
})
|
||
},
|
||
'/get_file': {
|
||
description: '获取文件',
|
||
request: z.object({
|
||
file_id: z.string().describe('文件ID')
|
||
}),
|
||
response: baseResponseSchema.extend({
|
||
data: fileSchema
|
||
})
|
||
},
|
||
'/get_group_msg_history': {
|
||
description: '获取群消息历史',
|
||
request: z.object({
|
||
group_id: z.union([z.string(), z.number()]).describe('群号'),
|
||
message_seq: z.union([z.string(), z.number()]).describe('消息序号'),
|
||
count: z.number().int().positive().describe('获取数量'),
|
||
reverseOrder: z.boolean().describe('是否倒序')
|
||
}),
|
||
response: baseResponseSchema.extend({
|
||
data: z.object({
|
||
messages: z.array(messageSchema).describe('消息列表')
|
||
})
|
||
})
|
||
},
|
||
'/set_msg_emoji_like': {
|
||
description: '贴表情',
|
||
request: z.object({
|
||
message_id: z.union([z.string(), z.number()]).describe('消息ID'),
|
||
emoji_id: z.number().describe('表情ID'),
|
||
set: z.boolean().describe('?')
|
||
}),
|
||
response: baseResponseSchema.extend({
|
||
data: commonResponseDataSchema
|
||
})
|
||
},
|
||
'/get_friend_msg_history': {
|
||
description: '获取好友消息历史',
|
||
request: z.object({
|
||
user_id: z.union([z.string(), z.number()]).describe('用户QQ号'),
|
||
message_seq: z.union([z.string(), z.number()]).describe('消息序号'),
|
||
count: z.number().int().positive().describe('获取数量'),
|
||
reverseOrder: z.boolean().describe('是否倒序')
|
||
}),
|
||
response: baseResponseSchema.extend({
|
||
data: z.object({
|
||
messages: z.array(messageSchema)
|
||
})
|
||
})
|
||
},
|
||
'/get_recent_contact': {
|
||
description: '最近消息列表',
|
||
request: z.object({
|
||
count: z.number().int().positive().describe('获取数量')
|
||
}),
|
||
response: baseResponseSchema.extend({
|
||
data: z.array(
|
||
z.object({
|
||
lastestMsg: messageSchema,
|
||
peerUin: z.string().describe('对方QQ号'),
|
||
remark: z.string().describe('备注'),
|
||
msgTime: z.string().describe('消息时间'),
|
||
chatType: z.number().describe('聊天类型'),
|
||
msgId: z.string().describe('消息ID'),
|
||
sendNickName: z.string().describe('发送人昵称'),
|
||
sendMemberName: z.string().describe('发送人?昵称'),
|
||
peerName: z.string().describe('对方昵称')
|
||
})
|
||
)
|
||
})
|
||
},
|
||
'/fetch_emoji_like': {
|
||
description: '获取贴表情详情',
|
||
request: z.object({
|
||
message_id: z.union([z.string(), z.number()]).describe('消息ID'),
|
||
emojiId: z.string().describe('表情ID'),
|
||
emojiType: z.string().describe('表情类型'),
|
||
group_id: z.union([z.string(), z.number()]).optional().describe('群号'),
|
||
user_id: z
|
||
.union([z.string(), z.number()])
|
||
.optional()
|
||
.describe('用户QQ号'),
|
||
count: z.number().int().positive().optional().describe('获取数量')
|
||
}),
|
||
response: baseResponseSchema.extend({
|
||
data: z.object({
|
||
result: z.number().describe('结果'),
|
||
errMsg: z.string().describe('错误信息'),
|
||
emojiLikesList: z
|
||
.array(
|
||
z
|
||
.object({
|
||
tinyId: z.string().describe('表情ID'),
|
||
nickName: z.string().describe('昵称?'),
|
||
headUrl: z.string().describe('头像?')
|
||
})
|
||
.describe('表情点赞列表')
|
||
)
|
||
.describe('表情点赞列表'),
|
||
cookie: z.string().describe('cookie'),
|
||
isLastPage: z.boolean().describe('是否最后一页'),
|
||
isFirstPage: z.boolean().describe('是否第一页')
|
||
})
|
||
})
|
||
},
|
||
'/get_forward_msg': {
|
||
description: '获取合并转发消息',
|
||
request: z.object({
|
||
message_id: z.union([z.string(), z.number()]).describe('消息ID')
|
||
}),
|
||
response: baseResponseSchema.extend({
|
||
data: z.object({})
|
||
})
|
||
},
|
||
'/send_forward_msg': {
|
||
description: '发送合并转发消息',
|
||
request: z.object({
|
||
group_id: z.union([z.string(), z.number()]).optional().describe('群号'),
|
||
user_id: z
|
||
.union([z.string(), z.number()])
|
||
.optional()
|
||
.describe('用户QQ号'),
|
||
messages: z.array(messageNodeSchema).describe('消息内容'),
|
||
news: z
|
||
.array(
|
||
z.object({
|
||
text: z.string()
|
||
})
|
||
)
|
||
.describe('?'),
|
||
prompt: z.string().describe('外显'),
|
||
summary: z.string().describe('底下文字'),
|
||
source: z.string().describe('内容')
|
||
}),
|
||
response: baseResponseSchema.extend({
|
||
data: commonResponseDataSchema.extend({
|
||
data: z.object({})
|
||
})
|
||
})
|
||
}
|
||
} as const
|
||
|
||
export default oneBotHttpApiMessage
|