Files
streambot_twitch/internal/chat/handler.go
2025-07-09 15:25:56 +12:00

109 lines
2.7 KiB
Go

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) {
if userHasPermission(user, cmd.Permission) {
client.Say(channel, cmd.Reply)
} else {
client.Say(channel, fmt.Sprintf("@%s You don't have permission to use this command.", user.DisplayName))
}
break
}
}
}