2023-09-08 01:36:41 +02:00
package main
import (
"fmt"
"strconv"
"github.com/gempir/go-twitch-irc/v4"
"github.com/lyx0/nourybot/internal/commands"
)
// AddUser calls GetIdByLogin to get the twitch id of the login name and then adds
// the login name, twitch id and supplied level to the database.
func ( app * application ) InitUser ( login , twitchId string , message twitch . PrivateMessage ) {
_ , err := app . Models . Users . Check ( twitchId )
app . Log . Error ( err )
if err != nil {
app . Models . Users . Insert ( login , twitchId )
return
}
}
// DebugUser queries the database for a login name, if that name exists it returns the fields
// and outputs them to twitch chat and a twitch whisper.
func ( app * application ) DebugUser ( login string , message twitch . PrivateMessage ) {
user , err := app . Models . Users . Get ( login )
if err != nil {
reply := fmt . Sprintf ( "Something went wrong FeelsBadMan %s" , err )
app . Send ( message . Channel , reply )
return
} else {
2023-09-16 19:39:10 +02:00
// subject := fmt.Sprintf("DEBUG for user %v", login)
2023-09-16 17:18:14 +02:00
body := fmt . Sprintf ( "id=%v \nlogin=%v \nlevel=%v \nlocation=%v \nlastfm=%v" ,
user . TwitchID ,
user . Login ,
user . Level ,
user . Location ,
user . LastFMUsername ,
)
resp , err := app . uploadPaste ( body )
if err != nil {
app . Log . Errorln ( "Could not upload paste:" , err )
2023-09-19 14:04:58 +02:00
app . Send ( message . Channel , fmt . Sprintf ( "Something went wrong FeelsBadMan %v" , ErrDuringPasteUpload ) )
2023-09-16 17:18:14 +02:00
return
}
app . Send ( message . Channel , resp )
2023-09-16 19:39:10 +02:00
// app.SendEmail(subject, body)
2023-09-08 01:36:41 +02:00
return
}
}
// DeleteUser takes in a login string, queries the database for an entry with
// that login name and tries to delete that entry in the database.
func ( app * application ) DeleteUser ( login string , message twitch . PrivateMessage ) {
err := app . Models . Users . Delete ( login )
if err != nil {
app . Send ( message . Channel , "Something went wrong FeelsBadMan" )
app . Log . Error ( err )
return
}
reply := fmt . Sprintf ( "Deleted user %s" , login )
app . Send ( message . Channel , reply )
}
// EditUserLevel tries to update the database record for the supplied
// login name with the new level.
func ( app * application ) EditUserLevel ( login , lvl string , message twitch . PrivateMessage ) {
// Convert the level string to an integer. This is an easy check to see if
// the level supplied was a number only.
level , err := strconv . Atoi ( lvl )
if err != nil {
app . Log . Error ( err )
app . Send ( message . Channel , fmt . Sprintf ( "Something went wrong FeelsBadMan %s" , ErrUserLevelNotInteger ) )
return
}
err = app . Models . Users . SetLevel ( login , level )
if err != nil {
app . Send ( message . Channel , fmt . Sprintf ( "Something went wrong FeelsBadMan %s" , ErrRecordNotFound ) )
app . Log . Error ( err )
return
} else {
reply := fmt . Sprintf ( "Updated user %s to level %v" , login , level )
app . Send ( message . Channel , reply )
return
}
}
// SetUserLocation sets new location for the user
func ( app * application ) SetUserLocation ( message twitch . PrivateMessage ) {
// snipLength is the length we need to "snip" off of the start of `message`.
// `()set location` = +13
// trailing space = +1
// zero-based = +1
// = 16
snipLength := 15
// Split the twitch message at `snipLength` plus length of the name of the
// The part of the message we are left over with is then passed on to the database
// handlers as the `location` part of the command.
location := message . Message [ snipLength : len ( message . Message ) ]
twitchId := message . User . ID
err := app . Models . Users . SetLocation ( twitchId , location )
if err != nil {
app . Send ( message . Channel , fmt . Sprintf ( "Something went wrong FeelsBadMan %s" , ErrRecordNotFound ) )
app . Log . Error ( err )
return
} else {
reply := fmt . Sprintf ( "Successfully set your location to %v" , location )
app . Send ( message . Channel , reply )
return
}
}
// SetUserLastFM tries to update the database record for the supplied
// login name with the new level.
func ( app * application ) SetUserLastFM ( lastfmUser string , message twitch . PrivateMessage ) {
login := message . User . Name
err := app . Models . Users . SetLastFM ( login , lastfmUser )
if err != nil {
app . Send ( message . Channel , fmt . Sprintf ( "Something went wrong FeelsBadMan %s" , ErrRecordNotFound ) )
app . Log . Error ( err )
return
} else {
reply := fmt . Sprintf ( "Successfully set your lastfm username to %v" , lastfmUser )
app . Send ( message . Channel , reply )
return
}
}
2023-09-19 14:04:58 +02:00
// GetUserLevel takes in a twitchId and queries the database for an entry
// with this twitchId. If there is one it returns the level value as an integer.
2023-09-08 01:36:41 +02:00
// Returns 0 on an error which is the level for unregistered users.
func ( app * application ) GetUserLevel ( twitchId string ) int {
userLevel , err := app . Models . Users . GetLevel ( twitchId )
if err != nil {
return 0
} else {
return userLevel
}
}
func ( app * application ) UserCheckWeather ( message twitch . PrivateMessage ) {
target := message . Channel
twitchLogin := message . User . Name
twitchId := message . User . ID
location , err := app . Models . Users . GetLocation ( twitchId )
if err != nil {
app . Log . Errorw ( "No location data registered for: " ,
"twitchLogin:" , twitchLogin ,
"twitchId:" , twitchId ,
)
reply := "No location for your account set in my database. Use ()set location <location> to register. Otherwise use ()weather <location> without registering."
app . Send ( message . Channel , reply )
return
}
reply , _ := commands . Weather ( location )
app . Send ( target , reply )
}
func ( app * application ) UserCheckLastFM ( message twitch . PrivateMessage ) string {
twitchLogin := message . User . Name
target := message . Channel
lastfmUser , err := app . Models . Users . GetLastFM ( twitchLogin )
if err != nil {
app . Log . Errorw ( "No LastFM account registered for: " ,
"twitchLogin:" , twitchLogin ,
)
reply := "No lastfm account registered in my database. Use ()set lastfm <username> to register. Otherwise use ()lastfm <username> without registering."
return reply
}
reply := commands . LastFmUserRecent ( target , lastfmUser )
return reply
}