Skip to content

Commit 52df787

Browse files
committed
syncmap
1 parent ae96c39 commit 52df787

File tree

8 files changed

+1611
-46
lines changed

8 files changed

+1611
-46
lines changed

pkg/bot/bot.go

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ import (
88
log "github.com/sirupsen/logrus"
99
)
1010

11+
//go:generate go run github.com/a8m/syncmap -o "gen_client_map.go" -pkg bot -name ClientMap "map[int64]*client.QQClient"
12+
//go:generate go run github.com/a8m/syncmap -o "gen_token_map.go" -pkg bot -name TokenMap "map[int64][]byte"
1113
var (
12-
// TODO sync
13-
Clients = map[int64]*client.QQClient{}
14-
LoginTokens = map[int64][]byte{}
14+
Clients ClientMap
15+
LoginTokens TokenMap
1516
)
1617

1718
func InitLog(cli *client.QQClient) {
@@ -48,7 +49,7 @@ func Login(cli *client.QQClient) (bool, error) {
4849
}
4950

5051
func SetRelogin(cli *client.QQClient, retryInterval int, retryCount int) {
51-
LoginTokens[cli.Uin] = cli.GenToken()
52+
LoginTokens.Store(cli.Uin, cli.GenToken())
5253
cli.OnDisconnected(func(bot *client.QQClient, e *client.ClientDisconnectedEvent) {
5354
if bot.Online {
5455
return
@@ -68,14 +69,16 @@ func SetRelogin(cli *client.QQClient, retryInterval int, retryCount int) {
6869
times++
6970
time.Sleep(time.Second * time.Duration(retryInterval))
7071

71-
// 尝试token登录
72-
if err := bot.TokenLogin(LoginTokens[bot.Uin]); err != nil {
73-
log.Errorf("failed to relogin with token, try to login with password, %+v", err)
74-
bot.Disconnect()
75-
} else {
76-
LoginTokens[cli.Uin] = bot.GenToken()
77-
log.Info("succeed to relogin with token")
78-
return
72+
if token, ok := LoginTokens.Load(bot.Uin); ok {
73+
// 尝试token登录
74+
if err := bot.TokenLogin(token); err != nil {
75+
log.Errorf("failed to relogin with token, try to login with password, %+v", err)
76+
bot.Disconnect()
77+
} else {
78+
LoginTokens.Store(bot.Uin, bot.GenToken())
79+
log.Info("succeed to relogin with token")
80+
return
81+
}
7982
}
8083

8184
time.Sleep(time.Second)
@@ -89,7 +92,7 @@ func SetRelogin(cli *client.QQClient, retryInterval int, retryCount int) {
8992
continue
9093
}
9194
if ok {
92-
LoginTokens[bot.Uin] = bot.GenToken()
95+
LoginTokens.Store(bot.Uin, bot.GenToken())
9396
log.Info("重连成功")
9497
return
9598
}
@@ -102,15 +105,17 @@ func SetRelogin(cli *client.QQClient, retryInterval int, retryCount int) {
102105
// ReleaseClient 断开连接并释放资源
103106
func ReleaseClient(cli *client.QQClient) {
104107
cli.Release()
105-
delete(Clients, cli.Uin) // 必须先删Clients,影响IsClientExist
106-
delete(LoginTokens, cli.Uin)
107-
for _, wsServer := range RemoteServers[cli.Uin] {
108-
wsServer.Close()
108+
Clients.Delete(cli.Uin) // 必须先删Clients,影响IsClientExist
109+
LoginTokens.Delete(cli.Uin)
110+
if wsServers, ok := RemoteServers.Load(cli.Uin); ok {
111+
for _, wsServer := range wsServers {
112+
wsServer.Close()
113+
}
109114
}
110-
delete(RemoteServers, cli.Uin)
115+
RemoteServers.Delete(cli.Uin)
111116
}
112117

113118
func IsClientExist(uin int64) bool {
114-
_, ok := Clients[uin]
119+
_, ok := Clients.Load(uin)
115120
return ok
116121
}

pkg/bot/captcha.go

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@ type WaitingCaptcha struct {
2020
Prom *promise.Promise
2121
}
2222

23+
//go:generate go run github.com/a8m/syncmap -o "gen_captcha_map.go" -pkg bot -name CaptchaMap "map[int64]*WaitingCaptcha"
24+
2325
// TODO sync
24-
var WaitingCaptchas = map[int64]*WaitingCaptcha{}
26+
var WaitingCaptchas CaptchaMap
2527

2628
func ProcessLoginRsp(cli *client.QQClient, rsp *client.LoginResponse) (bool, error) {
2729
if rsp.Success {
28-
delete(WaitingCaptchas, cli.Uin)
30+
WaitingCaptchas.Delete(cli.Uin)
2931
return true, nil
3032
}
3133
if rsp.Error == client.SMSOrVerifyNeededError {
@@ -40,15 +42,15 @@ func ProcessLoginRsp(cli *client.QQClient, rsp *client.LoginResponse) (bool, err
4042
case client.SliderNeededError:
4143
log.Infof("遇到滑块验证码,根据README提示操作 https://github.com/protobufbot/Go-Mirai-Client (顺便star)")
4244
prom := promise.NewPromise()
43-
WaitingCaptchas[cli.Uin] = &WaitingCaptcha{
45+
WaitingCaptchas.Store(cli.Uin, &WaitingCaptcha{
4446
Captcha: &dto.Bot_Captcha{
4547
BotId: cli.Uin,
4648
CaptchaType: dto.Bot_Captcha_SLIDER_CAPTCHA,
4749
Data: &dto.Bot_Captcha_Url{Url: rsp.VerifyUrl},
4850
},
4951
Prom: prom,
50-
}
51-
defer delete(WaitingCaptchas, cli.Uin)
52+
})
53+
defer WaitingCaptchas.Delete(cli.Uin)
5254
result, err := prom.Get()
5355
if err != nil {
5456
return false, fmt.Errorf("提交ticket错误")
@@ -63,15 +65,15 @@ func ProcessLoginRsp(cli *client.QQClient, rsp *client.LoginResponse) (bool, err
6365
log.Infof("遇到图形验证码,根据README提示操作 https://github.com/protobufbot/Go-Mirai-Client (顺便star)")
6466
_ = ioutil.WriteFile("captcha.jpg", rsp.CaptchaImage, 0644)
6567
prom := promise.NewPromise()
66-
WaitingCaptchas[cli.Uin] = &WaitingCaptcha{
68+
WaitingCaptchas.Store(cli.Uin, &WaitingCaptcha{
6769
Captcha: &dto.Bot_Captcha{
6870
BotId: cli.Uin,
6971
CaptchaType: dto.Bot_Captcha_PIC_CAPTCHA,
7072
Data: &dto.Bot_Captcha_Image{Image: rsp.CaptchaImage},
7173
},
7274
Prom: prom,
73-
}
74-
defer delete(WaitingCaptchas, cli.Uin)
75+
})
76+
defer WaitingCaptchas.Delete(cli.Uin)
7577
result, err := prom.Get()
7678
text := result.(string)
7779
rsp, err := cli.SubmitCaptcha(strings.ReplaceAll(text, "\n", ""), rsp.CaptchaSign)
@@ -86,15 +88,15 @@ func ProcessLoginRsp(cli *client.QQClient, rsp *client.LoginResponse) (bool, err
8688
return false, fmt.Errorf("请求短信验证码错误,可能是太频繁")
8789
}
8890
prom := promise.NewPromise()
89-
WaitingCaptchas[cli.Uin] = &WaitingCaptcha{
91+
WaitingCaptchas.Store(cli.Uin, &WaitingCaptcha{
9092
Captcha: &dto.Bot_Captcha{
9193
BotId: cli.Uin,
9294
CaptchaType: dto.Bot_Captcha_SMS,
9395
Data: &dto.Bot_Captcha_Url{Url: rsp.SMSPhone},
9496
},
9597
Prom: prom,
96-
}
97-
defer delete(WaitingCaptchas, cli.Uin)
98+
})
99+
WaitingCaptchas.Delete(cli.Uin)
98100
result, err := prom.Get()
99101
if err != nil {
100102
return false, fmt.Errorf("提交短信验证码错误")
@@ -108,15 +110,15 @@ func ProcessLoginRsp(cli *client.QQClient, rsp *client.LoginResponse) (bool, err
108110
log.Info("设置环境变量 SMS = 1 可优先使用短信验证码")
109111

110112
prom := promise.NewPromise()
111-
WaitingCaptchas[cli.Uin] = &WaitingCaptcha{
113+
WaitingCaptchas.Store(cli.Uin, &WaitingCaptcha{
112114
Captcha: &dto.Bot_Captcha{
113115
BotId: cli.Uin,
114116
CaptchaType: dto.Bot_Captcha_UNSAFE_DEVICE_LOGIN_VERIFY,
115117
Data: &dto.Bot_Captcha_Url{Url: rsp.VerifyUrl},
116118
},
117119
Prom: prom,
118-
}
119-
defer delete(WaitingCaptchas, cli.Uin)
120+
})
121+
defer WaitingCaptchas.Delete(cli.Uin)
120122
_, err := prom.Get()
121123
cli.Disconnect()
122124
time.Sleep(3 * time.Second)

0 commit comments

Comments
 (0)