Skip to content

Commit 08658ef

Browse files
committed
Remove channel for C2S packets in bot
1 parent 97bc258 commit 08658ef

3 files changed

Lines changed: 52 additions & 36 deletions

File tree

internal/bot/bot.go

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ type Bot struct {
1414

1515
state *state.GameState
1616

17-
UserActions chan []byte // packets sent by client to server
18-
1917
clientConn protocol.Connection
2018
serverConn protocol.Connection
2119
stopChan chan struct{} // The broadcast channel
@@ -27,8 +25,6 @@ func NewBot(state *state.GameState, clientConn protocol.Connection, serverConn p
2725
return &Bot{
2826
state: state,
2927

30-
UserActions: make(chan []byte, 1024),
31-
3228
clientConn: clientConn,
3329
serverConn: serverConn,
3430
stopChan: make(chan struct{}),
@@ -39,7 +35,6 @@ func (b *Bot) Start() {
3935
log.Println("[Bot] Engine started")
4036

4137
b.runModule("LightHack", b.loopLightHack)
42-
b.runModule("HandleUserAction", b.loopHandleUserAction)
4338
b.runModule("Fishing", b.loopFishing)
4439
b.runModule("UI", b.loopWebUI)
4540
}
@@ -100,29 +95,6 @@ func (b *Bot) loopLightHack() {
10095
}
10196
}
10297

103-
func (b *Bot) loopHandleUserAction() {
104-
for {
105-
select {
106-
case <-b.stopChan:
107-
return
108-
case packet := <-b.UserActions:
109-
b.handleUserAction(packet)
110-
}
111-
}
112-
}
113-
114-
func (b *Bot) handleUserAction(rawMsg []byte) {
115-
packetReader := protocol.NewPacketReader(rawMsg)
116-
packet, err := packets.ReadAndParseC2S(packetReader)
117-
if err != nil {
118-
return
119-
}
120-
switch p := packet.(type) {
121-
case *packets.LookRequest:
122-
log.Printf("User looked at item ID: %d", p.ItemId)
123-
}
124-
}
125-
12698
// InterceptS2CPacket has to return immediately.
12799
func (b *Bot) InterceptS2CPacket(data []byte) ([]byte, error) {
128100
pr := protocol.NewPacketReader(data)
@@ -136,3 +108,28 @@ func (b *Bot) InterceptS2CPacket(data []byte) ([]byte, error) {
136108
}
137109
return data, nil
138110
}
111+
112+
// InterceptC2SPacket has to return immediately.
113+
func (b *Bot) InterceptC2SPacket(data []byte) ([]byte, error) {
114+
pr := protocol.NewPacketReader(data)
115+
firstByte, err := pr.PeekUint8()
116+
if err != nil {
117+
log.Println("[Bot] InterceptC2SPacket err:", err)
118+
return data, err
119+
}
120+
opcode := packets.C2SOpcode(firstByte)
121+
switch opcode {
122+
case packets.C2SLookRequest:
123+
b.handleLookRequest(pr)
124+
}
125+
return data, nil
126+
}
127+
128+
func (b *Bot) handleLookRequest(pr *protocol.PacketReader) {
129+
p, err := packets.ParseLookRequest(pr)
130+
if err != nil {
131+
log.Printf("Failed to parse look request: %v", err)
132+
return
133+
}
134+
log.Printf("User looked at item ID: %d", p.ItemId)
135+
}

internal/game/game_handler.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,16 +84,14 @@ func (g *GameSession) loopC2S() {
8484
g.ErrChan <- fmt.Errorf("C2S Read: %w", err)
8585
return
8686
}
87-
if err := g.ServerConn.WriteMessage(rawMsg); err != nil {
88-
g.ErrChan <- fmt.Errorf("C2S Write: %w", err)
87+
patchedMsg, err := g.Bot.InterceptC2SPacket(rawMsg)
88+
if err != nil {
89+
g.ErrChan <- fmt.Errorf("C2S Patch: %w", err)
8990
return
9091
}
91-
92-
select {
93-
case g.Bot.UserActions <- rawMsg:
94-
// Successfully queued for processing
95-
default:
96-
// If the queue is full, this packet is dropped.
92+
if err := g.ClientConn.WriteMessage(patchedMsg); err != nil {
93+
g.ErrChan <- fmt.Errorf("C2S Write: %w", err)
94+
return
9795
}
9896
}
9997
}

internal/protocol/packet_reader.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,27 @@ func (pr *PacketReader) ReadAll() []byte {
140140
return buf
141141
}
142142

143+
func (pr *PacketReader) PeekUint8() (uint8, error) {
144+
if pr.reader.Len() < 1 {
145+
return 0, io.EOF
146+
}
147+
148+
// 1. Get the current position without moving the cursor
149+
currentOffset, err := pr.reader.Seek(0, io.SeekCurrent)
150+
if err != nil {
151+
return 0, err
152+
}
153+
154+
// 2. ReadAt reads from the specific offset and does not advance the reader
155+
var b [1]byte
156+
_, err = pr.reader.ReadAt(b[:], currentOffset)
157+
if err != nil {
158+
return 0, err
159+
}
160+
161+
return b[0], nil
162+
}
163+
143164
func (pr *PacketReader) PeekUint16() (uint16, error) {
144165
if pr.reader.Len() < 2 {
145166
return 0, io.EOF

0 commit comments

Comments
 (0)