Q58Bot/service/prompt_reply.go
wood chen b12915ef4f 数据库优化与提示词服务增强
- 重构全局变量以支持新的数据库文件路径和调试模式设置。
- 直接使用常量代替硬编码路径,以增强代码的可维护性。
- 引入环境变量读取调试模式,提高系统的灵活性和可配置性。
- 数据库缓存机制调整,通过更细粒度的缓存管理提高性能。
- 提示词服务现在依赖于数据库存储,以保证数据的持久化。
- 更新提示词操作现在通过专门的数据库方法执行,使得代码更加模块化和清晰。
- 错误处理和日志记录在提示词操作中得到改进,提高系统的健壮性和可追踪性。
2024-09-18 15:40:25 +08:00

124 lines
3.4 KiB
Go

package service
import (
"fmt"
"log"
"strings"
"sync"
"github.com/woodchen-ink/Q58Bot/core"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
)
var (
promptReplies = make(map[string]string)
promptMutex sync.RWMutex
db *core.Database
)
func InitPromptService(database *core.Database) error {
db = database
return loadPromptRepliesFromDB()
}
func loadPromptRepliesFromDB() error {
var err error
promptReplies, err = db.GetAllPromptReplies()
return err
}
func SetPromptReply(prompt, reply string) error {
return db.AddPromptReply(prompt, reply)
}
func DeletePromptReply(prompt string) error {
return db.DeletePromptReply(prompt)
}
func GetPromptReply(message string) (string, bool) {
promptReplies, err := db.GetAllPromptReplies()
if err != nil {
log.Printf("Error getting prompt replies: %v", err)
return "", false
}
for prompt, reply := range promptReplies {
if strings.Contains(strings.ToLower(message), prompt) {
return reply, true
}
}
return "", false
}
func ListPromptReplies() string {
promptMutex.RLock()
defer promptMutex.RUnlock()
if len(promptReplies) == 0 {
return "目前没有设置任何提示词回复。"
}
var result strings.Builder
result.WriteString("当前设置的提示词回复:\n")
for prompt, reply := range promptReplies {
result.WriteString(fmt.Sprintf("提示词: %s\n回复: %s\n\n", prompt, reply))
}
return result.String()
}
func HandlePromptCommand(bot *tgbotapi.BotAPI, message *tgbotapi.Message) {
if !core.IsAdmin(message.From.ID) {
bot.Send(tgbotapi.NewMessage(message.Chat.ID, "只有管理员才能使用此命令。"))
return
}
args := strings.SplitN(message.Text, " ", 3)
if len(args) < 2 {
bot.Send(tgbotapi.NewMessage(message.Chat.ID, "使用方法: /prompt set <提示词> <回复>\n/prompt delete <提示词>\n/prompt list"))
return
}
switch args[1] {
case "set":
if len(args) < 3 {
bot.Send(tgbotapi.NewMessage(message.Chat.ID, "使用方法: /prompt set <提示词> <回复>"))
return
}
promptAndReply := strings.SplitN(args[2], " ", 2)
if len(promptAndReply) < 2 {
bot.Send(tgbotapi.NewMessage(message.Chat.ID, "请同时提供提示词和回复。"))
return
}
err := SetPromptReply(promptAndReply[0], promptAndReply[1])
if err != nil {
bot.Send(tgbotapi.NewMessage(message.Chat.ID, fmt.Sprintf("设置提示词失败:%v", err)))
return
}
bot.Send(tgbotapi.NewMessage(message.Chat.ID, fmt.Sprintf("已设置提示词 '%s' 的回复。", promptAndReply[0])))
case "delete":
if len(args) < 3 {
bot.Send(tgbotapi.NewMessage(message.Chat.ID, "使用方法: /prompt delete <提示词>"))
return
}
err := DeletePromptReply(args[2])
if err != nil {
bot.Send(tgbotapi.NewMessage(message.Chat.ID, fmt.Sprintf("删除提示词失败:%v", err)))
return
}
bot.Send(tgbotapi.NewMessage(message.Chat.ID, fmt.Sprintf("已删除提示词 '%s' 的回复。", args[2])))
case "list":
bot.Send(tgbotapi.NewMessage(message.Chat.ID, ListPromptReplies()))
default:
bot.Send(tgbotapi.NewMessage(message.Chat.ID, "未知的子命令。使用方法: /prompt set|delete|list"))
}
}
func CheckAndReplyPrompt(bot *tgbotapi.BotAPI, message *tgbotapi.Message) {
if reply, found := GetPromptReply(message.Text); found {
replyMsg := tgbotapi.NewMessage(message.Chat.ID, reply)
replyMsg.ReplyToMessageID = message.MessageID
bot.Send(replyMsg)
}
}