sendAndWait 向服务器发送一个数据包, 并等待返回
(seq uint32, pkt []byte, params ...network.RequestParams)
| 191 | |
| 192 | // sendAndWait 向服务器发送一个数据包, 并等待返回 |
| 193 | func (c *QQClient) sendAndWait(seq uint32, pkt []byte, params ...network.RequestParams) (any, error) { |
| 194 | type T struct { |
| 195 | Response any |
| 196 | Error error |
| 197 | } |
| 198 | ch := make(chan T, 1) |
| 199 | var p network.RequestParams |
| 200 | |
| 201 | if len(params) != 0 { |
| 202 | p = params[0] |
| 203 | } |
| 204 | |
| 205 | c.handlers.Store(seq, &handlerInfo{fun: func(i any, err error) { |
| 206 | ch <- T{ |
| 207 | Response: i, |
| 208 | Error: err, |
| 209 | } |
| 210 | }, params: p, dynamic: false}) |
| 211 | |
| 212 | err := c.sendPacket(pkt) |
| 213 | if err != nil { |
| 214 | c.handlers.Delete(seq) |
| 215 | return nil, err |
| 216 | } |
| 217 | |
| 218 | retry := 0 |
| 219 | for { |
| 220 | select { |
| 221 | case rsp := <-ch: |
| 222 | return rsp.Response, rsp.Error |
| 223 | case <-time.After(time.Second * 15): |
| 224 | retry++ |
| 225 | if retry < 2 { |
| 226 | _ = c.sendPacket(pkt) |
| 227 | continue |
| 228 | } |
| 229 | c.handlers.Delete(seq) |
| 230 | return nil, errors.New("Packet timed out") |
| 231 | } |
| 232 | } |
| 233 | } |
| 234 | |
| 235 | // sendPacket 向服务器发送一个数据包 |
| 236 | func (c *QQClient) sendPacket(pkt []byte) error { |
no test coverage detected