diff --git a/service/message_handler.go b/service/message_handler.go index 14425f3..7ab917f 100644 --- a/service/message_handler.go +++ b/service/message_handler.go @@ -4,7 +4,6 @@ package service import ( "fmt" "log" - "strings" "time" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" @@ -148,211 +147,3 @@ func RunMessageHandler() error { } } } - -// 下面是辅助函数部分 -// -// -// - -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) { - keywords, err := core.DB.GetAllKeywords() - if err != nil { - core.SendErrorMessage(bot, message.Chat.ID, "获取关键词列表时发生错误。") - return - } - if len(keywords) == 0 { - core.SendMessage(bot, message.Chat.ID, "关键词列表为空。") - } else { - core.SendLongMessage(bot, message.Chat.ID, "当前关键词列表:", keywords) - } -} - -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, "检查关键词时发生错误。") - return - } - if !exists { - err = core.DB.AddKeyword(keyword) - if err != nil { - core.SendErrorMessage(bot, message.Chat.ID, "添加关键词时发生错误。") - } 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)) - 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, "搜索关键词时发生错误。") - 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, "删除关键词时发生错误。") - 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)) - 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)) - 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)) - return - } - - exists, err = core.DB.WhitelistExists(domain) - if err != nil { - core.SendErrorMessage(bot, message.Chat.ID, fmt.Sprintf("验证添加操作时发生错误: %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)) - 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)) - return - } - - exists, err = core.DB.WhitelistExists(domain) - if err != nil { - core.SendErrorMessage(bot, message.Chat.ID, fmt.Sprintf("验证删除操作时发生错误: %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)) - } -} - -// ShouldFilter 检查消息是否包含关键词或者非白名单链接 diff --git a/service/message_handler_utils.go b/service/message_handler_utils.go new file mode 100644 index 0000000..61612b1 --- /dev/null +++ b/service/message_handler_utils.go @@ -0,0 +1,219 @@ +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) { + keywords, err := core.DB.GetAllKeywords() + if err != nil { + core.SendErrorMessage(bot, message.Chat.ID, "获取关键词列表时发生错误。") + return + } + + if len(keywords) == 0 { + core.SendMessage(bot, message.Chat.ID, "关键词列表为空。") + } else { + // 对关键词进行排序 + sort.Strings(keywords) + + // 直接发送排序后的关键词列表 + err := core.SendLongMessage(bot, message.Chat.ID, "当前关键词列表(按字母顺序排序):", keywords) + 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, "检查关键词时发生错误。") + return + } + if !exists { + err = core.DB.AddKeyword(keyword) + if err != nil { + core.SendErrorMessage(bot, message.Chat.ID, "添加关键词时发生错误。") + } 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)) + 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, "搜索关键词时发生错误。") + 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, "删除关键词时发生错误。") + 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)) + 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)) + 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)) + return + } + + exists, err = core.DB.WhitelistExists(domain) + if err != nil { + core.SendErrorMessage(bot, message.Chat.ID, fmt.Sprintf("验证添加操作时发生错误: %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)) + 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)) + return + } + + exists, err = core.DB.WhitelistExists(domain) + if err != nil { + core.SendErrorMessage(bot, message.Chat.ID, fmt.Sprintf("验证删除操作时发生错误: %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)) + } +}