• 0 票 - 平均分 0
  • 1
  • 2
  • 3
  • 4
  • 5
[插件] kook-connect
#1
samp-kook-connector 插件 Wiki

将 Kook 机器人集成到你的 SA-MP / open.mp 服务器游戏模式中。

下载地址:siwode1/samp-kook-connect: SA:MP 插件用于控制 Kook bot (github.com)



目录

  1. 安装
  2. 重要说明
  3. Natives(原生函数)
  4. Callbacks(回调函数)



1. 安装

1.1 创建 Kook 机器人

  1. 访问 https://developer.kookapp.cn/
  2. 创建一个新的应用 / 机器人
  3. 输入机器人名称并完成创建
  4. 机器人连接模式选择 WEBSOCKET
  5. 从机器人设置页面获取你的 机器人令牌(Bot Token)
  6. 通过开发者门户或邀请链接,将机器人邀请到你的服务器

1.2 配置令牌

SA-MP(server.cfg):
代码:
kook_bot_token YOUR_BOT_TOKEN_HERE

open.mp(config.json):
代码:
"kook": {
        "bot_token": "token"
    }

也可以使用环境变量代替:
代码:
SAMP_KOOK_BOT_TOKEN=YOUR_BOT_TOKEN_HERE

引用:注意事项:
  • 永远不要将机器人令牌分享给任何人
  • 确保服务器时钟定期同步,否则速率限制器将无法正常工作,机器人可能会被封禁
  • 此插件专为 open.mp (OMP) 服务器设计



2. 重要说明

引用:关于 Kook ID 与内部 ID:
Kook ID 是一个很大的数字,无法放入 PAWN 的 32 位整数中。因此插件采用两套 ID 体系:
  • Kook ID:Kook 平台使用的真实 ID,必须以字符串形式传递
  • 内部 ID:插件内部使用的整数索引,通过 KCC_Find* / KCC_Get* 系列函数获取

你的脚本只需持有内部 ID(索引),插件会在内部维护与真实 ID 的映射关系。

引用:关于发送私信:
向用户发送私信需要两步:
  1. 调用 KCC_CreatePrivateChannel(user, "回调函数名") 打开私信频道
  2. 在回调函数中调用 KCC_GetCreatedPrivateChannel() 获取频道 ID
  3. 使用该频道 ID 调用 KCC_SendChannelMessage 等频道函数发送消息



3. Natives(原生函数)

3.1 频道

KOOK_FindChannelById
代码:
KOOK_FindChannelById(const channel_id[])
通过 Kook ID 查找频道,返回带 KCC_Channel 标签的内部 ID。

KCC_GetChannelId
代码:
KCC_GetChannelId(KCC_Channel:channel, dest[DCC_ID_SIZE], max_size = sizeof dest)
获取频道的 Kook ID,以文本形式存入 dest

KCC_GetChannelType
代码:
KCC_GetChannelType(KCC_Channel:channel, &KCC_ChannelType:type)
获取频道类型,存入 type

KCC_GetChannelGuild
代码:
KCC_GetChannelGuild(KCC_Channel:channel, &KCC_Guild:guild)
获取频道所属服务器,存入 guild

KCC_GetChannelName
代码:
KCC_GetChannelName(KCC_Channel:channel, dest[], max_size = sizeof dest)
获取频道名称,存入 dest

KCC_GetChannelTopic
代码:
KCC_GetChannelTopic(KCC_Channel:channel, dest[], max_size = sizeof dest)
获取频道主题,存入 dest

KCC_GetChannelPosition
代码:
KCC_GetChannelPosition(KCC_Channel:channel, &position)
获取频道排列位置,存入 position

KCC_SendChannelMessage
代码:
KCC_SendChannelMessage(KCC_Channel:channel, const message[], const callback[] = "", const format[] = "", {Float, _}:...)
向指定频道发送消息。callback(可选)为消息发送确认后调用的公共函数,format 及后续参数为回调参数。

KCC_SetChannelName
代码:
KCC_SetChannelName(KCC_Channel:channel, const name[])
修改频道名称。

KCC_SetChannelTopic
代码:
KCC_SetChannelTopic(KCC_Channel:channel, const topic[])
修改频道主题。

KCC_DeleteChannel
代码:
KCC_DeleteChannel(KCC_Channel:channel)
删除指定频道。



3.2 消息

KCC_GetMessageId
代码:
KCC_GetMessageId(KCC_Message:message, dest[KCC_ID_SIZE], max_size = KCC_ID_SIZE)
获取消息的 Kook ID,存入 dest

KCC_GetMessageChannel
代码:
KCC_GetMessageChannel(KCC_Message:message, &KCC_Channel:channel)
获取消息所在频道,存入 channel

KCC_GetMessageAuthor
代码:
KCC_GetMessageAuthor(KCC_Message:message, &KCC_User:author)
获取消息发送者,存入 author

