Q58Bot/service/message_handler_utils.go
wood chen a093f712f8 数据库与关键词管理功能的增强
- 扩展了数据库模式,为关键词添加了新字段:is_link、is_auto_added和added_at。
- 实现了新的关键词管理方法,包括AddKeyword的更新,使其能够设置链接和自动添加标记。
- 开发了CleanupExpiredLinks方法来删除过期的自动添加链接。
- 导入了time包以支持新字段的Timestamp默认值。
- 进行了迁移脚本的开发和执行,以无缝过渡到新的数据库结构。
- 更新了关键词检索方法,以支持新的关键词属性。
- 在消息处理和链接过滤服务中调整了关键词的添加逻辑。
- 重构了/list命令的响应,以区分手动添加的关键词和自动添加的链接。
- 优化了/add命令,以正确处理新的关键词属性。

注意:这些更改需要在已有的数据库中执行适当的迁移脚本,以避免数据丢失或结构冲突。
2024-09-28 15:28:26 +08:00

251 lines
8.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package service
import (
"fmt"
"sort"
"strings"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
"github.com/woodchen-ink/Q58Bot/core"
)
func HandleKeywordCommand(bot *tgbotapi.BotAPI, message *tgbotapi.Message, command string, args string) {
args = strings.TrimSpace(args)
switch command {
case "list":
handleListKeywords(bot, message)
case "add":
handleAddKeyword(bot, message, args)
case "delete":
handleDeleteKeyword(bot, message, args)
case "deletecontaining":
handleDeleteContainingKeyword(bot, message, args)
default:
core.SendErrorMessage(bot, message.Chat.ID, "无效的命令或参数。")
}
}
func handleListKeywords(bot *tgbotapi.BotAPI, message *tgbotapi.Message) {
manualKeywords, err := core.DB.GetAllManualKeywords()
if err != nil {
core.SendErrorMessage(bot, message.Chat.ID, "获取手动添加的关键词列表时发生错误。")
logger.Printf("Failed to get manual keywords: %v", err)
return
}
autoAddedLinks, err := core.DB.GetAllAutoAddedLinks()
if err != nil {
core.SendErrorMessage(bot, message.Chat.ID, "获取自动添加的链接列表时发生错误。")
logger.Printf("Failed to get auto-added links: %v", err)
return
}
if len(manualKeywords) == 0 && len(autoAddedLinks) == 0 {
core.SendMessage(bot, message.Chat.ID, "关键词和链接列表为空。")
} else {
// 对关键词和链接进行排序
sort.Strings(manualKeywords)
sort.Strings(autoAddedLinks)
// 发送手动添加的关键词列表
if len(manualKeywords) > 0 {
err := core.SendLongMessage(bot, message.Chat.ID, "手动添加的关键词列表(按字母顺序排序):", manualKeywords)
if err != nil {
core.SendErrorMessage(bot, message.Chat.ID, "发送手动添加的关键词列表时发生错误。")
}
}
// 发送自动添加的链接列表
if len(autoAddedLinks) > 0 {
err := core.SendLongMessage(bot, message.Chat.ID, "自动添加的链接列表(按字母顺序排序):", autoAddedLinks)
if err != nil {
core.SendErrorMessage(bot, message.Chat.ID, "发送自动添加的链接列表时发生错误。")
}
}
}
}
func handleAddKeyword(bot *tgbotapi.BotAPI, message *tgbotapi.Message, keyword string) {
if keyword == "" {
core.SendErrorMessage(bot, message.Chat.ID, "请提供要添加的关键词。")
return
}
exists, err := core.DB.KeywordExists(keyword)
if err != nil {
core.SendErrorMessage(bot, message.Chat.ID, "检查关键词时发生错误。")
logger.Printf("Failed to check keyword: %v", err)
return
}
if !exists {
err = core.DB.AddKeyword(keyword, false, false) // isLink = false, isAutoAdded = false
if err != nil {
core.SendErrorMessage(bot, message.Chat.ID, "添加关键词时发生错误。")
logger.Printf("Failed to add keyword: %v", err)
} else {
core.SendMessage(bot, message.Chat.ID, fmt.Sprintf("关键词 '%s' 已添加。", keyword))
}
} else {
core.SendMessage(bot, message.Chat.ID, fmt.Sprintf("关键词 '%s' 已存在。", keyword))
}
}
func handleDeleteKeyword(bot *tgbotapi.BotAPI, message *tgbotapi.Message, keyword string) {
if keyword == "" {
core.SendErrorMessage(bot, message.Chat.ID, "请提供要删除的关键词。")
return
}
removed, err := core.DB.RemoveKeyword(keyword)
if err != nil {
core.SendErrorMessage(bot, message.Chat.ID, fmt.Sprintf("删除关键词 '%s' 时发生错误: %v", keyword, err))
logger.Printf("Failed to remove keyword '%s': %v", keyword, err)
return
}
if removed {
core.SendMessage(bot, message.Chat.ID, fmt.Sprintf("关键词 '%s' 已成功删除。", keyword))
} else {
handleSimilarKeywords(bot, message, keyword)
}
}
func handleSimilarKeywords(bot *tgbotapi.BotAPI, message *tgbotapi.Message, keyword string) {
similarKeywords, err := core.DB.SearchKeywords(keyword)
if err != nil {
core.SendErrorMessage(bot, message.Chat.ID, "搜索关键词时发生错误。")
logger.Printf("Failed to search keywords: %v", err)
return
}
if len(similarKeywords) > 0 {
core.SendLongMessage(bot, message.Chat.ID, fmt.Sprintf("未能删除关键词 '%s'。\n\n以下是相似的关键词", keyword), similarKeywords)
} else {
core.SendMessage(bot, message.Chat.ID, fmt.Sprintf("未能删除关键词 '%s',且未找到相似的关键词。", keyword))
}
}
func handleDeleteContainingKeyword(bot *tgbotapi.BotAPI, message *tgbotapi.Message, substring string) {
if substring == "" {
core.SendErrorMessage(bot, message.Chat.ID, "请提供要删除的子字符串。")
return
}
removedKeywords, err := core.DB.RemoveKeywordsContaining(substring)
if err != nil {
core.SendErrorMessage(bot, message.Chat.ID, "删除关键词时发生错误。")
logger.Printf("Failed to remove keywords: %v", err)
return
}
if len(removedKeywords) > 0 {
core.SendLongMessage(bot, message.Chat.ID, fmt.Sprintf("已删除包含 '%s' 的以下关键词:", substring), removedKeywords)
} else {
core.SendMessage(bot, message.Chat.ID, fmt.Sprintf("没有找到包含 '%s' 的关键词。", substring))
}
}
func HandleWhitelistCommand(bot *tgbotapi.BotAPI, message *tgbotapi.Message, command string, args string) {
args = strings.TrimSpace(args)
switch command {
case "listwhite":
handleListWhitelist(bot, message)
case "addwhite":
handleAddWhitelist(bot, message, args)
case "delwhite":
handleDeleteWhitelist(bot, message, args)
default:
core.SendErrorMessage(bot, message.Chat.ID, "无效的命令或参数。")
}
}
func handleListWhitelist(bot *tgbotapi.BotAPI, message *tgbotapi.Message) {
whitelist, err := core.DB.GetAllWhitelist()
if err != nil {
core.SendErrorMessage(bot, message.Chat.ID, fmt.Sprintf("获取白名单时发生错误: %v", err))
logger.Printf("Failed to get whitelist: %v", err)
return
}
if len(whitelist) == 0 {
core.SendMessage(bot, message.Chat.ID, "白名单为空。")
} else {
core.SendLongMessage(bot, message.Chat.ID, "白名单域名列表:", whitelist)
}
}
func handleAddWhitelist(bot *tgbotapi.BotAPI, message *tgbotapi.Message, domain string) {
if domain == "" {
core.SendErrorMessage(bot, message.Chat.ID, "请提供要添加的域名。")
return
}
domain = strings.ToLower(domain)
exists, err := core.DB.WhitelistExists(domain)
if err != nil {
core.SendErrorMessage(bot, message.Chat.ID, fmt.Sprintf("检查白名单时发生错误: %v", err))
logger.Printf("Failed to check whitelist: %v", err)
return
}
if exists {
core.SendMessage(bot, message.Chat.ID, fmt.Sprintf("域名 '%s' 已在白名单中。", domain))
return
}
err = core.DB.AddWhitelist(domain)
if err != nil {
core.SendErrorMessage(bot, message.Chat.ID, fmt.Sprintf("添加到白名单时发生错误: %v", err))
logger.Printf("Failed to add to whitelist: %v", err)
return
}
exists, err = core.DB.WhitelistExists(domain)
if err != nil {
core.SendErrorMessage(bot, message.Chat.ID, fmt.Sprintf("验证添加操作时发生错误: %v", err))
logger.Printf("Failed to verify add operation: %v", err)
return
}
if exists {
core.SendMessage(bot, message.Chat.ID, fmt.Sprintf("域名 '%s' 已成功添加到白名单。", domain))
} else {
core.SendErrorMessage(bot, message.Chat.ID, fmt.Sprintf("未能添加域名 '%s' 到白名单。", domain))
}
}
func handleDeleteWhitelist(bot *tgbotapi.BotAPI, message *tgbotapi.Message, domain string) {
if domain == "" {
core.SendErrorMessage(bot, message.Chat.ID, "请提供要删除的域名。")
return
}
domain = strings.ToLower(domain)
exists, err := core.DB.WhitelistExists(domain)
if err != nil {
core.SendErrorMessage(bot, message.Chat.ID, fmt.Sprintf("检查白名单时发生错误: %v", err))
logger.Printf("Failed to check whitelist: %v", err)
return
}
if !exists {
core.SendMessage(bot, message.Chat.ID, fmt.Sprintf("域名 '%s' 不在白名单中。", domain))
return
}
err = core.DB.RemoveWhitelist(domain)
if err != nil {
core.SendErrorMessage(bot, message.Chat.ID, fmt.Sprintf("从白名单删除时发生错误: %v", err))
logger.Printf("Failed to remove from whitelist: %v", err)
return
}
exists, err = core.DB.WhitelistExists(domain)
if err != nil {
core.SendErrorMessage(bot, message.Chat.ID, fmt.Sprintf("验证删除操作时发生错误: %v", err))
logger.Printf("Failed to verify delete operation: %v", err)
return
}
if !exists {
core.SendMessage(bot, message.Chat.ID, fmt.Sprintf("域名 '%s' 已成功从白名单中删除。", domain))
} else {
core.SendErrorMessage(bot, message.Chat.ID, fmt.Sprintf("未能从白名单中删除域名 '%s'。", domain))
}
}