mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-04 19:17:38 +08:00
fix issue of connection lost.
This commit is contained in:
parent
808a63a78e
commit
a56bdf2a3e
@ -27,6 +27,12 @@ type (
|
|||||||
Map map[string]map[string][]byte `jceId:"0"`
|
Map map[string]map[string][]byte `jceId:"0"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SsoServerInfo struct {
|
||||||
|
Server string `jceId:"1"`
|
||||||
|
Port int32 `jceId:"2"`
|
||||||
|
Location string `jceId:"8"`
|
||||||
|
}
|
||||||
|
|
||||||
SvcReqRegister struct {
|
SvcReqRegister struct {
|
||||||
IJceStruct
|
IJceStruct
|
||||||
Uin int64 `jceId:"0"`
|
Uin int64 `jceId:"0"`
|
||||||
@ -358,6 +364,12 @@ func (pkt *RequestDataVersion2) ReadFrom(r *JceReader) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (pkt *SsoServerInfo) ReadFrom(r *JceReader) {
|
||||||
|
pkt.Server = r.ReadString(1)
|
||||||
|
pkt.Port = r.ReadInt32(2)
|
||||||
|
pkt.Location = r.ReadString(8)
|
||||||
|
}
|
||||||
|
|
||||||
func (pkt *SvcReqRegister) ToBytes() []byte {
|
func (pkt *SvcReqRegister) ToBytes() []byte {
|
||||||
w := NewJceWriter()
|
w := NewJceWriter()
|
||||||
w.WriteJceStructRaw(pkt)
|
w.WriteJceStructRaw(pkt)
|
||||||
|
@ -936,6 +936,7 @@ func (c *QQClient) sendAndWait(seq uint16, pkt []byte) (interface{}, error) {
|
|||||||
case <-time.After(time.Second * 30):
|
case <-time.After(time.Second * 30):
|
||||||
retry++
|
retry++
|
||||||
if retry < 2 {
|
if retry < 2 {
|
||||||
|
c.Error("packet %v timed out. retry.", seq)
|
||||||
_ = c.send(pkt)
|
_ = c.send(pkt)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -954,6 +955,7 @@ func (c *QQClient) netLoop() {
|
|||||||
for c.Online {
|
for c.Online {
|
||||||
l, err := reader.ReadInt32()
|
l, err := reader.ReadInt32()
|
||||||
if err == io.EOF || err == io.ErrClosedPipe {
|
if err == io.EOF || err == io.ErrClosedPipe {
|
||||||
|
c.Error("connection dropped by server: %v", err)
|
||||||
err = c.connect()
|
err = c.connect()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
break
|
||||||
|
@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"github.com/Mrs4s/MiraiGo/client/pb/pttcenter"
|
"github.com/Mrs4s/MiraiGo/client/pb/pttcenter"
|
||||||
"log"
|
"log"
|
||||||
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
@ -130,6 +131,24 @@ func decodePushReqPacket(c *QQClient, _ uint16, payload []byte) (interface{}, er
|
|||||||
jceBuf := []byte{}
|
jceBuf := []byte{}
|
||||||
t := r.ReadInt32(1)
|
t := r.ReadInt32(1)
|
||||||
r.ReadSlice(&jceBuf, 2)
|
r.ReadSlice(&jceBuf, 2)
|
||||||
|
if t == 1 && len(jceBuf) > 0 {
|
||||||
|
ssoPkt := jce.NewJceReader(jceBuf)
|
||||||
|
servers := []jce.SsoServerInfo{}
|
||||||
|
ssoPkt.ReadSlice(&servers, 1)
|
||||||
|
if len(servers) > 0 {
|
||||||
|
c.server = &net.TCPAddr{
|
||||||
|
IP: net.ParseIP(servers[0].Server),
|
||||||
|
Port: int(servers[0].Port),
|
||||||
|
}
|
||||||
|
c.Debug("got new server addr: %v location: %v", c.server.String(), servers[0].Location)
|
||||||
|
for _, e := range c.eventHandlers.serverUpdatedHandlers {
|
||||||
|
cover(func() {
|
||||||
|
e(c, &ServerUpdatedEvent{Servers: servers})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
seq := r.ReadInt64(3)
|
seq := r.ReadInt64(3)
|
||||||
_, pkt := c.buildConfPushRespPacket(t, seq, jceBuf)
|
_, pkt := c.buildConfPushRespPacket(t, seq, jceBuf)
|
||||||
return nil, c.send(pkt)
|
return nil, c.send(pkt)
|
||||||
|
@ -2,6 +2,7 @@ package client
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"github.com/Mrs4s/MiraiGo/binary/jce"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
@ -154,6 +155,10 @@ type (
|
|||||||
Message string
|
Message string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ServerUpdatedEvent struct {
|
||||||
|
Servers []jce.SsoServerInfo
|
||||||
|
}
|
||||||
|
|
||||||
NewFriendEvent struct {
|
NewFriendEvent struct {
|
||||||
Friend *FriendInfo
|
Friend *FriendInfo
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ type eventHandlers struct {
|
|||||||
newFriendHandlers []func(*QQClient, *NewFriendEvent)
|
newFriendHandlers []func(*QQClient, *NewFriendEvent)
|
||||||
disconnectHandlers []func(*QQClient, *ClientDisconnectedEvent)
|
disconnectHandlers []func(*QQClient, *ClientDisconnectedEvent)
|
||||||
logHandlers []func(*QQClient, *LogEvent)
|
logHandlers []func(*QQClient, *LogEvent)
|
||||||
|
serverUpdatedHandlers []func(*QQClient, *ServerUpdatedEvent)
|
||||||
groupMessageReceiptHandlers sync.Map
|
groupMessageReceiptHandlers sync.Map
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,6 +100,10 @@ func (c *QQClient) OnDisconnected(f func(*QQClient, *ClientDisconnectedEvent)) {
|
|||||||
c.eventHandlers.disconnectHandlers = append(c.eventHandlers.disconnectHandlers, f)
|
c.eventHandlers.disconnectHandlers = append(c.eventHandlers.disconnectHandlers, f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *QQClient) OnServerUpdated(f func(*QQClient, *ServerUpdatedEvent)) {
|
||||||
|
c.eventHandlers.serverUpdatedHandlers = append(c.eventHandlers.serverUpdatedHandlers, f)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *QQClient) OnLog(f func(*QQClient, *LogEvent)) {
|
func (c *QQClient) OnLog(f func(*QQClient, *LogEvent)) {
|
||||||
c.eventHandlers.logHandlers = append(c.eventHandlers.logHandlers, f)
|
c.eventHandlers.logHandlers = append(c.eventHandlers.logHandlers, f)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user