Skip to content
cmd1152 edited this page Aug 12, 2024 · 10 revisions

使用 hackchat-botlib 来在hackchat构建Bot是一个容易的事情,只需要你掌握nodejs的基础知识,就可以轻松构建

连接服务器

首先,你需要通过下面方法引入这个库

let Client = require("./HackChat-BotLib.js");

创建一个客户端并加入

你可以使用 new Client("ws://xxxx") 来创建一个新的hc客户端,然后通过在 onjoin 函数使用join方法来加入一个频道

let Client = require("./HackChat-BotLib.js");
let client = new Client("wss://hack.chat/chat-ws");
let join_channel = "lounge";

client.onjoin = () => { 
  client.join({  //发送加入数据包
    channel: join_channel,
    nick: 'my_bot',
    password: '123456'
  })
  //也可以读取 client.joined 判断有没有加入频道
}

client.join 返回一个 布尔值 ,告诉你是否加入成功,但是如果出现Rate Limit,那么还是返回加入成功,如果要检查所有的加入,需在 client.joinfailed 函数处理,这个会传入失败的提示内容

加入失败

client.joinfailed = (reason) => {
  console.log("加入失败",reason);
  client.close();
}

但是如果遇到验证码,那么会调用到 client.oncaptcha,你可以在 client.oncaptcha 使用 client.chat('验证码') 来通过验证码,但这一般不常用

client.oncaptcha = () => {
  console.log("频道要求验证码!");
  client.close()
}

加入成功

加入成功后,会触发 client.onjoined 函数,你可以在这里写上机器人加入聊天室成功(但是如果锁房,那么也会识别为加入成功【加入到了炼狱】,这时候使用 client.chat 会变成emote,因为炼狱不能使用聊天功能,但是emote和私信是可以的)

client.onjoined = () => {
  client.chat("Hello, world!");
  console.log("加入成功");
}

踢出检查

你可以设置client.ping的值来定时检查是否被踢出(这个值是一个number,小于1000为1000),设置为0不检查,越大越久才检测到,越小越容易Rate Limit

client.ping = 10000;

在发现频道发生改变(可能被踢出或者移动)后,client.onchangechannel会被触发(这个函数会传入新的频道):

client.onchangechannel = (channel) => {
  console.log("被踢出或者移动到了"+channel)
}

频率限制时

在执行操作太快的时候,往往会频率限制,你可以用 client.onratelimit 监听是否频率限制了,其中会传入下面 6 种文本的其中一种

You are joining channels too fast. Wait a moment and try again.

You are changing colors too fast. Wait a moment before trying again.

You are sending invites too fast. Wait a moment before trying again.

You are changing nicknames too fast. Wait a moment before trying again.

You are sending too much text. Wait a moment and try again.\nPress the up arrow key to restore your last message.

You are rate-limited or blocked.

client.onratelimit = (text) => {
  console.log("频率限制了:"+text)
}

关闭连接

你可以使用 client.close(reason(可选))来关闭客户端连接,其中的reason会被传递给 client.onclose 函数:

client.onclose = (reason) => {
  console.log(`连接断开`,reason);
  process.exit(1);
}
client.close("test");

聊天

你可以使用 client.chat 或者 client.emote 来发送一条公屏消息 你可以使用 client.chat(text,customId) 来发送一个带有customID的消息(但是emote不能),这可以让你通过 client.updatemessage(customId,mode,text) 来修改你的消息

overwrite append prepend complete
覆盖文本 添加文本到末尾 添加文本到前面 完成更新(这会让这个消息不能再被upDateMessage)

建议使用 client.getcustomId() 来生成一个不重复的id

注:client.updatemessageclient.chat都返回一个布尔值代表这个操作是否初步执行成功(如果出现了Rate Limit导致不能执行,那么还是会返回true)

回复

你可以使用 client.reply(obj) 来直接生成一个 hc++ 同款引用内容,其中需要传入包含{nick:...,trip:...,...}的消息数据,生成如下的内容

>2ZQ3+0 24a_:
>let me show you how easy is coding a bot in hvicorn

@24a_ 

私信

你可以使用 client.whisper(nick,text) 私信一个用户一些内容

用户信息操作

使用一些函数快捷获取一个或多个用户信息

快捷选定用户

通过 client.sel[XXX] (其中 [XXX] 可以是 TripNickHash

通过nick

client.selNick(xxx) 返回一个obj,这个obj就是这个用户的信息,如果找不到这个用户,那么这个值将是 null

通过trip

client.selTrip(xxx) 返回一个或多个匹配这个trip的用户信息obj组成的数组,这个obj就是这个用户的信息

通过hash

client.selHash(xxx) 返回一个或多个匹配这个hash的用户信息obj组成的数组,这个obj就是这个用户的信息

接受服务器消息

你可以修改 client.onmeeaage 函数来接受服务器消息

client.onmessage = (raw, json) => {
  console.log(raw); //服务器原始数据;
  console.log(json); //解析改进后的数据Obj
}

raw

服务器发送的原始字符串数据

json

经过解析和增加的数据,比如添加了 changeNick 的 cmd

{
  "cmd": "changeNick",
  "nick": "修改前的用户名",
  "to_nick": "修改后的新名称"
}

还有在私信消息和emote时,添加了 msg 内容(用户原始数据)还有 nick (用户名,解决了私信的用户名是from而不是nick的问题) 私信改成了 cmd:whisper (之前是cmd:info+type:whisper

{
  "cmd": "whisper",
  "from": "dpg",
  "nick": "dpg",
  "msg": "awa",
  "text": "@dpg whispered: awa",
  "..."
}
{
  "cmd": "emote",
  "nick": "dpg",
  "msg": "6",
  "text": "@dpg 6",
  "..."
}

以及 updateMessage 添加了 nick 和 trip

{
  "cmd": "updateMessage",
  "userid": 726134175636,
  "mode": "overwrite",
  "text": "good",
  "customId": "0",
  "nick": "dpg",
  "..."
}

还有邀请

{
  "cmd": "invite",
  "nick": "MelonCmd",
  "to": "i love 4n0n4me\nawa"
}