mirror of
https://github.com/woodchen-ink/Q58Bot.git
synced 2025-07-18 05:42:06 +08:00
- 扩展了数据库模式,为关键词添加了新字段:is_link、is_auto_added和added_at。 - 实现了新的关键词管理方法,包括AddKeyword的更新,使其能够设置链接和自动添加标记。 - 开发了CleanupExpiredLinks方法来删除过期的自动添加链接。 - 导入了time包以支持新字段的Timestamp默认值。 - 进行了迁移脚本的开发和执行,以无缝过渡到新的数据库结构。 - 更新了关键词检索方法,以支持新的关键词属性。 - 在消息处理和链接过滤服务中调整了关键词的添加逻辑。 - 重构了/list命令的响应,以区分手动添加的关键词和自动添加的链接。 - 优化了/add命令,以正确处理新的关键词属性。 注意:这些更改需要在已有的数据库中执行适当的迁移脚本,以避免数据丢失或结构冲突。
251 lines
8.4 KiB
Go
251 lines
8.4 KiB
Go
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))
|
||
}
|
||
}
|