/
connect.go
117 lines (103 loc) · 2.31 KB
/
connect.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package connect
import (
"bytes"
"crypto/cipher"
"fmt"
"log"
"net"
"os"
"time"
. "github.com/TISUnion/MCBot-go/datatype"
"github.com/TISUnion/MCBot-go/handletype"
"github.com/tidwall/gjson"
)
var ProtocolVersion int
type Connect struct {
Conn net.Conn
Host string
Port uint16
IsOnline bool
player *Player
sharedSecret string
isAES bool
aesDecrypter cipher.Stream
aesEncrypter cipher.Stream
}
//向服务器发送数据
func (c *Connect) Send(bs []byte) {
if len(bs) != 0 {
stream := AddLength(bs)
if c.isAES && c.IsOnline {
stream = c.aesCbf8Encode(stream)
}
c.Conn.Write(stream)
}
}
//处理获取的数据包
func (c *Connect) DealPacket(pk *Packet) {
if !c.IsOnline && (pk.Id == 0x01) {
return
}
c.Send(handletype.DistinguishPacket(pk, c.player))
}
//读取服务器发送过来的数据
func (c *Connect) ReadAll() *bytes.Buffer {
data := make([]byte, 1000)
n, _ := c.Conn.Read(data)
data = data[:n]
if n == 0 {
return bytes.NewBuffer(data)
}
if c.isAES {
data = c.aesCbf8Decode(data)
}
return bytes.NewBuffer(data)
}
func debug(data []byte, st string) {
f, _ := os.OpenFile("test3", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0777)
defer f.Close()
str := "["
for _, v := range data {
str = fmt.Sprintf("%s\\x%x", str, v)
}
f.WriteString(st + str + "]")
}
//获取协议版本号
func (c *Connect) GetProtocolVersion() int {
if ProtocolVersion == 0 {
address := fmt.Sprintf("%s:%d", c.Host, c.Port)
tempConn, err := net.DialTimeout("tcp", address, 5*time.Second)
if err != nil {
log.Fatal(err)
}
tempC := &Connect{Conn: tempConn, Host: c.Host, Port: c.Port}
defer tempC.Close()
ProtocolVersion = int(gjson.Get(tempC.GetStatus(), "version.protocol").Int())
}
return ProtocolVersion
}
//释放资源
func (c *Connect) Close() {
if c.player != nil {
c.player.Signout()
c.player.Invalidate()
}
c.Conn.Close()
}
//开始连接并运行
func (c *Connect) Start() {
c.LoginStart()
c.HandleBuf()
}
//AES解密
func (c *Connect) aesCbf8Decode(secretData []byte) []byte {
res := make([]byte, len(secretData))
c.aesDecrypter.XORKeyStream(res, secretData)
return res
}
//AES加密
func (c *Connect) aesCbf8Encode(originData []byte) []byte {
res := make([]byte, len(originData))
c.aesEncrypter.XORKeyStream(res, originData)
return res
}