@@ -21,6 +21,7 @@ import (
2121 log "github.com/sirupsen/logrus"
2222
2323 "github.com/Mrs4s/go-cqhttp/internal/base"
24+ "github.com/Mrs4s/go-cqhttp/modules/config"
2425)
2526
2627const serverLatencyDown = math .MaxUint32
3940
4041 remote struct {
4142 server string
43+ token string
4244 latency atomic.Uint32
4345 }
4446)
@@ -50,27 +52,18 @@ func newSigner() *signer {
5052 }
5153}
5254
53- func (c * signer ) init () {
54- go func () {
55- c .check ()
56- ticker := time .NewTicker (30 * time .Minute )
57- defer ticker .Stop ()
58- select {
59- case <- c .doneChan :
60- return
61- case <- ticker .C :
62- c .check ()
63- }
64- }()
65- }
55+ func (c * signer ) init () {}
6656
6757// Release 释放资源
6858func (c * signer ) Release () {
6959 close (c .doneChan )
7060}
7161
7262// Sign 对数据包签名
73- func (c * signer ) Sign (cmd string , seq uint32 , data []byte ) (* sign.Response , error ) {
63+ func (c * signer ) Sign (cmd string , seq uint32 , data []byte , uin uint32 , guid , qua string ) (* sign.Response , error ) {
64+ if ! sign .ContainSignPKG (cmd ) {
65+ return nil , nil
66+ }
7467 sortFlag := false
7568 defer func () {
7669 if sortFlag {
@@ -81,7 +74,7 @@ func (c *signer) Sign(cmd string, seq uint32, data []byte) (*sign.Response, erro
8174 c .lock .RLock ()
8275 defer c .lock .RUnlock ()
8376 for _ , instance := range c .instances {
84- resp , err := instance .sign (cmd , seq , data , c .extraHeaders )
77+ resp , err := instance .sign (cmd , seq , data , uin , guid , qua , c .extraHeaders )
8578 if err == nil {
8679 return resp , nil
8780 }
@@ -110,12 +103,16 @@ func (c *signer) AddRequestHeader(header map[string]string) {
110103}
111104
112105// AddSignServer 添加签名服务器
113- func (c * signer ) AddSignServer (signServers ... string ) {
106+ func (c * signer ) AddSignServer (signServers ... config. SignServer ) {
114107 c .lock .Lock ()
115108 defer c .lock .Unlock ()
116- c .instances = append (c .instances , io .Map (signServers , func (s string ) * remote {
117- return & remote {server : s }
118- })... )
109+ for _ , s := range signServers {
110+ u , err := url .Parse (s .URL )
111+ if err != nil || u .Hostname () == "" {
112+ continue
113+ }
114+ c .instances = append (c .instances , & remote {server : u .String (), token : s .Token })
115+ }
119116}
120117
121118// GetSignServer 获取签名服务器
@@ -136,37 +133,40 @@ func (c *signer) SetAppInfo(app *auth.AppInfo) {
136133 app .CurrentVersion , runtime .GOOS , runtime .GOARCH , base .Version ))
137134}
138135
139- func (c * signer ) check () {
140- log .Infoln ("开始签名服务器质量测试" )
141- availableQuantity := 0
142- wg := sync.WaitGroup {}
143- c .lock .RLock ()
144- for _ , instance := range c .instances {
145- wg .Add (1 )
146- go func (i * remote ) {
147- defer wg .Done ()
148- i .test ()
149- }(instance )
150- }
151- wg .Wait ()
152- for _ , instance := range c .instances {
153- if instance .latency .Load () < serverLatencyDown {
154- availableQuantity ++
155- }
156- }
157- c .lock .RUnlock ()
158- c .sortByLatency ()
159- log .Infof ("签名服务器质量测试完成,可用服务器数量: %d" , availableQuantity )
160- }
161-
162- func (i * remote ) sign (cmd string , seq uint32 , buf []byte , header http.Header ) (signResp * sign.Response , err error ) {
163- if ! ( sign .ContainSignPKG (cmd ) || cmd == "wtlogin.trans_emp" ) {
136+ // func (c *signer) check() {
137+ // log.Infoln("开始签名服务器质量测试")
138+ // availableQuantity := 0
139+ // wg := sync.WaitGroup{}
140+ // c.lock.RLock()
141+ // for _, instance := range c.instances {
142+ // wg.Add(1)
143+ // go func(i *remote) {
144+ // defer wg.Done()
145+ // i.test()
146+ // }(instance)
147+ // }
148+ // wg.Wait()
149+ // for _, instance := range c.instances {
150+ // if instance.latency.Load() < serverLatencyDown {
151+ // availableQuantity++
152+ // }
153+ // }
154+ // c.lock.RUnlock()
155+ // c.sortByLatency()
156+ // log.Infof("签名服务器质量测试完成,可用服务器数量: %d", availableQuantity)
157+ // }
158+
159+ func (i * remote ) sign (cmd string , seq uint32 , buf []byte , uin uint32 , guid , qua string , header http.Header ) (signResp * sign.Response , err error ) {
160+ if ! sign .ContainSignPKG (cmd ) {
164161 return nil , nil
165162 }
166163 signReq := sign.Request {
167- Cmd : cmd ,
168- Seq : int (seq ),
169- Src : buf ,
164+ Command : cmd ,
165+ Seq : int (seq ),
166+ Body : buf ,
167+ Uin : uin ,
168+ GUID : guid ,
169+ Qua : qua ,
170170 }
171171 u , err := url .Parse (i .server )
172172 if err != nil {
@@ -190,6 +190,9 @@ func (i *remote) sign(cmd string, seq uint32, buf []byte, header http.Header) (s
190190 req .Header .Add (k , v )
191191 }
192192 }
193+ if i .token != "" {
194+ req .Header .Set ("Authorization" , "Bearer " + i .token )
195+ }
193196 req .Header .Set ("Content-Type" , "application/json" )
194197
195198 resp , err := http .DefaultClient .Do (req )
@@ -201,26 +204,29 @@ func (i *remote) sign(cmd string, seq uint32, buf []byte, header http.Header) (s
201204 if err != nil {
202205 return nil , err
203206 }
207+ if signResp .Code != 0 {
208+ return nil , errors .New (signResp .Message )
209+ }
204210
205211 return signResp , nil
206212}
207213
208- func (i * remote ) test () {
209- startTime := time .Now ().UnixMilli ()
210- resp , err := i .sign ("wtlogin.login" , 1 , []byte {11 , 45 , 14 }, nil )
211- if err != nil || len (resp .Value .Sign ) == 0 {
212- log .Warnf ("测试签名服务器:%s时出现错误: %v" , i .server , err )
213- i .latency .Store (serverLatencyDown )
214- return
215- }
216- // 有长连接的情况,取两次平均值
217- resp , err = i .sign ("wtlogin.login" , 1 , []byte {11 , 45 , 14 }, nil )
218- if err != nil || len (resp .Value .Sign ) == 0 {
219- log .Warnf ("测试签名服务器:%s时出现错误: %v" , i .server , err )
220- i .latency .Store (serverLatencyDown )
221- return
222- }
223- latency := (time .Now ().UnixMilli () - startTime ) / 2
224- i .latency .Store (uint32 (latency ))
225- log .Debugf ("签名服务器:%s,延迟:%dms" , i .server , latency )
226- }
214+ // func (i *remote) test() {
215+ // startTime := time.Now().UnixMilli()
216+ // resp, err := i.sign("wtlogin.login", 1, []byte{11, 45, 14}, 0, "", "" , nil)
217+ // if err != nil || len(resp.Value.SecSign ) == 0 {
218+ // log.Warnf("测试签名服务器:%s时出现错误: %v", i.server, err)
219+ // i.latency.Store(serverLatencyDown)
220+ // return
221+ // }
222+ // // 有长连接的情况,取两次平均值
223+ // resp, err = i.sign("wtlogin.login", 1, []byte{11, 45, 14}, 0, "", "" , nil)
224+ // if err != nil || len(resp.Value.SecSign ) == 0 {
225+ // log.Warnf("测试签名服务器:%s时出现错误: %v", i.server, err)
226+ // i.latency.Store(serverLatencyDown)
227+ // return
228+ // }
229+ // latency := (time.Now().UnixMilli() - startTime) / 2
230+ // i.latency.Store(uint32(latency))
231+ // log.Debugf("签名服务器:%s,延迟:%dms", i.server, latency)
232+ // }
0 commit comments