KCC_GetMessageContent
代码:
KCC_GetMessageContent(KCC_Message:message, dest[], max_size = sizeof dest)
获取消息文本内容,存入 dest

KCC_IsMessageMentioningEveryone
代码:
KCC_IsMessageMentioningEveryone(KCC_Message:message, &bool:mentions_everyone)
检查消息是否 @全体成员。

KCC_GetMessageUserMentionCount
代码:
KCC_GetMessageUserMentionCount(KCC_Message:message, &mentioned_user_count)
获取消息中提及的用户数量。

KCC_GetMessageUserMention
代码:
KCC_GetMessageUserMention(KCC_Message:message, offset, &KCC_User:mentioned_user)
按索引获取消息中提及的某个用户。

KCC_GetMessageRoleMentionCount
代码:
KCC_GetMessageRoleMentionCount(KCC_Message:message, &mentioned_role_count)
获取消息中提及的身份组数量。

KCC_GetMessageRoleMention
代码:
KCC_GetMessageRoleMention(KCC_Message:message, offset, &KCC_Role:mentioned_role)
按索引获取消息中提及的某个身份组。

KCC_DeleteMessage
代码:
KCC_DeleteMessage(KCC_Message:message)
在 Kook 上删除该消息。

KCC_GetCreatedMessage
代码:
KCC_GetCreatedMessage()
KCC_SendChannelMessage 的回调中使用,返回刚发送的消息的内部 ID(带 KCC_Message 标签)。

KCC_DeleteInternalMessage
代码:
KCC_DeleteInternalMessage(KCC_Message:message)
从插件内部存储中移除该消息(不会在 Kook 上删除消息),用于持久化消息的清理。

KCC_EditMessage
代码:
KCC_EditMessage(KCC_Message:message, const content[], KCC_Embed:embed = KCC_Embed:0)
编辑消息内容,可选附带嵌入消息。

KCC_SetMessagePersistent
代码:
KCC_SetMessagePersistent(KCC_Message:message, bool:persistent)
设置消息是否持久保存在插件内部存储中。

KCC_CacheChannelMessage
代码:
KCC_CacheChannelMessage(const channel_id[DCC_ID_SIZE], const message_id[DCC_ID_SIZE], const callback[] = "", const format[] = "", {Float, _}:...)
通过 Kook ID 将指定消息缓存到插件中,缓存完成后调用 callback



3.3 用户

引用:用户的 discriminator 是附加在 Kook 用户名后的 4 位数字标识。

KCC_FindUserByName
代码:
KCC_FindUserByName(const user_name[], const user_discriminator[])
通过用户名 + discriminator 查找用户,返回带 KCC_User 标签的内部 ID。

KCC_FindUserById
代码:
KCC_FindUserById(const user_id[])
通过 Kook ID 查找用户,返回带 KCC_User 标签的内部 ID。

KCC_GetUserId
代码:
KCC_GetUserId(KCC_User:user, dest[DCC_ID_SIZE], max_size = DCC_ID_SIZE)
获取用户的 Kook ID,存入 dest

KCC_GetUserName
代码:
KCC_GetUserName(KCC_User:user, dest[DCC_USERNAME_SIZE], max_size = sizeof dest)
获取用户名,存入 dest

KCC_GetUserDiscriminator
代码:
KCC_GetUserDiscriminator(KCC_User:user, dest[], max_size = DCC_ID_SIZE)
获取用户的 discriminator,存入 dest

KCC_IsUserBot
代码:
KCC_IsUserBot(KCC_User:user, &bool:is_bot)
检查用户是否为机器人。

KCC_IsUserVerified
代码:
KCC_IsUserVerified(KCC_User:user, &bool:is_verified)
检查用户是否已完成验证。



3.4 身份组

引用:dest 字符串大小必须为 DCC_ID_SIZE。

KCC_FindRoleByName
代码:
KCC_FindRoleByName(KCC_Guild:guild, const role_name[])
在指定服务器中按名称查找身份组,返回带 KCC_Role 标签的内部 ID。

KCC_FindRoleById
代码:
KCC_FindRoleById(const role_id[])
通过 Kook ID 查找身份组,返回带 KCC_Role 标签的内部 ID。

KCC_GetRoleId
代码:
KCC_GetRoleId(KCC_Role:role, dest[DCC_ID_SIZE], max_size = sizeof dest)
获取身份组的 Kook ID,存入 dest

KCC_GetRoleName
代码:
KCC_GetRoleName(KCC_Role:role, dest[], max_size = sizeof dest)
获取身份组名称,存入 dest

KCC_GetRoleColor
代码:
KCC_GetRoleColor(KCC_Role:role, &color)
获取身份组颜色值,存入 color

KCC_GetRolePermissions
代码:
KCC_GetRolePermissions(KCC_Role:role, &perm_high, &perm_low)
获取身份组权限(64 位整数分为高低两个 32 位部分)。

