消息处理器启动时加载提示回复数据

消息处理器启动过程中现在会从数据库加载提示回复数据。这保证了在启动时,所有必要的回复数据都已准备好,提高了效率和用户体验。

更改包括在`RunMessageHandler`函数中加载数据,并在`PromptReplyManager`中实现数据的线程安全加载。
This commit is contained in:
wood chen 2024-09-19 23:15:16 +08:00
parent b153581254
commit c5acd7cd7c
2 changed files with 44 additions and 14 deletions

View File

@ -115,6 +115,14 @@ func processMessage(bot *tgbotapi.BotAPI, message *tgbotapi.Message, linkFilter
func RunMessageHandler() error { func RunMessageHandler() error {
log.Println("消息处理器启动...") log.Println("消息处理器启动...")
// 加载提示回复数据
err := prompt_reply.Manager.LoadDataFromDatabase()
if err != nil {
log.Printf("加载提示回复数据失败: %v", err)
// 考虑是否要因为这个错误停止启动
// return fmt.Errorf("加载提示回复数据失败: %w", err)
}
baseDelay := time.Second baseDelay := time.Second
maxDelay := 5 * time.Minute maxDelay := 5 * time.Minute
delay := baseDelay delay := baseDelay

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"log" "log"
"strings" "strings"
"sync"
"time" "time"
"github.com/woodchen-ink/Q58Bot/core" "github.com/woodchen-ink/Q58Bot/core"
@ -11,6 +12,33 @@ import (
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
) )
type PromptReplyManager struct {
promptReplies map[string]string
mu sync.RWMutex
}
var Manager *PromptReplyManager
func init() {
Manager = &PromptReplyManager{
promptReplies: make(map[string]string),
}
}
func (prm *PromptReplyManager) LoadDataFromDatabase() error {
prm.mu.Lock()
defer prm.mu.Unlock()
promptReplies, err := core.DB.GetAllPromptReplies()
if err != nil {
return err
}
prm.promptReplies = promptReplies
log.Printf("提示回复: 已从数据库加载 %d 条提示回复", len(prm.promptReplies))
return nil
}
func SetPromptReply(prompt, reply string) error { func SetPromptReply(prompt, reply string) error {
err := core.DB.AddPromptReply(prompt, reply) err := core.DB.AddPromptReply(prompt, reply)
if err != nil { if err != nil {
@ -18,14 +46,11 @@ func SetPromptReply(prompt, reply string) error {
return err return err
} }
// 获取当前所有的 prompt replies 来确认添加成功 Manager.mu.Lock()
promptReplies, err := core.DB.GetAllPromptReplies() Manager.promptReplies[prompt] = reply
if err != nil { Manager.mu.Unlock()
log.Printf("提示回复: %s 添加后获取提示回复列表出错: %v", time.Now().Format("2006/01/02 15:04:05"), err)
} else {
log.Printf("提示回复: %s 设置提示回复成功。当前提示回复数量: %d", time.Now().Format("2006/01/02 15:04:05"), len(promptReplies))
}
log.Printf("提示回复: %s 设置提示回复成功。当前提示回复数量: %d", time.Now().Format("2006/01/02 15:04:05"), len(Manager.promptReplies))
return nil return nil
} }
@ -36,14 +61,11 @@ func DeletePromptReply(prompt string) error {
return err return err
} }
// 获取当前所有的 prompt replies 来确认删除成功 Manager.mu.Lock()
promptReplies, err := core.DB.GetAllPromptReplies() delete(Manager.promptReplies, prompt)
if err != nil { Manager.mu.Unlock()
log.Printf("提示回复: %s 删除后获取提示回复列表出错: %v", time.Now().Format("2006/01/02 15:04:05"), err)
} else {
log.Printf("提示回复: %s 删除提示回复成功。当前提示回复数量: %d", time.Now().Format("2006/01/02 15:04:05"), len(promptReplies))
}
log.Printf("提示回复: %s 删除提示回复成功。当前提示回复数量: %d", time.Now().Format("2006/01/02 15:04:05"), len(Manager.promptReplies))
return nil return nil
} }