1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 19:17:38 +08:00

fix crash.

This commit is contained in:
Mrs4s 2020-07-28 19:26:13 +08:00
parent fe4df302aa
commit 91aa75e827
3 changed files with 17 additions and 13 deletions

View File

@ -1,5 +1,5 @@
# MiraiGo # MiraiGo
qq-android协议的golang实现 移植于Mirai qq-android协议的golang实现 移植于mirai
# 警告 # 警告
本项目目前还处于功能填充阶段将来API和项目结构可能会有调整目前不推荐使用。 本项目目前还处于功能填充阶段将来API和项目结构可能会有调整目前不推荐使用。

View File

@ -40,7 +40,7 @@ type QQClient struct {
Conn net.Conn Conn net.Conn
decoders map[string]func(*QQClient, uint16, []byte) (interface{}, error) decoders map[string]func(*QQClient, uint16, []byte) (interface{}, error)
handlers map[uint16]func(interface{}, error) handlers sync.Map
syncCookie []byte syncCookie []byte
pubAccountCookie []byte pubAccountCookie []byte
@ -121,7 +121,6 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient {
"MultiMsg.ApplyUp": decodeMultiApplyUpResponse, "MultiMsg.ApplyUp": decodeMultiApplyUpResponse,
"MultiMsg.ApplyDown": decodeMultiApplyDownResponse, "MultiMsg.ApplyDown": decodeMultiApplyDownResponse,
}, },
handlers: map[uint16]func(interface{}, error){},
sigInfo: &loginSigInfo{}, sigInfo: &loginSigInfo{},
requestPacketRequestId: 1921334513, requestPacketRequestId: 1921334513,
groupSeq: 22911, groupSeq: 22911,
@ -629,14 +628,19 @@ func (c *QQClient) sendAndWait(seq uint16, pkt []byte) (interface{}, error) {
} }
ch := make(chan T) ch := make(chan T)
defer close(ch) defer close(ch)
c.handlers[seq] = func(i interface{}, err error) { c.handlers.Store(seq, func(i interface{}, err error) {
ch <- T{ ch <- T{
Response: i, Response: i,
Error: err, Error: err,
} }
} })
rsp := <-ch select {
case rsp := <-ch:
return rsp.Response, rsp.Error return rsp.Response, rsp.Error
case <-time.After(time.Second * 15):
c.handlers.Delete(seq)
return nil, errors.New("time out")
}
} }
func (c *QQClient) loop() { func (c *QQClient) loop() {
@ -686,9 +690,9 @@ func (c *QQClient) loop() {
}() }()
decoder, ok := c.decoders[pkt.CommandName] decoder, ok := c.decoders[pkt.CommandName]
if !ok { if !ok {
if f, ok := c.handlers[pkt.SequenceId]; ok { if f, ok := c.handlers.Load(pkt.SequenceId); ok {
delete(c.handlers, pkt.SequenceId) c.handlers.Delete(pkt.SequenceId)
f(nil, nil) f.(func(i interface{}, err error))(nil, nil)
} }
return return
} }
@ -696,9 +700,9 @@ func (c *QQClient) loop() {
if err != nil { if err != nil {
log.Println("decode", pkt.CommandName, "error:", err) log.Println("decode", pkt.CommandName, "error:", err)
} }
if f, ok := c.handlers[pkt.SequenceId]; ok { if f, ok := c.handlers.Load(pkt.SequenceId); ok {
delete(c.handlers, pkt.SequenceId) c.handlers.Delete(pkt.SequenceId)
f(rsp, err) f.(func(i interface{}, err error))(rsp, err)
} }
}() }()
} }