KCC_IsRoleHoist
代码:
KCC_IsRoleHoist(KCC_Role:role, &bool:is_hoist)
检查身份组是否在成员列表中单独显示(提升显示)。

KCC_GetRolePosition
代码:
KCC_GetRolePosition(KCC_Role:role, &position)
获取身份组的排列位置,存入 position

KCC_IsRoleMentionable
代码:
KCC_IsRoleMentionable(KCC_Role:role, &bool:is_mentionable)
检查身份组是否可被 @ 提及。



3.5 服务器

引用:dest 字符串大小必须为 DCC_ID_SIZE。

— 查询 —

KCC_FindGuildByName
代码:
KCC_FindGuildByName(const guild_name[])
按名称查找服务器,返回带 KCC_Guild 标签的内部 ID。

KCC_FindGuildById
代码:
KCC_FindGuildById(const guild_id[])
通过 Kook ID 查找服务器,返回带 KCC_Guild 标签的内部 ID。

KCC_GetGuildId
代码:
KCC_GetGuildId(KCC_Guild:guild, dest[DCC_ID_SIZE], max_size = sizeof dest)
获取服务器的 Kook ID,存入 dest

KCC_GetGuildName
代码:
KCC_GetGuildName(KCC_Guild:guild, dest[], max_size = sizeof dest)
获取服务器名称,存入 dest

KCC_GetGuildOwnerId
代码:
KCC_GetGuildOwnerId(KCC_Guild:guild, dest[DCC_ID_SIZE], max_size = sizeof dest)
获取服务器所有者的 Kook 用户 ID,存入 dest

KCC_GetAllGuilds
代码:
KCC_GetAllGuilds(KCC_Guild:dest[], max_size = sizeof dest)
获取所有服务器的内部 ID,存入 dest 数组。

— 频道 —

KCC_GetGuildChannel
代码:
KCC_GetGuildChannel(KCC_Guild:guild, offset, &KCC_Channel:channel)
按索引获取服务器中的某个频道。

KCC_GetGuildChannelCount
代码:
KCC_GetGuildChannelCount(KCC_Guild:guild, &count)
获取服务器的频道总数。

KCC_CreateGuildChannel
代码:
KCC_CreateGuildChannel(KCC_Guild:guild, const name[], DCC_ChannelType:type, const callback[] = "", const format[] = "", {Float, _}:...)
在服务器中创建新频道,完成后调用 callback

KCC_GetCreatedGuildChannel
代码:
KCC_GetCreatedGuildChannel()
KCC_CreateGuildChannel 的回调中使用,返回新创建频道的内部 ID。

— 成员 —

KCC_GetGuildMember
代码:
KCC_GetGuildMember(KCC_Guild:guild, offset, &KCC_User:user)
按索引获取服务器中的某个成员。

KCC_GetGuildMemberCount
代码:
KCC_GetGuildMemberCount(KCC_Guild:guild, &count)
获取服务器成员总数。

KCC_GetGuildMemberVoiceChannel
代码:
KCC_GetGuildMemberVoiceChannel(KCC_Guild:guild, KCC_User:user, &KCC_Channel:channel)
获取成员当前所在的语音频道。

KCC_GetGuildMemberNickname
代码:
KCC_GetGuildMemberNickname(KCC_Guild:guild, KCC_User:user, dest[DCC_NICKNAME_SIZE], max_size = sizeof dest)
获取成员在服务器中的昵称。

KCC_GetGuildMemberRole
代码:
KCC_GetGuildMemberRole(KCC_Guild:guild, KCC_User:user, offset, &KCC_Role:role)
按索引获取成员拥有的某个身份组。

KCC_GetGuildMemberRoleCount
代码:
KCC_GetGuildMemberRoleCount(KCC_Guild:guild, KCC_User:user, &count)
获取成员拥有的身份组数量。

KCC_HasGuildMemberRole
代码:
KCC_HasGuildMemberRole(KCC_Guild:guild, KCC_User:user, KCC_Role:role, &bool:has_role)
检查成员是否拥有指定身份组。

KCC_SetGuildMemberNickname
代码:
KCC_SetGuildMemberNickname(KCC_Guild:guild, KCC_User:user, const nickname[])
修改成员昵称。

KCC_AddGuildMemberRole
代码:
KCC_AddGuildMemberRole(KCC_Guild:guild, KCC_User:user, KCC_Role:role)
为成员添加身份组。

KCC_RemoveGuildMemberRole
代码:
KCC_RemoveGuildMemberRole(KCC_Guild:guild, KCC_User:user, KCC_Role:role)
移除成员的某个身份组。

KCC_RemoveGuildMember
代码:
KCC_RemoveGuildMember(KCC_Guild:guild, KCC_User:user)
踢出服务器成员。

