![]() |
|
[插件] kook-connect - 打印版本 +- samp | open.mp 联机社区论坛 (https://open-mp.cn) +-- 板块: SA-MP (https://open-mp.cn/forumdisplay.php?fid=12) +--- 板块: 发布 (https://open-mp.cn/forumdisplay.php?fid=18) +---- 板块: 插件 (https://open-mp.cn/forumdisplay.php?fid=19) +---- 主题: [插件] kook-connect (/showthread.php?tid=33) |
[插件] kook-connect - siwode - 05-01-2026 samp-kook-connector 插件 Wiki 将 Kook 机器人集成到你的 SA-MP / open.mp 服务器游戏模式中。 下载地址:siwode1/samp-kook-connect: SA:MP 插件用于控制 Kook bot (github.com) 目录 1. 安装 1.1 创建 Kook 机器人
1.2 配置令牌 SA-MP(server.cfg): 代码: kook_bot_token YOUR_BOT_TOKEN_HEREopen.mp(config.json): 代码: "kook": {也可以使用环境变量代替: 代码: SAMP_KOOK_BOT_TOKEN=YOUR_BOT_TOKEN_HERE引用:注意事项: 2. 重要说明 引用:关于 Kook ID 与内部 ID: 引用:关于发送私信: 3. Natives(原生函数) 3.1 频道 KOOK_FindChannelById 代码: KOOK_FindChannelById(const channel_id[])KCC_GetChannelId 代码: KCC_GetChannelId(KCC_Channel:channel, dest[DCC_ID_SIZE], max_size = sizeof dest)KCC_GetChannelType 代码: KCC_GetChannelType(KCC_Channel:channel, &KCC_ChannelType:type)KCC_GetChannelGuild 代码: KCC_GetChannelGuild(KCC_Channel:channel, &KCC_Guild:guild)KCC_GetChannelName 代码: KCC_GetChannelName(KCC_Channel:channel, dest[], max_size = sizeof dest)KCC_GetChannelTopic 代码: KCC_GetChannelTopic(KCC_Channel:channel, dest[], max_size = sizeof dest)KCC_GetChannelPosition 代码: KCC_GetChannelPosition(KCC_Channel:channel, &position)KCC_SendChannelMessage 代码: KCC_SendChannelMessage(KCC_Channel:channel, const message[], const callback[] = "", const format[] = "", {Float, _}:...)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)KCC_GetMessageChannel 代码: KCC_GetMessageChannel(KCC_Message:message, &KCC_Channel:channel)KCC_GetMessageAuthor 代码: KCC_GetMessageAuthor(KCC_Message:message, &KCC_User:author)KCC_GetMessageContent 代码: KCC_GetMessageContent(KCC_Message:message, dest[], max_size = sizeof 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)KCC_GetCreatedMessage 代码: KCC_GetCreatedMessage()KCC_DeleteInternalMessage 代码: KCC_DeleteInternalMessage(KCC_Message:message)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, _}:...)3.3 用户 引用:用户的 discriminator 是附加在 Kook 用户名后的 4 位数字标识。 KCC_FindUserByName 代码: KCC_FindUserByName(const user_name[], const user_discriminator[])KCC_FindUserById 代码: KCC_FindUserById(const user_id[])KCC_GetUserId 代码: KCC_GetUserId(KCC_User:user, dest[DCC_ID_SIZE], max_size = DCC_ID_SIZE)KCC_GetUserName 代码: KCC_GetUserName(KCC_User:user, dest[DCC_USERNAME_SIZE], max_size = sizeof dest)KCC_GetUserDiscriminator 代码: KCC_GetUserDiscriminator(KCC_User:user, dest[], max_size = DCC_ID_SIZE)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_FindRoleById 代码: KCC_FindRoleById(const role_id[])KCC_GetRoleId 代码: KCC_GetRoleId(KCC_Role:role, dest[DCC_ID_SIZE], max_size = sizeof dest)KCC_GetRoleName 代码: KCC_GetRoleName(KCC_Role:role, dest[], max_size = sizeof dest)KCC_GetRoleColor 代码: KCC_GetRoleColor(KCC_Role:role, &color)KCC_GetRolePermissions 代码: KCC_GetRolePermissions(KCC_Role:role, &perm_high, &perm_low)KCC_IsRoleHoist 代码: KCC_IsRoleHoist(KCC_Role:role, &bool:is_hoist)KCC_GetRolePosition 代码: KCC_GetRolePosition(KCC_Role:role, &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_FindGuildById 代码: KCC_FindGuildById(const guild_id[])KCC_GetGuildId 代码: KCC_GetGuildId(KCC_Guild:guild, dest[DCC_ID_SIZE], max_size = sizeof dest)KCC_GetGuildName 代码: KCC_GetGuildName(KCC_Guild:guild, dest[], max_size = sizeof dest)KCC_GetGuildOwnerId 代码: KCC_GetGuildOwnerId(KCC_Guild:guild, dest[DCC_ID_SIZE], max_size = sizeof dest)KCC_GetAllGuilds 代码: KCC_GetAllGuilds(KCC_Guild:dest[], max_size = sizeof 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, _}:...)KCC_GetCreatedGuildChannel 代码: KCC_GetCreatedGuildChannel()— 成员 — 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, _}:...)KCC_GetCreatedGuildRole 代码: KCC_GetCreatedGuildRole()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)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, _}:...)KCC_GetCreatedPrivateChannel 代码: KCC_GetCreatedPrivateChannel()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_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)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[] = "")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] = "")KCC_DeleteEmoji 代码: KCC_DeleteEmoji(KCC_Emoji:emoji)KCC_GetEmojiName 代码: KCC_GetEmojiName(KCC_Emoji:emoji, dest[DCC_EMOJI_NAME_SIZE], maxlen = DCC_EMOJI_NAME_SIZE)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)3.10 其他 KCC_EscapeMarkdown 代码: KCC_EscapeMarkdown(const src[], dest[], max_size = sizeof dest)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)
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)
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)RE: [插件] kook-connect - siwode - 06-08-2026 KOOK 命令简单教程 这个教程演示如何在服务器里添加一个简单的 KOOK 指令。 一、设置命令前缀 如果希望 KOOK 指令使用 / 开头,需要在 include kook-cmd.inc 之前定义 KCMD_PREFIX: 代码: #define KCMD_PREFIX '/'注意: kook-cmd.inc 识别的是 KCMD_PREFIX,不是 KOOK_COMMAND_PREFIX。 二、创建一个简单指令 例如创建 /ping 指令: 代码: KCMD:ping(user, channel, params[])在 KOOK 频道输入: 代码: /ping机器人会回复: 代码: pong三、创建一个带参数的指令 例如创建 /say 指令: 代码: KCMD:say(user, channel, params[])在 KOOK 频道输入: 代码: /say 你好机器人会回复: 代码: 你好四、获取发送者名字 代码: KCMD:whoami(user, channel, params[])在 KOOK 频道输入: 代码: /whoami机器人会回复你的 KOOK 用户名。 五、KCMD 参数说明 代码: KCMD:命令名(user, channel, params[])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[])例如: 代码: KCMD:test(user, channel, params[])KOOK 输入: 代码: /test机器人回复: 代码: 测试成功RE: [插件] kook-connect - siwode - 06-08-2026 指定频道发送消息 KOOK 指令默认可以回复到当前频道,也可以发送到指定频道。 1. 回复当前频道 玩家在哪个 KOOK 频道输入指令,机器人就回复到哪个频道: 代码: KCMD:ping(user, channel, params[])KOOK 输入: 代码: /ping机器人会在当前频道回复: 代码: pong2. 发送到指定频道 如果想让机器人把消息发送到固定频道,可以使用频道 ID: 代码: KCMD:test(user, channel, params[])这样无论 /test 在哪个频道执行,消息都会发送到指定频道。 3. 游戏内主动发送 KOOK 日志 也可以写成一个 stock,方便游戏系统调用: 代码: stock SendMyKookLog(const message[])使用示例: 代码: SendMyKookLog("服务器启动完成。");4. 限制指令只能在指定频道使用 如果不希望某个指令在所有频道都能用,可以判断当前频道 ID: 代码: KCMD:players(user, channel, params[])这样只有在指定频道输入: 代码: /players指令才会真正执行。 5. 说明 代码: KCC_FindChannelById("频道ID")用于获取指定 KOOK 频道。 代码: KCC_SendChannelMessage(channel, "消息")用于向某个频道发送普通文字消息。 代码: KCC_GetChannelId(channel, currentId, sizeof(currentId))用于获取当前频道的 ID,常用于判断指令是否来自指定频道。 RE: [插件] kook-connect - siwode - 06-08-2026 KOOK Connector 常用函数教程 本教程只讲 kook-connector.inc 里的 KCC 函数,不讲 KCMD 指令系统。 一、发送消息到指定频道 先通过频道 ID 找到频道: 代码: new KCC_Channel:channel = KCC_FindChannelById("你的频道ID");然后发送消息: 代码: KCC_SendChannelMessage(channel, "服务器启动完成。");完整例子: 代码: stock SendKookServerMessage()二、封装一个发送日志函数 代码: stock KCC_SendServerLog(const msg[])使用: 代码: KCC_SendServerLog("管理员执行了一个操作。");三、发送格式化消息 使用 Pawn 自带的 format: 代码: stock KCC_SendPlayerJoinLog(playerid)四、发送 Embed 卡片消息 创建一个 Embed: 代码: new KCC_Embed:embed = KCC_CreateEmbed(发送 Embed: 代码: KCC_SendChannelEmbedMessage(channel, embed);完整例子: 代码: stock KCC_SendServerEmbedLog(const title[], const msg[])五、给 Embed 添加字段 代码: stock KCC_SendServerInfo()六、获取频道信息 获取频道 ID: 代码: new channelId[KCC_ID_SIZE];获取频道名称: 代码: new channelName[64];完整例子: 代码: stock KCC_PrintChannelInfo()七、获取用户信息 如果你在 KOOK 消息回调里拿到了 user,可以这样获取用户名: 代码: new username[KCC_USERNAME_SIZE];获取用户 ID: 代码: new userId[KCC_ID_SIZE];八、接收 KOOK 消息 kook-connector.inc 提供消息创建回调: 代码: public KCC_OnMessageCreate(KCC_Message:message)注意: 如果项目已经使用 kook-cmd.inc,它也会 hook KCC_OnMessageCreate。多个系统同时使用这个回调时,需要注意 hook 顺序。 九、删除 KOOK 消息 如果在回调里拿到了 message,可以删除这条 KOOK 消息: 代码: KCC_DeleteMessage(message);示例: 代码: public KCC_OnMessageCreate(KCC_Message:message)十、编辑消息 如果你拿到了 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()十四、常用函数总结 发送频道消息: 代码: 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);RE: [插件] kook-connect - siwode - 06-08-2026 表情与消息反应 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)3. 获取表情名称 代码: new emojiName[KCC_EMOJI_NAME_SIZE];4. 删除指定反应 代码: KCC_DeleteMessageReaction(message, emoji);5. 删除消息上的所有反应 不填写第二个参数时,会删除消息上的所有反应: 代码: KCC_DeleteMessageReaction(message);6. 删除表情对象 代码: KCC_DeleteEmoji(emoji);7. 完整示例 收到 KOOK 消息后,自动添加一个 smile 反应: 代码: public KCC_OnMessageCreate(KCC_Message:message) |