fix old comments

This commit is contained in:
lyx0 2024-02-28 11:53:39 +01:00
parent 9377bcf897
commit 78dff0e347
40 changed files with 151 additions and 242 deletions

View file

@ -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 {

View file

@ -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"

View file

@ -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)

View file

@ -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 {

View file

@ -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,

View file

@ -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"]

View file

@ -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"`

View file

@ -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

View file

@ -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 {

View file

@ -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)
}

View file

@ -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)

View file

@ -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

View file

@ -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 := `

View file

@ -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

View file

@ -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)

View file

@ -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)

View file

@ -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 := `

View file

@ -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 := `

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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)

View file

@ -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)

View file

@ -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
}

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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

View file

@ -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()

View file

@ -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)

View file

@ -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
}

View file

@ -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)

View file

@ -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 {

View file

@ -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)

View file

@ -14,4 +14,3 @@ func CommandUsed() {
func GetCommandsUsed() int {
return tempCommands
}

View file

@ -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
}

View file

@ -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

View file

@ -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)
}

View file

@ -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="

View file

@ -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()