KCC_CreateGuildMemberBan
代码:
KCC_CreateGuildMemberBan(KCC_Guild:guild, KCC_User:user, const reason[] = "")
封禁成员,可附带原因。

KCC_RemoveGuildMemberBan
代码:
KCC_RemoveGuildMemberBan(KCC_Guild:guild, KCC_User:user)
解封成员。

— 身份组管理 —

KCC_GetGuildRole
代码:
KCC_GetGuildRole(KCC_Guild:guild, offset, &KCC_Role:role)
按索引获取服务器中的某个身份组。

KCC_GetGuildRoleCount
代码:
KCC_GetGuildRoleCount(KCC_Guild:guild, &count)
获取服务器的身份组总数。

KCC_CreateGuildRole
代码:
KCC_CreateGuildRole(KCC_Guild:guild, const name[], const callback[] = "", const format[] = "", {Float, _}:...)
在服务器中创建新身份组,完成后调用 callback

KCC_GetCreatedGuildRole
代码:
KCC_GetCreatedGuildRole()
KCC_CreateGuildRole 的回调中使用,返回新创建身份组的内部 ID。

KCC_DeleteGuildRole
代码:
KCC_DeleteGuildRole(KCC_Guild:guild, KCC_Role:role)
删除服务器中的身份组。

KCC_SetGuildRoleName
代码:
KCC_SetGuildRoleName(KCC_Guild:guild, KCC_Role:role, const name[])
修改身份组名称。

KCC_SetGuildRolePermissions
代码:
KCC_SetGuildRolePermissions(KCC_Guild:guild, KCC_Role:role, perm_high, perm_low)
修改身份组权限(64 位整数分为高低两个 32 位部分)。

KCC_SetGuildRoleColor
代码:
KCC_SetGuildRoleColor(KCC_Guild:guild, KCC_Role:role, color)
修改身份组颜色。

KCC_SetGuildRoleHoist
代码:
KCC_SetGuildRoleHoist(KCC_Guild:guild, KCC_Role:role, bool:hoist)
设置身份组是否在成员列表中单独显示。

KCC_SetGuildRoleMentionable
代码:
KCC_SetGuildRoleMentionable(KCC_Guild:guild, KCC_Role:role, bool:mentionable)
设置身份组是否可被 @ 提及。



3.6 机器人

KCC_CreatePrivateChannel
代码:
KCC_CreatePrivateChannel(KCC_User:user, const callback[], const format[] = "", {Float, _}:...)
向指定用户打开私信频道,完成后调用 callback

KCC_GetCreatedPrivateChannel
代码:
KCC_GetCreatedPrivateChannel()
KCC_CreatePrivateChannel 的回调中使用,返回私信频道的内部 ID(可直接用于 KCC_SendChannelMessage 等函数)。



3.7 嵌入消息

嵌入消息(Embed)允许向 Kook 频道发送富文本内容消息。

KCC_CreateEmbed
代码:
KCC_CreateEmbed(const title[] = "", const description[] = "", const url[] = "", const timestamp[] = "", color = 0, const footer_text[] = "", const footer_icon_url[] = "", const thumbnail_url[] = "", const image_url[] = "")
创建一个嵌入消息,所有参数均为可选,返回带 KCC_Embed 标签的内部 ID。

KCC_DeleteEmbed
代码:
KCC_DeleteEmbed(KCC_Embed:embed)
删除嵌入消息。

KCC_SendChannelEmbedMessage
代码:
KCC_SendChannelEmbedMessage(KCC_Channel:channel, KCC_Embed:embed, const message[] = "", const callback[] = "", const format[] = "", {Float, _}:...)
向频道发送带嵌入消息的内容,可附带普通文字。

KCC_AddEmbedField
代码:
KCC_AddEmbedField(KCC_Embed:embed, const name[], const value[], bool:inline = false)
为嵌入消息添加字段,inlinetrue 时字段并排显示。

KCC_SetEmbedTitle
代码:
KCC_SetEmbedTitle(KCC_Embed:embed, const title[])
设置嵌入消息标题。

KCC_SetEmbedDescription
代码:
KCC_SetEmbedDescription(KCC_Embed:embed, const description[])
设置嵌入消息描述。

KCC_SetEmbedUrl
代码:
KCC_SetEmbedUrl(KCC_Embed:embed, const url[])
设置嵌入消息链接。

KCC_SetEmbedTimestamp
代码:
KCC_SetEmbedTimestamp(KCC_Embed:embed, const timestamp[])
设置嵌入消息时间戳。

KCC_SetEmbedColor
代码:
KCC_SetEmbedColor(KCC_Embed:embed, color)
设置嵌入消息左侧色条颜色。

KCC_SetEmbedFooter
代码:
KCC_SetEmbedFooter(KCC_Embed:embed, const footer_text[], const footer_icon_url[] = "")
设置嵌入消息页脚文本,可附带图标 URL。

