diff --git a/cmd/nourybot/channel.go b/cmd/nourybot/channel.go index e04adf7..08233ed 100644 --- a/cmd/nourybot/channel.go +++ b/cmd/nourybot/channel.go @@ -7,9 +7,9 @@ import ( "github.com/lyx0/nourybot/pkg/ivr" ) -// AddChannel takes in a channel name, then calls GetIdByLogin for the -// channels ID and inserts both the name and id value into the database. -// If there is no error thrown the TwitchClient joins the channel afterwards. +// AddChannel calls ivr.IDByUsername with the provided login and tries to insert +// the Twitch login and userID into the database. If there is no error thrown the +// TwitchClient joins the channel afterwards. func (app *application) AddChannel(login string, message twitch.PrivateMessage) { userID := ivr.IDByUsername(login) @@ -27,7 +27,6 @@ func (app *application) AddChannel(login string, message twitch.PrivateMessage) } // GetAllChannels() queries the database and lists all channels. -// Only used for debug/information purposes. func (app *application) GetAllChannels() { channel, err := app.Models.Channels.GetAll() if err != nil { diff --git a/cmd/nourybot/command.go b/cmd/nourybot/command.go index 8fb81c2..1ad4693 100644 --- a/cmd/nourybot/command.go +++ b/cmd/nourybot/command.go @@ -10,8 +10,8 @@ import ( "github.com/lyx0/nourybot/internal/data" ) -// AddCommand splits a message into two parts and passes on the -// name and text to the database handler. +// AddCommand splits a message into two parts and passes on the name and text +// to the database handler. func (app *application) AddCommand(name string, message twitch.PrivateMessage) { // snipLength is the length we need to "snip" off of the start of `message`. // `()add command` = +12 @@ -21,13 +21,12 @@ func (app *application) AddCommand(name string, message twitch.PrivateMessage) { snipLength := 15 // Split the twitch message at `snipLength` plus length of the name of the - // command that we want to add. - // The part of the message we are left over with is then passed on to the database - // handlers as the `text` part of the command. + // command that we want to add. The part of the message we are left over with + // is then passed on to the database handlers as the `text` part of the command. // - // e.g. `()addcommand CoolSponsors Check out CoolSponsor.com they are the coolest sponsors! + // e.g. ()addcommand CoolSponsors Check out CoolSponsor.com they are the coolest sponsors! // | <- snipLength + name -> | <--- command text with however many characters ---> | - // | <----- 14 + 12 ------> | + // | <----- 15 + 12 ------> | text := message.Message[snipLength+len(name) : len(message.Message)] command := &data.Command{ Name: name, @@ -50,12 +49,11 @@ func (app *application) AddCommand(name string, message twitch.PrivateMessage) { } } -// GetCommand queries the database for a name. If an entry exists it checks -// if the Command.Level is 0, if it is the command.Text value is returned. +// GetCommand queries the database for a command with the provided name. If an entry exists +// it checks if the Command.Level is 0, if it is the command.Text value is returned. // -// If the Command.Level is not 0 it queries the database for the level of the -// user who sent the message. If the users level is equal or higher -// the command.Text field is returned. +// If the Command.Level is not 0 it queries the database for the level of the user who sent +// the message. If the users level is equal or higher the command.Text field is returned. func (app *application) GetCommand(target, commandName string, userLevel int) (string, error) { app.Log.Infow("command", "target", target, @@ -75,22 +73,17 @@ func (app *application) GetCommand(target, commandName string, userLevel int) (s } else if userLevel >= command.Level { // Userlevel is sufficient so return the command.Text return command.Text, nil - - // If the command has no level set just return the text. - // Otherwise check if the level is high enough. } // Userlevel was not enough so return an empty string and error. return "", ErrUserInsufficientLevel } -// GetCommand queries the database for a name. If an entry exists it checks -// if the Command.Level is 0, if it is the command.Text value is returned. +// GetCommandDescription queries the database for a command with the provided name in the channel. +// If a command exist it then checks if the Command.Level is 0, if it is the command.Text value is returned. // -// If the Command.Level is not 0 it queries the database for the level of the -// user who sent the message. If the users level is equal or higher -// the command.Text field is returned. +// If the Command.Level is not 0 it queries the database for the level of the user who sent +// the message. If the users level is equal or higher the command.Text field is returned. func (app *application) GetCommandDescription(name, channel, username string) (string, error) { - // Fetch the command from the database if it exists. command, err := app.Models.Commands.Get(name, channel) if err != nil { // It probably did not exist @@ -102,8 +95,7 @@ func (app *application) GetCommandDescription(name, channel, username string) (s if command.Level == 0 { return command.Description, nil } else { - // Get the user from the database to check if the userlevel is equal - // or higher than the command.Level. + // Get the user from the database to check if the userlevel is sufficient. user, err := app.Models.Users.Get(username) if err != nil { return "", err @@ -118,8 +110,8 @@ func (app *application) GetCommandDescription(name, channel, username string) (s return "", ErrUserInsufficientLevel } -// EditCommandLevel takes in a name and level string and updates the entry with name -// to the supplied level value. +// EditCommandLevel checks if a command with the provided name exists in the database. If it does it +// changes the level of the command with the supplied value. func (app *application) EditCommandLevel(name, lvl string, message twitch.PrivateMessage) { level, err := strconv.Atoi(lvl) if err != nil { @@ -141,10 +133,9 @@ func (app *application) EditCommandLevel(name, lvl string, message twitch.Privat } } -// DebugCommand checks if a command with the provided name exists in the database -// and outputs information about it in the chat. +// DebugCommand checks if a command with the provided name exists in the database and if it +// does it creates a new paste with the commands information. func (app *application) DebugCommand(name string, message twitch.PrivateMessage) { - // Query the database for a command with the provided name cmd, err := app.Models.Commands.Get(name, message.Channel) if err != nil { reply := fmt.Sprintf("Something went wrong FeelsBadMan %s", err) @@ -160,7 +151,6 @@ func (app *application) DebugCommand(name string, message twitch.PrivateMessage) cmd.Description, ) - //app.Send(message.Channel, reply) resp, err := app.uploadPaste(reply) if err != nil { app.Log.Errorln("Could not upload paste:", err) @@ -168,7 +158,6 @@ func (app *application) DebugCommand(name string, message twitch.PrivateMessage) return } app.Send(message.Channel, resp, message) - //app.SendEmail(fmt.Sprintf("DEBUG for command %s", name), reply) return } } @@ -205,7 +194,7 @@ func (app *application) EditCommandHelp(name string, message twitch.PrivateMessa } } -// DeleteCommand takes in a name value and deletes the command from the database if it exists. +// DeleteCommand takes in a name of a command and deletes the command from the database if it exists. func (app *application) DeleteCommand(name string, message twitch.PrivateMessage) { err := app.Models.Commands.Delete(name, message.Channel) if err != nil { @@ -218,6 +207,7 @@ func (app *application) DeleteCommand(name string, message twitch.PrivateMessage app.Send(message.Channel, reply, message) } +// LogCommand is called when a command is called and logs information about it in the database. func (app *application) LogCommand(msg twitch.PrivateMessage, commandName string, userLevel int) { twitchLogin := msg.User.Name twitchID := msg.User.ID @@ -229,8 +219,7 @@ func (app *application) LogCommand(msg twitch.PrivateMessage, commandName string go app.Models.CommandsLogs.Insert(twitchLogin, twitchID, twitchChannel, twitchMessage, commandName, userLevel, identifier, rawMsg) } -// InitialTimers is called on startup and queries the database for a list of -// timers and then adds each onto the scheduler. +// ListCommands queries the databse for all commands, and then creates a new paste with them. func (app *application) ListCommands() string { command, err := app.Models.Commands.GetAll() if err != nil { @@ -277,8 +266,8 @@ func (app *application) ListCommands() string { return reply } -// InitialTimers is called on startup and queries the database for a list of -// timers and then adds each onto the scheduler. +// ListChannelCommands queries the databse for all commands in a specified twitch channel +// and then creates a new paste with them. func (app *application) ListChannelCommands(channel string) string { channelUrl := fmt.Sprintf("https://bot.noury.li/commands/%s", channel) commandUrl := "https://bot.noury.li/commands" diff --git a/cmd/nourybot/download.go b/cmd/nourybot/download.go index 8383436..367eb66 100644 --- a/cmd/nourybot/download.go +++ b/cmd/nourybot/download.go @@ -37,6 +37,8 @@ func (app *application) NewDownload(destination, target, link string, msg twitch } } +// ConvertAndSave downloads a given video link with yt-dlp, then tries to convert it +// to mp4 with ffmpeg and afterwards serves the video from /public/uploads func (app *application) ConvertAndSave(fName, link string, msg twitch.PrivateMessage) { goutubedl.Path = "yt-dlp" uuid_og := uuid.NewString() @@ -64,10 +66,8 @@ func (app *application) ConvertAndSave(fName, link string, msg twitch.PrivateMes app.Send(msg.Channel, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg) return } - //app.Send(target, "Downloaded.", msg) fileName := fmt.Sprintf("/public/uploads/%s.%s", uuid_og, rExt) f, err := os.Create(fileName) - //app.Send(target, fmt.Sprintf("Filename: %s", fileName), msg) if err != nil { app.Log.Errorln(err) app.Send(msg.Channel, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg) @@ -100,6 +100,8 @@ func (app *application) ConvertAndSave(fName, link string, msg twitch.PrivateMes app.Send(msg.Channel, fmt.Sprintf("https://bot.noury.li/uploads/%s.mp4", fName), msg) } +// ConvertAndSave downloads a given video link with yt-dlp, then tries to convert it +// to mp4 with ffmpeg and afterwards passes the result to NewUpload with yaf.li as destination. func (app *application) ConvertToMP4(link string, msg twitch.PrivateMessage) { fName := "in" goutubedl.Path = "yt-dlp" @@ -129,10 +131,8 @@ func (app *application) ConvertToMP4(link string, msg twitch.PrivateMessage) { app.Send(msg.Channel, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg) return } - //app.Send(target, "Downloaded.", msg) fileName := fmt.Sprintf("/public/uploads/%s.%s", uuid_og, rExt) f, err := os.Create(fileName) - //app.Send(target, fmt.Sprintf("Filename: %s", fileName), msg) if err != nil { app.Log.Errorln(err) app.Send(msg.Channel, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg) @@ -165,6 +165,8 @@ func (app *application) ConvertToMP4(link string, msg twitch.PrivateMessage) { go app.NewUpload("yaf", out, msg.Channel, uuid_new, msg) } +// YafDownload downloads a given link with yt-dlp and then passes the result on to the NewUpload function +// with yaf.li as destination. func (app *application) YafDownload(target, link, identifier string, msg twitch.PrivateMessage) { goutubedl.Path = "yt-dlp" @@ -191,10 +193,8 @@ func (app *application) YafDownload(target, link, identifier string, msg twitch. app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg) return } - //app.Send(target, "Downloaded.", msg) fileName := fmt.Sprintf("/public/uploads/%s.%s", identifier, rExt) f, err := os.Create(fileName) - //app.Send(target, fmt.Sprintf("Filename: %s", fileName), msg) if err != nil { app.Log.Errorln(err) @@ -210,14 +210,12 @@ func (app *application) YafDownload(target, link, identifier string, msg twitch. downloadResult.Close() f.Close() - // duration := 5 * time.Second - // dl.twitchClient.Say(target, "ResidentSleeper ..") - // time.Sleep(duration) go app.NewUpload("yaf", fileName, target, identifier, msg) - } +// KappaDownload downloads a given link with yt-dlp and then passes the result on to the NewUpload function +// with kappa.lol as destination. func (app *application) KappaDownload(target, link, identifier string, msg twitch.PrivateMessage) { goutubedl.Path = "yt-dlp" @@ -263,14 +261,12 @@ func (app *application) KappaDownload(target, link, identifier string, msg twitc downloadResult.Close() f.Close() - // duration := 5 * time.Second - // dl.twitchClient.Say(target, "ResidentSleeper ..") - // time.Sleep(duration) go app.NewUpload("kappa", fileName, target, identifier, msg) - } +// GoFileDownload downloads a given link with yt-dlp and then passes the result to the NewUpload function +// with gofile.io as destination. func (app *application) GofileDownload(target, link, identifier string, msg twitch.PrivateMessage) { goutubedl.Path = "yt-dlp" @@ -324,6 +320,8 @@ func (app *application) GofileDownload(target, link, identifier string, msg twit go app.NewUpload("gofile", fileName, target, identifier, msg) } +// CatboxDownload downloads a given link with yt-dlp and then passes the result to NewUpload function +// with catbox.moe as destination. func (app *application) CatboxDownload(target, link, identifier string, msg twitch.PrivateMessage) { goutubedl.Path = "yt-dlp" var fileName string @@ -348,10 +346,8 @@ func (app *application) CatboxDownload(target, link, identifier string, msg twit app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg) return } - //app.Send(target, "Downloaded.", msg) fileName = fmt.Sprintf("/public/uploads/%s.%s", identifier, rExt) f, err := os.Create(fileName) - //app.Send(target, fmt.Sprintf("Filename: %s", fileName), msg) if err != nil { app.Log.Errorln(err) diff --git a/cmd/nourybot/email.go b/cmd/nourybot/email.go index e22c190..35b0b92 100644 --- a/cmd/nourybot/email.go +++ b/cmd/nourybot/email.go @@ -8,7 +8,8 @@ import ( "gopkg.in/gomail.v2" ) -// Thanks to Twitch moving whispers again I just use email now. +// SendEmail sends an email to the email address configured in the .env file +// with the supplied body. func (app *application) SendEmail(subject, body string) { err := godotenv.Load() if err != nil { diff --git a/cmd/nourybot/eventsub.go b/cmd/nourybot/eventsub.go index ced2744..1941567 100644 --- a/cmd/nourybot/eventsub.go +++ b/cmd/nourybot/eventsub.go @@ -17,16 +17,6 @@ const ( ) func (app *application) createLiveSubscription(target, channel string) string { - // client, err := helix.NewClient(&helix.Options{ - // ClientID: app.Config.twitchClientId, - // AppAccessToken: app.HelixClient.GetAppAccessToken(), - // }) - // if err != nil { - // app.Log.Errorw("Error creating new helix client", - // "err", err, - // ) - // } - uid := ivr.IDByUsername(channel) if uid == "xd" { return fmt.Sprintf("Could not find user with name %v", channel) @@ -56,22 +46,12 @@ func (app *application) createLiveSubscription(target, channel string) string { } func (app *application) deleteLiveSubscription(target, channel string) string { - client, err := helix.NewClient(&helix.Options{ - ClientID: app.Config.twitchClientId, - AppAccessToken: app.HelixClient.GetAppAccessToken(), - }) - if err != nil { - app.Log.Errorw("Error creating new helix client", - "err", err, - ) - } - uid := ivr.IDByUsername(channel) if uid == "xd" { return fmt.Sprintf("Could not find user with name %v", channel) } - resp, err := client.GetEventSubSubscriptions(&helix.EventSubSubscriptionsParams{ + resp, err := app.HelixClient.GetEventSubSubscriptions(&helix.EventSubSubscriptionsParams{ UserID: uid, }) if err != nil { @@ -103,7 +83,7 @@ func (app *application) deleteLiveSubscription(target, channel string) string { //eventSubID := resp.Data.EventSubSubscriptions[0].ID //app.SendNoContext("nouryxd", eventSubID) - resp2, err := client.RemoveEventSubSubscription(eventSubID) + resp2, err := app.HelixClient.RemoveEventSubSubscription(eventSubID) if err != nil { app.Log.Errorw("Error getting EventSub subscriptions", "resp", resp, @@ -121,16 +101,6 @@ func (app *application) deleteLiveSubscription(target, channel string) string { } func (app *application) createOfflineSubscription(target, channel string) string { - // client, err := helix.NewClient(&helix.Options{ - // ClientID: app.Config.twitchClientId, - // AppAccessToken: app.HelixClient.GetAppAccessToken(), - // }) - // if err != nil { - // app.Log.Errorw("Error creating new helix client", - // "err", err, - // ) - // } - uid := ivr.IDByUsername(channel) if uid == "xd" { return fmt.Sprintf("Could not find user with name %v", channel) @@ -160,22 +130,12 @@ func (app *application) createOfflineSubscription(target, channel string) string } func (app *application) deleteOfflineSubscription(target, channel string) string { - client, err := helix.NewClient(&helix.Options{ - ClientID: app.Config.twitchClientId, - AppAccessToken: app.HelixClient.GetAppAccessToken(), - }) - if err != nil { - app.Log.Errorw("Error creating new helix client", - "err", err, - ) - } - uid := ivr.IDByUsername(channel) if uid == "xd" { return fmt.Sprintf("Could not find user with name %v", channel) } - resp, err := client.GetEventSubSubscriptions(&helix.EventSubSubscriptionsParams{ + resp, err := app.HelixClient.GetEventSubSubscriptions(&helix.EventSubSubscriptionsParams{ UserID: uid, }) if err != nil { @@ -207,7 +167,7 @@ func (app *application) deleteOfflineSubscription(target, channel string) string //eventSubID = resp.Data.EventSubSubscriptions[0].ID //app.SendNoContext("nouryxd", eventSubID) - resp2, err := client.RemoveEventSubSubscription(eventSubID) + resp2, err := app.HelixClient.RemoveEventSubSubscription(eventSubID) if err != nil { app.Log.Errorw("Error getting EventSub subscriptions", "resp", resp, diff --git a/cmd/nourybot/main.go b/cmd/nourybot/main.go index 117de58..d9935c3 100644 --- a/cmd/nourybot/main.go +++ b/cmd/nourybot/main.go @@ -50,9 +50,6 @@ type application struct { // Rdb *redis.Client } -// main() only calls the run function so that we can go around the limitation -// that main() cannot return anything, like int for error codes in c for example. -// https://grafana.com/blog/2024/02/09/how-i-write-http-services-in-go-after-13-years/ func main() { ctx := context.Background() ctx, cancel := signal.NotifyContext(ctx, os.Interrupt) @@ -65,8 +62,7 @@ func main() { func run(ctx context.Context, w io.Writer, args []string) error { var cfg config - // Initialize a new sugared logger that we'll pass on - // down through the application. + logger := zap.NewExample() defer func() { if err := logger.Sync(); err != nil { @@ -156,13 +152,6 @@ func run(ctx context.Context, w io.Writer, args []string) error { // Received a PrivateMessage (normal chat message). app.TwitchClient.OnPrivateMessage(func(message twitch.PrivateMessage) { - // sugar.Infow("New Twitch PrivateMessage", - // "message.Channel", message.Channel, - // "message.User.DisplayName", message.User.DisplayName, - // "message.User.ID", message.User.ID, - // "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. roomId := message.Tags["room-id"] diff --git a/cmd/nourybot/predb.go b/cmd/nourybot/predb.go index 27ac54f..7b9f82f 100644 --- a/cmd/nourybot/predb.go +++ b/cmd/nourybot/predb.go @@ -14,6 +14,7 @@ type latestFullResult struct { Results int `json:"results"` Data []latestSingleResult `json:"data"` } + type latestSingleResult struct { ID string `json:"id"` PreTime string `json:"pretime"` diff --git a/cmd/nourybot/router.go b/cmd/nourybot/router.go index d2f2054..b65f2e9 100644 --- a/cmd/nourybot/router.go +++ b/cmd/nourybot/router.go @@ -10,6 +10,7 @@ import ( "net/http" "os" "sort" + "time" "github.com/julienschmidt/httprouter" "github.com/lyx0/nourybot/internal/data" @@ -77,6 +78,9 @@ func (app *application) eventsubFollow(w http.ResponseWriter, r *http.Request, _ w.WriteHeader(200) w.Write([]byte("ok")) + // Sleep for 5 seconds before checking querying game and title as they might not be updated. + time.Sleep(time.Duration(5) * time.Second) + game := ivr.GameByUsername(liveEvent.BroadcasterUserLogin) title := ivr.TitleByUsername(liveEvent.BroadcasterUserLogin) @@ -114,8 +118,6 @@ func (app *application) timersRoute(w http.ResponseWriter, r *http.Request, _ ht app.Log.Errorw("Error trying to retrieve all timer for a channel from database", err) return } - // The slice of timers is only used to log them at - // the start so it looks a bit nicer. // Iterate over all timers and then add them onto the scheduler. for i, v := range timerData { @@ -164,8 +166,6 @@ func (app *application) channelTimersRoute(w http.ResponseWriter, r *http.Reques app.Log.Errorw("Error trying to retrieve all timer for a channel from database", err) return } - // The slice of timers is only used to log them at - // the start so it looks a bit nicer. // Iterate over all timers and then add them onto the scheduler. for i, v := range timerData { @@ -206,11 +206,8 @@ func (app *application) commandsRoute(w http.ResponseWriter, r *http.Request, _ return } - // The slice of timers is only used to log them at - // the start so it looks a bit nicer. var cs []string - // Iterate over all timers and then add them onto the scheduler. for i, v := range helpText { // idk why this works but it does so no touchy touchy. // https://github.com/robfig/cron/issues/420#issuecomment-940949195 diff --git a/cmd/nourybot/send.go b/cmd/nourybot/send.go index 3584221..f2d5c5c 100644 --- a/cmd/nourybot/send.go +++ b/cmd/nourybot/send.go @@ -12,16 +12,14 @@ import ( "github.com/google/uuid" ) -// banphraseResponse is the data we receive back from -// the banphrase API +// banphraseResponse is the data we receive back from the banphrase API type banphraseResponse struct { Banned bool `json:"banned"` InputMessage string `json:"input_message"` BanphraseData banphraseData `json:"banphrase_data"` } -// banphraseData contains details about why a message -// was banphrased. +// banphraseData contains details about why a message was banphrased. type banphraseData struct { Id int `json:"id"` Name string `json:"name"` @@ -83,8 +81,7 @@ func (app *application) checkMessage(text string) (bool, string) { return true, "Banphrase API couldn't be reached monkaS" } -// Send is used to send twitch replies and contains the necessary -// safeguards and logic for that. +// SendNoContext is used to send twitch replies without the full twitch.PrivateMessage context to be logged. func (app *application) SendNoContext(target, message string) { // Message we are trying to send is empty. if len(message) == 0 { @@ -141,8 +138,8 @@ func (app *application) SendNoContext(target, message string) { } } -// Send is used to send twitch replies and contains the necessary -// safeguards and logic for that. +// Send is used to send twitch replies and contains the necessary safeguards and logic for that. +// Send also logs the twitch.PrivateMessage contents into the database. func (app *application) Send(target, message string, msgContext twitch.PrivateMessage) { // Message we are trying to send is empty. if len(message) == 0 { @@ -200,8 +197,7 @@ func (app *application) Send(target, message string, msgContext twitch.PrivateMe } } -// Send is used to send twitch replies and contains the necessary -// safeguards and logic for that. +// SendNoBanphrase does not check the banphrase before sending a twitch mesage. func (app *application) SendNoBanphrase(target, message string) { // Message we are trying to send is empty. if len(message) == 0 { diff --git a/cmd/nourybot/timer.go b/cmd/nourybot/timer.go index 7e61e7a..4e67888 100644 --- a/cmd/nourybot/timer.go +++ b/cmd/nourybot/timer.go @@ -52,9 +52,8 @@ func (app *application) AddTimer(name, repeat string, message twitch.PrivateMess Repeat: repeat, } - // Check if the time string we got is valid, this is important - // because the Scheduler panics instead of erroring out if an invalid - // time format string is supplied. + // Check if the time string we got is valid, this is important because the Scheduler + // panics instead of erroring out if an invalid time format string is supplied. if validateTimeFormat { timer := &data.Timer{ Name: name, @@ -70,19 +69,14 @@ func (app *application) AddTimer(name, repeat string, message twitch.PrivateMess "timer", timer, "error", err, ) - reply := fmt.Sprintln("Something went wrong FeelsBadMan") app.Send(message.Channel, reply, message) return } else { - // cronName is the internal, unique tag/name for the timer. - // A timer named "sponsor" in channel "forsen" will be named "forsensponsor" - app.Scheduler.AddFunc(fmt.Sprintf("@every %s", repeat), func() { app.newPrivateMessageTimer(message.Channel, text) }, id) app.Log.Infow("Added new timer", "timer", timer, ) - reply := fmt.Sprintf("Successfully added timer %s repeating every %s", name, repeat) app.Send(message.Channel, reply, message) return @@ -102,8 +96,6 @@ func (app *application) AddTimer(name, repeat string, message twitch.PrivateMess // with the same name. It is technically not editing the timer. func (app *application) EditTimer(name, repeat string, message twitch.PrivateMessage) { // Check if a timer with that name is in the database. - app.Log.Info(name) - old, err := app.Models.Timers.Get(name) if err != nil { app.Log.Errorw("Could not get timer", @@ -115,9 +107,7 @@ func (app *application) EditTimer(name, repeat string, message twitch.PrivateMes return } - // ----------------------- // Delete the old timer - // ----------------------- identifier := old.Identifier app.Scheduler.RemoveJob(identifier) @@ -134,21 +124,8 @@ func (app *application) EditTimer(name, repeat string, message twitch.PrivateMes return } - // ----------------------- // Add the new timer - // ----------------------- - //cmdParams := strings.SplitN(message.Message, " ", 500) - // prefixLength is the length of `()editcommand` plus +2 (for the space and zero based) prefix := "()edit timer" - prefixLength := len("()add timer") - nameLength := len(name) - repeatLength := len(repeat) - app.Log.Infow("Lengths", - "prefix", prefixLength, - "name", nameLength, - "repeat", repeatLength, - "sum", prefixLength+nameLength+repeatLength, - ) // Split the message into the parts we need. // @@ -156,8 +133,8 @@ func (app *application) EditTimer(name, repeat string, message twitch.PrivateMes // parts: | prefix | |name | |repeat | <----------- text -------------> | text := message.Message[3+len(prefix)+len(name)+len(repeat) : len(message.Message)] - // validateTimeFormat will be true if the repeat parameter is in - // the format of either 30m, 10h, or 10h30m. + // validateTimeFormat will be true if the repeat parameter is in the format + // of either 30m, 10h, or 10h30m. validateTimeFormat, err := regexp.MatchString(`^(\d{1,2}[h])$|^(\d+[m])$|^(\d+[s])$|((\d{1,2}[h])((([0]?|[1-5]{1})[0-9])[m]))$`, repeat) if err != nil { app.Log.Errorw("Received malformed time format in timer", @@ -176,9 +153,8 @@ func (app *application) EditTimer(name, repeat string, message twitch.PrivateMes Repeat: repeat, } - // Check if the time string we got is valid, this is important - // because the Scheduler panics instead of erroring out if an invalid - // time format string is supplied. + // Check if the time string we got is valid, this is important because the + // Scheduler panics instead of erroring out if an invalid time format string is supplied. if validateTimeFormat { timer := &data.Timer{ Name: name, @@ -194,13 +170,10 @@ func (app *application) EditTimer(name, repeat string, message twitch.PrivateMes "timer", timer, "error", err, ) - reply := fmt.Sprintln("Something went wrong FeelsBadMan") app.Send(message.Channel, reply, message) return } else { // this is a bit scuffed. The else here is the end of a successful call. - // cronName is the internal, unique tag/name for the timer. - // A timer named "sponsor" in channel "forsen" will be named "forsensponsor" app.Scheduler.AddFunc(fmt.Sprintf("@every %s", repeat), func() { app.newPrivateMessageTimer(message.Channel, text) }, id) app.Log.Infow("Updated a timer", @@ -225,8 +198,7 @@ func (app *application) EditTimer(name, repeat string, message twitch.PrivateMes } } -// InitialTimers is called on startup and queries the database for a list of -// timers and then adds each onto the scheduler. +// ListTimers queries the database for all timers and uploads the contents as a paste. func (app *application) ListTimers() string { timer, err := app.Models.Timers.GetAll() if err != nil { @@ -257,11 +229,7 @@ func (app *application) ListTimers() string { "\n\n", v.ID, v.Name, v.Identifier, v.Text, v.Channel, v.Repeat, ) - - // Add new value to the slice ts = append(ts, t) - - //app.Scheduler.AddFunc(repeating, func() { app.newPrivateMessageTimer(v.Channel, v.Text) }, cronName) } reply, err := app.uploadPaste(strings.Join(ts, "")) @@ -282,8 +250,6 @@ func (app *application) InitialTimers() { return } - // The slice of timers is only used to log them at - // the start so it looks a bit nicer. var ts []*data.Timer // Iterate over all timers and then add them onto the scheduler. @@ -311,15 +277,14 @@ func (app *application) InitialTimers() { ) } -// newPrivateMessageTimer is a helper function to set timers -// which trigger into sending a twitch PrivateMessage. +// newPrivateMessageTimer is a helper function to set timers which trigger +// into sending a twitch PrivateMessage. func (app *application) newPrivateMessageTimer(channel, text string) { app.SendNoContext(channel, text) } // DeleteTimer takes in the name of a timer and tries to delete the timer from the database. func (app *application) DeleteTimer(name string, message twitch.PrivateMessage) { - identifier, err := app.Models.Timers.GetIdentifier(name) if err != nil { app.Log.Errorw("Error retrieving identifier rom database", @@ -354,6 +319,7 @@ func (app *application) DeleteTimer(name string, message twitch.PrivateMessage) app.Send(message.Channel, reply, message) } +// DebugChannelTimers queries the database for all timers in channel and uploads the contents as a paste. func (app *application) DebugChannelTimers(channel string) string { timer, err := app.Models.Timers.GetChannelTimer(channel) if err != nil { @@ -396,6 +362,8 @@ func (app *application) DebugChannelTimers(channel string) string { return reply } + +// ListchannelTimer queries the database for all timers in channel and uploads the contents as a paste. func (app *application) ListChannelTimer(channel string) string { timer, err := app.Models.Timers.GetChannelTimer(channel) if err != nil { @@ -403,8 +371,6 @@ func (app *application) ListChannelTimer(channel string) string { return "" } - // The slice of timers is only used to log them at - // the start so it looks a bit nicer. var ts []string // Iterate over all timers and then add them onto the scheduler. @@ -423,7 +389,6 @@ func (app *application) ListChannelTimer(channel string) string { v.Name, v.Text, v.Repeat, ) - // Add new value to the slice ts = append(ts, t) } diff --git a/cmd/nourybot/upload.go b/cmd/nourybot/upload.go index 3698d84..3cad80e 100644 --- a/cmd/nourybot/upload.go +++ b/cmd/nourybot/upload.go @@ -44,6 +44,7 @@ func (app *application) NewUpload(destination, fileName, target, identifier stri } } +// CatboxUpload uplodas the given file to catbox.moe. func (app *application) CatboxUpload(target, fileName, identifier string, msg twitch.PrivateMessage) { defer os.Remove(fileName) file, err := os.Open(fileName) @@ -54,10 +55,6 @@ func (app *application) CatboxUpload(target, fileName, identifier string, msg tw defer file.Close() app.Send(target, "Uploading to catbox.moe... dankCircle", msg) - // if size := helper.FileSize(fileName); size > 209715200 { - // return "", fmt.Errorf("file too large, size: %d MB", size/1024/1024) - // } - r, w := io.Pipe() m := multipart.NewWriter(w) @@ -112,6 +109,7 @@ func (app *application) CatboxUpload(target, fileName, identifier string, msg tw app.Send(target, reply, msg) } +// GetGofileServer queries to gofile api for the server name to upload to func (app *application) GetGofileServer() string { type gofileData struct { Server string `json:"server"` @@ -139,6 +137,7 @@ func (app *application) GetGofileServer() string { return uploadServer } +// GofileUpload uplodas the given file to gofile.io. func (app *application) GofileUpload(target, path, identifier string, msg twitch.PrivateMessage) { defer os.Remove(path) app.Send(target, "Uploading to gofile.io... dankCircle", msg) @@ -231,6 +230,7 @@ func (app *application) GofileUpload(target, path, identifier string, msg twitch app.Send(target, reply, msg) } +// KappaUpload uplodas the given file to kappa.lol. func (app *application) KappaUpload(target, path, identifier string, msg twitch.PrivateMessage) { defer os.Remove(path) app.Send(target, "Uploading to kappa.lol... dankCircle", msg) @@ -319,6 +319,7 @@ func (app *application) KappaUpload(target, path, identifier string, msg twitch. app.Send(target, reply, msg) } +// YafUpload uplodas the given file to yaf.li. func (app *application) YafUpload(target, path, identifier string, msg twitch.PrivateMessage) { defer os.Remove(path) app.Send(target, "Uploading to yaf.li... dankCircle", msg) @@ -395,6 +396,7 @@ func (app *application) YafUpload(target, path, identifier string, msg twitch.Pr app.Send(target, reply, msg) } +// YafUploadString uplodas text to yaf.li. func (app *application) YafUploadString(text string) string { path := uuid.NewString() app.Log.Info(path) diff --git a/cmd/nourybot/user.go b/cmd/nourybot/user.go index 55fe327..b93c830 100644 --- a/cmd/nourybot/user.go +++ b/cmd/nourybot/user.go @@ -9,8 +9,8 @@ import ( "github.com/lyx0/nourybot/pkg/owm" ) -// 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. +// InitUser is called on each command usage and checks if the user that sent the command +// is already in the database. If he isn't then add the user to the database. func (app *application) InitUser(login, twitchId string) { _, err := app.Models.Users.Check(twitchId) //app.Log.Error(err) @@ -21,8 +21,7 @@ func (app *application) InitUser(login, twitchId string) { } } -// 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. +// DebugUser queries the database for a login name, if that name exists it creates a new paste func (app *application) DebugUser(login string, message twitch.PrivateMessage) { user, err := app.Models.Users.Get(login) @@ -47,7 +46,6 @@ func (app *application) DebugUser(login string, message twitch.PrivateMessage) { return } app.Send(message.Channel, resp, message) - // app.SendEmail(subject, body) return } } @@ -93,10 +91,6 @@ func (app *application) EditUserLevel(login, lvl string, message twitch.PrivateM // 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 @@ -134,6 +128,7 @@ func (app *application) SetUserLastFM(lastfmUser string, message twitch.PrivateM } } +// GetUserLevel returns the level a user has in the database. func (app *application) GetUserLevel(msg twitch.PrivateMessage) int { var dbUserLevel int var twitchUserLevel int @@ -160,6 +155,10 @@ func (app *application) GetUserLevel(msg twitch.PrivateMessage) int { } } +// UserCheckWeather checks if a user is in the database and if he has a location +// provided. If both is true it calls owm.Weather with the location and replies +// with the result. +// If no location was provided the response will instruct the user how to set a location. func (app *application) UserCheckWeather(message twitch.PrivateMessage) { target := message.Channel twitchLogin := message.User.Name @@ -180,6 +179,10 @@ func (app *application) UserCheckWeather(message twitch.PrivateMessage) { app.Send(target, reply, message) } +// UserCheckWeather checks if a user is in the database and if he has a lastfm +// username provided. If both is true it calls lastfm.LastFmUserRecent with the username +// and replies with the result. +// If no lastfm username was provided the response will instruct the user how to set a lastfm username. func (app *application) UserCheckLastFM(message twitch.PrivateMessage) string { twitchLogin := message.User.Name target := message.Channel diff --git a/internal/data/channel.go b/internal/data/channel.go index de5314e..c4bebb0 100644 --- a/internal/data/channel.go +++ b/internal/data/channel.go @@ -48,7 +48,7 @@ func (c ChannelModel) Get(login string) (*Channel, error) { return &channel, nil } -// Insert takes in a channel struct and inserts it into the database. +// Insert takes in a twitch login name and a twitch id and inserts them into the database. func (c ChannelModel) Insert(login, id string) error { query := ` INSERT INTO channels(login, twitchid) @@ -79,7 +79,7 @@ func (c ChannelModel) Insert(login, id string) error { return nil } -// GetAll() returns a pointer to a slice of all channels (`[]*Channel`) in the database. +// GetAll returns all channels in the database. func (c ChannelModel) GetAll() ([]*Channel, error) { query := ` SELECT id, added_at, login, twitchid @@ -97,11 +97,8 @@ func (c ChannelModel) GetAll() ([]*Channel, error) { return nil, err } - // Need to defer a call to rows.Close() to ensure the resultset - // is closed before GetAll() returns. defer rows.Close() - // Initialize an empty slice to hold the data. channels := []*Channel{} // Iterate over the resultset. @@ -132,7 +129,7 @@ func (c ChannelModel) GetAll() ([]*Channel, error) { return channels, nil } -// GetJoinable() returns a slice of channel names (Channel.Login) in the database. +// GetJoinable returns a slice of channels in the database. func (c ChannelModel) GetJoinable() ([]string, error) { query := ` SELECT login @@ -150,11 +147,8 @@ func (c ChannelModel) GetJoinable() ([]string, error) { return nil, err } - // Need to defer a call to rows.Close() to ensure the resultset - // is closed before GetAll() returns. defer rows.Close() - // Initialize an empty slice to hold the data. channels := []string{} // Iterate over the resultset. @@ -182,8 +176,7 @@ func (c ChannelModel) GetJoinable() ([]string, error) { return channels, nil } -// Delete takes in a login name and queries the database and if there is an -// entry with that login name deletes the entry. +// Delete deletes the channel with the given login name string in the database. func (c ChannelModel) Delete(login string) error { // Prepare the statement. query := ` diff --git a/internal/data/commands.go b/internal/data/commands.go index 014d3ac..a3cd6e8 100644 --- a/internal/data/commands.go +++ b/internal/data/commands.go @@ -20,7 +20,7 @@ type CommandModel struct { DB *sql.DB } -// Get tries to find a command in the database with the provided name. +// Get tries to find a command in the database with the provided name and channel. func (c CommandModel) Get(name, channel string) (*Command, error) { query := ` SELECT * @@ -50,14 +50,13 @@ func (c CommandModel) Get(name, channel string) (*Command, error) { return &command, nil } -// GetAll() returns a pointer to a slice of all channels (`[]*Channel`) in the database. +// GetAll returns a slice of all channels in the database. func (c CommandModel) GetAll() ([]*Command, error) { query := ` SELECT * FROM commands ORDER BY id` - // Create a context with 3 seconds timeout. ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() @@ -68,11 +67,8 @@ func (c CommandModel) GetAll() ([]*Command, error) { return nil, err } - // Need to defer a call to rows.Close() to ensure the resultset - // is closed before GetAll() returns. defer rows.Close() - // Initialize an empty slice to hold the data. commands := []*Command{} // Iterate over the resultset. @@ -105,7 +101,7 @@ func (c CommandModel) GetAll() ([]*Command, error) { return commands, nil } -// GetAll() returns a pointer to a slice of all channels (`[]*Channel`) in the database. +// GetAll returns a slice of all channels in the database. func (c CommandModel) GetAllChannel(channel string) ([]*Command, error) { query := ` SELECT id, name, channel, text, level, description @@ -113,7 +109,6 @@ func (c CommandModel) GetAllChannel(channel string) ([]*Command, error) { WHERE channel = $1 ORDER BY name` - // Create a context with 3 seconds timeout. ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() @@ -124,8 +119,6 @@ func (c CommandModel) GetAllChannel(channel string) ([]*Command, error) { return nil, err } - // Need to defer a call to rows.Close() to ensure the resultset - // is closed before GetAll() returns. defer rows.Close() // Initialize an empty slice to hold the data. @@ -193,6 +186,7 @@ func (c CommandModel) Insert(command *Command) error { return nil } +// Update updates a command with the new supplied values. func (c CommandModel) Update(command *Command) error { query := ` UPDATE commands @@ -220,7 +214,7 @@ func (c CommandModel) Update(command *Command) error { } // SetLevel queries the database for an entry with the provided name, -// if there is one it updates the entrys level with the provided level. +// if there is one it updates the entries level with the newly provided level. func (c CommandModel) SetLevel(name, channel string, level int) error { query := ` UPDATE commands diff --git a/internal/data/commands_logs.go b/internal/data/commands_logs.go index 0eb4b28..8f4afa5 100644 --- a/internal/data/commands_logs.go +++ b/internal/data/commands_logs.go @@ -20,7 +20,7 @@ type CommandsLogModel struct { DB *sql.DB } -// Get tries to find a command in the database with the provided name. +// Insert inserts the supplied values into the database commands_logs 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) diff --git a/internal/data/sent_messages_logs.go b/internal/data/sent_messages_logs.go index a0c0d2c..42dd609 100644 --- a/internal/data/sent_messages_logs.go +++ b/internal/data/sent_messages_logs.go @@ -20,7 +20,7 @@ type SentMessagesLogModel struct { DB *sql.DB } -// Get tries to find a command in the database with the provided name. +// Insert adds the supplied values to the database sent_messages_logs. func (s SentMessagesLogModel) Insert(twitchChannel, twitchMessage, ctxCommandName, ctxUser, ctxUserID, ctxMsg, identifier, ctxRaw string) { query := ` INSERT into sent_messages_logs(twitch_channel, twitch_message, context_command_name, context_username, context_user_id, context_message, identifier, context_raw) diff --git a/internal/data/timers.go b/internal/data/timers.go index 90c263f..965074c 100644 --- a/internal/data/timers.go +++ b/internal/data/timers.go @@ -20,6 +20,7 @@ type TimerModel struct { DB *sql.DB } +// Get tries to find a timer with the supplied name. func (t TimerModel) Get(name string) (*Timer, error) { query := ` SELECT id, name, identifier, text, channel, repeat @@ -49,6 +50,7 @@ func (t TimerModel) Get(name string) (*Timer, error) { return &timer, nil } +// GetIdentifier returns the internal identifier for a supplied timer name. func (t TimerModel) GetIdentifier(name string) (string, error) { query := ` SELECT id, name, identifier, text, channel, repeat @@ -78,7 +80,7 @@ func (t TimerModel) GetIdentifier(name string) (string, error) { return timer.Identifier, nil } -// Insert adds a command into the database. +// Insert adds a new timer into the database. func (t TimerModel) Insert(timer *Timer) error { query := ` INSERT into timers(name, identifier, text, channel, repeat) @@ -105,14 +107,13 @@ func (t TimerModel) Insert(timer *Timer) error { return nil } -// GetAll() returns a pointer to a slice of all channels (`[]*Channel`) in the database. +// GetAll returns a pointer to a slice of all timers in the database. func (t TimerModel) GetAll() ([]*Timer, error) { query := ` SELECT id, name, identifier, text, channel, repeat FROM timers ORDER BY id` - // Create a context with 3 seconds timeout. ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() @@ -123,11 +124,8 @@ func (t TimerModel) GetAll() ([]*Timer, error) { return nil, err } - // Need to defer a call to rows.Close() to ensure the resultset - // is closed before GetAll() returns. defer rows.Close() - // Initialize an empty slice to hold the data. timers := []*Timer{} // Iterate over the resultset. @@ -160,7 +158,7 @@ func (t TimerModel) GetAll() ([]*Timer, error) { return timers, nil } -// GetAll() returns a pointer to a slice of all channels (`[]*Channel`) in the database. +// GetChanneltimer returns a pointer to a slice of all timers of a given channel in the database. func (t TimerModel) GetChannelTimer(channel string) ([]*Timer, error) { query := ` SELECT id, name, identifier, text, channel, repeat @@ -168,7 +166,6 @@ func (t TimerModel) GetChannelTimer(channel string) ([]*Timer, error) { WHERE channel = $1 ORDER BY name` - // Create a context with 3 seconds timeout. ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() @@ -179,11 +176,8 @@ func (t TimerModel) GetChannelTimer(channel string) ([]*Timer, error) { return nil, err } - // Need to defer a call to rows.Close() to ensure the resultset - // is closed before GetAll() returns. defer rows.Close() - // Initialize an empty slice to hold the data. timers := []*Timer{} // Iterate over the resultset. @@ -248,7 +242,7 @@ func (t TimerModel) Update(timer *Timer) error { } // Delete takes in a command name and queries the database for an entry with -// the same name and tries to delete that entry. +// the name and tries to delete that entry. func (t TimerModel) Delete(identifier string) error { // Prepare the statement. query := ` diff --git a/internal/data/uploads.go b/internal/data/uploads.go index 5efcae2..d27f97a 100644 --- a/internal/data/uploads.go +++ b/internal/data/uploads.go @@ -23,7 +23,7 @@ type UploadModel struct { DB *sql.DB } -// Insert takes in a channel struct and inserts it into the database. +// Insert logs the supplied valeus to the uploads database. func (u UploadModel) Insert(twitchLogin, twitchID, twitchChannel, twitchMessage, filehoster, downloadURL, identifier string) { query := ` INSERT INTO uploads(twitchlogin, twitchid, twitchchannel, twitchmessage, filehoster, downloadurl, uploadurl, identifier) @@ -59,6 +59,7 @@ func (u UploadModel) Insert(twitchLogin, twitchID, twitchChannel, twitchMessage, } } +// UpdateUploadURL updates the url for a given upload identifier. func (u UploadModel) UpdateUploadURL(identifier, uploadURL string) { var id string query := ` diff --git a/internal/data/user.go b/internal/data/user.go index a75cae6..0466c72 100644 --- a/internal/data/user.go +++ b/internal/data/user.go @@ -51,7 +51,7 @@ func (u UserModel) Insert(login, twitchId string) error { return nil } -// SetLocation searches the database for a record with the provided login value +// SetLocation queries the database for a record with the provided login value // and if that exists sets the location to the supplied func (u UserModel) SetLocation(twitchId, location string) error { query := ` @@ -78,8 +78,8 @@ func (u UserModel) SetLocation(twitchId, location string) error { return nil } -// SetLocation searches the database for a record with the provided login value -// and if that exists sets the location to the supplied +// GetLocation queries the database for a record with the provided login value +// and if that exists returns the location value. func (u UserModel) GetLocation(twitchId string) (string, error) { query := ` SELECT location @@ -104,8 +104,8 @@ func (u UserModel) GetLocation(twitchId string) (string, error) { return user.Location, nil } -// SetLocation searches the database for a record with the provided login value -// and if that exists sets the location to the supplied +// SetLastFM queries the database for a record with the provided login value +// and if that exists sets the lastfm value to the supplied value. func (u UserModel) SetLastFM(login, lastfmUser string) error { query := ` UPDATE users @@ -131,8 +131,8 @@ func (u UserModel) SetLastFM(login, lastfmUser string) error { return nil } -// SetLocation searches the database for a record with the provided login value -// and if that exists sets the location to the supplied +// GetLastFM queries the database for a record with the provided login value +// and if that exists returns the lastfm username. func (u UserModel) GetLastFM(login string) (string, error) { query := ` SELECT lastfm_username @@ -157,8 +157,8 @@ func (u UserModel) GetLastFM(login string) (string, error) { return user.LastFMUsername, nil } -// SetLocation searches the database for a record with the provided login value -// and if that exists sets the location to the supplied +// SetLocation queries the database for a record with the provided twitch id +// and if that exists returns the level specified in the database for the user. func (u UserModel) GetLevel(twitchId string) (int, error) { query := ` SELECT level @@ -184,14 +184,13 @@ func (u UserModel) GetLevel(twitchId string) (int, error) { } // Setlevel searches the database for a record with the provided login value -// and if that exists sets the level to the supplied level value. +// and if that exists sets the level to the newly supplied level value. func (u UserModel) SetLevel(login string, level int) error { query := ` UPDATE users SET level = $2 WHERE login = $1` - // err := u.DB.QueryRow(query, args...).Scan(&user) result, err := u.DB.Exec(query, login, level) if err != nil { return err @@ -242,7 +241,7 @@ func (u UserModel) Get(login string) (*User, error) { return &user, nil } -// Check checks the database for a record with the given login name. +// Check checks for a record with the given login name. func (u UserModel) Check(twitchId string) (*User, error) { query := ` SELECT id, login diff --git a/pkg/commands/bttv.go b/pkg/commands/bttv.go index 813faec..b1dcdcb 100644 --- a/pkg/commands/bttv.go +++ b/pkg/commands/bttv.go @@ -4,6 +4,7 @@ import ( "fmt" ) +// Bttv returns a search string to a specified betterttv search query. func Bttv(query string) string { reply := fmt.Sprintf("https://betterttv.com/emotes/shared/search?query=%s", query) diff --git a/pkg/commands/coinflip.go b/pkg/commands/coinflip.go index f951a02..d52fdb1 100644 --- a/pkg/commands/coinflip.go +++ b/pkg/commands/coinflip.go @@ -4,6 +4,7 @@ import ( "github.com/lyx0/nourybot/pkg/common" ) +// Coinflip returns either "Heads!" or "Tails!" func Coinflip() string { flip := common.GenerateRandomNumber(2) var reply string diff --git a/pkg/commands/currency.go b/pkg/commands/currency.go index f6ca31e..b58ab4e 100644 --- a/pkg/commands/currency.go +++ b/pkg/commands/currency.go @@ -6,6 +6,8 @@ import ( "net/http" ) +// Currency queries the decapi.me api for the current exchange rate for +// two given currencies. func Currency(currAmount, currFrom, currTo string) (string, error) { basePath := "https://decapi.me/misc/currency/" from := fmt.Sprintf("?from=%s", currFrom) diff --git a/pkg/commands/duckduckgo.go b/pkg/commands/duckduckgo.go index 3ab8d00..5cb8741 100644 --- a/pkg/commands/duckduckgo.go +++ b/pkg/commands/duckduckgo.go @@ -5,6 +5,7 @@ import ( "net/url" ) +// DuckDuckGo returns the search url for a given query. func DuckDuckGo(query string) string { query = url.QueryEscape(query) reply := fmt.Sprintf("https://duckduckgo.com/?va=n&hps=1&q=%s", query) diff --git a/pkg/commands/ffz.go b/pkg/commands/ffz.go index 10435e1..c64ffea 100644 --- a/pkg/commands/ffz.go +++ b/pkg/commands/ffz.go @@ -2,9 +2,9 @@ package commands import "fmt" +// Ffz returns the search url for a given query. func Ffz(query string) string { reply := fmt.Sprintf("https://www.frankerfacez.com/emoticons/?q=%s&sort=count-desc&days=0", query) return reply } - diff --git a/pkg/commands/godocs.go b/pkg/commands/godocs.go index 6cc0b15..e768508 100644 --- a/pkg/commands/godocs.go +++ b/pkg/commands/godocs.go @@ -5,6 +5,7 @@ import ( "net/url" ) +// Godocs returns the search link for a given query. func Godocs(query string) string { query = url.QueryEscape(query) reply := fmt.Sprintf("https://godocs.io/?q=%s", query) diff --git a/pkg/commands/google.go b/pkg/commands/google.go index d08d77a..d674054 100644 --- a/pkg/commands/google.go +++ b/pkg/commands/google.go @@ -5,6 +5,7 @@ import ( "net/url" ) +// Google returns the search link for a given query. func Google(query string) string { query = url.QueryEscape(query) reply := fmt.Sprintf("https://www.google.com/search?q=%s", query) diff --git a/pkg/commands/osrs.go b/pkg/commands/osrs.go index 1587c76..5f22982 100644 --- a/pkg/commands/osrs.go +++ b/pkg/commands/osrs.go @@ -5,6 +5,7 @@ import ( "net/url" ) +// OSRS returns the search link for a given query. func OSRS(query string) string { query = url.QueryEscape(query) reply := fmt.Sprintf("https://oldschool.runescape.wiki/?search=%s", query) diff --git a/pkg/commands/phonetic.go b/pkg/commands/phonetic.go index 21bf350..e8486bf 100644 --- a/pkg/commands/phonetic.go +++ b/pkg/commands/phonetic.go @@ -75,6 +75,8 @@ var cm = map[string]string{ "M": "М", } +// Phonetic replaces the characters in a given message with the characters on a +// russian phonetic keyboard. func Phonetic(message string) (string, error) { var ts string diff --git a/pkg/commands/ping.go b/pkg/commands/ping.go index 619790c..a473a7b 100644 --- a/pkg/commands/ping.go +++ b/pkg/commands/ping.go @@ -7,6 +7,7 @@ import ( "github.com/lyx0/nourybot/pkg/humanize" ) +// Ping returns information about the bot. func Ping(env string) string { botUptime := humanize.Time(common.GetUptime()) commandsUsed := common.GetCommandsUsed() diff --git a/pkg/commands/preview.go b/pkg/commands/preview.go index a4483b2..8b992de 100644 --- a/pkg/commands/preview.go +++ b/pkg/commands/preview.go @@ -6,6 +6,8 @@ import ( "github.com/lyx0/nourybot/pkg/common" ) +// Preview returns a link to an almost live image of a given twitch stream +// if the channel is currently live. func Preview(channel string) string { imageHeight := common.GenerateRandomNumberRange(1040, 1080) imageWidth := common.GenerateRandomNumberRange(1890, 1920) diff --git a/pkg/commands/seventv.go b/pkg/commands/seventv.go index 1ea590d..411c554 100644 --- a/pkg/commands/seventv.go +++ b/pkg/commands/seventv.go @@ -2,9 +2,9 @@ package commands import "fmt" +// SevenTV returns a search link to a given query. func SevenTV(query string) string { reply := fmt.Sprintf("https://7tv.app/emotes?page=1&query=%s", query) return reply } - diff --git a/pkg/commands/wolframalpha.go b/pkg/commands/wolframalpha.go index 84196b9..3f696da 100644 --- a/pkg/commands/wolframalpha.go +++ b/pkg/commands/wolframalpha.go @@ -7,6 +7,8 @@ import ( "net/url" ) +// WolframAlphaQuery queries the WolframAlpha api with the supplied query and replies +// with the result. func WolframAlphaQuery(query, appid string) string { escaped := url.QueryEscape(query) url := fmt.Sprintf("http://api.wolframalpha.com/v1/result?appid=%s&i=%s", appid, escaped) diff --git a/pkg/commands/xkcd.go b/pkg/commands/xkcd.go index 3d2d070..82de4d9 100644 --- a/pkg/commands/xkcd.go +++ b/pkg/commands/xkcd.go @@ -15,6 +15,7 @@ type xkcdResponse struct { Img string `json:"img"` } +// Xkcd queries the xkcd api and returns latest xkcd comic. func Xkcd() (string, error) { response, err := http.Get("https://xkcd.com/info.0.json") if err != nil { @@ -34,8 +35,9 @@ func Xkcd() (string, error) { return reply, nil } +// RandomXkcd queries the xkcd api and returns a random xkcd comic. func RandomXkcd() (string, error) { - comicNum := fmt.Sprint(common.GenerateRandomNumber(2772)) + comicNum := fmt.Sprint(common.GenerateRandomNumber(2899)) response, err := http.Get(fmt.Sprint("http://xkcd.com/" + comicNum + "/info.0.json")) if err != nil { diff --git a/pkg/commands/youtube.go b/pkg/commands/youtube.go index ea0a9ee..1654307 100644 --- a/pkg/commands/youtube.go +++ b/pkg/commands/youtube.go @@ -5,6 +5,7 @@ import ( "net/url" ) +// Youtube returns a search link to a given query. func Youtube(query string) string { query = url.QueryEscape(query) reply := fmt.Sprintf("https://www.youtube.com/results?search_query=%s", query) diff --git a/pkg/common/counter.go b/pkg/common/counter.go index 9a67b09..28451bc 100644 --- a/pkg/common/counter.go +++ b/pkg/common/counter.go @@ -14,4 +14,3 @@ func CommandUsed() { func GetCommandsUsed() int { return tempCommands } - diff --git a/pkg/common/uptime.go b/pkg/common/uptime.go index a1d0086..1bdef25 100644 --- a/pkg/common/uptime.go +++ b/pkg/common/uptime.go @@ -6,10 +6,12 @@ var ( uptime time.Time ) +// StartTime adds the current time to the uptime variable. func StartTime() { uptime = time.Now() } +// GetUptime returns the time from the uptime variable. func GetUptime() time.Time { return uptime } diff --git a/pkg/common/version.go b/pkg/common/version.go index d9ee0a0..d0ad28c 100644 --- a/pkg/common/version.go +++ b/pkg/common/version.go @@ -11,6 +11,8 @@ import ( "runtime/debug" ) +// GetVersion returns the current git commit hash. +// If the version is modified the hash ends in "-dirty" func GetVersion() string { var revision string var modified bool @@ -40,6 +42,8 @@ func GetVersion() string { return revision } +// GetVersion returns the current git commit hash. +// This function does not add the "-dirty" string at the end of the hash. func GetVersionPure() string { var revision string var modified bool diff --git a/pkg/humanize/time.go b/pkg/humanize/time.go index 2598cd7..dd7a4d3 100644 --- a/pkg/humanize/time.go +++ b/pkg/humanize/time.go @@ -6,6 +6,7 @@ import ( humanize "github.com/dustin/go-humanize" ) +// Time returns the humanized time for a supplied time value. func Time(t time.Time) string { return humanize.Time(t) } diff --git a/pkg/ivr/user.go b/pkg/ivr/user.go index 8025ef8..e8b59d0 100644 --- a/pkg/ivr/user.go +++ b/pkg/ivr/user.go @@ -20,6 +20,7 @@ type ivrGame struct { DisplayName string `json:"displayName"` } +// TitleByUsername returns the current title of a supplied twitch channel. func TitleByUsername(login string) string { baseUrl := "https://api.ivr.fi/v2/twitch/user?login=" @@ -39,6 +40,7 @@ func TitleByUsername(login string) string { return responseList[0].Stream.Title } +// GameByUsername returns the current game of a supplied twitch channel. func GameByUsername(login string) string { baseUrl := "https://api.ivr.fi/v2/twitch/user?login=" @@ -58,6 +60,8 @@ func GameByUsername(login string) string { return responseList[0].Stream.Game.DisplayName } +// IDByUsernameReply returns the twitch user id of a supplied +// twitch username in the format of "username=id" func IDByUsernameReply(username string) string { baseUrl := "https://api.ivr.fi/v2/twitch/user?login=" @@ -76,6 +80,7 @@ func IDByUsernameReply(username string) string { return reply } +// IDByUsername returns the twitch user id for a given twitch username. func IDByUsername(username string) string { baseUrl := "https://api.ivr.fi/v2/twitch/user?login=" diff --git a/pkg/lastfm/lastfm.go b/pkg/lastfm/lastfm.go index 968bec3..ff4c3e2 100644 --- a/pkg/lastfm/lastfm.go +++ b/pkg/lastfm/lastfm.go @@ -9,6 +9,7 @@ import ( "go.uber.org/zap" ) +// LastFmUserRecent returns the recently played track for a given lastfm username. func LastFmUserRecent(target, user string) string { sugar := zap.NewExample().Sugar()