add currency/preview/weather command

This commit is contained in:
lyx0 2024-01-11 02:33:25 +01:00
parent 96de26a544
commit 9927aa2724
6 changed files with 122 additions and 14 deletions

View file

@ -3,7 +3,7 @@ package main
import (
"strings"
"github.com/lyx0/nourybot-matrix/pkg/owm"
"github.com/lyx0/nourybot-matrix/pkg/commands"
"maunium.net/go/mautrix/event"
)
@ -21,7 +21,7 @@ func (app *application) ParseCommand(evt *event.Event) {
// msgLen is the amount of words in a message without the prefix.
// Useful to check if enough cmdParams are provided.
//msgLen := len(strings.SplitN(evt.Content.AsMessage().Body, " ", -2))
msgLen := len(strings.SplitN(evt.Content.AsMessage().Body, " ", -1))
app.Log.Info().Msgf("Command: %s", evt.Content.AsMessage().Body)
@ -30,16 +30,42 @@ func (app *application) ParseCommand(evt *event.Event) {
case "xd":
app.SendText(evt, "xd !")
return
case "currency":
if msgLen <= 4 {
reply = "Not enough arguments provided. Usage: ()currency 10 USD to EUR"
} else {
reply, _ = commands.Currency(cmdParams[1], cmdParams[2], cmdParams[4])
}
case "gofile":
if msgLen < 2 {
reply = "Not enough arguments provided. Usage: !gofile [link]"
} else {
app.NewDownload("gofile", evt, cmdParams[1])
return
}
case "preview":
if msgLen < 2 {
reply = "Not enough arguments provided. Usage: !preview [stream]"
} else {
reply = commands.Preview(cmdParams[1])
}
case "weather":
reply, _ = owm.Weather(evt.Content.AsMessage().Body[9:len(evt.Content.AsMessage().Body)])
if msgLen < 2 {
reply = "Not enough arguments provided. Usage: !weather [location]"
} else {
reply, _ = commands.Weather(evt.Content.AsMessage().Body[9:len(evt.Content.AsMessage().Body)])
}
case "yaf":
if msgLen < 2 {
reply = "Not enough arguments provided. Usage: !gofile [link]"
} else {
app.NewDownload("yaf", evt, cmdParams[1])
return
}
}
if reply != "" {

30
pkg/commands/currency.go Normal file
View file

@ -0,0 +1,30 @@
package commands
import (
"fmt"
"io"
"net/http"
)
func Currency(currAmount, currFrom, currTo string) (string, error) {
basePath := "https://decapi.me/misc/currency/"
from := fmt.Sprintf("?from=%s", currFrom)
to := fmt.Sprintf("&to=%s", currTo)
value := fmt.Sprintf("&value=%s", currAmount)
// https://decapi.me/misc/currency/?from=usd&to=usd&value=10
resp, err := http.Get(fmt.Sprint(basePath + from + to + value))
if err != nil {
return "", ErrInternalServerError
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", ErrInternalServerError
}
reply := string(body)
return reply, nil
}

8
pkg/commands/errors.go Normal file
View file

@ -0,0 +1,8 @@
package commands
import "errors"
var (
ErrInternalServerError = errors.New("internal server error")
ErrWeatherLocationNotFound = errors.New("location not found")
)

15
pkg/commands/preview.go Normal file
View file

@ -0,0 +1,15 @@
package commands
import (
"fmt"
"github.com/lyx0/nourybot-matrix/pkg/common"
)
func Preview(channel string) string {
imageHeight := common.GenerateRandomNumberRange(1040, 1080)
imageWidth := common.GenerateRandomNumberRange(1890, 1920)
reply := fmt.Sprintf("https://static-cdn.jtvnw.net/previews-ttv/live_user_%s-%vx%v.jpg", channel, imageWidth, imageHeight)
return reply
}

View file

@ -1,7 +1,6 @@
package owm
package commands
import (
"errors"
"fmt"
"os"
@ -9,11 +8,6 @@ import (
"github.com/joho/godotenv"
)
var (
ErrInternalServerError = errors.New("internal server error")
ErrWeatherLocationNotFound = errors.New("location not found")
)
// Weather queries the OpenWeatherMap Api for the given location and sends the
// current weather response to the target twitch chat.
func Weather(location string) (string, error) {

35
pkg/common/random.go Normal file
View file

@ -0,0 +1,35 @@
package common
import (
"fmt"
"math/rand"
"strconv"
)
// StrGenerateRandomNumber generates a random number from
// a given max value as a string
func StrGenerateRandomNumber(max string) int {
num, err := strconv.Atoi(max)
if num < 1 {
return 0
}
if err != nil {
fmt.Printf("Supplied value %v is not a number", num)
return 0
} else {
return rand.Intn(num)
}
}
// GenerateRandomNumber returns a random number from
// a given max value as a int
func GenerateRandomNumber(max int) int {
return rand.Intn(max)
}
// GenerateRandomNumberRange returns a random number
// over a given minimum and maximum range.
func GenerateRandomNumberRange(min int, max int) int {
return (rand.Intn(max-min) + min)
}