KCC_SetEmbedThumbnail
代码:
KCC_SetEmbedThumbnail(KCC_Embed:embed, const thumbnail_url[])
设置嵌入消息缩略图。

KCC_SetEmbedImage
代码:
KCC_SetEmbedImage(KCC_Embed:embed, const image_url[])
设置嵌入消息主图片。



3.8 表情

引用:dest 字符串大小必须为 DCC_EMOJI_NAME_SIZE

KCC_CreateEmoji
代码:
KCC_CreateEmoji(const name[DCC_EMOJI_NAME_SIZE], const snowflake[DCC_ID_SIZE] = "")
创建一个表情对象,snowflake 为可选的 Kook 雪花 ID,返回带 KCC_Emoji 标签的内部 ID。

KCC_DeleteEmoji
代码:
KCC_DeleteEmoji(KCC_Emoji:emoji)
删除表情对象。

KCC_GetEmojiName
代码:
KCC_GetEmojiName(KCC_Emoji:emoji, dest[DCC_EMOJI_NAME_SIZE], maxlen = DCC_EMOJI_NAME_SIZE)
获取表情名称,存入 dest



3.9 反应

KCC_CreateReaction
代码:
KCC_CreateReaction(KCC_Message:message, KCC_Emoji:reaction_emoji)
对指定消息添加表情反应。

KCC_DeleteMessageReaction
代码:
KCC_DeleteMessageReaction(KCC_Message:message, KCC_Emoji:reaction_emoji = KCC_Emoji:0)
移除消息上的表情反应。reaction_emoji 为 0(默认)时删除该消息上的所有反应。



3.10 其他

KCC_EscapeMarkdown
代码:
KCC_EscapeMarkdown(const src[], dest[], max_size = sizeof dest)
对字符串中的 Markdown 特殊字符进行转义,使文本在 Kook 消息中原样显示,不被格式化。



4. Callbacks(回调函数)

4.1 频道回调

KCC_OnChannelCreate
代码:
public KCC_OnChannelCreate(KCC_Channel:channel)
触发时机:服务器中有新频道创建时。

KCC_OnChannelUpdate
代码:
public KCC_OnChannelUpdate(KCC_Channel:channel)
触发时机:频道信息更新时(名称、权限等)。

KCC_OnChannelDelete
代码:
public KCC_OnChannelDelete(KCC_Channel:channel)
触发时机:频道被删除时。



4.2 消息回调

KCC_OnMessageCreate
代码:
public KCC_OnMessageCreate(KCC_Message:message)
触发时机:频道中有新消息发送时。

KCC_OnMessageDelete
代码:
public KCC_OnMessageDelete(KCC_Message:message)
触发时机:消息被删除时。

KCC_OnMessageReaction
代码:
public KCC_OnMessageReaction(KCC_Message:message, KCC_User:reaction_user, KCC_Emoji:emoji, DCC_MessageReactionType:reaction_type)
触发时机:消息添加或移除表情反应时。
  • message:消息内部 ID
  • reaction_user:操作反应的用户内部 ID
  • emoji:使用的表情内部 ID
  • reaction_type:反应事件类型(添加 / 移除等)



4.3 用户回调

KCC_OnUserUpdate
代码:
public KCC_OnUserUpdate(KCC_User:user)
触发时机:用户资料更新时(用户名、头像等)。



4.4 服务器回调

KCC_OnGuildCreate
代码:
public KCC_OnGuildCreate(KCC_Guild:guild)
触发时机:服务器创建,或机器人加入新服务器时。

KCC_OnGuildUpdate
代码:
public KCC_OnGuildUpdate(KCC_Guild:guild)
触发时机:服务器信息更新时(名称、图标等)。

KCC_OnGuildDelete
代码:
public KCC_OnGuildDelete(KCC_Guild:guild)
触发时机:服务器删除,或机器人离开服务器时。

KCC_OnGuildMemberAdd
代码:
public KCC_OnGuildMemberAdd(KCC_Guild:guild, KCC_User:user)
触发时机:用户加入服务器时。

KCC_OnGuildMemberUpdate
代码:
public KCC_OnGuildMemberUpdate(KCC_Guild:guild, KCC_User:user)
触发时机:成员信息更新时(昵称、身份组等)。

KCC_OnGuildMemberVoiceUpdate
代码:
public KCC_OnGuildMemberVoiceUpdate(KCC_Guild:guild, KCC_User:user, KCC_Channel:channel)
触发时机:成员语音状态变化时(加入 / 离开语音频道)。
  • channel:语音频道内部 ID,用户离开语音时该值可能无效

KCC_OnGuildMemberRemove
代码:
public KCC_OnGuildMemberRemove(KCC_Guild:guild, KCC_User:user)
触发时机:用户离开或被踢出服务器时。

KCC_OnGuildRoleCreate
代码:
public KCC_OnGuildRoleCreate(KCC_Guild:guild, KCC_Role:role)
触发时机:服务器中创建新身份组时。

