vRp.CD2g_test/server/bot.go

70 lines
1.5 KiB
Go

package server
import (
"fmt"
"io"
"sync/atomic"
"time"
)
// NewBot 创建一个机器人,目前仅支持 Socket 服务器
func NewBot(srv *Server, options ...BotOption) *Bot {
if !srv.IsSocket() {
panic(fmt.Errorf("server type[%s] is not socket", srv.network))
}
bot := &Bot{
conn: newBotConn(srv),
}
for _, option := range options {
option(bot)
}
return bot
}
type Bot struct {
conn *Conn
joined atomic.Bool
}
// JoinServer 加入服务器
func (slf *Bot) JoinServer() {
if slf.joined.Swap(true) {
slf.conn.server.OnConnectionClosedEvent(slf.conn, nil)
}
slf.conn.server.OnConnectionOpenedEvent(slf.conn)
}
// LeaveServer 离开服务器
func (slf *Bot) LeaveServer() {
if slf.joined.Swap(false) {
slf.conn.server.OnConnectionClosedEvent(slf.conn, nil)
}
}
// SetNetworkDelay 设置网络延迟和波动范围
// - delay 延迟
// - fluctuation 波动范围
func (slf *Bot) SetNetworkDelay(delay, fluctuation time.Duration) {
slf.conn.delay = delay
slf.conn.fluctuation = fluctuation
}
// SetWriter 设置写入器
func (slf *Bot) SetWriter(writer io.Writer) {
slf.conn.botWriter.Store(&writer)
}
// SendPacket 发送数据包到服务器
func (slf *Bot) SendPacket(packet []byte) {
if slf.conn.server.IsOnline(slf.conn.GetID()) {
slf.conn.server.PushPacketMessage(slf.conn, 0, packet)
}
}
// SendWSPacket 发送 WebSocket 数据包到服务器
func (slf *Bot) SendWSPacket(wst int, packet []byte) {
if slf.conn.server.IsOnline(slf.conn.GetID()) {
slf.conn.server.PushPacketMessage(slf.conn, wst, packet)
}
}