2021-05-02 12:29:43 +00:00
package twitchbot
import (
"fmt"
"strings"
2021-05-02 17:39:46 +00:00
"time"
2021-05-02 12:29:43 +00:00
irc "github.com/gempir/go-twitch-irc/v2"
2021-05-02 17:39:46 +00:00
"github.com/strimertul/strimertul/modules/loyalty"
2021-05-02 12:29:43 +00:00
)
type AccessLevelType string
const (
ALTEveryone AccessLevelType = "everyone"
ALTVIP AccessLevelType = "vip"
ALTModerators AccessLevelType = "moderators"
ALTStreamer AccessLevelType = "streamer"
)
type BotCommandHandler func ( bot * TwitchBot , message irc . PrivateMessage )
type BotCommand struct {
Description string
Usage string
AccessLevel AccessLevelType
Handler BotCommandHandler
}
var commands = map [ string ] BotCommand {
"!redeem" : {
Description : "Redeem a reward with loyalty points" ,
Usage : "!redeem reward-id" ,
AccessLevel : ALTEveryone ,
Handler : cmdRedeem ,
} ,
2021-05-03 08:35:11 +00:00
"!balance" : {
Description : "See your current point balance" ,
Usage : "!balance" ,
AccessLevel : ALTEveryone ,
Handler : cmdBalance ,
} ,
}
func cmdBalance ( bot * TwitchBot , message irc . PrivateMessage ) {
// Get user balance
balance , ok := bot . Loyalty . Points [ message . User . Name ]
if ! ok {
balance = 0
}
bot . Client . Say ( message . Channel , fmt . Sprintf ( "%s: You have %d %s!" , message . User . DisplayName , balance , bot . Loyalty . Config . Currency ) )
2021-05-02 12:29:43 +00:00
}
func cmdRedeem ( bot * TwitchBot , message irc . PrivateMessage ) {
parts := strings . Fields ( message . Message )
if len ( parts ) < 2 {
return
}
redeemID := parts [ 1 ]
// Find reward
for _ , reward := range bot . Loyalty . Rewards {
if reward . ID != redeemID {
continue
}
2021-05-10 21:08:44 +00:00
// Reward not active, return early
if ! reward . Enabled {
return
}
2021-05-02 12:29:43 +00:00
// Get user balance
balance , ok := bot . Loyalty . Points [ message . User . Name ]
if ! ok {
balance = 0
}
// Check if user can afford the reward
if balance - reward . Price < 0 {
bot . Client . Say ( message . Channel , fmt . Sprintf ( "I'm sorry %s but you cannot afford this (have %d %s, need %d)" , message . User . DisplayName , balance , bot . Loyalty . Config . Currency , reward . Price ) )
return
}
// Perform redeem
2021-05-02 17:39:46 +00:00
if err := bot . Loyalty . AddRedeem ( loyalty . Redeem {
Username : message . User . Name ,
DisplayName : message . User . DisplayName ,
When : time . Now ( ) ,
Reward : reward ,
} ) ; err != nil {
2021-05-07 16:36:23 +00:00
bot . logger . WithError ( err ) . Error ( "error while adding redeem" )
2021-05-02 12:29:43 +00:00
return
}
// Remove points from user
if err := bot . Loyalty . TakePoints ( map [ string ] int64 { message . User . Name : reward . Price } ) ; err != nil {
2021-05-07 16:36:23 +00:00
bot . logger . WithError ( err ) . Error ( "error while taking points for redeem" )
2021-05-02 12:29:43 +00:00
}
bot . Client . Say ( message . Channel , fmt . Sprintf ( "%s has redeemed %s! (new balance: %d %s)" , message . User . DisplayName , reward . Name , bot . Loyalty . Points [ message . User . Name ] , bot . Loyalty . Config . Currency ) )
return
}
}