check if a user is registered in the database everytime a command is used and if not register said user

This commit is contained in:
lyx0 2023-03-05 19:44:34 +00:00
parent d6712d314a
commit a23e7aafe9
4 changed files with 67 additions and 56 deletions

View file

@ -200,7 +200,7 @@ func (app *Application) handleCommand(message twitch.PrivateMessage) {
//app.SetLastFMUser(cmdParams[2], message)
return
} else if cmdParams[1] == "location" {
app.SetUserLocation(cmdParams[2], message)
app.SetUserLocation(message)
return
} else {
return
@ -349,17 +349,6 @@ func (app *Application) handleCommand(message twitch.PrivateMessage) {
app.AddTimer(cmdParams[1], message)
return
}
case "adduser":
if userLevel < 1000 {
return
} else if msgLen < 3 {
common.Send(target, "Not enough arguments provided.", app.TwitchClient)
return
} else {
// ()adduser nourylul 1000
app.AddUser(cmdParams[1], cmdParams[2], message)
return
}
// ######
// Edit

View file

@ -128,11 +128,11 @@ func main() {
// Received a PrivateMessage (normal chat message).
app.TwitchClient.OnPrivateMessage(func(message twitch.PrivateMessage) {
app.Logger.Infow("Message received",
"message", message,
"message.User.DisplayName", message.User.DisplayName,
"message.Message", message.Message,
)
// app.Logger.Infow("Message received",
// "message", message,
// "message.User.DisplayName", message.User.DisplayName,
// "message.Message", message.Message,
// )
// roomId is the Twitch UserID of the channel the message originated from.
// If there is no roomId something went really wrong.
@ -150,6 +150,7 @@ func main() {
// Check if the first 2 characters of the mesage were our prefix.
// if they were forward the message to the command handler.
if message.Message[:2] == cfg.commandPrefix {
app.InitUser(message.User.Name, message.User.ID, message)
app.handleCommand(message)
return
}

View file

@ -6,48 +6,32 @@ import (
"github.com/gempir/go-twitch-irc/v3"
"github.com/lyx0/nourybot/internal/commands"
"github.com/lyx0/nourybot/internal/commands/decapi"
"github.com/lyx0/nourybot/internal/common"
"github.com/lyx0/nourybot/internal/data"
"go.uber.org/zap"
)
// 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) AddUser(login, lvl string, message twitch.PrivateMessage) {
userId, err := decapi.GetIdByLogin(login)
if err != nil {
func (app *Application) InitUser(login, twitchId string, message twitch.PrivateMessage) {
sugar := zap.NewExample().Sugar()
defer sugar.Sync()
_, err := app.Models.Users.Check(login)
app.Logger.Error(err)
common.Send(message.Channel, "Something went wrong FeelsBadMan", app.TwitchClient)
return
}
// 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.Logger.Error(err)
common.Send(message.Channel, fmt.Sprintf("Something went wrong FeelsBadMan %s", ErrUserLevelNotInteger), app.TwitchClient)
app.Logger.Infow("InitUser: Adding new user:",
"login: ", login,
"twitchId: ", twitchId,
)
app.Models.Users.Insert(login, twitchId)
return
}
// Create a user to hold our values to be inserted to the database.
user := &data.User{
Login: login,
TwitchID: userId,
Level: level,
}
err = app.Models.Users.Insert(user)
if err != nil {
reply := fmt.Sprintf("Something went wrong FeelsBadMan %s", err)
common.Send(message.Channel, reply, app.TwitchClient)
return
} else {
reply := fmt.Sprintf("Added user %s with level %v", login, level)
common.Send(message.Channel, reply, app.TwitchClient)
return
}
sugar.Infow("User Insert: User already registered: xd",
"login: ", login,
"twitchId: ", twitchId,
)
}
// DebugUser queries the database for a login name, if that name exists it returns the fields
@ -105,9 +89,19 @@ func (app *Application) EditUserLevel(login, lvl string, message twitch.PrivateM
}
}
// EditUserLevel tries to update the database record for the supplied
// login name with the new level.
func (app *Application) SetUserLocation(location string, message twitch.PrivateMessage) {
// 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)]
login := message.User.Name
app.Logger.Infow("SetUserLocation",

View file

@ -21,16 +21,16 @@ type UserModel struct {
}
// Insert inserts a user model into the database.
func (u UserModel) Insert(user *User) error {
func (u UserModel) Insert(login, twitchId string) error {
query := `
INSERT INTO users(login, twitchid, level)
VALUES ($1, $2, $3)
INSERT INTO users(login, twitchid)
VALUES ($1, $2)
ON CONFLICT (login)
DO NOTHING
RETURNING id, added_at;
`
args := []interface{}{user.Login, user.TwitchID, user.Level}
args := []interface{}{login, twitchId}
// Execute the query returning the number of affected rows.
result, err := u.DB.Exec(query, args...)
@ -215,6 +215,33 @@ func (u UserModel) Get(login string) (*User, error) {
return &user, nil
}
// Check checks the database for a record with the given login name.
func (u UserModel) Check(login string) (*User, error) {
query := `
SELECT id, added_at, login
FROM users
WHERE login = $1`
var user User
err := u.DB.QueryRow(query, login).Scan(
&user.ID,
&user.Login,
&user.TwitchID,
)
if err != nil {
switch {
case errors.Is(err, sql.ErrNoRows):
return nil, ErrRecordNotFound
default:
return nil, err
}
}
return &user, nil
}
// Delete searches the database for a value with the supplied login name and if
// one exists deletes the record, returning any errors that might occur.
func (u UserModel) Delete(login string) error {