KCC_OnGuildRoleUpdate
代码:
public KCC_OnGuildRoleUpdate(KCC_Guild:guild, KCC_Role:role)
触发时机:服务器身份组更新时(名称、颜色、权限等)。

KCC_OnGuildRoleDelete
代码:
public KCC_OnGuildRoleDelete(KCC_Guild:guild, KCC_Role:role)
触发时机:服务器身份组被删除时。
  回复
#2
KOOK 命令简单教程

这个教程演示如何在服务器里添加一个简单的 KOOK 指令。

一、设置命令前缀

如果希望 KOOK 指令使用 / 开头,需要在 include kook-cmd.inc 之前定义 KCMD_PREFIX:

代码:
#define KCMD_PREFIX '/'
#include "include/kook-connector.inc"
#include "include/kook-cmd.inc"

注意:
kook-cmd.inc 识别的是 KCMD_PREFIX,不是 KOOK_COMMAND_PREFIX。

二、创建一个简单指令

例如创建 /ping 指令:

代码:
KCMD:ping(user, channel, params[])
{
    KCC_SendChannelMessage(channel, "pong");
    return 1;
}

在 KOOK 频道输入:

代码:
/ping

机器人会回复:

代码:
pong

三、创建一个带参数的指令

例如创建 /say 指令:

代码:
KCMD:say(user, channel, params[])
{
    if(isnull(params))
        return KCC_SendChannelMessage(channel, "用法: /say [内容]");

    KCC_SendChannelMessage(channel, params);
    return 1;
}

在 KOOK 频道输入:

代码:
/say 你好

机器人会回复:

代码:
你好

四、获取发送者名字

代码:
KCMD:whoami(user, channel, params[])
{
    new username[KCC_USERNAME_SIZE];
    KCC_GetUserName(user, username, sizeof(username));

    KCC_SendChannelMessage(channel, sprintf("你是: %s", username));
    return 1;
}

在 KOOK 频道输入:

代码:
/whoami

机器人会回复你的 KOOK 用户名。

五、KCMD 参数说明

代码:
KCMD:命令名(user, channel, params[])
{
    return 1;
}

user:
发送 KOOK 指令的用户。

channel:
发送指令的 KOOK 频道。

params:
指令后面的内容。

例如:

代码:
/say hello

其中 /say 是命令,hello 是 params。

六、常用发送消息方法

发送普通文字:

代码:
KCC_SendChannelMessage(channel, "消息内容");

发送变量内容:

代码:
KCC_SendChannelMessage(channel, params);

发送格式化内容:

代码:
KCC_SendChannelMessage(channel, sprintf("你好,%s", username));

七、简单总结

添加 KOOK 指令只需要写:

代码:
KCMD:指令名(user, channel, params[])
{
    // 你的代码
    return 1;
}

例如:

代码:
KCMD:test(user, channel, params[])
{
    KCC_SendChannelMessage(channel, "测试成功");
    return 1;
}

KOOK 输入:

代码:
/test

机器人回复:

代码:
测试成功
  回复
#3
指定频道发送消息

KOOK 指令默认可以回复到当前频道,也可以发送到指定频道。

1. 回复当前频道

玩家在哪个 KOOK 频道输入指令,机器人就回复到哪个频道:

代码:
KCMD:ping(user, channel, params[])
{
    KCC_SendChannelMessage(channel, "pong");
    return 1;
}

KOOK 输入:

代码:
/ping

机器人会在当前频道回复:

代码:
pong

2. 发送到指定频道

如果想让机器人把消息发送到固定频道,可以使用频道 ID:

代码:
KCMD:test(user, channel, params[])
{
    new KCC_Channel:targetChannel = KCC_FindChannelById("你的频道ID");

    KCC_SendChannelMessage(targetChannel, "这条消息会发送到指定频道");
    return 1;
}

这样无论 /test 在哪个频道执行,消息都会发送到指定频道。

3. 游戏内主动发送 KOOK 日志

也可以写成一个 stock,方便游戏系统调用:

代码:
stock SendMyKookLog(const message[])
{
    new KCC_Channel:targetChannel = KCC_FindChannelById("你的频道ID");

    KCC_SendChannelMessage(targetChannel, message);
    return 1;
}

使用示例:

代码:
SendMyKookLog("服务器启动完成。");

4. 限制指令只能在指定频道使用

如果不希望某个指令在所有频道都能用,可以判断当前频道 ID:

代码:
KCMD:players(user, channel, params[])
{
    new currentId[KCC_ID_SIZE];
    KCC_GetChannelId(channel, currentId, sizeof(currentId));

    if(strcmp(currentId, "允许使用的频道ID", false) != 0)
    {
        KCC_SendChannelMessage(channel, "这个指令只能在指定频道使用。");
        return 1;
    }

    KCC_SendChannelMessage(channel, "指令执行成功。");
    return 1;
}

