Skip to content

Commit fb55006

Browse files
authored
fix: 修复 session_timeout 配置项不生效的bug,优化相关缓存逻辑,同时余额、查对话功能权限优化 (#210)
1 parent 5231009 commit fb55006

File tree

3 files changed

+45
-23
lines changed

3 files changed

+45
-23
lines changed

pkg/cache/user_base.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cache
33
import (
44
"time"
55

6+
"github.com/eryajf/chatgpt-dingtalk/config"
67
"github.com/patrickmn/go-cache"
78
)
89

@@ -33,7 +34,11 @@ type UserService struct {
3334
cache *cache.Cache
3435
}
3536

37+
var Config *config.Configuration
38+
3639
// NewUserService 创建新的业务层
3740
func NewUserService() UserServiceInterface {
38-
return &UserService{cache: cache.New(time.Hour*2, time.Hour*5)}
41+
// 加载配置
42+
Config = config.LoadConfig()
43+
return &UserService{cache: cache.New(Config.SessionTimeout, time.Hour*1)}
3944
}

pkg/chatgpt/chatgpt.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,7 @@ func New(userId string) *ChatGPT {
2828
var ctx context.Context
2929
var cancel func()
3030

31-
if public.Config.SessionTimeout == 0 {
32-
ctx, cancel = context.WithCancel(context.Background())
33-
} else {
34-
ctx, cancel = context.WithTimeout(context.Background(), public.Config.SessionTimeout)
35-
}
31+
ctx, cancel = context.WithTimeout(context.Background(), 600)
3632
timeOutChan := make(chan struct{}, 1)
3733
go func() {
3834
<-ctx.Done()

pkg/process/process_request.go

+38-17
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package process
33
import (
44
"fmt"
55
"strings"
6+
"time"
67

78
"github.com/eryajf/chatgpt-dingtalk/pkg/db"
89
"github.com/eryajf/chatgpt-dingtalk/pkg/dingbot"
@@ -15,16 +16,20 @@ import (
1516
func ProcessRequest(rmsg *dingbot.ReceiveMsg) error {
1617
if CheckRequestTimes(rmsg) {
1718
content := strings.TrimSpace(rmsg.Text.Content)
19+
timeoutStr := ""
20+
if content != public.Config.DefaultMode {
21+
timeoutStr = fmt.Sprintf("\n\n>%s 后将恢复默认聊天模式:%s", FormatTimeDuation(public.Config.SessionTimeout), public.Config.DefaultMode)
22+
}
1823
switch content {
1924
case "单聊":
2025
public.UserService.SetUserMode(rmsg.GetSenderIdentifier(), content)
21-
_, err := rmsg.ReplyToDingtalk(string(dingbot.MARKDOWN), fmt.Sprintf("**[Concentrate] 现在进入与 %s 的单聊模式**", rmsg.SenderNick))
26+
_, err := rmsg.ReplyToDingtalk(string(dingbot.MARKDOWN), fmt.Sprintf("**[Concentrate] 现在进入与 %s 的单聊模式**%s", rmsg.SenderNick, timeoutStr))
2227
if err != nil {
2328
logger.Warning(fmt.Errorf("send message error: %v", err))
2429
}
2530
case "串聊":
2631
public.UserService.SetUserMode(rmsg.GetSenderIdentifier(), content)
27-
_, err := rmsg.ReplyToDingtalk(string(dingbot.MARKDOWN), fmt.Sprintf("**[Concentrate] 现在进入与 %s 的串聊模式**", rmsg.SenderNick))
32+
_, err := rmsg.ReplyToDingtalk(string(dingbot.MARKDOWN), fmt.Sprintf("**[Concentrate] 现在进入与 %s 的串聊模式**%s", rmsg.SenderNick, timeoutStr))
2833
if err != nil {
2934
logger.Warning(fmt.Errorf("send message error: %v", err))
3035
}
@@ -62,25 +67,28 @@ func ProcessRequest(rmsg *dingbot.ReceiveMsg) error {
6267
logger.Warning(fmt.Errorf("send message error: %v", err))
6368
}
6469
case "余额":
65-
cacheMsg := public.UserService.GetUserMode("system_balance")
66-
if cacheMsg == "" {
67-
rst, err := public.GetBalance()
70+
if public.JudgeAdminUsers(rmsg.SenderStaffId) {
71+
cacheMsg := public.UserService.GetUserMode("system_balance")
72+
if cacheMsg == "" {
73+
rst, err := public.GetBalance()
74+
if err != nil {
75+
logger.Warning(fmt.Errorf("get balance error: %v", err))
76+
return err
77+
}
78+
cacheMsg = rst
79+
}
80+
_, err := rmsg.ReplyToDingtalk(string(dingbot.TEXT), cacheMsg)
6881
if err != nil {
69-
logger.Warning(fmt.Errorf("get balance error: %v", err))
70-
return err
82+
logger.Warning(fmt.Errorf("send message error: %v", err))
7183
}
72-
cacheMsg = rst
73-
}
74-
// cacheMsg := "官方暂时改写了余额接口,因此暂不提供查询余额功能!2023-04-03"
75-
_, err := rmsg.ReplyToDingtalk(string(dingbot.TEXT), cacheMsg)
76-
if err != nil {
77-
logger.Warning(fmt.Errorf("send message error: %v", err))
7884
}
7985
case "查对话":
80-
msg := "使用如下指令进行查询:\n\n---\n\n**#查对话 username:张三**\n\n---\n\n需要注意格式必须严格与上边一致,否则将会查询失败\n\n只有程序系统管理员有权限查询,即config.yml中的admin_users指定的人员。"
81-
_, err := rmsg.ReplyToDingtalk(string(dingbot.MARKDOWN), msg)
82-
if err != nil {
83-
logger.Warning(fmt.Errorf("send message error: %v", err))
86+
if public.JudgeAdminUsers(rmsg.SenderStaffId) {
87+
msg := "使用如下指令进行查询:\n\n---\n\n**#查对话 username:张三**\n\n---\n\n需要注意格式必须严格与上边一致,否则将会查询失败\n\n只有程序系统管理员有权限查询,即config.yml中的admin_users指定的人员。"
88+
_, err := rmsg.ReplyToDingtalk(string(dingbot.MARKDOWN), msg)
89+
if err != nil {
90+
logger.Warning(fmt.Errorf("send message error: %v", err))
91+
}
8492
}
8593
default:
8694
if public.FirstCheck(rmsg) {
@@ -223,6 +231,19 @@ func Do(mode string, rmsg *dingbot.ReceiveMsg) error {
223231
}
224232
return nil
225233
}
234+
// FormatTimeDuation 格式化时间
235+
// 主要提示单聊/群聊切换时多久后恢复默认聊天模式
236+
func FormatTimeDuation(duration time.Duration) string {
237+
minutes := int64(duration.Minutes())
238+
seconds := int64(duration.Seconds()) - minutes*60
239+
timeoutStr := ""
240+
if seconds == 0 {
241+
timeoutStr = fmt.Sprintf("%d分钟", minutes)
242+
} else {
243+
timeoutStr = fmt.Sprintf("%d分%d秒", minutes, seconds)
244+
}
245+
return timeoutStr
246+
}
226247

227248
// FormatMarkdown 格式化Markdown
228249
// 主要修复ChatGPT返回多行代码块,钉钉会将代码块中的#当作Markdown语法里的标题来处理,这里进行下转义

0 commit comments

Comments
 (0)