ONLY active when bot is running - Arguments [--watch] displays how many usses of each trigger and how many uses over the lifetime ofthe bot Commands - title [get/set] <newTitle> - category [get/set] <newCategory> - MUST be a legit Twitch.tv one - yet to come [cmd add|del|edit] [trigger] [response] (NOTE if you want Emotes you will have to type the 'name' in for twitch chat to recognise it)
115 lines
2.9 KiB
Go
115 lines
2.9 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) {
|
|
// 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
|
|
}
|
|
}
|
|
}
|