Skip to content
This repository was archived by the owner on Jul 27, 2024. It is now read-only.

Commit 1612825

Browse files
authored
Merge pull request #10 from opq-osc/beta
修复 无法连接OPQ接口后程序无法结束
2 parents 41f70e8 + 5b78616 commit 1612825

File tree

1 file changed

+48
-36
lines changed

1 file changed

+48
-36
lines changed

main.go

Lines changed: 48 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
}
5663
func (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 开始连接
150185
func (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

Comments
 (0)