From 88356fd576ed90821676ef956e22ff9b1f5bbaf1 Mon Sep 17 00:00:00 2001 From: Tnze Date: Sun, 1 Jan 2023 18:50:39 +0800 Subject: [PATCH] Support disguised chat --- bot/msg/chat.go | 40 ++++++++++++++++++++++++++++++---------- bot/msg/events.go | 1 + examples/daze/daze.go | 6 ++++++ 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/bot/msg/chat.go b/bot/msg/chat.go index ac22396..eeb826b 100644 --- a/bot/msg/chat.go +++ b/bot/msg/chat.go @@ -34,16 +34,22 @@ func New(c *bot.Client, p *basic.Player, pl *playerlist.PlayerList, events Event events: events, SignatureCache: sign.NewSignatureCache(), } - c.Events.AddListener( - bot.PacketHandler{ + if events.PlayerChatMessage != nil { + c.Events.AddListener(bot.PacketHandler{ Priority: 64, ID: packetid.ClientboundPlayerChat, - F: m.handlePacket, - }, - ) + F: m.handlePlayerChat, + }) + } + if events.DisguisedChat != nil { + c.Events.AddListener(bot.PacketHandler{ + Priority: 64, ID: packetid.ClientboundDisguisedChat, + F: m.handleDisguisedChat, + }) + } return m } -func (m *Manager) handlePacket(packet pk.Packet) error { +func (m *Manager) handlePlayerChat(packet pk.Packet) error { var ( sender pk.UUID index pk.VarInt @@ -105,14 +111,28 @@ func (m *Manager) handlePacket(packet pk.Packet) error { } else { content = chat.Text(body.PlainMsg) } - - if m.events.PlayerChatMessage == nil { - return nil - } msg := chatType.Decorate(content, &ct.Chat) return m.events.PlayerChatMessage(msg, validated) } +func (m *Manager) handleDisguisedChat(packet pk.Packet) error { + var ( + message chat.Message + chatType chat.Type + ) + if err := packet.Scan(&message, &chatType); err != nil { + return err + } + + ct := m.p.WorldInfo.RegistryCodec.ChatType.FindByID(chatType.ID) + if ct == nil { + return InvalidChatPacket + } + msg := chatType.Decorate(message, &ct.Chat) + + return m.events.DisguisedChat(msg) +} + // SendMessage send chat message to server. // Currently only support offline-mode or "Not Secure" chat func (m *Manager) SendMessage(msg string) error { diff --git a/bot/msg/events.go b/bot/msg/events.go index 5a73fa7..412daf5 100644 --- a/bot/msg/events.go +++ b/bot/msg/events.go @@ -4,4 +4,5 @@ import "github.com/Tnze/go-mc/chat" type EventsHandler struct { PlayerChatMessage func(msg chat.Message, validated bool) error + DisguisedChat func(msg chat.Message) error } diff --git a/examples/daze/daze.go b/examples/daze/daze.go index bee9864..b814eb4 100644 --- a/examples/daze/daze.go +++ b/examples/daze/daze.go @@ -57,6 +57,7 @@ func main() { playerList = playerlist.New(client) chatHandler = msg.New(client, player, playerList, msg.EventsHandler{ PlayerChatMessage: onPlayerMsg, + DisguisedChat: onDisguisedMsg, }) worldManager = world.NewWorld(client, player, world.EventsListener{ LoadChunk: onChunkLoad, @@ -125,6 +126,11 @@ func onPlayerMsg(msg chat.Message, validated bool) error { return nil } +func onDisguisedMsg(msg chat.Message) error { + log.Printf("Disguised: %v", msg) + return nil +} + func onSystemMsg(c chat.Message, overlay bool) error { log.Printf("System: %v, Overlay: %v", c, overlay) return nil