diff --git a/README.md b/README.md index 05f58871..b0141dc0 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # MiraiGo -qq-android协议的golang实现 移植于Mirai +qq-android协议的golang实现 移植于mirai # 警告 本项目目前还处于功能填充阶段,将来API和项目结构可能会有调整,目前不推荐使用。 diff --git a/client/client.go b/client/client.go index 2b05c7ed..e79361c6 100644 --- a/client/client.go +++ b/client/client.go @@ -40,7 +40,7 @@ type QQClient struct { Conn net.Conn decoders map[string]func(*QQClient, uint16, []byte) (interface{}, error) - handlers map[uint16]func(interface{}, error) + handlers sync.Map syncCookie []byte pubAccountCookie []byte @@ -121,7 +121,6 @@ func NewClientMd5(uin int64, passwordMd5 [16]byte) *QQClient { "MultiMsg.ApplyUp": decodeMultiApplyUpResponse, "MultiMsg.ApplyDown": decodeMultiApplyDownResponse, }, - handlers: map[uint16]func(interface{}, error){}, sigInfo: &loginSigInfo{}, requestPacketRequestId: 1921334513, groupSeq: 22911, @@ -629,14 +628,19 @@ func (c *QQClient) sendAndWait(seq uint16, pkt []byte) (interface{}, error) { } ch := make(chan T) defer close(ch) - c.handlers[seq] = func(i interface{}, err error) { + c.handlers.Store(seq, func(i interface{}, err error) { ch <- T{ Response: i, Error: err, } + }) + select { + case rsp := <-ch: + return rsp.Response, rsp.Error + case <-time.After(time.Second * 15): + c.handlers.Delete(seq) + return nil, errors.New("time out") } - rsp := <-ch - return rsp.Response, rsp.Error } func (c *QQClient) loop() { @@ -686,9 +690,9 @@ func (c *QQClient) loop() { }() decoder, ok := c.decoders[pkt.CommandName] if !ok { - if f, ok := c.handlers[pkt.SequenceId]; ok { - delete(c.handlers, pkt.SequenceId) - f(nil, nil) + if f, ok := c.handlers.Load(pkt.SequenceId); ok { + c.handlers.Delete(pkt.SequenceId) + f.(func(i interface{}, err error))(nil, nil) } return } @@ -696,9 +700,9 @@ func (c *QQClient) loop() { if err != nil { log.Println("decode", pkt.CommandName, "error:", err) } - if f, ok := c.handlers[pkt.SequenceId]; ok { - delete(c.handlers, pkt.SequenceId) - f(rsp, err) + if f, ok := c.handlers.Load(pkt.SequenceId); ok { + c.handlers.Delete(pkt.SequenceId) + f.(func(i interface{}, err error))(rsp, err) } }() } diff --git a/message/message.go b/message/message.go index 44af7d32..697bc924 100644 --- a/message/message.go +++ b/message/message.go @@ -263,7 +263,7 @@ func ToProtoElems(elems []IMessageElement, generalFlags bool) (r []*msg.Elem) { for _, elem := range elems { switch elem.(type) { case *ServiceElement: - d, _ := hex.DecodeString("08 09 78 00 C8 01 00 F0 01 00 F8 01 00 90 02 00 C8 02 00 98 03 00 A0 03 20 B0 03 00 C0 03 00 D0 03 00 E8 03 00 8A 04 02 08 03 90 04 80 80 80 10 B8 04 00 C0 04 00") + d, _ := hex.DecodeString("08097800C80100F00100F80100900200C80200980300A00320B00300C00300D00300E803008A04020803900480808010B80400C00400") r = append(r, &msg.Elem{ GeneralFlags: &msg.GeneralFlags{ PbReserve: d,