@@ -41,6 +41,7 @@ type BotManager struct {
4141 middleware []middleware
4242 delayed int
4343 locker sync.RWMutex
44+ restart chan int
4445 Session * session.Manager
4546}
4647
@@ -53,21 +54,37 @@ func (b *BotManager) SetMaxRetryCount(maxRetryCount int) {
5354 b .MaxRetryCount = maxRetryCount
5455}
5556
57+ var interrupt chan os.Signal
58+
59+ func init () {
60+ interrupt = make (chan os.Signal , 1 )
61+ signal .Notify (interrupt , os .Interrupt , os .Kill )
62+ }
5663func (b * BotManager ) Wait () {
64+ home:
5765 b .wg .Wait ()
5866 if b .MaxRetryCount > 0 {
59- time .Sleep (5 * time .Second )
6067 for i := 0 ; i < b .MaxRetryCount ; i ++ {
68+ log .Println ("等待重试,要终止请按下Ctrl+C" )
69+ select {
70+ case <- b .Done :
71+
72+ b .Running = false
73+ log .Println ("Bot结束" )
74+ return
75+
76+ case <- time .After (5 * time .Second ):
77+ log .Println ("正在重连" )
78+ }
6179 log .Printf ("重连尝试第%d/%d次\n " , i + 1 , b .MaxRetryCount )
6280 err := b .Start ()
6381 if err != nil {
6482 log .Println (err )
83+ } else {
84+ goto home
6585 }
66- b .wg .Wait ()
67- time .Sleep (5 * time .Second )
6886 }
6987 }
70- //b.onEvent["BotStop"]
7188 b .Running = false
7289 log .Println ("Bot结束" )
7390}
@@ -138,7 +155,25 @@ func NewBotManager(QQ int64, OPQUrl string) BotManager {
138155 panic (err )
139156 }
140157 go s .GC ()
141- return BotManager {Session : s , Done : make (chan int , 10 ), MaxRetryCount : 10 , wg : sync.WaitGroup {}, QQ : QQ , OPQUrl : OPQUrl , SendChan : make (chan SendMsgPack , 1024 ), onEvent : make (map [string ][]reflect.Value ), myRecord : map [string ]MyRecord {}, myRecordLocker : sync.RWMutex {}, locker : sync.RWMutex {}, delayed : 1000 }
158+ b := BotManager {restart : make (chan int , 1 ), Session : s , Done : make (chan int , 10 ), MaxRetryCount : 10 , wg : sync.WaitGroup {}, QQ : QQ , OPQUrl : OPQUrl , SendChan : make (chan SendMsgPack , 1024 ), onEvent : make (map [string ][]reflect.Value ), myRecord : map [string ]MyRecord {}, myRecordLocker : sync.RWMutex {}, locker : sync.RWMutex {}, delayed : 1000 }
159+ go func () {
160+ for {
161+ select {
162+ case <- interrupt :
163+ log .Println ("程序被用户终止,正在进行释放资源操作!" )
164+ b .MaxRetryCount = 0
165+ b .Done <- 0
166+ b .Done <- 0
167+ b .Done <- 0
168+ case <- b .restart :
169+ log .Println ("程序重连尝试!" )
170+ b .Done <- 1
171+ b .Done <- 2
172+ }
173+ }
174+
175+ }()
176+ return b
142177}
143178
144179// SetSendDelayed 设置发送消息的时延 单位毫秒 默认1000
@@ -149,34 +184,15 @@ func (b *BotManager) SetSendDelayed(Millisecond int) {
149184// Start 开始连接
150185func (b * BotManager ) Start () error {
151186 b .Running = true
152- b .wg .Add (3 )
153- interrupt := make (chan os.Signal , 1 )
154- restart := make (chan int )
155- signal .Notify (interrupt , os .Interrupt , os .Kill )
156- go func () {
157- select {
158- case <- interrupt :
159- log .Println ("程序被用户终止,正在进行释放资源操作!" )
160- b .MaxRetryCount = 0
161- b .Done <- 1
162- b .Done <- 2
163- b .wg .Done ()
164- case <- restart :
165- log .Println ("程序重连尝试!" )
166- b .Done <- 1
167- b .Done <- 2
168- b .wg .Done ()
169- }
170-
171- }()
187+ b .wg .Add (2 )
172188 go b .receiveSendPack ()
173189 go func () {
174190 for {
175191 select {
176192 case <- b .Done :
177193 b .wg .Done ()
178194 return
179- default :
195+ case <- time . After ( 10 * time . Second ) :
180196 go func () {
181197 if len (b .myRecord ) > 50 {
182198 b .myRecordLocker .Lock ()
@@ -188,16 +204,12 @@ func (b *BotManager) Start() error {
188204 b .myRecordLocker .Unlock ()
189205 }
190206 }()
191- time .Sleep (10 * time .Second )
192207 }
193-
194208 }
195-
196209 }()
197-
198210 c , err := gosocketio .Dial (strings .ReplaceAll (b .OPQUrl , "http://" , "ws://" )+ "/socket.io/?EIO=3&transport=websocket" , transport .GetDefaultWebsocketTransport ())
199211 if err != nil {
200- restart <- 1
212+ b . restart <- 1
201213 return err
202214 }
203215 err = c .On (gosocketio .OnConnection , func (h * gosocketio.Channel ) {
@@ -208,7 +220,7 @@ func (b *BotManager) Start() error {
208220 }
209221 })
210222 if err != nil {
211- restart <- 1
223+ b . restart <- 1
212224 return err
213225 }
214226 err = c .On (gosocketio .OnDisconnection , func (h * gosocketio.Channel ) {
@@ -217,10 +229,10 @@ func (b *BotManager) Start() error {
217229 if ok && len (f ) >= 1 {
218230 f [0 ].Call ([]reflect.Value {})
219231 }
220- restart <- 1
232+ b . restart <- 1
221233 })
222234 if err != nil {
223- restart <- 1
235+ b . restart <- 1
224236 return err
225237 }
226238 err = c .On ("OnGroupMsgs" , func (h * gosocketio.Channel , args returnPack ) {
@@ -290,7 +302,7 @@ func (b *BotManager) Start() error {
290302 //log.Println(args)
291303 })
292304 if err != nil {
293- restart <- 1
305+ b . restart <- 1
294306 return err
295307 }
296308 err = c .On ("OnEvents" , func (h * gosocketio.Channel , args eventPack ) {
@@ -454,7 +466,7 @@ func (b *BotManager) Start() error {
454466 }
455467 })
456468 if err != nil {
457- restart <- 1
469+ b . restart <- 1
458470 return err
459471 }
460472 return nil
0 commit comments