implement database logging for used commands

This commit is contained in:
lyx0 2023-10-10 16:07:35 +02:00
parent 11f084978d
commit cd79c34643
7 changed files with 87 additions and 5 deletions

View file

@ -5,6 +5,7 @@ import (
"strconv" "strconv"
"github.com/gempir/go-twitch-irc/v4" "github.com/gempir/go-twitch-irc/v4"
"github.com/google/uuid"
"github.com/lyx0/nourybot/internal/data" "github.com/lyx0/nourybot/internal/data"
) )
@ -234,3 +235,14 @@ func (app *application) DeleteCommand(name string, message twitch.PrivateMessage
reply := fmt.Sprintf("Deleted command %s", name) reply := fmt.Sprintf("Deleted command %s", name)
app.Send(message.Channel, reply) app.Send(message.Channel, reply)
} }
func (app *application) LogCommand(msg twitch.PrivateMessage, commandName string, userLevel int) {
twitchLogin := msg.User.Name
twitchID := msg.User.ID
twitchMessage := msg.Message
twitchChannel := msg.Channel
identifier := uuid.NewString()
rawMsg := msg.Raw
go app.Models.CommandsLogs.Insert(twitchLogin, twitchID, twitchChannel, twitchMessage, commandName, userLevel, identifier, rawMsg)
}

View file

@ -49,6 +49,7 @@ func (app *application) handleCommand(message twitch.PrivateMessage) {
"userLevel", userLevel, "userLevel", userLevel,
) )
go app.LogCommand(message, commandName, userLevel)
// A `commandName` is every message starting with `()`. // A `commandName` is every message starting with `()`.
// Hardcoded commands have a priority over database commands. // Hardcoded commands have a priority over database commands.
// Switch over the commandName and see if there is a hardcoded case for it. // Switch over the commandName and see if there is a hardcoded case for it.

View file

@ -169,7 +169,9 @@ func main() {
common.StartTime() common.StartTime()
app.TwitchClient.Join("nourylul") app.TwitchClient.Join("nourylul")
app.TwitchClient.Join("nourybot")
app.Send("nourylul", "xD!") app.Send("nourylul", "xD!")
app.Send("nourybot", "gopherDance")
// Successfully connected to Twitch // Successfully connected to Twitch
app.Log.Infow("Successfully connected to Twitch Servers", app.Log.Infow("Successfully connected to Twitch Servers",

View file

@ -0,0 +1,46 @@
package data
import (
"database/sql"
)
type CommandsLog struct {
ID int `json:"id"`
TwitchLogin string `json:"twitch_login"`
TwitchID string `json:"twitch_id,omitempty"`
TwitchChannel string `json:"twitch_channel,omitempty"`
TwitchMessage string `json:"twitch_message,omitempty"`
CommandName string `json:"command_name,omitempty"`
UserLevel int `json:"user_level,omitempty"`
Identifier string `json:"identifier,omitempty"`
RawMessage string `json:"raw_message,omitempty"`
}
type CommandsLogModel struct {
DB *sql.DB
}
// Get tries to find a command in the database with the provided name.
func (c CommandsLogModel) Insert(twitchLogin, twitchId, twitchChannel, twitchMessage, commandName string, uLvl int, identifier, rawMsg string) {
query := `
INSERT into commands_logs(twitch_login, twitch_id, twitch_channel, twitch_message, command_name, user_level, identifier, raw_message)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
RETURNING id;
`
args := []interface{}{twitchLogin, twitchId, twitchChannel, twitchMessage, commandName, uLvl, identifier, rawMsg}
result, err := c.DB.Exec(query, args...)
if err != nil {
return
}
rowsAffected, err := result.RowsAffected()
if err != nil {
return
}
if rowsAffected == 0 {
return
}
}

View file

@ -57,6 +57,9 @@ type Models struct {
Insert(twitchLogin, twitchID, twitchMessage, twitchChannel, filehoster, downloadURL, identifier string) Insert(twitchLogin, twitchID, twitchMessage, twitchChannel, filehoster, downloadURL, identifier string)
UpdateUploadURL(identifier, uploadURL string) UpdateUploadURL(identifier, uploadURL string)
} }
CommandsLogs interface {
Insert(twitchLogin, twitchId, twitchChannel, twitchMessage, commandName string, uLvl int, identifier, rawMsg string)
}
} }
func NewModels(db *sql.DB) Models { func NewModels(db *sql.DB) Models {
@ -66,5 +69,6 @@ func NewModels(db *sql.DB) Models {
Commands: CommandModel{DB: db}, Commands: CommandModel{DB: db},
Timers: TimerModel{DB: db}, Timers: TimerModel{DB: db},
Uploads: UploadModel{DB: db}, Uploads: UploadModel{DB: db},
CommandsLogs: CommandsLogModel{DB: db},
} }
} }

View file

@ -0,0 +1 @@
DROP TABLE IF EXISTS commands_logs;

View file

@ -0,0 +1,16 @@
CREATE TABLE IF NOT EXISTS commands_logs (
id bigserial PRIMARY KEY,
added_at timestamp(0) with time zone NOT NULL DEFAULT NOW(),
twitch_login text NOT NULL,
twitch_id text NOT NULL,
twitch_channel text NOT NULL,
twitch_message text NOT NULL,
command_name text NOT NULL,
user_level integer NOT NULL,
identifier text NOT NULL,
raw_message text NOT NULL
);
INSERT INTO commands_logs (added_at,twitch_login,twitch_id,twitch_channel,twitch_message,command_name,user_level,identifier,raw_message) VALUES
(NOW(),'nourylul','31437432','nourybot','()weather Vilnius','weather',1000,'8441e97b-f622-4c42-b9b1-9bf22ba0d0bd','@badge-info=;badges=moderator/1,game-developer/1;color=#00F2FB;display-name=nourylul;emotes=;first-msg=0;flags=;id=87d40f5c-8c7c-4105-9f57-b1a953bb42d0;mod=1;returning-chatter=0;room-id=596581605;subscriber=0;tmi-sent-ts=1696945359165;turbo=0;user-id=31437432;user-type=mod :nourylul!nourylul@nourylul.tmi.twitch.tv PRIVMSG #nourybot :()weather Vilnius');