这样只有在指定频道输入:

代码:
/players

指令才会真正执行。

5. 说明

代码:
KCC_FindChannelById("频道ID")

用于获取指定 KOOK 频道。

代码:
KCC_SendChannelMessage(channel, "消息")

用于向某个频道发送普通文字消息。

代码:
KCC_GetChannelId(channel, currentId, sizeof(currentId))

用于获取当前频道的 ID,常用于判断指令是否来自指定频道。
  回复
#4
KOOK Connector 常用函数教程

本教程只讲 kook-connector.inc 里的 KCC 函数,不讲 KCMD 指令系统。

一、发送消息到指定频道

先通过频道 ID 找到频道:

代码:
new KCC_Channel:channel = KCC_FindChannelById("你的频道ID");

然后发送消息:

代码:
KCC_SendChannelMessage(channel, "服务器启动完成。");

完整例子:

代码:
stock SendKookServerMessage()
{
    new KCC_Channel:channel = KCC_FindChannelById("你的频道ID");

    KCC_SendChannelMessage(channel, "服务器启动完成。");
    return 1;
}

二、封装一个发送日志函数

代码:
stock KCC_SendServerLog(const msg[])
{
    new KCC_Channel:channel = KCC_FindChannelById("你的频道ID");

    KCC_SendChannelMessage(channel, msg);
    return 1;
}

使用:

代码:
KCC_SendServerLog("管理员执行了一个操作。");

三、发送格式化消息

使用 Pawn 自带的 format:

代码:
stock KCC_SendPlayerJoinLog(playerid)
{
    new name[MAX_PLAYER_NAME + 1];
    new message[128];

    GetPlayerName(playerid, name, sizeof(name));

    format(message, sizeof(message), "玩家 %s 加入了服务器。", name);

    new KCC_Channel:channel = KCC_FindChannelById("你的频道ID");
    KCC_SendChannelMessage(channel, message);

    return 1;
}

四、发送 Embed 卡片消息

创建一个 Embed:

代码:
new KCC_Embed:embed = KCC_CreateEmbed(
    "标题",
    "内容",
    "",
    "",
    0x6495ED,
    "页脚",
    "",
    "",
    ""
);

发送 Embed:

代码:
KCC_SendChannelEmbedMessage(channel, embed);

完整例子:

代码:
stock KCC_SendServerEmbedLog(const title[], const msg[])
{
    new KCC_Channel:channel = KCC_FindChannelById("你的频道ID");

    new KCC_Embed:embed = KCC_CreateEmbed(
        title,
        msg,
        "",
        "",
        0x6495ED,
        "页脚文字",
        "",
        "",
        ""
    );

    KCC_SendChannelEmbedMessage(channel, embed);
    return 1;
}

五、给 Embed 添加字段

代码:
stock KCC_SendServerInfo()
{
    new KCC_Channel:channel = KCC_FindChannelById("你的频道ID");

    new KCC_Embed:embed = KCC_CreateEmbed(
        "服务器信息",
        "服务器当前运行正常。",
        "",
        "",
        0x6495ED,
        "页脚文字",
        "",
        "",
        ""
    );

    KCC_AddEmbedField(embed, "服务器地址", "`127.0.0.1:7777`", true);
    KCC_AddEmbedField(embed, "在线状态", "正常", true);

    KCC_SendChannelEmbedMessage(channel, embed);
    return 1;
}

六、获取频道信息

获取频道 ID:

代码:
new channelId[KCC_ID_SIZE];
KCC_GetChannelId(channel, channelId, sizeof(channelId));

获取频道名称:

代码:
new channelName[64];
KCC_GetChannelName(channel, channelName, sizeof(channelName));

完整例子:

代码:
stock KCC_PrintChannelInfo()
{
    new KCC_Channel:channel = KCC_FindChannelById("你的频道ID");

    new channelId[KCC_ID_SIZE];
    new channelName[64];

    KCC_GetChannelId(channel, channelId, sizeof(channelId));
    KCC_GetChannelName(channel, channelName, sizeof(channelName));

    printf("[KOOK] Channel: %s (%s)", channelName, channelId);
    return 1;
}

七、获取用户信息

如果你在 KOOK 消息回调里拿到了 user,可以这样获取用户名:

代码:
new username[KCC_USERNAME_SIZE];
KCC_GetUserName(user, username, sizeof(username));

获取用户 ID:

代码:
new userId[KCC_ID_SIZE];
KCC_GetUserId(user, userId, sizeof(userId));

八、接收 KOOK 消息

kook-connector.inc 提供消息创建回调:

代码:
public KCC_OnMessageCreate(KCC_Message:message)
{
    new content[256];
    new reply[300];
    new username[KCC_USERNAME_SIZE];
    new KCC_User:user;
    new KCC_Channel:channel;

    KCC_GetMessageContent(message, content, sizeof(content));
    KCC_GetMessageAuthor(message, user);
    KCC_GetMessageChannel(message, channel);
    KCC_GetUserName(user, username, sizeof(username));

    format(reply, sizeof(reply), "%s 发送了: %s", username, content);
    KCC_SendChannelMessage(channel, reply);

    return 1;
}

