From e95259e2e63689670e22d4b0b8ca90182954cb93 Mon Sep 17 00:00:00 2001 From: Tnze Date: Wed, 7 Dec 2022 23:43:54 +0800 Subject: [PATCH] support offline-mode chat message sending --- bot/msg/chat.go | 36 +++++++++++++++++++++++++++++++----- examples/daze/daze.go | 3 +++ 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/bot/msg/chat.go b/bot/msg/chat.go index 9a1923a..e5fade5 100644 --- a/bot/msg/chat.go +++ b/bot/msg/chat.go @@ -1,8 +1,11 @@ package msg import ( - "encoding/hex" + "crypto/rand" + "encoding/binary" + "errors" "fmt" + "time" "github.com/Tnze/go-mc/bot" "github.com/Tnze/go-mc/bot/basic" @@ -27,8 +30,6 @@ func attachPlayerMsg(c *bot.Client, p *basic.Player, handler func(msg chat.Messa bot.PacketHandler{ Priority: 64, ID: packetid.ClientboundPlayerChatHeader, F: func(packet pk.Packet) error { - fmt.Println(packetid.ClientboundPacketID(packet.ID)) - fmt.Println(hex.Dump(packet.Data)) return nil }, }, @@ -37,8 +38,6 @@ func attachPlayerMsg(c *bot.Client, p *basic.Player, handler func(msg chat.Messa F: func(packet pk.Packet) error { var message sign.PlayerMessage var chatType chat.Type - fmt.Println(packetid.ClientboundPacketID(packet.ID)) - fmt.Println(hex.Dump(packet.Data)) if err := packet.Scan(&message, &chatType); err != nil { return err } @@ -63,3 +62,30 @@ func attachPlayerMsg(c *bot.Client, p *basic.Player, handler func(msg chat.Messa }, }) } + +// SendMessage send chat message to server. +// Currently only support offline-mode or "Not Secure" chat +func (m *Manager) SendMessage(msg string) error { + if len(msg) > 256 { + return errors.New("message length greater than 256") + } + + var salt int64 + if err := binary.Read(rand.Reader, binary.BigEndian, &salt); err != nil { + return err + } + + err := m.c.Conn.WritePacket(pk.Marshal( + packetid.ServerboundChat, + pk.String(msg), + pk.Long(time.Now().UnixMilli()), + pk.Long(salt), + pk.ByteArray{}, + pk.Boolean(false), + pk.Array([]sign.HistoryMessage{}), + pk.Option[sign.HistoryMessage, *sign.HistoryMessage]{ + Has: false, + }, + )) + return err +} diff --git a/examples/daze/daze.go b/examples/daze/daze.go index 4c00557..d1a40bb 100644 --- a/examples/daze/daze.go +++ b/examples/daze/daze.go @@ -107,6 +107,9 @@ func onDeath() error { func onGameStart() error { log.Println("Game start") + if err := chatHandler.SendMessage("Hello, world"); err != nil { + return err + } return nil // if err isn't nil, HandleGame() will return it. }