fixup codes
This commit is contained in:
@ -7,6 +7,12 @@ import (
|
||||
"net"
|
||||
"strconv"
|
||||
|
||||
"golang.org/x/sync/errgroup"
|
||||
|
||||
"git.konjactw.dev/falloutBot/go-mc/data/packetid"
|
||||
mcnet "git.konjactw.dev/falloutBot/go-mc/net"
|
||||
pk "git.konjactw.dev/falloutBot/go-mc/net/packet"
|
||||
|
||||
"git.konjactw.dev/patyhank/minego/pkg/auth"
|
||||
"git.konjactw.dev/patyhank/minego/pkg/bot"
|
||||
"git.konjactw.dev/patyhank/minego/pkg/game/inventory"
|
||||
@ -14,15 +20,11 @@ import (
|
||||
"git.konjactw.dev/patyhank/minego/pkg/game/world"
|
||||
"git.konjactw.dev/patyhank/minego/pkg/protocol/packet/game/client"
|
||||
"git.konjactw.dev/patyhank/minego/pkg/protocol/packet/game/server"
|
||||
"github.com/Tnze/go-mc/data/packetid"
|
||||
mcnet "github.com/Tnze/go-mc/net"
|
||||
pk "github.com/Tnze/go-mc/net/packet"
|
||||
"golang.org/x/sync/errgroup"
|
||||
)
|
||||
|
||||
type botClient struct {
|
||||
conn *mcnet.Conn
|
||||
packetHandler bot.PacketHandler
|
||||
packetHandler *packetHandler
|
||||
eventHandler bot.EventHandler
|
||||
connected bool
|
||||
authProvider auth.Provider
|
||||
@ -91,7 +93,13 @@ func (b *botClient) Connect(ctx context.Context, addr string, options *bot.Conne
|
||||
}
|
||||
}
|
||||
|
||||
dialer := &mcnet.DefaultDialer
|
||||
var dialer mcnet.MCDialer = &mcnet.DefaultDialer
|
||||
if options != nil && options.Proxy != nil {
|
||||
dialer, err = socks5(options.Proxy)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
b.conn, err = dialer.DialMCContext(ctx, addr)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -156,6 +164,15 @@ func (b *botClient) handlePackets(ctx context.Context) error {
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
hs, ok := b.packetHandler.rawMap[pktID]
|
||||
for _, h := range hs {
|
||||
group.Go(func() error {
|
||||
h(ctx, p)
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
creator, ok := client.ClientboundPackets[pktID]
|
||||
if !ok {
|
||||
continue
|
||||
@ -163,12 +180,10 @@ func (b *botClient) handlePackets(ctx context.Context) error {
|
||||
pkt := creator()
|
||||
_, err := pkt.ReadFrom(bytes.NewReader(p.Data))
|
||||
if err != nil {
|
||||
// fmt.Printf("Decoding: 0x%x %s %s\n", p.ID, pktID.String(), err.Error())
|
||||
continue
|
||||
}
|
||||
group.Go(func() error {
|
||||
b.packetHandler.HandlePacket(ctx, pkt)
|
||||
return nil
|
||||
})
|
||||
b.packetHandler.HandlePacket(ctx, pkt)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5,10 +5,11 @@ import (
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
"git.konjactw.dev/falloutBot/go-mc/chat"
|
||||
"git.konjactw.dev/falloutBot/go-mc/data/packetid"
|
||||
pk "git.konjactw.dev/falloutBot/go-mc/net/packet"
|
||||
|
||||
"git.konjactw.dev/patyhank/minego/pkg/auth"
|
||||
"github.com/Tnze/go-mc/chat"
|
||||
"github.com/Tnze/go-mc/data/packetid"
|
||||
pk "github.com/Tnze/go-mc/net/packet"
|
||||
)
|
||||
|
||||
func (b *botClient) login() error {
|
||||
|
@ -3,20 +3,23 @@ package client
|
||||
import (
|
||||
"context"
|
||||
|
||||
"git.konjactw.dev/patyhank/minego/pkg/bot"
|
||||
"git.konjactw.dev/falloutBot/go-mc/data/packetid"
|
||||
pk "git.konjactw.dev/falloutBot/go-mc/net/packet"
|
||||
|
||||
"git.konjactw.dev/patyhank/minego/pkg/protocol/packet/game/client"
|
||||
"github.com/Tnze/go-mc/data/packetid"
|
||||
)
|
||||
|
||||
func newPacketHandler() bot.PacketHandler {
|
||||
func newPacketHandler() *packetHandler {
|
||||
return &packetHandler{
|
||||
handlerMap: make(map[packetid.ClientboundPacketID][]func(ctx context.Context, p client.ClientboundPacket)),
|
||||
rawMap: make(map[packetid.ClientboundPacketID][]func(ctx context.Context, p pk.Packet)),
|
||||
}
|
||||
}
|
||||
|
||||
type packetHandler struct {
|
||||
handlerMap map[packetid.ClientboundPacketID][]func(ctx context.Context, p client.ClientboundPacket)
|
||||
genericMap []func(ctx context.Context, p client.ClientboundPacket)
|
||||
rawMap map[packetid.ClientboundPacketID][]func(ctx context.Context, p pk.Packet)
|
||||
}
|
||||
|
||||
func (ph *packetHandler) AddPacketHandler(id packetid.ClientboundPacketID, handler func(ctx context.Context, p client.ClientboundPacket)) {
|
||||
@ -29,13 +32,16 @@ func (ph *packetHandler) AddGenericPacketHandler(handler func(ctx context.Contex
|
||||
ph.genericMap = append(ph.genericMap, handler)
|
||||
}
|
||||
|
||||
func (ph *packetHandler) AddRawPacketHandler(id packetid.ClientboundPacketID, handler func(ctx context.Context, p pk.Packet)) {
|
||||
ph.rawMap[id] = append(ph.rawMap[id], handler)
|
||||
}
|
||||
|
||||
func (ph *packetHandler) HandlePacket(ctx context.Context, p client.ClientboundPacket) {
|
||||
f := ph.handlerMap[p.PacketID()]
|
||||
if f != nil {
|
||||
for _, handler := range f {
|
||||
handler(ctx, p)
|
||||
}
|
||||
for _, handler := range f {
|
||||
handler(ctx, p)
|
||||
}
|
||||
|
||||
for _, handler := range ph.genericMap {
|
||||
handler(ctx, p)
|
||||
}
|
||||
|
48
pkg/client/proxy.go
Normal file
48
pkg/client/proxy.go
Normal file
@ -0,0 +1,48 @@
|
||||
package client
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"golang.org/x/net/proxy"
|
||||
|
||||
mcnet "git.konjactw.dev/falloutBot/go-mc/net"
|
||||
|
||||
"git.konjactw.dev/patyhank/minego/pkg/bot"
|
||||
)
|
||||
|
||||
// createSOCKS5Dialer 建立 SOCKS5 dialer
|
||||
func socks5(proxyConfig *bot.ProxyConfig) (mcnet.MCDialer, error) {
|
||||
var auth *proxy.Auth
|
||||
if proxyConfig.Username != "" || proxyConfig.Password != "" {
|
||||
auth = &proxy.Auth{
|
||||
User: proxyConfig.Username,
|
||||
Password: proxyConfig.Password,
|
||||
}
|
||||
}
|
||||
|
||||
dialer, err := proxy.SOCKS5("tcp", proxyConfig.Host, auth, proxy.Direct)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create SOCKS5 proxy dialer: %w", err)
|
||||
}
|
||||
|
||||
return &socks5MCDialer{
|
||||
dialer: dialer,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// socks5MCDialer 實作 mcnet.MCDialer 介面,使用 SOCKS5 proxy
|
||||
type socks5MCDialer struct {
|
||||
dialer proxy.Dialer
|
||||
}
|
||||
|
||||
func (d *socks5MCDialer) DialMCContext(ctx context.Context, address string) (*mcnet.Conn, error) {
|
||||
// 使用 SOCKS5 proxy 建立連線
|
||||
conn, err := d.dialer.Dial("tcp", address)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to dial through SOCKS5 proxy: %w", err)
|
||||
}
|
||||
|
||||
// 將 net.Conn 包裝成 mcnet.Conn
|
||||
return mcnet.WrapConn(conn), nil
|
||||
}
|
Reference in New Issue
Block a user