package chat import ( "fmt" "strings" twitch "github.com/gempir/go-twitch-irc/v4" "streambot_twitch/internal/commands" ) const ( MatchPrefix = "prefix" MatchMention = "mention" MatchContains = "contains" ) func ReplacePlaceholders(reply, user, channel, bot string) string { now := time.Now() replacements := map[string]string{ "$user": user, "$channel": channel, "$bot": bot, "$date": now.Format("02-01-2006"), "$time": now.Format("15:04:05"), } for placeholder, value := range replacements { reply = strings.ReplaceAll(reply, placeholder, value) } return reply } func messageMatchesCommand(message, botUserName string, cmd commands.CustomCommand) bool { msgLower := strings.ToLower(message) triggerLower := "" botMention := "@" + strings.ToLower(botUserName) for _, trigger := range cmd.Triggers{ triggerLower :=strings.ToLower(trigger) switch cmd.Match { case MatchPrefix: if strings.HasPrefix(msgLower, triggerLower) { return true } case MatchMention: if strings.Contains(msgLower, botMention) { return true } case MatchContains: if strings.Contains(msgLower, triggerLower) { return true } } } return false } func userHasPermisson(user twitch.User, required commands.PermissionLevel) bool { isStreamer := use.Badges["broadcaster"] == 1 isModerator := user.Badges["moderator"] == 1 isVIP := user.Badges["vip"] == 1 switch required { case commands.PermissionEveryone: return true case commands.PermissionVIP: return isStreamer || isModerator || is VIP case commands.PermissionModerator: return isStreamer || isModerator case commands.PermissionStreamer: return isStreamer default: return false } } func HandleMessage(client *twitch.Client, apiClient interface{}, message twitch.PrivateMessage, botUserName string) { user := message.User msg := message.Message channel := message.Channel // Dispatch Countdown command if strings.HasPrefix(msg, "!countdown") { HandleCountdownCommand(client, message, user, channel, msg) return } // Dispatch title/category commands if strings.HasPrefix(msg, "!title") || strings.HasPrefix(msg, "!category") || strings.HasPrefix(msg, "!game") { HandleTitleCategoryCommand(client, apiClient, message, user, channel, msg) return } // Dispatch custom/default commands HandleCustomCommands(client, message, user, channel, botUsername) } // check perms for _, cmd := range commands.GetAllCommands() { if messageMatchesCommand(msg, botName, cmd) { // track usage: use first alias as key triggerKey := strings.ToLower(cmd.Triggers[0]) commands.IncrementUsage(triggerKey) if userHasPermission(user, cmd.Permission) { reply := ReplacePlaceholders(cmd.Replay, user.DisplayName, channel, botUsername) client.Say(channel, cmd.Reply) } else { client.Say(channel, fmt.Sprintf("@%s You don't have permission to use this command.", user.DisplayName)) } break } } }