109 lines
2.7 KiB
Go
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
|
|
}
|
|
}
|
|
}
|