注意:
如果项目已经使用 kook-cmd.inc,它也会 hook KCC_OnMessageCreate。多个系统同时使用这个回调时,需要注意 hook 顺序。

九、删除 KOOK 消息

如果在回调里拿到了 message,可以删除这条 KOOK 消息:

代码:
KCC_DeleteMessage(message);

示例:

代码:
public KCC_OnMessageCreate(KCC_Message:message)
{
    new content[256];
    KCC_GetMessageContent(message, content, sizeof(content));

    if(!strcmp(content, "delete", true))
    {
        KCC_DeleteMessage(message);
    }

    return 1;
}

十、编辑消息

如果你拿到了 KCC_Message,可以编辑它:

代码:
KCC_EditMessage(message, "新的消息内容");

十一、查找用户

通过 KOOK 用户 ID 查找用户:

代码:
new KCC_User:user = KCC_FindUserById("用户ID");

通过用户名查找用户:

代码:
new KCC_User:user = KCC_FindUserByName("用户名", "0000");

十二、查找服务器

通过服务器 ID:

代码:
new KCC_Guild:guild = KCC_FindGuildById("服务器ID");

通过服务器名称:

代码:
new KCC_Guild:guild = KCC_FindGuildByName("服务器名称");

十三、获取服务器信息

代码:
stock KCC_PrintGuildInfo()
{
    new KCC_Guild:guild = KCC_FindGuildById("服务器ID");

    new guildId[KCC_ID_SIZE];
    new guildName[64];

    KCC_GetGuildId(guild, guildId, sizeof(guildId));
    KCC_GetGuildName(guild, guildName, sizeof(guildName));

    printf("[KOOK] Guild: %s (%s)", guildName, guildId);
    return 1;
}

十四、常用函数总结

发送频道消息:

代码:
KCC_SendChannelMessage(channel, "内容");

查找频道:

代码:
KCC_FindChannelById("频道ID");

创建 Embed:

代码:
KCC_CreateEmbed("标题", "内容", "", "", 0x6495ED, "页脚", "", "", "");

发送 Embed:

代码:
KCC_SendChannelEmbedMessage(channel, embed);

添加 Embed 字段:

代码:
KCC_AddEmbedField(embed, "名称", "内容", true);

获取频道名称:

代码:
KCC_GetChannelName(channel, name, sizeof(name));

获取用户名称:

代码:
KCC_GetUserName(user, name, sizeof(name));

获取消息内容:

代码:
KCC_GetMessageContent(message, content, sizeof(content));

获取消息作者:

代码:
KCC_GetMessageAuthor(message, user);

获取消息频道:

代码:
KCC_GetMessageChannel(message, channel);
  回复
#5
表情与消息反应

kook-connector.inc 支持给 KOOK 消息添加表情反应。

在此处查看表情列表 受支持的表情符号列表 | Kook.Net 文档 (kooknet.dev)

注意:
你们当前源码里的表情短代码格式是:

代码:
:smile

不是:

代码:
:smile:

1. 创建表情对象

代码:
new KCC_Emoji:emoji = KCC_CreateEmoji(":smile");

如果需要指定表情 ID,可以填写第二个参数:

代码:
new KCC_Emoji:emoji = KCC_CreateEmoji(":smile", "表情ID");

2. 给消息添加反应

如果你在 KCC_OnMessageCreate 回调里拿到了 message,可以给这条消息添加反应:

代码:
public KCC_OnMessageCreate(KCC_Message:message)
{
    new KCC_Emoji:emoji = KCC_CreateEmoji(":smile");
    KCC_CreateReaction(message, emoji);
    KCC_DeleteEmoji(emoji);
    return 1;
}

3. 获取表情名称

代码:
new emojiName[KCC_EMOJI_NAME_SIZE];
KCC_GetEmojiName(emoji, emojiName, sizeof(emojiName));

4. 删除指定反应

代码:
KCC_DeleteMessageReaction(message, emoji);

5. 删除消息上的所有反应

不填写第二个参数时,会删除消息上的所有反应:

代码:
KCC_DeleteMessageReaction(message);

6. 删除表情对象

代码:
KCC_DeleteEmoji(emoji);

7. 完整示例

收到 KOOK 消息后,自动添加一个 smile 反应:

代码:
public KCC_OnMessageCreate(KCC_Message:message)
{
    new KCC_Emoji:emoji = KCC_CreateEmoji(":smile");
    KCC_CreateReaction(message, emoji);
    KCC_DeleteEmoji(emoji);
    return 1;
}
  回复


论坛跳转:


浏览此主题的用户: 1 位客人