📚 事件基类
约 1936 字大约 6 分钟
2025-05-15
事件基类
所有事件都包含以下字段:
| 属性 | 类型 | 说明 |
|---|---|---|
| selfId | string | 机器人 ID |
| userId | string | 触发事件用户 ID 同 event.sender.userId |
| eventId | string | 事件 ID |
| rawEvent | unknown | 原始事件 也就是适配器上报的事件 |
| time | number | 事件触发时间戳 |
| event | Event | 事件类型 |
| subEvent | SubEvent | 事件子类型 |
| contact | Contact | 消息来源信息 |
| sender | Sender | 消息触发者信息 |
| srcReply | SrcReply | 内部函数 |
| reply | Reply | 快速回复 |
| hasPermission | hasPermission | 权限检查函数 |
| bot | bot | |
| store | Map | 存储器 由开发者自行调用 |
| logFnc | string | 日志函数字符串 |
| logText | string | 日志用户字符串 |
| isMaster | boolean | 是否为机器人主人 |
| isAdmin | boolean | 是否为机器人管理员 |
| isPrivate | boolean | 是否为私聊场景 |
| isFriend | boolean | 是否为好友场景 |
| isGroup | boolean | 是否为群聊 |
| isGuild | boolean | 是否为频道 |
| isStranger | boolean | 是否为群临时会话场景 |
| isDirect | boolean | 是否为频道私信场景 |
事件类型
提示
message_sent 目前没有支持,待后续版本更新。
| 事件类型 | 说明 |
|---|---|
| message | 消息事件 |
| notice | 通知事件 |
| request | 请求事件 |
| message_sent | Bot自身发送消息 |
事件子类型
message消息事件子类型:group: 群聊friend: 好友guild: 频道direct: 频道私信groupTemp: 群临时会话
notice通知事件子类型:receiveLike: 收到点赞friendPoke: 好友戳一戳friendRecall: 好友消息撤回privateFileUploaded: 好友发送文件friendIncrease: 好友增加friendDecrease: 好友减少groupPoke: 群戳一戳groupCardChanged: 群名片变动groupMemberTitleUpdate: 群成员头衔变动groupHighlightsChange: 群精华消息变动groupRecall: 群消息撤回groupMemberAdd: 群成员增加groupMemberRemove: 群成员减少groupAdminChanged: 群管理员变动groupMemberBan: 群成员禁言groupSignIn: 群签到groupWholeBan: 群全员禁言groupFileUploaded: 群文件上传groupMessageReaction: 群聊消息表情动态回应groupLuckyKing: 群聊运气王事件groupHonorChange: 群聊荣誉变更事件
request请求事件子类型:friendApply: 收到添加Bot为好友请求groupApply: 收到用户申请加入群聊请求groupInvite: 收到邀请Bot加入群聊请求
消息来源
提示
在不同的 event(事件类型) 下,contact 的值都是不同的,请根据实际情况进行使用。
friend
scene:friendpeer: 好友IDname: 好友昵称
group
scene:grouppeer: 群IDname: 群名
guild
scene:guildpeer: 频道IDname: 频道名subPeer: 子频道IDsubName: 子频道名
direct
scene:directpeer: 频道IDname: 频道名subPeer: 子频道ID 虚拟IDsubName: 子频道名
groupTemp
scene:groupTemppeer: 群IDname: 群名subPeer: 发起临时会话用户ID
如果你需要构造一个 contact 对象,请参考以下代码
快速构造
import { contact } from 'node-karin'
const friend = contact.friend('friend_id', '好友名称')
const group = contact.group('群ID', '群名称')
const guild = contact.guild('频道ID', '频道名称', '子频道ID', '子频道名称')
const direct = contact.direct('频道ID', '子频道ID', '频道名称', '子频道名称')
const groupTemp = contact.groupTemp('群ID', '发起临时会话用户ID', '群名称')消息触发者
提示
sender在不同的 event(事件类型) 下,sender 的值都是不同的,请根据实际情况进行使用。
friend
| 属性 | 类型 | 属性是否100%存在 | 说明 |
|---|---|---|---|
| userId | string | ✅ | 用户ID |
| nick | string | ✅ | 昵称 |
| name | string | ✅ | 同 nick |
| sex | string | 性别 | |
| age | number | 年龄 | |
| uid | string | QQ场景专属 | |
| uin | number | QQ场景专属 |
group
| 属性 | 类型 | 属性是否100%存在 | 说明 |
|---|---|---|---|
| userId | string | ✅ | 用户ID |
| nick | string | ✅ | 昵称 |
| name | string | ✅ | 同 nick |
| role | owner | admin | member | unknown | ✅ | 群成员身份 |
| card | string | 群名片 | |
| area | string | 地区 | |
| level | number | 成员等级 | |
| title | string | 专属头衔 | |
| sex | string | 性别 | |
| age | number | 年龄 | |
| uid | string | QQ场景专属 | |
| uin | number | QQ场景专属 |
guild
同 group
direct
同 friend
groupTemp
同 group
快速构造
import { sender } from 'node-karin'
const age = 18
const uid = '1234567890'
const uin = 1234567890
const friend = sender.friend('用户ID', '用户昵称', '性别', age, uid, uin)
const group = sender.group({
userId: '用户ID',
role: '身份',
name: '名称',
sex: '性别',
age,
card: '群名片',
area: '地区',
level: 1,
title: '专属头衔',
uid,
uin,
})
const guild = sender.guild('频道ID', '身份', '昵称', '性别', age)
const direct = sender.direct('用户ID', '昵称', '性别', age, uid, uin)
const groupTemp = sender.groupTemp('用户ID', '昵称', '性别', age, uid, uin)快速回复源函数
提示
此函数需要非常标准的参数,不建议任何人使用,在未来可能被移除。
import { karin, segment } from 'node-karin'
export const demo = karin.command('demo', async (ctx) => {
// 只接受这种传参
ctx.srcReply([
segment.text('你好'),
segment.image('https://example.com/image.png'),
segment.video('https://example.com/video.mp4'),
])
})快速回复
提示
更宽松的快速回复,适用于任何场景
import { karin, segment } from 'node-karin'
export const demo = karin.command('demo', async (ctx) => {
ctx.reply('string') // string
ctx.reply(segment.text('string')) // 单个消息段
ctx.reply([ // 多个字符串、消息段混合
'string',
segment.text('string'),
segment.image('string'),
])
// 发送消息选项
ctx.reply('string', {
at: true, // 是否@发送者
reply: true, // 是否引用回复发送者
recallMsg: 1000, // 消息发送成功后撤回消息时间 默认为0不撤回
retryCount: 3, // 重试次数 默认为0
})
})快速回复消息选项
| 参数 | 类型 | 说明 |
|---|---|---|
| at | boolean | 是否@发送者 |
| reply | boolean | 是否引用回复发送者 |
| recallMsg | number | 消息发送成功后撤回消息时间 默认为0不撤回 |
| retryCount | number | 重试次数 默认为0 |
返回结果
export interface SendMsgResults {
/** 消息ID */
messageId: string
/** 消息发送时间戳 */
time: number
/** 原始结果 一般是Object、Array */
rawData: any
/** @deprecated 已废弃 请使用 `messageId` */
message_id: string
/** @deprecated 已废弃 请使用 `time` */
messageTime: number
}types
import type { SendMessage } from 'node-karin'
export interface SendMsgResults {
/** 消息ID */
messageId: string
/** 消息发送时间戳 */
time: number
/** 原始结果 一般是Object、Array */
rawData: any
/** @deprecated 已废弃 请使用 `messageId` */
message_id: string
/** @deprecated 已废弃 请使用 `time` */
messageTime: number
}
/** 快速回复函数 */
export type Reply = (
/** 发送的消息 */
elements: SendMessage,
/** 发送消息选项 */
options?: {
/** 是否@发送者 */
at?: boolean
/** 是否引用回复发送者 */
reply?: boolean
/** 撤回消息时间 默认为0不撤回 */
recallMsg?: number
/** 重试次数 默认为0 */
retryCount?: number
}
) => Promise<SendMsgResults> | SendMsgResults权限检查
提示
使用 hasPermission 函数,你无需关注事件场景、角色身份即可快速进行权限检查。
import { karin } from 'node-karin'
export const demo = karin.command('demo', async (ctx) => {
// 判断一个用户是否为群管理员
if (ctx.hasPermission('group.admin', true)) {
// 在这个例子中,如果这个触发事件的用户是 master、admin、group.admin 其中之一,那么都会返回 true
}
// 判断一个用户是否为群管理员
if (ctx.hasPermission('group.admin', false)) {
// 在这个例子中,触发事件的用户必须是 group.admin 才能返回 true
}
// 在非群聊场景下,判断group.owner
if (ctx.hasPermission('group.owner', true)) {
// 在这个例子中,永远都会返回 false,因为非群聊场景下没有群主,对应其他场景也是一样
}
})| 参数 | 类型 | 说明 |
|---|---|---|
| role | Role | 权限角色 |
| isUpper | boolean | 是否向上检查 例如admin向上检查到master 默认true |
Role
all: 所有人master: 所有者admin: 管理员group.owner: 群主group.admin: 群管理guild.owner: 频道主guild.admin: 频道管理
store
提示
store 是一个 Map 对象,你可以通过 ctx.store.get 和 ctx.store.set 来获取和设置值,这对于需要跨插件共享数据非常有用。
import { karin } from 'node-karin'
const key = 'mihoyo-uid'
export const demo = karin.command('demo', async (ctx, next) => {
ctx.store.set(key, '1234567890')
next()
})
export const demo2 = karin.command('demo', async (ctx) => {
const value = ctx.store.get(key)
ctx.reply(value)
})适配器实例
提示
ctx.bot 是适配器实例的引用,用于在当前事件中快速调用适配器实例的方法。
import { karin, segment } from 'node-karin'
export const demo = karin.command('demo', async (ctx) => {
ctx.bot.sendMsg(ctx.contact, [
segment.text('你好')
])
})更多API请参考 适配器文档


