From 54e463fcb72cbb0093c7f61db5508f305ccdd059 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Fri, 19 Sep 2025 21:25:51 +0200 Subject: [PATCH 01/29] remove code --- README.md | 2 +- assets/font/Inter_24pt-Regular.ttf | Bin 342732 -> 0 bytes assets/img/broken.png | Bin 19714 -> 0 bytes assets/img/chart_gradient.png | Bin 51893 -> 0 bytes assets/img/profile_gradient.png | Bin 170610 -> 0 bytes cache/cache.go | 158 ---------- cmd/bot/bot.go | 228 -------------- commands/botinfo/botinfo.go | 94 ------ commands/chart/chart.go | 214 ------------- commands/commands.go | 118 ------- commands/fm/fm.go | 115 ------- commands/profile/profile.go | 149 --------- commands/profile/v2/profile.go | 262 ---------------- commands/setuser/setuser.go | 80 ----- commands/top/top.go | 148 --------- commands/update/update.go | 123 -------- commands/whoknows/whoknows.go | 465 ---------------------------- db/db.go | 138 --------- db/embed.go | 6 - db/models.go | 10 - db/queries.sql.go | 103 ------ db/sql/queries.sql | 27 -- db/sql/schema.sql | 4 - go.mod | 23 -- go.sum | 36 --- lfm/README.md | 6 - lfm/album.go | 36 --- lfm/artist.go | 36 --- lfm/error.go | 21 -- lfm/lfm.go | 151 --------- lfm/track.go | 36 --- lfm/types/album.go | 40 --- lfm/types/artist.go | 46 --- lfm/types/track.go | 37 --- lfm/types/user.go | 184 ----------- lfm/user.go | 249 --------------- logger/logger.go | 23 -- pkg/bild/LICENSE | 21 -- pkg/bild/README.md | 12 - pkg/bild/blend/blend.go | 380 ----------------------- pkg/bild/blur/blur.go | 52 ---- pkg/bild/clone/clone.go | 156 ---------- pkg/bild/colors/colors.go | 150 --------- pkg/bild/convolution/convolution.go | 133 -------- pkg/bild/convolution/kernel.go | 103 ------ pkg/bild/fcolor/fcolor.go | 22 -- pkg/bild/font/font.go | 60 ---- pkg/bild/imgio/imgio.go | 112 ------- pkg/bild/mask/mask.go | 52 ---- pkg/bild/math/f64/f64.go | 13 - pkg/bild/parallel/parallel.go | 36 --- pkg/bild/transform/filters.go | 142 --------- pkg/bild/transform/resize.go | 180 ----------- pkg/constants/emojis/emojis.go | 27 -- pkg/constants/errs/errs.go | 25 -- pkg/constants/opts/opts.go | 11 - pkg/ctx/ctx.go | 47 --- pkg/discord/markdown/markdown.go | 200 ------------ pkg/discord/reply/reply.go | 138 --------- pkg/strng/strng.go | 13 - sqlc.yaml | 14 - 61 files changed, 1 insertion(+), 5466 deletions(-) delete mode 100644 assets/font/Inter_24pt-Regular.ttf delete mode 100644 assets/img/broken.png delete mode 100644 assets/img/chart_gradient.png delete mode 100644 assets/img/profile_gradient.png delete mode 100644 cache/cache.go delete mode 100644 commands/botinfo/botinfo.go delete mode 100644 commands/chart/chart.go delete mode 100644 commands/commands.go delete mode 100644 commands/fm/fm.go delete mode 100644 commands/profile/profile.go delete mode 100644 commands/profile/v2/profile.go delete mode 100644 commands/setuser/setuser.go delete mode 100644 commands/top/top.go delete mode 100644 commands/update/update.go delete mode 100644 commands/whoknows/whoknows.go delete mode 100644 db/db.go delete mode 100644 db/embed.go delete mode 100644 db/models.go delete mode 100644 db/queries.sql.go delete mode 100644 db/sql/queries.sql delete mode 100644 db/sql/schema.sql delete mode 100644 go.mod delete mode 100644 go.sum delete mode 100644 lfm/README.md delete mode 100644 lfm/album.go delete mode 100644 lfm/artist.go delete mode 100644 lfm/error.go delete mode 100644 lfm/lfm.go delete mode 100644 lfm/track.go delete mode 100644 lfm/types/album.go delete mode 100644 lfm/types/artist.go delete mode 100644 lfm/types/track.go delete mode 100644 lfm/types/user.go delete mode 100644 lfm/user.go delete mode 100644 logger/logger.go delete mode 100644 pkg/bild/LICENSE delete mode 100644 pkg/bild/README.md delete mode 100644 pkg/bild/blend/blend.go delete mode 100644 pkg/bild/blur/blur.go delete mode 100644 pkg/bild/clone/clone.go delete mode 100644 pkg/bild/colors/colors.go delete mode 100644 pkg/bild/convolution/convolution.go delete mode 100644 pkg/bild/convolution/kernel.go delete mode 100644 pkg/bild/fcolor/fcolor.go delete mode 100644 pkg/bild/font/font.go delete mode 100644 pkg/bild/imgio/imgio.go delete mode 100644 pkg/bild/mask/mask.go delete mode 100644 pkg/bild/math/f64/f64.go delete mode 100644 pkg/bild/parallel/parallel.go delete mode 100644 pkg/bild/transform/filters.go delete mode 100644 pkg/bild/transform/resize.go delete mode 100644 pkg/constants/emojis/emojis.go delete mode 100644 pkg/constants/errs/errs.go delete mode 100644 pkg/constants/opts/opts.go delete mode 100644 pkg/ctx/ctx.go delete mode 100644 pkg/discord/markdown/markdown.go delete mode 100644 pkg/discord/reply/reply.go delete mode 100644 pkg/strng/strng.go delete mode 100644 sqlc.yaml diff --git a/README.md b/README.md index a092025..2818d96 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,4 @@ your last.fm stats within Discord. - +### readme wip. diff --git a/assets/font/Inter_24pt-Regular.ttf b/assets/font/Inter_24pt-Regular.ttf deleted file mode 100644 index 6b088a71193dc27290d27f910bc5d73214f3bbc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342732 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

(ooqSGyr+~wg7v7X~!Ms4b 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

rife;5RpkCf%7@_EqLdp!t}|B70o-Azq!r|v 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 z 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

ERBva=-o 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ૂ`3XTd_s$gG`pq+cNfzhxxM*6D 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 Duw-^W diff --git a/assets/img/broken.png b/assets/img/broken.png deleted file mode 100644 index 338dac7d7646900a8cb1089ed23fdbc2062aa17d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19714 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 XUM>?n@;@1PWEq2}tDnm{r-UW|`W-&9 diff --git a/assets/img/chart_gradient.png b/assets/img/chart_gradient.png deleted file mode 100644 index 79d81a30a4233c228bdec81415016904e3ccbbc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51893 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 Wwvl{Zc}sl&0000kkPwYQ3T0qDDrC+VCT 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 z
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 U>`(FWg8%>k07*qoM6N<$f<4KbDgXcg diff --git a/cache/cache.go b/cache/cache.go deleted file mode 100644 index fb3e6a5..0000000 --- a/cache/cache.go +++ /dev/null @@ -1,158 +0,0 @@ -package cache - -import ( - "time" - - "github.com/disgoorg/snowflake/v2" - "github.com/nxtgo/gce" - - "go.fm/lfm/types" -) - -type Cache struct { - User *gce.Cache[string, types.UserGetInfo] - Members *gce.Cache[snowflake.ID, map[snowflake.ID]string] - Album *gce.Cache[string, types.AlbumGetInfo] - Artist *gce.Cache[string, types.ArtistGetInfo] - Track *gce.Cache[string, types.TrackGetInfo] - TopAlbums *gce.Cache[string, types.UserGetTopAlbums] - TopArtists *gce.Cache[string, types.UserGetTopArtists] - TopTracks *gce.Cache[string, types.UserGetTopTracks] - Tracks *gce.Cache[string, types.UserGetRecentTracks] - Plays *gce.Cache[string, int] - Cover *gce.Cache[string, string] -} - -func NewCache() *Cache { - return &Cache{ - User: gce.New[string, types.UserGetInfo]( - gce.WithDefaultTTL(time.Hour), - gce.WithMaxEntries(50_000), - ), - Members: gce.New[snowflake.ID, map[snowflake.ID]string]( - gce.WithDefaultTTL(time.Hour*6), - gce.WithMaxEntries(2000), - ), - Album: gce.New[string, types.AlbumGetInfo]( - gce.WithDefaultTTL(time.Hour*12), - gce.WithMaxEntries(64_000), - ), - Artist: gce.New[string, types.ArtistGetInfo]( - gce.WithDefaultTTL(time.Hour*12), - gce.WithMaxEntries(64_000), - ), - Track: gce.New[string, types.TrackGetInfo]( - gce.WithDefaultTTL(time.Hour*12), - gce.WithMaxEntries(64_000), - ), - TopAlbums: gce.New[string, types.UserGetTopAlbums]( - gce.WithDefaultTTL(time.Minute*15), - gce.WithMaxEntries(1000), - ), - TopArtists: gce.New[string, types.UserGetTopArtists]( - gce.WithDefaultTTL(time.Minute*15), - gce.WithMaxEntries(1000), - ), - TopTracks: gce.New[string, types.UserGetTopTracks]( - gce.WithDefaultTTL(time.Minute*15), - gce.WithMaxEntries(1000), - ), - Tracks: gce.New[string, types.UserGetRecentTracks]( - gce.WithDefaultTTL(time.Minute*15), - gce.WithMaxEntries(1000), - ), - Plays: gce.New[string, int]( - gce.WithDefaultTTL(time.Minute*15), - gce.WithMaxEntries(50_000), - ), - Cover: gce.New[string, string]( - gce.WithDefaultTTL(time.Hour*24*7), - gce.WithMaxEntries(10_000), - ), - } -} - -type CacheStats struct { - Name string - Stats gce.Stats -} - -func (c *Cache) Stats() []CacheStats { - var out []CacheStats - - add := func(name string, s gce.Stats) { - out = append(out, CacheStats{Name: name, Stats: s}) - } - - if c.User != nil { - add("User", c.User.Stats()) - } - if c.Members != nil { - add("Members", c.Members.Stats()) - } - if c.Album != nil { - add("Album", c.Album.Stats()) - } - if c.Artist != nil { - add("Artist", c.Artist.Stats()) - } - if c.Track != nil { - add("Track", c.Track.Stats()) - } - if c.TopAlbums != nil { - add("TopAlbums", c.TopAlbums.Stats()) - } - if c.TopArtists != nil { - add("TopArtists", c.TopArtists.Stats()) - } - if c.TopTracks != nil { - add("TopTracks", c.TopTracks.Stats()) - } - if c.Tracks != nil { - add("Tracks", c.Tracks.Stats()) - } - if c.Plays != nil { - add("Plays", c.Plays.Stats()) - } - if c.Cover != nil { - add("Cover", c.Cover.Stats()) - } - - return out -} - -func (c *Cache) Close() { - if c.User != nil { - c.User.Close() - } - if c.Members != nil { - c.Members.Close() - } - if c.Album != nil { - c.Album.Close() - } - if c.Artist != nil { - c.Artist.Close() - } - if c.Track != nil { - c.Track.Close() - } - if c.TopAlbums != nil { - c.TopAlbums.Close() - } - if c.TopArtists != nil { - c.TopArtists.Close() - } - if c.TopTracks != nil { - c.TopTracks.Close() - } - if c.Tracks != nil { - c.Tracks.Close() - } - if c.Plays != nil { - c.Plays.Close() - } - if c.Cover != nil { - c.Cover.Close() - } -} diff --git a/cmd/bot/bot.go b/cmd/bot/bot.go index 7746bcc..06ab7d0 100644 --- a/cmd/bot/bot.go +++ b/cmd/bot/bot.go @@ -1,229 +1 @@ package main - -import ( - "context" - "database/sql" - "flag" - "os" - "os/signal" - "runtime" - "runtime/debug" - "syscall" - "time" - - "github.com/disgoorg/disgo" - "github.com/disgoorg/disgo/bot" - dgocache "github.com/disgoorg/disgo/cache" - "github.com/disgoorg/disgo/discord" - "github.com/disgoorg/disgo/events" - "github.com/disgoorg/disgo/gateway" - "github.com/disgoorg/snowflake/v2" - _ "github.com/mattn/go-sqlite3" - "github.com/nxtgo/env" - - "go.fm/cache" - "go.fm/commands" - "go.fm/db" - "go.fm/lfm" - "go.fm/logger" - gofmCtx "go.fm/pkg/ctx" -) - -var ( - globalCmds bool - deleteCommands bool - dbPath string -) - -/* -close order: database, cache, client. ~elisiei -*/ - -func init() { - debug.SetMemoryLimit(1 << 30) - if err := env.Load(""); err != nil { - logger.Log.Fatalf("failed loading environment: %v", err) - } - - flag.BoolVar(&globalCmds, "global", true, "upload global commands to discord") - flag.BoolVar(&deleteCommands, "delete", false, "delete commands on exit") - flag.StringVar(&dbPath, "db", "database.db", "path to the SQLite database file") - flag.Parse() -} - -func main() { - go func() { - ticker := time.NewTicker(5 * time.Minute) - defer ticker.Stop() - - for range ticker.C { - var m runtime.MemStats - runtime.ReadMemStats(&m) - - if m.Alloc > 500*1024*1024 { - logger.Log.Warnf("high memory usage: %d MB", m.Alloc/1024/1024) - runtime.GC() - } - } - }() - - ctx := context.Background() - - token := os.Getenv("DISCORD_TOKEN") - if token == "" { - logger.Log.Fatal("missing DISCORD_TOKEN environment variable") - } - - lfmCache := cache.NewCache() - lfm := lfm.New(os.Getenv("LASTFM_API_KEY"), lfmCache) - closeConnection, database := initDatabase(ctx, dbPath) - - defer closeConnection() - defer lfmCache.Close() - - cmdCtx := gofmCtx.CommandContext{ - LastFM: lfm, - Database: database, - Cache: lfmCache, - Context: ctx, - } - commands.InitDependencies(cmdCtx) - - client := initDiscordClient(token) - defer client.Close(context.TODO()) - - if err := client.OpenGateway(context.TODO()); err != nil { - logger.Log.Fatalf("failed to open gateway: %v", err) - } - - if globalCmds { - uploadGlobalCommands(*client) - if deleteCommands { - defer deleteAllGlobalCommands(*client) - } - } else { - uploadGuildCommands(*client) - if deleteCommands { - defer deleteAllGuildCommands(*client) - } - } - - waitForShutdown() -} - -func initDatabase(ctx context.Context, path string) (func() error, *db.Queries) { - dbConn, err := sql.Open("sqlite3", path) - if err != nil { - logger.Log.Fatalf("failed opening database: %v", err) - } - - if _, err := dbConn.ExecContext(ctx, db.Schema); err != nil { - dbConn.Close() - logger.Log.Fatalf("failed executing schema: %v", err) - } - - queries, err := db.Prepare(ctx, dbConn) - if err != nil { - dbConn.Close() - logger.Log.Fatalf("failed preparing queries: %v", err) - } - - return func() error { - queries.Close() - return dbConn.Close() - }, queries -} - -func initDiscordClient(token string) *bot.Client { - cacheOptions := bot.WithCacheConfigOpts( - dgocache.WithCaches(dgocache.FlagMembers, dgocache.FlagGuilds), - ) - - options := bot.WithGatewayConfigOpts( - gateway.WithIntents( - gateway.IntentsNonPrivileged, - gateway.IntentGuildMembers, - gateway.IntentsGuild, - ), - ) - - client, err := disgo.New( - token, - options, - bot.WithEventListeners( - commands.Handler(), - bot.NewListenerFunc(func(r *events.Ready) { - logger.Log.Info("client ready v/") - if err := r.Client().SetPresence(context.TODO(), - //gateway.WithListeningActivity("your scrobbles <3"), - gateway.WithCustomActivity("xd"), - gateway.WithOnlineStatus(discord.OnlineStatusOnline), - ); err != nil { - logger.Log.Errorf("failed to set presence: %s", err) - } - }), - ), - cacheOptions, - ) - if err != nil { - logger.Log.Fatalf("failed to instantiate Discord client: %v", err) - } - - return client -} - -func uploadGlobalCommands(client bot.Client) { - _, err := client.Rest.SetGlobalCommands(client.ApplicationID, commands.All()) - if err != nil { - logger.Log.Fatalf("failed registering global commands: %v", err) - } - logger.Log.Info("registered global slash commands") -} - -func uploadGuildCommands(client bot.Client) { - guildId := snowflake.GetEnv("GUILD_ID") - _, err := client.Rest.SetGuildCommands(client.ApplicationID, guildId, commands.All()) - if err != nil { - logger.Log.Fatalf("failed registering guild commands: %v", err) - } - logger.Log.Infof("registered guild slash commands to guild '%s'", guildId.String()) -} - -func deleteAllGlobalCommands(client bot.Client) { - commands, err := client.Rest.GetGlobalCommands(client.ApplicationID, false) - if err != nil { - logger.Log.Fatalf("failed fetching global commands: %v", err) - } - - for _, cmd := range commands { - if err := client.Rest.DeleteGlobalCommand(client.ApplicationID, cmd.ID()); err != nil { - logger.Log.Errorf("failed deleting global command '%s': %v", cmd.Name(), err) - } else { - logger.Log.Infof("deleted global command '%s'", cmd.Name()) - } - } -} - -func deleteAllGuildCommands(client bot.Client) { - guildId := snowflake.GetEnv("GUILD_ID") - - commands, err := client.Rest.GetGuildCommands(client.ApplicationID, guildId, false) - if err != nil { - logger.Log.Fatalf("failed fetching guild commands: %v", err) - } - - for _, cmd := range commands { - if err := client.Rest.DeleteGuildCommand(client.ApplicationID, guildId, cmd.ID()); err != nil { - logger.Log.Errorf("failed deleting guild command '%s': %v", cmd.Name(), err) - } else { - logger.Log.Infof("deleted guild command '%s'", cmd.Name()) - } - } -} - -func waitForShutdown() { - s := make(chan os.Signal, 1) - signal.Notify(s, syscall.SIGINT, syscall.SIGTERM) - <-s - logger.Log.Info("goodbye :)") -} diff --git a/commands/botinfo/botinfo.go b/commands/botinfo/botinfo.go deleted file mode 100644 index 5d1b30e..0000000 --- a/commands/botinfo/botinfo.go +++ /dev/null @@ -1,94 +0,0 @@ -package botinfo - -import ( - "fmt" - "os/exec" - "runtime" - "strings" - "time" - - "github.com/disgoorg/disgo/discord" - "github.com/disgoorg/disgo/events" - - "go.fm/pkg/constants/errs" - "go.fm/pkg/ctx" - "go.fm/pkg/discord/markdown" - "go.fm/pkg/discord/reply" -) - -type Command struct{} - -func (Command) Data() discord.ApplicationCommandCreate { - return discord.SlashCommandCreate{ - Name: "botinfo", - Description: "display go.fm's info", - IntegrationTypes: []discord.ApplicationIntegrationType{ - discord.ApplicationIntegrationTypeGuildInstall, - discord.ApplicationIntegrationTypeUserInstall, - }, - } -} - -func (Command) Handle(e *events.ApplicationCommandInteractionCreate, ctx ctx.CommandContext) { - r := reply.New(e) - - if err := r.Defer(); err != nil { - reply.Error(e, errs.ErrCommandDeferFailed) - return - } - - var m runtime.MemStats - runtime.ReadMemStats(&m) - - lastFMUsers, err := ctx.Database.GetUserCount(ctx.Context) - if err != nil { - lastFMUsers = 0 - } - - branch, commit, message := getGitInfo() - botStats := [][2]string{ - {"users", fmt.Sprintf("%d", lastFMUsers)}, - {"goroutines", fmt.Sprintf("%d", runtime.NumGoroutine())}, - {"alloc", fmt.Sprintf("%.2f MB", float64(m.Alloc)/1024/1024)}, - {"total", fmt.Sprintf("%.2f MB", float64(m.TotalAlloc)/1024/1024)}, - {"sys", fmt.Sprintf("%.2f MB", float64(m.Sys)/1024/1024)}, - {"uptime", time.Since(ctx.Start).Truncate(time.Second).String()}, - {"branch", branch}, - {"commit", fmt.Sprintf("%s (%s)", commit, message)}, - } - - cacheStats := ctx.Cache.Stats() - cacheRows := make([][2]string, 0, len(cacheStats)) - for _, cs := range cacheStats { - cacheRow := fmt.Sprintf( - "hits=%d misses=%d loads=%d evicts=%d size=%d", - cs.Stats.Hits, - cs.Stats.Misses, - cs.Stats.Loads, - cs.Stats.Evictions, - cs.Stats.CurrentSize, - ) - cacheRows = append(cacheRows, [2]string{cs.Name, cacheRow}) - } - - botTable := markdown.MD(markdown.GenerateTable(botStats)).CodeBlock("ts") - cacheTable := markdown.MD(markdown.GenerateTable(cacheRows)).CodeBlock("ts") - - r.Content("## bot stats\n%s\n## cache stats\n%s", botTable, cacheTable).Edit() - -} - -func getGitInfo() (branch, commit, message string) { - branch = runGitCommand("rev-parse", "--abbrev-ref", "HEAD") - commit = runGitCommand("rev-parse", "--short", "HEAD") - message = runGitCommand("log", "-1", "--pretty=%B") - return -} - -func runGitCommand(args ...string) string { - out, err := exec.Command("git", args...).Output() - if err != nil { - return "unknown" - } - return strings.TrimSpace(string(out)) -} diff --git a/commands/chart/chart.go b/commands/chart/chart.go deleted file mode 100644 index 560b862..0000000 --- a/commands/chart/chart.go +++ /dev/null @@ -1,214 +0,0 @@ -package chart - -import ( - "bytes" - "errors" - "fmt" - "image" - "image/color" - "image/draw" - - "github.com/disgoorg/disgo/discord" - "github.com/disgoorg/disgo/events" - - "go.fm/lfm" - "go.fm/pkg/bild/font" - "go.fm/pkg/bild/imgio" - "go.fm/pkg/bild/transform" - "go.fm/pkg/constants/errs" - "go.fm/pkg/constants/opts" - "go.fm/pkg/ctx" - "go.fm/pkg/discord/reply" -) - -type Command struct{} - -type Entry struct { - Image image.Image - Name string - Artist string -} - -var ( - maxGridSize = 10 - minGridSize = 3 - defaultPeriod = "overall" -) - -func (Command) Data() discord.ApplicationCommandCreate { - return discord.SlashCommandCreate{ - Name: "chart", - Description: "your top artists/tracks/albums but with images", - IntegrationTypes: []discord.ApplicationIntegrationType{ - discord.ApplicationIntegrationTypeGuildInstall, - discord.ApplicationIntegrationTypeUserInstall, - }, - Options: []discord.ApplicationCommandOption{ - discord.ApplicationCommandOptionString{ - Name: "type", - Description: "artist, track or album", - Choices: []discord.ApplicationCommandOptionChoiceString{ - {Name: "artist", Value: "artist"}, - {Name: "track", Value: "track"}, - {Name: "album", Value: "album"}, - }, - Required: true, - }, - discord.ApplicationCommandOptionInt{ - Name: "grid-size", - Description: fmt.Sprintf("grid size (NxN) (min: %d, max: %d, default: min)", minGridSize, maxGridSize), - Required: false, - }, - discord.ApplicationCommandOptionString{ - Name: "period", - Description: fmt.Sprintf( - "overall, 7day, 1month, 3month, 6month or 12month (default: %s)", - defaultPeriod, - ), - Choices: []discord.ApplicationCommandOptionChoiceString{ - {Name: "overall", Value: "overall"}, - {Name: "7day", Value: "7day"}, - {Name: "1month", Value: "1month"}, - {Name: "3month", Value: "3month"}, - {Name: "6month", Value: "6month"}, - {Name: "12month", Value: "12month"}, - }, - Required: false, - }, - opts.UserOption, - }, - } -} - -func (Command) Handle(e *events.ApplicationCommandInteractionCreate, ctx ctx.CommandContext) { - r := reply.New(e) - if err := r.Defer(); err != nil { - reply.Error(e, errs.ErrCommandDeferFailed) - return - } - - user, err := ctx.GetUser(e) - if err != nil { - reply.Error(e, errs.ErrUserNotFound) - return - } - - t := e.SlashCommandInteractionData().String("type") - var entries []Entry - - gridSize, gridSizeDefined := e.SlashCommandInteractionData().OptInt("grid-size") - if !gridSizeDefined { - gridSize = minGridSize - } - - period, periodDefined := e.SlashCommandInteractionData().OptString("period") - if !periodDefined { - period = defaultPeriod - } - - switch t { - case "artist": - reply.Error(e, errors.New("artist images are currently unsupported")) - return - case "track": - // todo: workaround for track images. i hate last.fm. ~elisiei - topTracks, err := ctx.LastFM.User.GetTopTracks(lfm.P{"user": user, "limit": gridSize * gridSize, "period": period}) - if err != nil { - reply.Error(e, err) - return - } - for _, track := range topTracks.Tracks { - if len(track.Images) == 0 { - continue - } - imgURL := track.Images[len(track.Images)-1].Url - imgBytes, err := imgio.Fetch(imgURL) - if err != nil { - continue - } - img, err := imgio.Decode(imgBytes) - if err != nil { - continue - } - entries = append(entries, Entry{Image: img, Name: track.Name, Artist: track.Artist.Name}) - } - case "album": - topAlbums, err := ctx.LastFM.User.GetTopAlbums(lfm.P{"user": user, "limit": gridSize * gridSize, "period": period}) - if err != nil { - reply.Error(e, err) - return - } - for _, album := range topAlbums.Albums { - if len(album.Images) == 0 { - continue - } - imgURL := album.Images[len(album.Images)-1].Url - imgBytes, err := imgio.Fetch(imgURL) - if err != nil { - brokenImage, _ := imgio.Open("assets/img/broken.png") - resized := transform.Resize(brokenImage, 300, 300, transform.Gaussian) - entries = append(entries, Entry{Image: resized, Name: album.Name, Artist: album.Artist.Name}) - continue - } - img, err := imgio.Decode(imgBytes) - if err != nil { - continue - } - entries = append(entries, Entry{Image: img, Name: album.Name, Artist: album.Artist.Name}) - } - } - - if len(entries) == 0 { - reply.Error(e, errs.ErrNoTracksFound) - return - } - - inter := font.LoadFont("assets/font/Inter_24pt-Regular.ttf") - labelFace := inter.Face(20, 72) - subFace := inter.Face(16, 72) - - firstBounds := entries[0].Image.Bounds() - cellWidth := firstBounds.Dx() - cellHeight := firstBounds.Dy() - canvasWidth := cellWidth * gridSize - canvasHeight := cellHeight * gridSize - canvas := image.NewRGBA(image.Rect(0, 0, canvasWidth, canvasHeight)) - - chartGradient, err := imgio.Open("assets/img/chart_gradient.png") - if err != nil { - reply.Error(e, errors.New("failed to load chart gradient")) - return - } - - for i, entry := range entries { - row := i / gridSize - col := i % gridSize - x := col * cellWidth - y := row * cellHeight - rect := image.Rect(x, y, x+cellWidth, y+cellHeight) - - draw.Draw(canvas, rect, entry.Image, image.Point{}, draw.Over) - draw.Draw(canvas, rect, chartGradient, image.Point{}, draw.Over) - font.DrawText(canvas, x+15, y+labelFace.Metrics().Ascent.Ceil()+15, entry.Name, color.White, labelFace) - - if entry.Artist != "" { - font.DrawText( - canvas, - x+15, - y+labelFace.Metrics().Ascent.Ceil()+subFace.Metrics().Ascent.Ceil()+25, - entry.Artist, - color.RGBA{170, 170, 170, 255}, - subFace, - ) - } - } - - result, err := imgio.Encode(canvas, imgio.PNGEncoder()) - if err != nil { - reply.Error(e, err) - return - } - - // see you twin <3 - r.File(discord.NewFile("chart.png", "", bytes.NewReader(result))).Edit() -} diff --git a/commands/commands.go b/commands/commands.go deleted file mode 100644 index 3d6bde7..0000000 --- a/commands/commands.go +++ /dev/null @@ -1,118 +0,0 @@ -package commands - -import ( - "time" - - "github.com/disgoorg/disgo/bot" - "github.com/disgoorg/disgo/discord" - "github.com/disgoorg/disgo/events" - - "go.fm/commands/botinfo" - "go.fm/commands/chart" - "go.fm/commands/fm" - "go.fm/commands/profile" - - // profilev2 "go.fm/commands/profile/v2" - "go.fm/commands/setuser" - "go.fm/commands/top" - "go.fm/commands/update" - "go.fm/commands/whoknows" - - "go.fm/logger" - "go.fm/pkg/ctx" -) - -var registry = map[string]Command{} -var sharedCtx ctx.CommandContext - -const ( - DefaultWorkerCount = 50 - DefaultQueueSize = 1000 -) - -type CommandJob struct { - e *events.ApplicationCommandInteractionCreate - ctx ctx.CommandContext -} - -var jobQueue = make(chan CommandJob, DefaultQueueSize) - -func init() { - Register(fm.Command{}) - Register(whoknows.Command{}) - Register(setuser.Command{}) - Register(profile.Command{}) - Register(top.Command{}) - Register(update.Command{}) - Register(botinfo.Command{}) - Register(chart.Command{}) - - // wip. - // Register(profilev2.Command{}) -} - -type Command interface { - Data() discord.ApplicationCommandCreate - Handle(e *events.ApplicationCommandInteractionCreate, ctx ctx.CommandContext) -} - -func Register(cmd Command) { - name := cmd.Data().CommandName() - registry[name] = cmd - logger.Log.Debugf("registered command %s", name) -} - -func All() []discord.ApplicationCommandCreate { - cmds := make([]discord.ApplicationCommandCreate, 0, len(registry)) - for _, cmd := range registry { - cmds = append(cmds, cmd.Data()) - } - return cmds -} - -func InitDependencies(ctx ctx.CommandContext) { - ctx.Start = time.Now() - sharedCtx = ctx - StartWorkerPool(DefaultWorkerCount) -} - -func StartWorkerPool(numWorkers int) { - for i := range numWorkers { - go func(workerID int) { - for job := range jobQueue { - safeHandle(job.e, job.ctx) - } - }(i) - } - logger.Log.Infof("started %d command workers", numWorkers) -} - -func safeHandle(e *events.ApplicationCommandInteractionCreate, ctx ctx.CommandContext) { - defer func() { - if r := recover(); r != nil { - logger.Log.Errorf("panic in command %s: %v", e.Data.CommandName(), r) - } - }() - - cmd, ok := registry[e.Data.CommandName()] - if !ok { - logger.Log.Warnf("unknown command: %s", e.Data.CommandName()) - return - } - - start := time.Now() - cmd.Handle(e, ctx) - logger.Log.Debugf("command %s executed in %s", e.Data.CommandName(), time.Since(start)) -} - -func Handler() bot.EventListener { - return &events.ListenerAdapter{ - OnApplicationCommandInteraction: func(e *events.ApplicationCommandInteractionCreate) { - select { - case jobQueue <- CommandJob{e: e, ctx: sharedCtx}: - default: - logger.Log.Warnf("command queue full, dropping command: %s", e.Data.CommandName()) - } - }, - } -} diff --git a/commands/fm/fm.go b/commands/fm/fm.go deleted file mode 100644 index 28bb168..0000000 --- a/commands/fm/fm.go +++ /dev/null @@ -1,115 +0,0 @@ -package fm - -import ( - "github.com/disgoorg/disgo/discord" - "github.com/disgoorg/disgo/events" - "github.com/disgoorg/snowflake/v2" - - "go.fm/lfm" - "go.fm/lfm/types" - "go.fm/pkg/bild/colors" - "go.fm/pkg/constants/emojis" - "go.fm/pkg/constants/errs" - "go.fm/pkg/constants/opts" - "go.fm/pkg/ctx" - "go.fm/pkg/discord/reply" -) - -type Command struct{} - -func (Command) Data() discord.ApplicationCommandCreate { - return discord.SlashCommandCreate{ - Name: "fm", - Description: "get an user's current track", - IntegrationTypes: []discord.ApplicationIntegrationType{ - discord.ApplicationIntegrationTypeGuildInstall, - discord.ApplicationIntegrationTypeUserInstall, - }, - Options: []discord.ApplicationCommandOption{ - opts.UserOption, - }, - } -} - -func (Command) Handle(e *events.ApplicationCommandInteractionCreate, ctx ctx.CommandContext) { - r := reply.New(e) - if err := r.Defer(); err != nil { - reply.Error(e, errs.ErrCommandDeferFailed) - return - } - - user, err := ctx.GetUser(e) - if err != nil { - reply.Error(e, errs.ErrUserNotFound) - return - } - - data, err := ctx.LastFM.User.GetRecentTracks(lfm.P{"user": user, "limit": 1}) - if err != nil { - reply.Error(e, errs.ErrCurrentTrackFetch) - return - } - - if len(data.Tracks) == 0 { - reply.Error(e, errs.ErrNoTracksFound) - return - } - - track := data.Tracks[0] - if track.NowPlaying != "true" { - reply.Error(e, errs.ErrNotListening) - return - } - - thumbnail := "https://lastfm.freetls.fastly.net/i/u/avatar170s/818148bf682d429dc215c1705eb27b98.png" - if n := len(track.Images); n > 0 { - thumbnail = string([]byte(track.Images[n-1].Url)) - } - - trackData, err := ctx.LastFM.Track.GetInfo(lfm.P{ - "user": user, - "track": track.Name, - "artist": track.Artist.Name, - }) - if err != nil || trackData == nil { - trackData = &types.TrackGetInfo{UserPlayCount: 0} - } - - color, err := colors.Dominant(thumbnail) - if err != nil { - color = 0x00ADD8 - } - - var linkButton discord.ButtonComponent - if track.Url != "" { - linkButton = discord.NewLinkButton( - "Song in Last.fm", - track.Url, - ).WithEmoji( - discord.NewCustomComponentEmoji(snowflake.MustParse("1418268922448187492")), - ) - } - - component := discord.NewContainer( - discord.NewSection( - discord.NewTextDisplayf( - "# %s\nby **%s**\n-# At %s", - track.Name, - track.Artist.Name, - track.Album.Name, - ), - ).WithAccessory(discord.NewThumbnail(thumbnail)), - discord.NewActionRow( - linkButton, - ), - discord.NewSmallSeparator(), - discord.NewTextDisplayf( - "-# *Current track for **%s**, scrobbled **%d** times* %s", - user, - trackData.UserPlayCount, - emojis.EmojiNote, - ), - ).WithAccentColor(color) - - r.Flags(discord.MessageFlagIsComponentsV2).Component(component).Edit() -} diff --git a/commands/profile/profile.go b/commands/profile/profile.go deleted file mode 100644 index 63a9af6..0000000 --- a/commands/profile/profile.go +++ /dev/null @@ -1,149 +0,0 @@ -package profile - -import ( - "fmt" - - "github.com/disgoorg/disgo/discord" - "github.com/disgoorg/disgo/events" - - "go.fm/lfm" - "go.fm/lfm/types" - "go.fm/pkg/bild/colors" - "go.fm/pkg/constants/emojis" - "go.fm/pkg/constants/errs" - "go.fm/pkg/constants/opts" - "go.fm/pkg/ctx" - "go.fm/pkg/discord/reply" -) - -type Command struct{} -type Fav struct { - Name string - URL string - PlayCount string -} - -func fetchFav[T any](fetch func() (T, error), extract func(T) Fav) Fav { - data, err := fetch() - if err != nil { - return Fav{"none", "", "0"} - } - return extract(data) -} - -func (Command) Data() discord.ApplicationCommandCreate { - return discord.SlashCommandCreate{ - Name: "profile", - Description: "display a last.fm user info", - IntegrationTypes: []discord.ApplicationIntegrationType{ - discord.ApplicationIntegrationTypeGuildInstall, - discord.ApplicationIntegrationTypeUserInstall, - }, - Options: []discord.ApplicationCommandOption{ - opts.UserOption, - }, - } -} - -func (Command) Handle(e *events.ApplicationCommandInteractionCreate, ctx ctx.CommandContext) { - r := reply.New(e) - if err := r.Defer(); err != nil { - reply.Error(e, errs.ErrCommandDeferFailed) - return - } - - username, err := ctx.GetUser(e) - if err != nil { - reply.Error(e, errs.ErrUserNotFound) - return - } - - user, err := ctx.LastFM.User.GetInfoWithPrefetch(lfm.P{"user": username}) - if err != nil { - reply.Error(e, errs.ErrUserNotFound) - return - } - - realName := user.RealName - if realName == "" { - realName = user.Name - } - - favTrack := fetchFav( - func() (*types.UserGetTopTracks, error) { - return ctx.LastFM.User.GetTopTracks(lfm.P{"user": username, "limit": 1}) - }, - func(tt *types.UserGetTopTracks) Fav { - if len(tt.Tracks) == 0 { - return Fav{"none", "", "0"} - } - t := tt.Tracks[0] - return Fav{t.Name, t.Url, t.PlayCount} - }, - ) - - favArtist := fetchFav( - func() (*types.UserGetTopArtists, error) { - return ctx.LastFM.User.GetTopArtists(lfm.P{"user": username, "limit": 1}) - }, - func(ta *types.UserGetTopArtists) Fav { - if len(ta.Artists) == 0 { - return Fav{"none", "", "0"} - } - a := ta.Artists[0] - return Fav{a.Name, a.Url, a.PlayCount} - }, - ) - - favAlbum := fetchFav( - func() (*types.UserGetTopAlbums, error) { - return ctx.LastFM.User.GetTopAlbums(lfm.P{"user": username, "limit": 1}) - }, - func(ta *types.UserGetTopAlbums) Fav { - if len(ta.Albums) == 0 { - return Fav{"none", "", "0"} - } - a := ta.Albums[0] - return Fav{a.Name, a.Url, a.PlayCount} - }, - ) - - avatar := "" - if len(user.Images) > 0 { - avatar = user.Images[len(user.Images)-1].Url - } - if avatar == "" { - avatar = "https://lastfm.freetls.fastly.net/i/u/avatar170s/818148bf682d429dc215c1705eb27b98.png" - } - - color := 0x00ADD8 - if dominantColor, err := colors.Dominant(avatar); err == nil { - color = dominantColor - } - - component := discord.NewContainer( - discord.NewSection( - discord.NewTextDisplayf("## [%s](%s)", realName, user.Url), - discord.NewTextDisplayf("-# *__@%s__*\nSince %s", user.Name, user.Registered.Unixtime, emojis.EmojiCalendar), - discord.NewTextDisplayf("**%s** total scrobbles %s", user.PlayCount, emojis.EmojiPlay), - ).WithAccessory(discord.NewThumbnail(avatar)), - discord.NewSmallSeparator(), - discord.NewTextDisplay( - fmt.Sprintf("-# *Favorite album* %s\n[**%s**](%s) โ€” %s plays\n", emojis.EmojiAlbum, favAlbum.Name, favAlbum.URL, favAlbum.PlayCount)+ - fmt.Sprintf("-# *Favorite artist* %s\n[**%s**](%s) โ€” %s plays\n", emojis.EmojiMic2, favArtist.Name, favArtist.URL, favArtist.PlayCount)+ - fmt.Sprintf("-# *Favorite track* %s\n[**%s**](%s) โ€” %s plays\n", emojis.EmojiNote, favTrack.Name, favTrack.URL, favTrack.PlayCount), - ), - discord.NewSmallSeparator(), - discord.NewTextDisplayf( - "%s **%s** albums\n%s **%s** artists\n%s **%s** unique tracks", - emojis.EmojiAlbum, - user.ArtistCount, - emojis.EmojiMic2, - user.AlbumCount, - emojis.EmojiNote, - user.TrackCount, - ), - ).WithAccentColor(color) - - r.Flags(discord.MessageFlagIsComponentsV2).Component(component).Edit() -} diff --git a/commands/profile/v2/profile.go b/commands/profile/v2/profile.go deleted file mode 100644 index 1801a5e..0000000 --- a/commands/profile/v2/profile.go +++ /dev/null @@ -1,262 +0,0 @@ -package v2 - -// an *over*engineering masterpiece - -import ( - "bytes" - "fmt" - "image" - "image/color" - "image/draw" - "runtime" - "runtime/debug" - - "github.com/disgoorg/disgo/discord" - "github.com/disgoorg/disgo/events" - - "go.fm/lfm" - "go.fm/lfm/types" - "go.fm/logger" - "go.fm/pkg/bild/blur" - "go.fm/pkg/bild/font" - "go.fm/pkg/bild/imgio" - "go.fm/pkg/bild/mask" - "go.fm/pkg/bild/transform" - "go.fm/pkg/constants/errs" - "go.fm/pkg/constants/opts" - "go.fm/pkg/ctx" - "go.fm/pkg/discord/reply" - "go.fm/pkg/strng" -) - -var inter *font.Font -var gradient image.Image - -func init() { - inter = font.LoadFont("assets/font/Inter_24pt-Regular.ttf") - gradientImage, err := imgio.Open("assets/img/profile_gradient.png") - if err != nil { - logger.Log.Fatalf("missing profile gradient image") - } - gradient = gradientImage - logger.Log.Debug("loaded profile gradient and font") -} - -type Command struct{} - -type Fav struct { - Name string - PlayCount string -} - -func fetchFav[T any](fetch func() (T, error), extract func(T) Fav) Fav { - data, err := fetch() - if err != nil { - return Fav{"none", "0"} - } - return extract(data) -} - -func (Command) Data() discord.ApplicationCommandCreate { - return discord.SlashCommandCreate{ - Name: "profile-v2", - Description: "[NEW] provile v2 (WIP) (DELETED SOON)", - IntegrationTypes: []discord.ApplicationIntegrationType{ - discord.ApplicationIntegrationTypeGuildInstall, - }, - Options: []discord.ApplicationCommandOption{ - opts.UserOption, - }, - } -} - -func (Command) Handle(e *events.ApplicationCommandInteractionCreate, ctx ctx.CommandContext) { - r := reply.New(e) - if err := r.Defer(); err != nil { - reply.Error(e, errs.ErrCommandDeferFailed) - return - } - - username, err := ctx.GetUser(e) - if err != nil { - reply.Error(e, errs.ErrUserNotRegistered) - return - } - - user, err := ctx.LastFM.User.GetInfo(lfm.P{"user": username}) - if err != nil { - reply.Error(e, err) - return - } - - favTrack := fetchFav( - func() (*types.UserGetTopTracks, error) { - return ctx.LastFM.User.GetTopTracks(lfm.P{"user": username, "limit": 1}) - }, - func(tt *types.UserGetTopTracks) Fav { - if len(tt.Tracks) == 0 { - return Fav{"none", "0"} - } - t := tt.Tracks[0] - return Fav{t.Name, t.PlayCount} - }, - ) - - favArtist := fetchFav( - func() (*types.UserGetTopArtists, error) { - return ctx.LastFM.User.GetTopArtists(lfm.P{"user": username, "limit": 1}) - }, - func(ta *types.UserGetTopArtists) Fav { - if len(ta.Artists) == 0 { - return Fav{"none", "0"} - } - a := ta.Artists[0] - return Fav{a.Name, a.PlayCount} - }, - ) - - favAlbum := fetchFav( - func() (*types.UserGetTopAlbums, error) { - return ctx.LastFM.User.GetTopAlbums(lfm.P{"user": username, "limit": 1}) - }, - func(ta *types.UserGetTopAlbums) Fav { - if len(ta.Albums) == 0 { - return Fav{"none", "0"} - } - a := ta.Albums[0] - return Fav{a.Name, a.PlayCount} - }, - ) - - runtime.GC() - var mStart, mEnd runtime.MemStats - runtime.ReadMemStats(&mStart) - - // - start memory measure - - userAvatar := user.Images[len(user.Images)-1].Url - data, err := imgio.Fetch(userAvatar) - if err != nil { - reply.Error(e, err) - return - } - - avatarImage, err := imgio.Decode(data) - if err != nil { - reply.Error(e, err) - return - } - - canvasWidth, canvasHeight := 500, 600 - avatarSize := 180 - avatarPadding := image.Pt(20, 20) - radius := 10 - - canvas := image.NewRGBA(image.Rect(0, 0, canvasWidth, canvasHeight)) - - bgImage := transform.Resize(avatarImage, canvasWidth, canvasHeight, transform.Linear) - bgImage = blur.Gaussian(bgImage, 20) - - draw.Draw(canvas, canvas.Bounds(), bgImage, image.Point{0, 0}, draw.Over) - draw.Draw(canvas, canvas.Bounds(), gradient, image.Point{0, 0}, draw.Over) - - avatarImage = transform.Resize(avatarImage, avatarSize, avatarSize, transform.Gaussian) - mask := mask.Rounded(avatarSize, avatarSize, radius) - - draw.DrawMask( - canvas, - image.Rect(avatarPadding.X, avatarPadding.Y, avatarPadding.X+avatarSize, avatarPadding.Y+avatarSize), - avatarImage, - image.Point{0, 0}, - mask, - image.Point{0, 0}, - draw.Over, - ) - - // real name (if exists) - realName := user.RealName - if realName == "" { - realName = user.Name - } - - face32 := inter.Face(32, 72) - metrics32 := face32.Metrics() - ascent32 := metrics32.Ascent.Ceil() - textX := avatarPadding.X + avatarSize + 20 - textY1 := avatarPadding.Y + ascent32 - font.DrawText(canvas, textX, textY1, realName, color.White, face32) - - // @username - face16 := inter.Face(16, 72) - textY2 := textY1 + face32.Metrics().Height.Ceil() - 10 - font.DrawText(canvas, textX, textY2, fmt.Sprintf("@%s", user.Name), color.White, face16) - - // below avatar btw - labelFace := inter.Face(20, 72) - valueFace := inter.Face(26, 72) - spacing := 6 - infoStartY := avatarPadding.Y + avatarSize + 35 - - // colors - labelColor := color.RGBA{170, 170, 170, 255} - valueColor := color.White - - // nums - artistNum := favArtist.PlayCount - trackNum := favTrack.PlayCount - albumNum := favAlbum.PlayCount - - // font width - wArtist := font.Measure(valueFace, artistNum) - wTrack := font.Measure(valueFace, trackNum) - wAlbum := font.Measure(valueFace, albumNum) - - maxNumW := wArtist - maxNumW = max(wTrack, maxNumW) - maxNumW = max(wAlbum, maxNumW) - - numGap := 12 - xBase := avatarPadding.X - y := infoStartY - - // favourite artist - font.DrawText(canvas, xBase, y, "Favourite artist", labelColor, labelFace) - valY := y + labelFace.Metrics().Height.Ceil() + spacing - font.DrawText(canvas, xBase, valY, artistNum, labelColor, valueFace) - font.DrawText(canvas, xBase+maxNumW+numGap, valY, strng.Truncate(favArtist.Name, 25), valueColor, valueFace) - - // favourite track - y = valY + valueFace.Metrics().Height.Ceil() + spacing - font.DrawText(canvas, xBase, y, "Favourite track", labelColor, labelFace) - valY = y + labelFace.Metrics().Height.Ceil() + spacing - font.DrawText(canvas, xBase, valY, trackNum, labelColor, valueFace) - font.DrawText(canvas, xBase+maxNumW+numGap, valY, strng.Truncate(favTrack.Name, 25), valueColor, valueFace) - - // favourite album - y = valY + valueFace.Metrics().Height.Ceil() + spacing - font.DrawText(canvas, xBase, y, "Favourite album", labelColor, labelFace) - valY = y + labelFace.Metrics().Height.Ceil() + spacing - font.DrawText(canvas, xBase, valY, albumNum, labelColor, valueFace) - font.DrawText(canvas, xBase+maxNumW+numGap, valY, strng.Truncate(favAlbum.Name, 25), valueColor, valueFace) - - // :D - result, err := imgio.Encode(canvas, imgio.PNGEncoder()) - if err != nil { - reply.Error(e, err) - return - } - // - end memory measure - - - runtime.ReadMemStats(&mEnd) - - defer func() { - runtime.GC() - debug.FreeOSMemory() - }() - - file := discord.NewFile("test.png", "", bytes.NewReader(result)) - r.File(file).Content("ready. (wip command, testing purposes)\n-# *used %vmb*", bToMb(mEnd.Alloc-mStart.Alloc)).Edit() -} - -func bToMb(b uint64) uint64 { - return b / 1024 / 1024 -} diff --git a/commands/setuser/setuser.go b/commands/setuser/setuser.go deleted file mode 100644 index 52f055c..0000000 --- a/commands/setuser/setuser.go +++ /dev/null @@ -1,80 +0,0 @@ -package setuser - -import ( - "database/sql" - "errors" - - "github.com/disgoorg/disgo/discord" - "github.com/disgoorg/disgo/events" - "github.com/nxtgo/zlog" - - "go.fm/db" - "go.fm/lfm" - "go.fm/logger" - "go.fm/pkg/constants/emojis" - "go.fm/pkg/constants/errs" - "go.fm/pkg/ctx" - "go.fm/pkg/discord/reply" -) - -type Command struct{} - -func (Command) Data() discord.ApplicationCommandCreate { - return discord.SlashCommandCreate{ - Name: "set-user", - Description: "link your last.fm username to your Discord account", - IntegrationTypes: []discord.ApplicationIntegrationType{ - discord.ApplicationIntegrationTypeGuildInstall, - discord.ApplicationIntegrationTypeUserInstall, - }, - Options: []discord.ApplicationCommandOption{ - discord.ApplicationCommandOptionString{ - Name: "username", - Description: "your last.fm username", - Required: true, - }, - }, - } -} - -func (Command) Handle(e *events.ApplicationCommandInteractionCreate, ctx ctx.CommandContext) { - r := reply.New(e) - if err := r.Defer(); err != nil { - reply.Error(e, errs.ErrCommandDeferFailed) - return - } - - username := e.SlashCommandInteractionData().String("username") - discordID := e.User().ID.String() - - _, err := ctx.LastFM.User.GetInfo(lfm.P{"user": username}) - if err != nil { - reply.Error(e, errs.ErrUserNotFound) - return - } - - existing, err := ctx.Database.GetUserByUsername(ctx.Context, username) - if err == nil { - if existing.DiscordID != discordID { - reply.Error(e, errs.ErrUsernameAlreadyUsed) - return - } - if existing.LastfmUsername == username { - reply.Error(e, errs.ErrUsernameAlreadySet(username)) - return - } - } - - if errors.Is(err, sql.ErrNoRows) || existing.DiscordID == discordID { - if dbErr := ctx.Database.UpsertUser(ctx.Context, db.UpsertUserParams{ - DiscordID: discordID, - LastfmUsername: username, - }); dbErr != nil { - logger.Log.Errorw("failed to upsert user", zlog.F{"gid": e.GuildID().String(), "uid": discordID}, dbErr) - reply.Error(e, errs.ErrSetUsername) - return - } - - r.Content("your last.fm username has been set to **%s**! %s", username, emojis.EmojiUpdate).Edit() - } -} diff --git a/commands/top/top.go b/commands/top/top.go deleted file mode 100644 index c637ee9..0000000 --- a/commands/top/top.go +++ /dev/null @@ -1,148 +0,0 @@ -package top - -import ( - "fmt" - - "github.com/disgoorg/disgo/discord" - "github.com/disgoorg/disgo/events" - - "go.fm/lfm" - "go.fm/pkg/constants/emojis" - "go.fm/pkg/constants/errs" - "go.fm/pkg/constants/opts" - "go.fm/pkg/ctx" - "go.fm/pkg/discord/reply" -) - -var ( - maxLimit int = 100 - minLimit int = 5 -) - -type Command struct{} - -func (Command) Data() discord.ApplicationCommandCreate { - return discord.SlashCommandCreate{ - Name: "top", - Description: "get an user's top tracks/albums/artists", - IntegrationTypes: []discord.ApplicationIntegrationType{ - discord.ApplicationIntegrationTypeGuildInstall, - discord.ApplicationIntegrationTypeUserInstall, - }, - Options: []discord.ApplicationCommandOption{ - discord.ApplicationCommandOptionString{ - Name: "type", - Description: "artist, track or album", - Choices: []discord.ApplicationCommandOptionChoiceString{ - {Name: "artist", Value: "artist"}, - {Name: "track", Value: "track"}, - {Name: "album", Value: "album"}, - }, - Required: true, - }, - discord.ApplicationCommandOptionInt{ - Name: "limit", - Description: "max entries for the list (max: 100, min: 5)", - Required: false, - MinValue: &minLimit, - MaxValue: &maxLimit, - }, - opts.UserOption, - }, - } -} - -func (Command) Handle(e *events.ApplicationCommandInteractionCreate, ctx ctx.CommandContext) { - r := reply.New(e) - if err := r.Defer(); err != nil { - reply.Error(e, errs.ErrCommandDeferFailed) - return - } - - user, err := ctx.GetUser(e) - if err != nil { - reply.Error(e, errs.ErrUserNotRegistered) - return - } - - topType := e.SlashCommandInteractionData().String("type") - limit, limitDefined := e.SlashCommandInteractionData().OptInt("limit") - if !limitDefined { - limit = 10 - } - - userData, err := ctx.LastFM.User.GetInfoWithPrefetch(lfm.P{"user": user}) - if err != nil { - reply.Error(e, errs.ErrUserNotFound) - } - - var description string - - switch topType { - case "artist": - data, err := ctx.LastFM.User.GetTopArtists(lfm.P{ - "user": user, - "limit": limit, - }) - if err != nil { - reply.Error(e, err) - return - } - - for i, a := range data.Artists { - if i > limit { - break - } - description += fmt.Sprintf("%d. %s โ€” **%s** plays\n", i+1, a.Name, a.PlayCount) - } - - case "track": - data, err := ctx.LastFM.User.GetTopTracks(lfm.P{ - "user": user, - "limit": limit, - }) - if err != nil { - reply.Error(e, err) - return - } - - for i, t := range data.Tracks { - if i > limit { - break - } - description += fmt.Sprintf("%d. %s โ€” *%s* (**%s** plays)\n", i+1, t.Name, t.Artist.Name, t.PlayCount) - } - - case "album": - data, err := ctx.LastFM.User.GetTopAlbums(lfm.P{ - "user": user, - "limit": limit, - }) - if err != nil { - reply.Error(e, err) - return - } - - for i, a := range data.Albums { - if i > limit { - break - } - description += fmt.Sprintf("%d. %s โ€” *%s* (**%s** plays)\n", i+1, a.Name, a.Artist.Name, a.PlayCount) - } - } - - if description == "" { - description = errs.ErrNoTracksFound.Error() - } - - component := discord.NewContainer( - discord.NewSection( - discord.NewTextDisplayf("# [%s](%s)'s %s %ss", user, userData.Url, emojis.EmojiTop, topType), - discord.NewTextDisplay(description), - ).WithAccessory(discord.NewThumbnail(userData.Images[len(userData.Images)-1].Url)), - discord.NewSmallSeparator(), - discord.NewTextDisplayf("-# *If results are odd, use `/update`* %s", emojis.EmojiChat), - ) - - r.Flags(discord.MessageFlagIsComponentsV2).Component(component).Edit() -} diff --git a/commands/update/update.go b/commands/update/update.go deleted file mode 100644 index 9aeab81..0000000 --- a/commands/update/update.go +++ /dev/null @@ -1,123 +0,0 @@ -package update - -import ( - "github.com/disgoorg/disgo/discord" - "github.com/disgoorg/disgo/events" - "github.com/disgoorg/snowflake/v2" - - "go.fm/lfm" - "go.fm/lfm/types" - "go.fm/pkg/constants/emojis" - "go.fm/pkg/constants/errs" - "go.fm/pkg/constants/opts" - "go.fm/pkg/ctx" - "go.fm/pkg/discord/reply" -) - -type Command struct{} - -func (Command) Data() discord.ApplicationCommandCreate { - return discord.SlashCommandCreate{ - Name: "update", - Description: "refresh cache data", - IntegrationTypes: []discord.ApplicationIntegrationType{ - discord.ApplicationIntegrationTypeGuildInstall, - discord.ApplicationIntegrationTypeUserInstall, - }, - Options: []discord.ApplicationCommandOption{ - opts.UserOption, - }, - } -} - -func (Command) Handle(e *events.ApplicationCommandInteractionCreate, ctx ctx.CommandContext) { - r := reply.New(e) - if err := r.Defer(); err != nil { - reply.Error(e, errs.ErrCommandDeferFailed) - return - } - - username, err := ctx.GetUser(e) - if err != nil { - reply.Error(e, errs.ErrUserNotFound) - return - } - - clearUserCaches(username, ctx) - clearMemberCache(e, ctx) - - userInfo, err := fetchUserInfo(username, ctx) - if err != nil { - reply.Error(e, errs.ErrUserNotFound) - return - } - - updateCaches(e, username, userInfo, ctx) - - go ctx.LastFM.User.PrefetchUserData(username) - - r.Content("updated and cached your data! %s", emojis.EmojiUpdate).Edit() -} - -func clearUserCaches(username string, ctx ctx.CommandContext) { - if ctx.Cache == nil { - return - } - - caches := []interface { - Delete(string) - }{ - ctx.Cache.User, - ctx.Cache.TopArtists, - ctx.Cache.TopAlbums, - ctx.Cache.TopTracks, - } - - for _, cache := range caches { - if cache != nil { - cache.Delete(username) - } - } -} - -func clearMemberCache(e *events.ApplicationCommandInteractionCreate, ctx ctx.CommandContext) { - guildID := e.GuildID() - if guildID == nil || ctx.Cache.Members == nil { - return - } - - members, exists := ctx.Cache.Members.Get(*guildID) - if !exists || members == nil { - return - } - - delete(members, e.User().ID) - ctx.Cache.Members.Set(*guildID, members, 0) -} - -func fetchUserInfo(username string, ctx ctx.CommandContext) (*types.UserGetInfo, error) { - return ctx.LastFM.User.GetInfo(lfm.P{"user": username}) -} - -func updateCaches(e *events.ApplicationCommandInteractionCreate, username string, userInfo *types.UserGetInfo, ctx ctx.CommandContext) { - if ctx.Cache.User != nil { - ctx.Cache.User.Set(username, *userInfo, 0) - } - - updateGuildMemberCache(e, username, ctx) -} - -func updateGuildMemberCache(e *events.ApplicationCommandInteractionCreate, username string, ctx ctx.CommandContext) { - guildID := e.GuildID() - if guildID == nil || ctx.Cache.Members == nil { - return - } - - members, _ := ctx.Cache.Members.Get(*guildID) - if members == nil { - members = make(map[snowflake.ID]string) - } - - members[e.User().ID] = username - ctx.Cache.Members.Set(*guildID, members, 0) -} diff --git a/commands/whoknows/whoknows.go b/commands/whoknows/whoknows.go deleted file mode 100644 index f05ee34..0000000 --- a/commands/whoknows/whoknows.go +++ /dev/null @@ -1,465 +0,0 @@ -package whoknows - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - "net/url" - "sort" - "strings" - "sync" - "time" - - "github.com/disgoorg/disgo/discord" - "github.com/disgoorg/disgo/events" - "github.com/disgoorg/snowflake/v2" - - "go.fm/lfm" - "go.fm/pkg/bild/colors" - "go.fm/pkg/constants/emojis" - "go.fm/pkg/constants/errs" - "go.fm/pkg/ctx" - "go.fm/pkg/discord/reply" -) - -var ( - maxLimit = 100 - minLimit = 3 - defaultLimit = 10 - maxWorkers = 20 - timeout = 30 * time.Second -) - -type Command struct{} - -type Options struct { - Type string - Name string - Limit int - IsGlobal bool -} - -type Query struct { - Url string - Type string - Name string - ArtistName string - Thumbnail string - BetterName string -} - -type Result struct { - UserID string - Username string - PlayCount int -} - -func (Command) Data() discord.ApplicationCommandCreate { - return discord.SlashCommandCreate{ - Name: "who-knows", - Description: "see who has listened to a track/artist/album the most", - IntegrationTypes: []discord.ApplicationIntegrationType{ - discord.ApplicationIntegrationTypeGuildInstall, - }, - Options: []discord.ApplicationCommandOption{ - discord.ApplicationCommandOptionString{ - Name: "type", - Description: "artist, track or album", - Choices: []discord.ApplicationCommandOptionChoiceString{ - {Name: "artist", Value: "artist"}, - {Name: "track", Value: "track"}, - {Name: "album", Value: "album"}, - }, - Required: true, - }, - discord.ApplicationCommandOptionString{ - Name: "name", - Description: "name of the artist/track/album", - Required: false, - }, - discord.ApplicationCommandOptionInt{ - Name: "limit", - Description: "max entries for the list (max: 100, min: 3)", - Required: false, - MinValue: &minLimit, - MaxValue: &maxLimit, - }, - discord.ApplicationCommandOptionBool{ - Name: "global", - Description: "show global stats across all registered users instead of just this guild", - Required: false, - }, - }, - } -} - -func (Command) Handle(e *events.ApplicationCommandInteractionCreate, ctx ctx.CommandContext) { - r := reply.New(e) - if err := r.Defer(); err != nil { - reply.Error(e, errs.ErrCommandDeferFailed) - return - } - - options := parseOptions(e) - - query, err := buildQuery(options, e, ctx) - if err != nil { - reply.Error(e, err) - return - } - - users, err := getUsers(options.IsGlobal, e, ctx) - if err != nil { - reply.Error(e, errs.ErrUnexpected) - return - } - - results := fetchPlayCounts(query, users, ctx) - if len(results) == 0 { - reply.Error(e, errs.ErrNoListeners) - return - } - - sort.Slice(results, func(i, j int) bool { - return results[i].PlayCount > results[j].PlayCount - }) - - sendResponse(e, r, query, results, options) -} - -func parseOptions(e *events.ApplicationCommandInteractionCreate) Options { - data := e.SlashCommandInteractionData() - - limit := defaultLimit - if l, ok := data.OptInt("limit"); ok { - limit = l - } - - name, _ := data.OptString("name") - isGlobal, _ := data.OptBool("global") - - return Options{ - Type: data.String("type"), - Name: name, - Limit: limit, - IsGlobal: isGlobal, - } -} - -func buildQuery(options Options, e *events.ApplicationCommandInteractionCreate, ctx ctx.CommandContext) (*Query, error) { - query := &Query{Type: options.Type} - - if options.Name != "" { - query.Name = options.Name - } else { - if err := setQueryFromCurrentTrack(query, e, ctx); err != nil { - return nil, err - } - } - - enrichQuery(query, ctx) - return query, nil -} - -func setQueryFromCurrentTrack(query *Query, e *events.ApplicationCommandInteractionCreate, ctx ctx.CommandContext) error { - currentUser, err := ctx.Database.GetUser(ctx.Context, e.Member().User.ID.String()) - if err != nil { - return errs.ErrUserNotFound - } - - tracks, err := ctx.LastFM.User.GetRecentTracks(lfm.P{"user": currentUser, "limit": 1}) - if err != nil || len(tracks.Tracks) == 0 || tracks.Tracks[0].NowPlaying != "true" { - return errs.ErrCurrentTrackFetch - } - - track := tracks.Tracks[0] - query.ArtistName = track.Artist.Name - - sanitize := func(s string) string { - return strings.ReplaceAll(s, " ", "+") - } - - switch query.Type { - case "artist": - query.Name = track.Artist.Name - query.Url = fmt.Sprintf("https://www.last.fm/music/%s", sanitize(track.Artist.Name)) - case "track": - query.Name = track.Name - query.Url = track.Url - case "album": - query.Name = track.Album.Name - query.Url = fmt.Sprintf("https://www.last.fm/music/%s/%s", - sanitize(track.Artist.Name), sanitize(track.Album.Name)) - } - - return nil -} - -func enrichQuery(query *Query, ctx ctx.CommandContext) { - query.BetterName = query.Name - query.Thumbnail = "https://lastfm.freetls.fastly.net/i/u/avatar170s/818148bf682d429dc215c1705eb27b98.png" - - switch query.Type { - case "artist": - if artist, err := ctx.LastFM.Artist.GetInfo(lfm.P{"artist": query.Name}); err == nil { - if len(artist.Images) > 0 { - artistImage, err := getArtistImage(ctx, artist.Name) - if err == nil { - query.Thumbnail = artistImage - } - } - if artist.Name != "" { - query.BetterName = artist.Name - } - } - - case "track": - params := lfm.P{"track": query.Name} - if query.ArtistName != "" { - params["artist"] = query.ArtistName - } - if track, err := ctx.LastFM.Track.GetInfo(params); err == nil { - if len(track.Album.Images) > 0 { - query.Thumbnail = track.Album.Images[len(track.Album.Images)-1].Url - } - if track.Name != "" { - query.BetterName = track.Name - } - } - - case "album": - params := lfm.P{"album": query.Name} - if query.ArtistName != "" { - params["artist"] = query.ArtistName - } - if album, err := ctx.LastFM.Album.GetInfo(params); err == nil { - if len(album.Images) > 0 { - query.Thumbnail = album.Images[len(album.Images)-1].Url - } - if album.Name != "" { - query.BetterName = album.Name - } - } - } -} - -func getUsers(isGlobal bool, e *events.ApplicationCommandInteractionCreate, ctx ctx.CommandContext) (map[snowflake.ID]string, error) { - if isGlobal { - return getAllUsers(ctx) - } - return ctx.LastFM.User.GetUsersByGuild(ctx.Context, e, ctx.Database) -} - -func getAllUsers(ctx ctx.CommandContext) (map[snowflake.ID]string, error) { - if cached, ok := ctx.Cache.Members.Get(snowflake.ID(0)); ok { - return cached, nil - } - - users, err := ctx.Database.ListUsers(ctx.Context) - if err != nil { - return nil, err - } - - result := make(map[snowflake.ID]string, len(users)) - for _, user := range users { - if id, err := snowflake.Parse(user.DiscordID); err == nil { - result[id] = user.LastfmUsername - } - } - - ctx.Cache.Members.Set(snowflake.ID(0), result, 0) - return result, nil -} - -func fetchPlayCounts(query *Query, users map[snowflake.ID]string, ctx ctx.CommandContext) []Result { - if len(users) == 0 { - return nil - } - - workerCount := min(len(users), maxWorkers) - sem := make(chan struct{}, workerCount) - - var ( - results []Result - mu sync.Mutex - wg sync.WaitGroup - ) - - ctx_timeout, cancel := context.WithTimeout(ctx.Context, timeout) - defer cancel() - -loop: - for userID, username := range users { - select { - case <-ctx_timeout.Done(): - break loop - default: - } - - wg.Add(1) - go func(userID snowflake.ID, username string) { - defer wg.Done() - - select { - case sem <- struct{}{}: - defer func() { <-sem }() - case <-ctx_timeout.Done(): - return - } - - count := getUserPlayCount(query, username, ctx) - if count > 0 { - mu.Lock() - results = append(results, Result{ - UserID: userID.String(), - Username: username, - PlayCount: count, - }) - mu.Unlock() - } - }(userID, username) - } - - done := make(chan struct{}) - go func() { - wg.Wait() - close(done) - }() - - select { - case <-done: - case <-ctx_timeout.Done(): - } - - return results -} - -func getUserPlayCount(query *Query, username string, ctx ctx.CommandContext) int { - params := lfm.P{ - "user": username, - "name": query.Name, - "type": query.Type, - } - - if query.ArtistName != "" { - params["artist"] = query.ArtistName - } - - count, err := ctx.LastFM.User.GetPlays(params) - if err != nil { - return 0 - } - return count -} - -func sendResponse(e *events.ApplicationCommandInteractionCreate, r *reply.ResponseBuilder, query *Query, results []Result, options Options) { - scope := "in this server" - if options.IsGlobal { - scope = "globally" - } else if guild, ok := e.Guild(); ok { - scope = fmt.Sprintf("in %s", guild.Name) - } - - title := fmt.Sprintf("# %s\n-# Who knows %s %s %s?", query.BetterName, query.Type, query.BetterName, scope) - list := buildResultsList(results, options.Limit) - - color := 0x00ADD8 - if dominantColor, err := colors.Dominant(query.Thumbnail); err == nil { - color = dominantColor - } - - component := discord.NewContainer( - discord.NewSection( - discord.NewTextDisplay(title), - discord.NewTextDisplay(list), - ).WithAccessory( - discord.NewThumbnail(query.Thumbnail), - ), - discord.NewSmallSeparator(), - discord.NewActionRow( - discord.NewLinkButton( - "Last.fm", - query.Url, - ).WithEmoji( - discord.NewCustomComponentEmoji(snowflake.MustParse("1418268922448187492")), - ), - ), - ).WithAccentColor(color) - - r.Flags(discord.MessageFlagIsComponentsV2).Component(component).Edit() -} - -func buildResultsList(results []Result, limit int) string { - if len(results) == 0 { - return "no listeners found." - } - - displayCount := min(len(results), limit) - list := "" - - for i := range displayCount { - r := results[i] - count := i + 1 - - var prefix string = fmt.Sprintf("%d.", count) - switch count { - case 1: - prefix = emojis.EmojiRankOne - case 2: - prefix = emojis.EmojiRankTwo - case 3: - prefix = emojis.EmojiRankThree - } - - list += fmt.Sprintf( - "%s [%s]() (*<@%s>*) โ€” **%d** plays\n", - prefix, r.Username, r.Username, r.UserID, r.PlayCount, - ) - } - - if len(results) == 1 { - list += "*this is pretty empty...*" - } - - if len(results) > limit { - list += fmt.Sprintf("\n*...and %d more listeners*", len(results)-limit) - } - - return list -} - -func getArtistImage(ctx ctx.CommandContext, name string) (string, error) { - name = url.QueryEscape(name) - - if v, ok := ctx.Cache.Cover.Get(name); ok { - return v, nil - } - endpoint := "https://api.deezer.com/search/artist?q=" + name - - resp, err := http.Get(endpoint) - if err != nil { - return "", err - } - defer resp.Body.Close() - - var result struct { - Data []struct { - PictureXL string `json:"picture_xl"` - } `json:"data"` - } - - if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { - return "", err - } - - if len(result.Data) == 0 { - return "", fmt.Errorf("no artist found") - } - - image := result.Data[0].PictureXL - - ctx.Cache.Cover.Set(name, image, 0) - - return image, nil -} diff --git a/db/db.go b/db/db.go deleted file mode 100644 index f8f6046..0000000 --- a/db/db.go +++ /dev/null @@ -1,138 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.30.0 - -package db - -import ( - "context" - "database/sql" - "fmt" -) - -type DBTX interface { - ExecContext(context.Context, string, ...interface{}) (sql.Result, error) - PrepareContext(context.Context, string) (*sql.Stmt, error) - QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) - QueryRowContext(context.Context, string, ...interface{}) *sql.Row -} - -func New(db DBTX) *Queries { - return &Queries{db: db} -} - -func Prepare(ctx context.Context, db DBTX) (*Queries, error) { - q := Queries{db: db} - var err error - if q.deleteUserStmt, err = db.PrepareContext(ctx, deleteUser); err != nil { - return nil, fmt.Errorf("error preparing query DeleteUser: %w", err) - } - if q.getUserStmt, err = db.PrepareContext(ctx, getUser); err != nil { - return nil, fmt.Errorf("error preparing query GetUser: %w", err) - } - if q.getUserByUsernameStmt, err = db.PrepareContext(ctx, getUserByUsername); err != nil { - return nil, fmt.Errorf("error preparing query GetUserByUsername: %w", err) - } - if q.getUserCountStmt, err = db.PrepareContext(ctx, getUserCount); err != nil { - return nil, fmt.Errorf("error preparing query GetUserCount: %w", err) - } - if q.listUsersStmt, err = db.PrepareContext(ctx, listUsers); err != nil { - return nil, fmt.Errorf("error preparing query ListUsers: %w", err) - } - if q.upsertUserStmt, err = db.PrepareContext(ctx, upsertUser); err != nil { - return nil, fmt.Errorf("error preparing query UpsertUser: %w", err) - } - return &q, nil -} - -func (q *Queries) Close() error { - var err error - if q.deleteUserStmt != nil { - if cerr := q.deleteUserStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing deleteUserStmt: %w", cerr) - } - } - if q.getUserStmt != nil { - if cerr := q.getUserStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing getUserStmt: %w", cerr) - } - } - if q.getUserByUsernameStmt != nil { - if cerr := q.getUserByUsernameStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing getUserByUsernameStmt: %w", cerr) - } - } - if q.getUserCountStmt != nil { - if cerr := q.getUserCountStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing getUserCountStmt: %w", cerr) - } - } - if q.listUsersStmt != nil { - if cerr := q.listUsersStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing listUsersStmt: %w", cerr) - } - } - if q.upsertUserStmt != nil { - if cerr := q.upsertUserStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing upsertUserStmt: %w", cerr) - } - } - return err -} - -func (q *Queries) exec(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (sql.Result, error) { - switch { - case stmt != nil && q.tx != nil: - return q.tx.StmtContext(ctx, stmt).ExecContext(ctx, args...) - case stmt != nil: - return stmt.ExecContext(ctx, args...) - default: - return q.db.ExecContext(ctx, query, args...) - } -} - -func (q *Queries) query(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (*sql.Rows, error) { - switch { - case stmt != nil && q.tx != nil: - return q.tx.StmtContext(ctx, stmt).QueryContext(ctx, args...) - case stmt != nil: - return stmt.QueryContext(ctx, args...) - default: - return q.db.QueryContext(ctx, query, args...) - } -} - -func (q *Queries) queryRow(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) *sql.Row { - switch { - case stmt != nil && q.tx != nil: - return q.tx.StmtContext(ctx, stmt).QueryRowContext(ctx, args...) - case stmt != nil: - return stmt.QueryRowContext(ctx, args...) - default: - return q.db.QueryRowContext(ctx, query, args...) - } -} - -type Queries struct { - db DBTX - tx *sql.Tx - deleteUserStmt *sql.Stmt - getUserStmt *sql.Stmt - getUserByUsernameStmt *sql.Stmt - getUserCountStmt *sql.Stmt - listUsersStmt *sql.Stmt - upsertUserStmt *sql.Stmt -} - -func (q *Queries) WithTx(tx *sql.Tx) *Queries { - return &Queries{ - db: tx, - tx: tx, - deleteUserStmt: q.deleteUserStmt, - getUserStmt: q.getUserStmt, - getUserByUsernameStmt: q.getUserByUsernameStmt, - getUserCountStmt: q.getUserCountStmt, - listUsersStmt: q.listUsersStmt, - upsertUserStmt: q.upsertUserStmt, - } -} diff --git a/db/embed.go b/db/embed.go deleted file mode 100644 index 1baf0de..0000000 --- a/db/embed.go +++ /dev/null @@ -1,6 +0,0 @@ -package db - -import _ "embed" - -//go:embed sql/schema.sql -var Schema string diff --git a/db/models.go b/db/models.go deleted file mode 100644 index 4bec386..0000000 --- a/db/models.go +++ /dev/null @@ -1,10 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.30.0 - -package db - -type User struct { - DiscordID string `json:"discord_id"` - LastfmUsername string `json:"lastfm_username"` -} diff --git a/db/queries.sql.go b/db/queries.sql.go deleted file mode 100644 index 7fae169..0000000 --- a/db/queries.sql.go +++ /dev/null @@ -1,103 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.30.0 -// source: queries.sql - -package db - -import ( - "context" -) - -const deleteUser = `-- name: DeleteUser :exec -DELETE FROM users -WHERE discord_id = ? -` - -func (q *Queries) DeleteUser(ctx context.Context, discordID string) error { - _, err := q.exec(ctx, q.deleteUserStmt, deleteUser, discordID) - return err -} - -const getUser = `-- name: GetUser :one -SELECT lastfm_username -FROM users -WHERE discord_id = ? -` - -func (q *Queries) GetUser(ctx context.Context, discordID string) (string, error) { - row := q.queryRow(ctx, q.getUserStmt, getUser, discordID) - var lastfm_username string - err := row.Scan(&lastfm_username) - return lastfm_username, err -} - -const getUserByUsername = `-- name: GetUserByUsername :one -SELECT discord_id, lastfm_username -FROM users -WHERE lastfm_username = ? -` - -func (q *Queries) GetUserByUsername(ctx context.Context, lastfmUsername string) (User, error) { - row := q.queryRow(ctx, q.getUserByUsernameStmt, getUserByUsername, lastfmUsername) - var i User - err := row.Scan(&i.DiscordID, &i.LastfmUsername) - return i, err -} - -const getUserCount = `-- name: GetUserCount :one -SELECT COUNT(*) AS count -FROM users -` - -func (q *Queries) GetUserCount(ctx context.Context) (int64, error) { - row := q.queryRow(ctx, q.getUserCountStmt, getUserCount) - var count int64 - err := row.Scan(&count) - return count, err -} - -const listUsers = `-- name: ListUsers :many -SELECT discord_id, lastfm_username -FROM users -` - -func (q *Queries) ListUsers(ctx context.Context) ([]User, error) { - rows, err := q.query(ctx, q.listUsersStmt, listUsers) - if err != nil { - return nil, err - } - defer rows.Close() - var items []User - for rows.Next() { - var i User - if err := rows.Scan(&i.DiscordID, &i.LastfmUsername); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const upsertUser = `-- name: UpsertUser :exec -INSERT INTO users (discord_id, lastfm_username) -VALUES (?, ?) -ON CONFLICT(discord_id) DO UPDATE -SET lastfm_username = excluded.lastfm_username -` - -type UpsertUserParams struct { - DiscordID string `json:"discord_id"` - LastfmUsername string `json:"lastfm_username"` -} - -func (q *Queries) UpsertUser(ctx context.Context, arg UpsertUserParams) error { - _, err := q.exec(ctx, q.upsertUserStmt, upsertUser, arg.DiscordID, arg.LastfmUsername) - return err -} diff --git a/db/sql/queries.sql b/db/sql/queries.sql deleted file mode 100644 index 3714cc9..0000000 --- a/db/sql/queries.sql +++ /dev/null @@ -1,27 +0,0 @@ --- name: GetUser :one -SELECT lastfm_username -FROM users -WHERE discord_id = ?; - --- name: GetUserByUsername :one -SELECT discord_id, lastfm_username -FROM users -WHERE lastfm_username = ?; - --- name: ListUsers :many -SELECT discord_id, lastfm_username -FROM users; - --- name: GetUserCount :one -SELECT COUNT(*) AS count -FROM users; - --- name: UpsertUser :exec -INSERT INTO users (discord_id, lastfm_username) -VALUES (?, ?) -ON CONFLICT(discord_id) DO UPDATE -SET lastfm_username = excluded.lastfm_username; - --- name: DeleteUser :exec -DELETE FROM users -WHERE discord_id = ?; diff --git a/db/sql/schema.sql b/db/sql/schema.sql deleted file mode 100644 index 274f2aa..0000000 --- a/db/sql/schema.sql +++ /dev/null @@ -1,4 +0,0 @@ -CREATE TABLE IF NOT EXISTS users ( - discord_id TEXT PRIMARY KEY, - lastfm_username TEXT NOT NULL -); diff --git a/go.mod b/go.mod deleted file mode 100644 index ebd1688..0000000 --- a/go.mod +++ /dev/null @@ -1,23 +0,0 @@ -module go.fm - -go 1.25.0 - -require ( - github.com/disgoorg/disgo v0.19.0-rc.5 - github.com/disgoorg/snowflake/v2 v2.0.3 - github.com/mattn/go-sqlite3 v1.14.32 - github.com/nxtgo/env v0.0.0-20250905234547-f627e8d51f13 - github.com/nxtgo/gce v0.0.0-20250910001932-ff8e22b0e630 - github.com/nxtgo/zlog v0.0.0-20250905224555-91d56b347e9b - golang.org/x/image v0.31.0 -) - -require ( - github.com/disgoorg/json/v2 v2.0.0 // indirect - github.com/disgoorg/omit v1.0.0 // indirect - github.com/gorilla/websocket v1.5.3 // indirect - github.com/sasha-s/go-csync v0.0.0-20240107134140-fcbab37b09ad // indirect - golang.org/x/crypto v0.42.0 // indirect - golang.org/x/sys v0.36.0 // indirect - golang.org/x/text v0.29.0 // indirect -) diff --git a/go.sum b/go.sum deleted file mode 100644 index 629955a..0000000 --- a/go.sum +++ /dev/null @@ -1,36 +0,0 @@ -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/disgoorg/disgo v0.19.0-rc.5 h1:W+R/LPLblXRlFbsPx+vk6TUPdAL5CvSFWH1l76orVnM= -github.com/disgoorg/disgo v0.19.0-rc.5/go.mod h1:Gc5o9M0pNcdPd4YhQszhdKMRJwmVVIv3IVlHsvtAwpQ= -github.com/disgoorg/json/v2 v2.0.0 h1:U16yy/ARK7/aEpzjjqK1b/KaqqGHozUdeVw/DViEzQI= -github.com/disgoorg/json/v2 v2.0.0/go.mod h1:jZTBC0nIE1WeetSEI3/Dka8g+qglb4FPVmp5I5HpEfI= -github.com/disgoorg/omit v1.0.0 h1:y0LkVUOyUHT8ZlnhIAeOZEA22UYykeysK8bLJ0SfT78= -github.com/disgoorg/omit v1.0.0/go.mod h1:RTmSARkf6PWT/UckwI0bV8XgWkWQoPppaT01rYKLcFQ= -github.com/disgoorg/snowflake/v2 v2.0.3 h1:3B+PpFjr7j4ad7oeJu4RlQ+nYOTadsKapJIzgvSI2Ro= -github.com/disgoorg/snowflake/v2 v2.0.3/go.mod h1:W6r7NUA7DwfZLwr00km6G4UnZ0zcoLBRufhkFWgAc4c= -github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= -github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= -github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/nxtgo/env v0.0.0-20250905234547-f627e8d51f13 h1:hX0UuV5kUvn9CM9gpxMm+Xuhz2sU+HhHDQWMJb/XBMc= -github.com/nxtgo/env v0.0.0-20250905234547-f627e8d51f13/go.mod h1:r0zexk0/D43emHcb+mMAoICHwZj1DYd887q8Z1xidpA= -github.com/nxtgo/gce v0.0.0-20250910001932-ff8e22b0e630 h1:q6YDsr4P1r0iViA9p04SmBNVK2+wP6m6dLZsKXhPhDs= -github.com/nxtgo/gce v0.0.0-20250910001932-ff8e22b0e630/go.mod h1:Lo1Rn6XM9r74u2JPtznKRojJuvZLd5e8V6dqUOP/yJo= -github.com/nxtgo/zlog v0.0.0-20250905224555-91d56b347e9b h1:8NuRbM5rK9hkF82EDlMFNnSVdCd1IasK4faR1bbctWo= -github.com/nxtgo/zlog v0.0.0-20250905224555-91d56b347e9b/go.mod h1:+GsCeLJZWqFJYu0QnV0kFKrYQ6gX+x5yrbWeEY8DkeY= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sasha-s/go-csync v0.0.0-20240107134140-fcbab37b09ad h1:qIQkSlF5vAUHxEmTbaqt1hkJ/t6skqEGYiMag343ucI= -github.com/sasha-s/go-csync v0.0.0-20240107134140-fcbab37b09ad/go.mod h1:/pA7k3zsXKdjjAiUhB5CjuKib9KJGCaLvZwtxGC8U0s= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= -golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= -golang.org/x/image v0.31.0 h1:mLChjE2MV6g1S7oqbXC0/UcKijjm5fnJLUYKIYrLESA= -golang.org/x/image v0.31.0/go.mod h1:R9ec5Lcp96v9FTF+ajwaH3uGxPH4fKfHHAVbUILxghA= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/lfm/README.md b/lfm/README.md deleted file mode 100644 index 90653c2..0000000 --- a/lfm/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# lastfm/v2 - -heavily wip, this package brings breaking changes. :D - -thanks [sonjek/go-lastfm](https://github.com/sonjek/go-lastfm) for the -types. <3 diff --git a/lfm/album.go b/lfm/album.go deleted file mode 100644 index d69e89b..0000000 --- a/lfm/album.go +++ /dev/null @@ -1,36 +0,0 @@ -package lfm - -import ( - "time" - - "go.fm/lfm/types" -) - -type albumApi struct { - api *LastFMApi -} - -func (a *albumApi) GetInfo(args P) (*types.AlbumGetInfo, error) { - key := generateCacheKey("album", args) - - if cached, ok := a.api.cache.Album.Get(key); ok { - return &cached, nil - } - - var result types.AlbumGetInfo - if err := a.api.doAndDecode("album.getinfo", args, &result); err != nil { - return nil, err - } - - ttl := a.getAdaptiveTTL(args) - a.api.cache.Album.Set(key, result, ttl) - - return &result, nil -} - -func (a *albumApi) getAdaptiveTTL(args P) time.Duration { - if _, hasUser := args["username"]; hasUser { - return 6 * time.Hour - } - return 24 * time.Hour -} diff --git a/lfm/artist.go b/lfm/artist.go deleted file mode 100644 index 1ee0194..0000000 --- a/lfm/artist.go +++ /dev/null @@ -1,36 +0,0 @@ -package lfm - -import ( - "time" - - "go.fm/lfm/types" -) - -type artistApi struct { - api *LastFMApi -} - -func (a *artistApi) GetInfo(args P) (*types.ArtistGetInfo, error) { - key := generateCacheKey("artist", args) - - if cached, ok := a.api.cache.Artist.Get(key); ok { - return &cached, nil - } - - var result types.ArtistGetInfo - if err := a.api.doAndDecode("artist.getinfo", args, &result); err != nil { - return nil, err - } - - ttl := a.getAdaptiveTTL(args) - a.api.cache.Artist.Set(key, result, ttl) - - return &result, nil -} - -func (ar *artistApi) getAdaptiveTTL(args P) time.Duration { - if _, hasUser := args["username"]; hasUser { - return 6 * time.Hour - } - return 24 * time.Hour -} diff --git a/lfm/error.go b/lfm/error.go deleted file mode 100644 index ecb0109..0000000 --- a/lfm/error.go +++ /dev/null @@ -1,21 +0,0 @@ -package lfm - -import "encoding/xml" - -type Envelope struct { - XMLName xml.Name `xml:"lfm"` - Status string `xml:"status,attr"` - Inner []byte `xml:",innerxml"` -} - -type ApiError struct { - Code int `xml:"code,attr"` - Message string `xml:",chardata"` -} - -type LastFMError struct { - Code int - Message string - Where string - Caller string -} diff --git a/lfm/lfm.go b/lfm/lfm.go deleted file mode 100644 index f42bcbb..0000000 --- a/lfm/lfm.go +++ /dev/null @@ -1,151 +0,0 @@ -package lfm - -import ( - "context" - "crypto/sha256" - "encoding/xml" - "errors" - "fmt" - "io" - "net/http" - "net/url" - "sort" - "strings" - "time" - - "go.fm/cache" -) - -const ( - lastFMBaseURL = "https://ws.audioscrobbler.com/2.0/" -) - -type P map[string]any - -type lastFMParams struct { - apikey string - useragent string -} - -type LastFMApi struct { - params *lastFMParams - client *http.Client - apiKey string - cache *cache.Cache - - User *userApi - Album *albumApi - Artist *artistApi - Track *trackApi -} - -var defaultRateLimiter = time.Tick(100 * time.Millisecond) - -func New(key string, c *cache.Cache) *LastFMApi { - params := lastFMParams{ - apikey: key, - useragent: "go.fm/0.0.1 (discord bot; https://github.com/nxtgo/go.fm; contact: yehorovye@disroot.org)", - } - - api := &LastFMApi{ - params: ¶ms, - client: &http.Client{ - Timeout: 10 * time.Second, - Transport: &http.Transport{ - MaxIdleConns: 100, - MaxIdleConnsPerHost: 50, - }, - }, - apiKey: key, - cache: c, - } - - api.User = &userApi{api: api} - api.Album = &albumApi{api: api} - api.Artist = &artistApi{api: api} - api.Track = &trackApi{api: api} - - return api -} - -func (c *LastFMApi) baseRequest(method string, params P) (*http.Response, error) { - <-defaultRateLimiter - - values := url.Values{} - values.Set("api_key", c.apiKey) - values.Set("method", method) - for k, v := range params { - values.Set(k, fmt.Sprintf("%v", v)) - } - - u := lastFMBaseURL + "?" + values.Encode() - - req, err := http.NewRequestWithContext(context.Background(), "GET", u, nil) - if err != nil { - return nil, err - } - - req.Header.Set("User-Agent", c.params.useragent) - req.Header.Set("Accept", "application/xml") - - return c.client.Do(req) -} - -func (c *LastFMApi) doAndDecode(method string, params P, result any) error { - resp, err := c.baseRequest(method, params) - if err != nil { - return err - } - defer resp.Body.Close() - - return decodeResponse(resp.Body, result) -} - -func decodeResponse(r io.Reader, result any) (err error) { - var base Envelope - body, err := io.ReadAll(r) - if err != nil { - return err - } - - if err = xml.Unmarshal(body, &base); err != nil { - return err - } - - if base.Status == "failed" { - var errorDetail ApiError - if err = xml.Unmarshal(base.Inner, &errorDetail); err != nil { - return err - } - return errors.New(errorDetail.Message) - } - - if result != nil { - return xml.Unmarshal(base.Inner, result) - } - - return nil -} - -func generateCacheKey(prefix string, args P) string { - keys := make([]string, 0, len(args)) - for k := range args { - keys = append(keys, k) - } - sort.Strings(keys) - - parts := []string{prefix} - for _, k := range keys { - if v, ok := args[k]; ok { - parts = append(parts, fmt.Sprintf("%s:%v", k, v)) - } - } - - keyString := strings.Join(parts, "|") - if len(keyString) > 100 { - hash := sha256.Sum256([]byte(keyString)) - return fmt.Sprintf("%s|%x", prefix, hash[:8]) - } - - return keyString -} diff --git a/lfm/track.go b/lfm/track.go deleted file mode 100644 index 81cda3f..0000000 --- a/lfm/track.go +++ /dev/null @@ -1,36 +0,0 @@ -package lfm - -import ( - "time" - - "go.fm/lfm/types" -) - -type trackApi struct { - api *LastFMApi -} - -func (t *trackApi) GetInfo(args P) (*types.TrackGetInfo, error) { - key := generateCacheKey("track", args) - - if cached, ok := t.api.cache.Track.Get(key); ok { - return &cached, nil - } - - var result types.TrackGetInfo - if err := t.api.doAndDecode("track.getinfo", args, &result); err != nil { - return nil, err - } - - ttl := t.getAdaptiveTTL(args) - t.api.cache.Track.Set(key, result, ttl) - - return &result, nil -} - -func (t *trackApi) getAdaptiveTTL(args P) time.Duration { - if _, hasUser := args["username"]; hasUser { - return 4 * time.Hour - } - return 12 * time.Hour -} diff --git a/lfm/types/album.go b/lfm/types/album.go deleted file mode 100644 index 4f2c219..0000000 --- a/lfm/types/album.go +++ /dev/null @@ -1,40 +0,0 @@ -package types - -// album.getInfo -type AlbumGetInfo struct { - Name string `xml:"name"` - Artist string `xml:"artist"` - Mbid string `xml:"mbid"` - Url string `xml:"url"` - Images []struct { - Size string `xml:"size,attr"` - Url string `xml:",chardata"` - } `xml:"image"` - Listeners int `xml:"listeners"` - PlayCount int `xml:"playcount"` - UserPlayCount int `xml:"userplaycount"` - Tracks []struct { - Rank int `xml:"rank,attr"` - Name string `xml:"name"` - Url string `xml:"url"` - Duration string `xml:"duration"` - Streamable struct { - Fulltrack string `xml:"fulltrack,attr"` - Value string `xml:",chardata"` - } `xml:"streamable"` - Artist struct { - Name string `xml:"name"` - Mbid string `xml:"mbid"` - Url string `xml:"url"` - } `xml:"artist"` - } `xml:"tracks>track"` - Tags []struct { - Name string `xml:"name"` - Url string `xml:"url"` - } `xml:"tags>tag"` - Wiki struct { - Published string `xml:"published"` - Summary string `xml:"summary"` - Content string `xml:"content"` - } `xml:"wiki"` -} diff --git a/lfm/types/artist.go b/lfm/types/artist.go deleted file mode 100644 index a75e764..0000000 --- a/lfm/types/artist.go +++ /dev/null @@ -1,46 +0,0 @@ -package types - -// artist.getInfo -type ArtistGetInfo struct { - Name string `xml:"name"` - MBID string `xml:"mbid"` - URL string `xml:"url"` - Images []struct { - Size string `xml:"size,attr"` - Url string `xml:",chardata"` - } `xml:"image"` - Streamable string `xml:"streamable"` - OnTour string `xml:"ontour"` - Stats struct { - Listeners int `xml:"listeners"` - PlayCount int `xml:"playcount"` - UserPlayCount int `xml:"userplaycount"` - } `xml:"stats"` - Similar struct { - Artists []struct { - Name string `xml:"name"` - Url string `xml:"url"` - Images []struct { - Size string `xml:"size,attr"` - Url string `xml:",chardata"` - } `xml:"image"` - } `xml:"artist"` - } `xml:"similar"` - Tags struct { - Tags []struct { - Name string `xml:"name"` - URL string `xml:"url"` - } `xml:"tag"` - } `xml:"tags"` - Bio struct { - Links struct { - Link struct { - Rel string `xml:"rel,attr"` - Href string `xml:"href,attr"` - } `xml:"link"` - } `xml:"links"` - Published string `xml:"published"` - Summary string `xml:"summary"` - Content string `xml:"content"` - } `xml:"bio"` -} diff --git a/lfm/types/track.go b/lfm/types/track.go deleted file mode 100644 index c0e5d96..0000000 --- a/lfm/types/track.go +++ /dev/null @@ -1,37 +0,0 @@ -package types - -// track.getInfo -type TrackGetInfo struct { - Name string `xml:"name"` - Mbid string `xml:"mbid"` - Url string `xml:"url"` - Duration int `xml:"duration"` - Streamable struct { - Fulltrack string `xml:"fulltrack,attr"` - Value string `xml:",chardata"` - } `xml:"streamable"` - Listeners int `xml:"listeners"` - PlayCount int `xml:"playcount"` - UserPlayCount int `xml:"userplaycount"` - UserLoved int `xml:"userloved"` - Artist struct { - Name string `xml:"name"` - Mbid string `xml:"mbid"` - Url string `xml:"url"` - } `xml:"artist"` - Album struct { - Artist string `xml:"artist"` - Title string `xml:"title"` - Url string `xml:"url"` - Images []struct { - Size string `xml:"size,attr"` - Url string `xml:",chardata"` - } `xml:"image"` - } `xml:"album"` - TopTags struct { - Tags []struct { - Name string `xml:"name"` - Url string `xml:"url"` - } `xml:"tag"` - } `xml:"toptags"` -} diff --git a/lfm/types/user.go b/lfm/types/user.go deleted file mode 100644 index 76aa9d4..0000000 --- a/lfm/types/user.go +++ /dev/null @@ -1,184 +0,0 @@ -package types - -// user.getArtistTracks -type UserGetArtistTracks struct { - User string `xml:"user,attr"` - Artist string `xml:"artist,attr"` - Items string `xml:"items,attr"` - Total int `xml:"total,attr"` - Page int `xml:"page,attr"` - PerPage int `xml:"perPage,attr"` - TotalPages int `xml:"totalPages,attr"` - Tracks []struct { - Artist struct { - Mbid string `xml:"mbid,attr"` - Name string `xml:",chardata"` - } `xml:"artist"` - Name string `xml:"name"` - Streamable struct { - FullTrack string `xml:"fulltrack,attr"` - Streamable string `xml:",chardata"` - } `xml:"streamable"` - Mbid string `xml:"mbid"` - Album struct { - Mbid string `xml:"mbid,attr"` - Name string `xml:",chardata"` - } `xml:"album"` - Url string `xml:"url"` - Images []struct { - Size string `xml:"size,attr"` - Url string `xml:",chardata"` - } `xml:"image"` - Date struct { - Uts string `xml:"uts,attr"` - Str string `xml:",chardata"` - } `xml:"date"` - } `xml:"track"` -} - -// user.getInfo -type UserGetInfo struct { - Name string `xml:"name"` - RealName string `xml:"realname"` - Url string `xml:"url"` - Country string `xml:"country"` - Age string `xml:"age"` - Gender string `xml:"gender"` - Subscriber string `xml:"subscriber"` - PlayCount string `xml:"playcount"` - Playlists string `xml:"playlists"` - Bootstrap string `xml:"bootstrap"` - Registered struct { - Unixtime string `xml:"unixtime,attr"` - Time string `xml:",chardata"` - } `xml:"registered"` - Type string `xml:"type"` - Images []struct { - Size string `xml:"size,attr"` - Url string `xml:",chardata"` - } `xml:"image"` - ArtistCount string `xml:"artist_count"` - AlbumCount string `xml:"album_count"` - TrackCount string `xml:"track_count"` -} - -// user.getRecentTracks -type UserGetRecentTracks struct { - User string `xml:"user,attr"` - Total int `xml:"total,attr"` - Page int `xml:"page,attr"` - PerPage int `xml:"perPage,attr"` - TotalPages int `xml:"totalPages,attr"` - Tracks []struct { - NowPlaying string `xml:"nowplaying,attr,omitempty"` - Artist struct { - Name string `xml:",chardata"` - Mbid string `xml:"mbid,attr"` - } `xml:"artist"` - Name string `xml:"name"` - Streamable string `xml:"streamable"` - Mbid string `xml:"mbid"` - Album struct { - Name string `xml:",chardata"` - Mbid string `xml:"mbid,attr"` - } `xml:"album"` - Url string `xml:"url"` - Images []struct { - Size string `xml:"size,attr"` - Url string `xml:",chardata"` - } `xml:"image"` - Date struct { - Uts string `xml:"uts,attr"` - Date string `xml:",chardata"` - } `xml:"date"` - } `xml:"track"` -} - -// user.getTopAlbums -type UserGetTopAlbums struct { - User string `xml:"user,attr"` - Type string `xml:"type,attr"` - Total int `xml:"total,attr"` - Page int `xml:"page,attr"` - PerPage int `xml:"perPage,attr"` - TotalPages int `xml:"totalPages,attr"` - Albums []struct { - Rank string `xml:"rank,attr"` - Name string `xml:"name"` - PlayCount string `xml:"playcount"` - Mbid string `xml:"mbid"` - Url string `xml:"url"` - Artist struct { - Name string `xml:"name"` - Mbid string `xml:"mbid"` - Url string `xml:"url"` - } `xml:"artist"` - Images []struct { - Size string `xml:"size,attr"` - Url string `xml:",chardata"` - } `xml:"image"` - } `xml:"album"` -} - -// user.getTopArtists -type UserGetTopArtists struct { - User string `xml:"user,attr"` - Type string `xml:"type,attr"` - Total int `xml:"total,attr"` - Page int `xml:"page,attr"` - PerPage int `xml:"perPage,attr"` - TotalPages int `xml:"totalPages,attr"` - Artists []struct { - Rank string `xml:"rank,attr"` - Name string `xml:"name"` - PlayCount string `xml:"playcount"` - Mbid string `xml:"mbid"` - Url string `xml:"url"` - Streamable string `xml:"streamable"` - Images []struct { - Size string `xml:"size,attr"` - Url string `xml:",chardata"` - } `xml:"image"` - } `xml:"artist"` -} - -// user.getTopTags -type UserGetTopTags struct { - User string `xml:"user,attr"` - Tags []struct { - Name string `xml:"name"` - Count string `xml:"count"` - Url string `xml:"url"` - } `xml:"tag"` -} - -// user.getTopTracks -type UserGetTopTracks struct { - User string `xml:"user,attr"` - Type string `xml:"type,attr"` - Total int `xml:"total,attr"` - Page int `xml:"page,attr"` - PerPage int `xml:"perPage,attr"` - TotalPages int `xml:"totalPages,attr"` - Tracks []struct { - Rank string `xml:"rank,attr"` - Name string `xml:"name"` - Duration string `xml:"duration"` - PlayCount string `xml:"playcount"` - Mbid string `xml:"mbid"` - Url string `xml:"url"` - Streamable struct { - FullTrack string `xml:"fulltrack,attr"` - Streamable string `xml:",chardata"` - } `xml:"streamable"` - Artist struct { - Name string `xml:"name"` - Mbid string `xml:"mbid"` - Url string `xml:"url"` - } `xml:"artist"` - Images []struct { - Size string `xml:"size,attr"` - Url string `xml:",chardata"` - } `xml:"image"` - } `xml:"track"` -} diff --git a/lfm/user.go b/lfm/user.go deleted file mode 100644 index 4591bef..0000000 --- a/lfm/user.go +++ /dev/null @@ -1,249 +0,0 @@ -package lfm - -import ( - "context" - "fmt" - "time" - - "github.com/disgoorg/disgo/events" - "github.com/disgoorg/snowflake/v2" - "go.fm/db" - "go.fm/lfm/types" -) - -type userApi struct { - api *LastFMApi -} - -func (u *userApi) GetInfo(args P) (*types.UserGetInfo, error) { - username := args["user"].(string) - - if user, ok := u.api.cache.User.Get(username); ok { - return &user, nil - } - - var result types.UserGetInfo - if err := u.api.doAndDecode("user.getinfo", args, &result); err != nil { - return nil, err - } - - u.api.cache.User.Set(username, result, 0) - return &result, nil -} - -func (u *userApi) GetRecentTracks(args P) (*types.UserGetRecentTracks, error) { - var result types.UserGetRecentTracks - if err := u.api.doAndDecode("user.getrecenttracks", args, &result); err != nil { - return nil, err - } - return &result, nil -} - -func (u *userApi) GetTopArtists(args P) (*types.UserGetTopArtists, error) { - key := generateCacheKey("topartists", args) - - if artists, ok := u.api.cache.TopArtists.Get(key); ok { - return &artists, nil - } - - var result types.UserGetTopArtists - if err := u.api.doAndDecode("user.gettopartists", args, &result); err != nil { - return nil, err - } - - ttl := u.getTopDataTTL(args) - u.api.cache.TopArtists.Set(key, result, ttl) - - return &result, nil -} - -func (u *userApi) GetTopAlbums(args P) (*types.UserGetTopAlbums, error) { - key := generateCacheKey("topalbums", args) - - if albums, ok := u.api.cache.TopAlbums.Get(key); ok { - return &albums, nil - } - - var result types.UserGetTopAlbums - if err := u.api.doAndDecode("user.gettopalbums", args, &result); err != nil { - return nil, err - } - - ttl := u.getTopDataTTL(args) - u.api.cache.TopAlbums.Set(key, result, ttl) - - return &result, nil -} - -func (u *userApi) GetTopTracks(args P) (*types.UserGetTopTracks, error) { - key := generateCacheKey("toptracks", args) - - if tracks, ok := u.api.cache.TopTracks.Get(key); ok { - return &tracks, nil - } - - var result types.UserGetTopTracks - if err := u.api.doAndDecode("user.gettoptracks", args, &result); err != nil { - return nil, err - } - - ttl := u.getTopDataTTL(args) - u.api.cache.TopTracks.Set(key, result, ttl) - - return &result, nil -} - -func (u *userApi) GetPlays(args P) (int, error) { - key := generateCacheKey("plays", args) - if cached, ok := u.api.cache.Plays.Get(key); ok { - return cached, nil - } - - username := args["user"].(string) - queryType := args["type"].(string) - queryName := args["name"].(string) - - fetchers := map[string]func() (int, time.Duration, error){ - "artist": func() (int, time.Duration, error) { - a, err := u.api.Artist.GetInfo(P{"artist": queryName, "username": username}) - if err != nil { - return 0, 0, err - } - return a.Stats.UserPlayCount, 10 * time.Minute, nil - }, - "album": func() (int, time.Duration, error) { - a, err := u.api.Album.GetInfo(P{"artist": args["artist"], "album": queryName, "username": username}) - if err != nil { - return 0, 0, err - } - return a.UserPlayCount, 15 * time.Minute, nil - }, - "track": func() (int, time.Duration, error) { - t, err := u.api.Track.GetInfo(P{"artist": args["artist"], "track": queryName, "username": username}) - if err != nil { - return 0, 0, err - } - return t.UserPlayCount, 5 * time.Minute, nil - }, - } - - fetch, ok := fetchers[queryType] - if !ok { - return 0, fmt.Errorf("unknown query type: %s", queryType) - } - - count, ttl, err := fetch() - if err != nil { - return 0, err - } - - u.api.cache.Plays.Set(key, count, ttl) - return count, nil -} - -func (u *userApi) GetUsersByGuild( - ctx context.Context, - e *events.ApplicationCommandInteractionCreate, - q *db.Queries, -) (map[snowflake.ID]string, error) { - guildID := *e.GuildID() - - if cached, ok := u.api.cache.Members.Get(guildID); ok { - return cached, nil - } - - registered, err := q.ListUsers(ctx) - if err != nil { - return nil, err - } - - memberIDs := make(map[snowflake.ID]struct{}) - cached := e.Client().Caches.Members(guildID) - for m := range cached { - memberIDs[m.User.ID] = struct{}{} - } - - users := make(map[snowflake.ID]string) - for _, u := range registered { - id := snowflake.MustParse(u.DiscordID) - if _, ok := memberIDs[id]; ok { - users[id] = u.LastfmUsername - } - } - - u.api.cache.Members.Set(guildID, users, 10*time.Minute) - - return users, nil -} - -func (u *userApi) GetInfoWithPrefetch(args P) (*types.UserGetInfo, error) { - username := args["user"].(string) - - userInfo, err := u.GetInfo(args) - if err != nil { - return nil, err - } - - u.PrefetchUserData(username) - - return userInfo, nil -} - -func (u *userApi) PrefetchUserData(username string) { - if _, ok := u.api.cache.TopArtists.Get(generateCacheKey("topartists", P{"user": username})); !ok { - go u.GetTopArtists(P{"user": username, "limit": 10}) - } - - if _, ok := u.api.cache.TopAlbums.Get(generateCacheKey("topalbums", P{"user": username})); !ok { - go u.GetTopAlbums(P{"user": username, "limit": 10}) - } - - if _, ok := u.api.cache.TopTracks.Get(generateCacheKey("toptracks", P{"user": username})); !ok { - go u.GetTopTracks(P{"user": username, "limit": 10}) - } -} - -func (u *userApi) InvalidateUserCache(username string) { - periods := []string{"7day", "1month", "3month", "6month", "12month", "overall"} - - for _, period := range periods { - key := generateCacheKey("topartists", P{"user": username, "period": period}) - u.api.cache.TopArtists.Delete(key) - - key = generateCacheKey("topalbums", P{"user": username, "period": period}) - u.api.cache.TopAlbums.Delete(key) - - key = generateCacheKey("toptracks", P{"user": username, "period": period}) - u.api.cache.TopTracks.Delete(key) - } - - defaultKeys := []P{ - {"user": username}, - {"user": username, "limit": 10}, - {"user": username, "limit": 50}, - } - - for _, args := range defaultKeys { - u.api.cache.TopArtists.Delete(generateCacheKey("topartists", args)) - u.api.cache.TopAlbums.Delete(generateCacheKey("topalbums", args)) - u.api.cache.TopTracks.Delete(generateCacheKey("toptracks", args)) - } - - u.api.cache.User.Delete(username) -} - -func (u *userApi) getTopDataTTL(args P) time.Duration { - if period, ok := args["period"].(string); ok { - switch period { - case "7day": - return 30 * time.Minute - case "1month": - return 2 * time.Hour - case "3month", "6month": - return 6 * time.Hour - case "12month", "overall": - return 12 * time.Hour - } - } - return 15 * time.Minute -} diff --git a/logger/logger.go b/logger/logger.go deleted file mode 100644 index f20230d..0000000 --- a/logger/logger.go +++ /dev/null @@ -1,23 +0,0 @@ -package logger - -import ( - "os" - "time" - - "github.com/nxtgo/zlog" -) - -var Log *zlog.Logger - -func init() { - Log = zlog.New() - Log.SetOutput(os.Stdout) - Log.SetTimeFormat(time.Kitchen) - Log.EnableColors(true) - Log.ShowCaller(true) - if os.Getenv("MODE") == "" { - Log.SetLevel(zlog.LevelDebug) - } else { - Log.SetLevel(zlog.LevelInfo) - } -} diff --git a/pkg/bild/LICENSE b/pkg/bild/LICENSE deleted file mode 100644 index ad22cb9..0000000 --- a/pkg/bild/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016-2024 Anthony Simon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/pkg/bild/README.md b/pkg/bild/README.md deleted file mode 100644 index d3f663d..0000000 --- a/pkg/bild/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# pkg/bild - -this directory contains code adapted from [anthonynsimon/bild](https://github.com/anthonynsimon/bild), -which is licensed under the mit license. - -we use parts of the original codebase and, in some cases, -modify or simplify it to better fit our needs. -any changes from the upstream project are made with clarity -and maintainability in mind. - -selective changes have been made (naming, structure, and behavior) -to align with our project requirements. diff --git a/pkg/bild/blend/blend.go b/pkg/bild/blend/blend.go deleted file mode 100644 index 396167e..0000000 --- a/pkg/bild/blend/blend.go +++ /dev/null @@ -1,380 +0,0 @@ -package blend - -import ( - "image" - "math" - - "go.fm/pkg/bild/clone" - "go.fm/pkg/bild/fcolor" - "go.fm/pkg/bild/math/f64" - "go.fm/pkg/bild/parallel" -) - -// Normal combines the foreground and background images by placing the foreground over the -// background using alpha compositing. The resulting image is then returned. -func Normal(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - return alphaComp(c0, c1) - }) - - return dst -} - -// Add combines the foreground and background images by adding their values and -// returns the resulting image. -func Add(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := c0.R + c1.R - g := c0.G + c1.G - b := c0.B + c1.B - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Multiply combines the foreground and background images by multiplying their -// normalized values and returns the resulting image. -func Multiply(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := c0.R * c1.R - g := c0.G * c1.G - b := c0.B * c1.B - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Overlay combines the foreground and background images by using Multiply when channel values < 0.5 -// or using Screen otherwise and returns the resulting image. -func Overlay(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - var r, g, b float64 - if c0.R > 0.5 { - r = 1 - (1-2*(c0.R-0.5))*(1-c1.R) - } else { - r = 2 * c0.R * c1.R - } - if c0.G > 0.5 { - g = 1 - (1-2*(c0.G-0.5))*(1-c1.G) - } else { - g = 2 * c0.G * c1.G - } - if c0.B > 0.5 { - b = 1 - (1-2*(c0.B-0.5))*(1-c1.B) - } else { - b = 2 * c0.B * c1.B - } - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// SoftLight combines the foreground and background images by using Pegtop's Soft Light formula and -// returns the resulting image. -func SoftLight(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := (1-2*c1.R)*c0.R*c0.R + 2*c0.R*c1.R - g := (1-2*c1.G)*c0.G*c0.G + 2*c0.G*c1.G - b := (1-2*c1.B)*c0.B*c0.B + 2*c0.B*c1.B - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - return dst -} - -// Screen combines the foreground and background images by inverting, multiplying and inverting the output. -// The result is a brighter image which is then returned. -func Screen(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := 1 - (1-c0.R)*(1-c1.R) - g := 1 - (1-c0.G)*(1-c1.G) - b := 1 - (1-c0.B)*(1-c1.B) - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Difference calculates the absolute difference between the foreground and background images and -// returns the resulting image. -func Difference(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := math.Abs(c0.R - c1.R) - g := math.Abs(c0.G - c1.G) - b := math.Abs(c0.B - c1.B) - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Divide combines the foreground and background images by diving the values from the background -// by the foreground and returns the resulting image. -func Divide(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - var r, g, b float64 - if c1.R == 0 { - r = 1 - } else { - r = c0.R / c1.R - } - if c1.G == 0 { - g = 1 - } else { - g = c0.G / c1.G - } - if c1.B == 0 { - b = 1 - } else { - b = c0.B / c1.B - } - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// ColorBurn combines the foreground and background images by dividing the inverted -// background by the foreground image and then inverting the result which is then returned. -func ColorBurn(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - var r, g, b float64 - if c1.R == 0 { - r = 0 - } else { - r = 1 - (1-c0.R)/c1.R - } - if c1.G == 0 { - g = 0 - } else { - g = 1 - (1-c0.G)/c1.G - } - if c1.B == 0 { - b = 0 - } else { - b = 1 - (1-c0.B)/c1.B - } - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Exclusion combines the foreground and background images applying the Exclusion blend mode and -// returns the resulting image. -func Exclusion(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := 0.5 - 2*(c0.R-0.5)*(c1.R-0.5) - g := 0.5 - 2*(c0.G-0.5)*(c1.G-0.5) - b := 0.5 - 2*(c0.B-0.5)*(c1.B-0.5) - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst - -} - -// ColorDodge combines the foreground and background images by dividing background by the -// inverted foreground image and returns the result. -func ColorDodge(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - var r, g, b float64 - if c1.R == 1 { - r = 1 - } else { - r = c0.R / (1 - c1.R) - } - if c1.G == 1 { - g = 1 - } else { - g = c0.G / (1 - c1.G) - } - if c1.B == 1 { - b = 1 - } else { - b = c0.B / (1 - c1.B) - } - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// LinearBurn combines the foreground and background images by adding them and -// then subtracting 255 (1.0 in normalized scale). The resulting image is then returned. -func LinearBurn(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := c0.R + c1.R - 1 - g := c0.G + c1.G - 1 - b := c0.B + c1.B - 1 - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// LinearLight combines the foreground and background images by a mix of a Linear Dodge and -// Linear Burn operation. The resulting image is then returned. -func LinearLight(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - var r, g, b float64 - if c1.R > 0.5 { - r = c0.R + 2*c1.R - 0.5 - } else { - r = c0.R + 2*c1.R - 1 - } - if c1.G > 0.5 { - g = c0.G + 2*c1.G - 0.5 - } else { - g = c0.G + 2*c1.G - 1 - } - if c1.B > 0.5 { - b = c0.B + 2*c1.B - 0.5 - } else { - b = c0.B + 2*c1.B - 1 - } - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Subtract combines the foreground and background images by Subtracting the background from the -// foreground. The result is then returned. -func Subtract(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := c1.R - c0.R - g := c1.G - c0.G - b := c1.B - c0.B - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Opacity returns an image which blends the two input images by the percentage provided. -// Percent must be of range 0 <= percent <= 1.0 -func Opacity(bg image.Image, fg image.Image, percent float64) *image.RGBA { - percent = f64.Clamp(percent, 0, 1.0) - - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := c1.R*percent + (1-percent)*c0.R - g := c1.G*percent + (1-percent)*c0.G - b := c1.B*percent + (1-percent)*c0.B - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Darken combines the foreground and background images by picking the darkest value per channel -// for each pixel. The result is then returned. -func Darken(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := math.Min(c0.R, c1.R) - g := math.Min(c0.G, c1.G) - b := math.Min(c0.B, c1.B) - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Lighten combines the foreground and background images by picking the brightest value per channel -// for each pixel. The result is then returned. -func Lighten(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := math.Max(c0.R, c1.R) - g := math.Max(c0.G, c1.G) - b := math.Max(c0.B, c1.B) - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Blend two images together by applying the provided function for each pixel. -// If images differ in size, the minimum width and height will be picked from each one -// when creating the resulting image. -func Blend(bg image.Image, fg image.Image, fn func(fcolor.RGBAF64, fcolor.RGBAF64) fcolor.RGBAF64) *image.RGBA { - bgBounds := bg.Bounds() - fgBounds := fg.Bounds() - - var w, h int - w = min(bgBounds.Dx(), fgBounds.Dx()) - h = min(bgBounds.Dy(), fgBounds.Dy()) - - bgSrc := clone.AsShallowRGBA(bg) - fgSrc := clone.AsShallowRGBA(fg) - dst := image.NewRGBA(image.Rect(0, 0, w, h)) - - parallel.Line(h, func(start, end int) { - for y := start; y < end; y++ { - for x := 0; x < w; x++ { - bgPos := y*bgSrc.Stride + x*4 - fgPos := y*fgSrc.Stride + x*4 - result := fn( - fcolor.NewRGBAF64(bgSrc.Pix[bgPos+0], bgSrc.Pix[bgPos+1], bgSrc.Pix[bgPos+2], bgSrc.Pix[bgPos+3]), - fcolor.NewRGBAF64(fgSrc.Pix[fgPos+0], fgSrc.Pix[fgPos+1], fgSrc.Pix[fgPos+2], fgSrc.Pix[fgPos+3])) - - result.Clamp() - dstPos := y*dst.Stride + x*4 - dst.Pix[dstPos+0] = uint8(result.R * 255) - dst.Pix[dstPos+1] = uint8(result.G * 255) - dst.Pix[dstPos+2] = uint8(result.B * 255) - dst.Pix[dstPos+3] = uint8(result.A * 255) - } - - } - }) - - return dst -} - -// alphaComp returns a new color after compositing the two colors -// based on the foreground's alpha channel. -func alphaComp(bg, fg fcolor.RGBAF64) fcolor.RGBAF64 { - fg.Clamp() - fga := fg.A - - r := (fg.R * fga / 1) + ((1 - fga) * bg.R / 1) - g := (fg.G * fga / 1) + ((1 - fga) * bg.G / 1) - b := (fg.B * fga / 1) + ((1 - fga) * bg.B / 1) - a := bg.A + fga - - return fcolor.RGBAF64{R: r, G: g, B: b, A: a} -} diff --git a/pkg/bild/blur/blur.go b/pkg/bild/blur/blur.go deleted file mode 100644 index 0e8c883..0000000 --- a/pkg/bild/blur/blur.go +++ /dev/null @@ -1,52 +0,0 @@ -/*Package blur provides image blurring functions.*/ -package blur - -import ( - "image" - "math" - - "go.fm/pkg/bild/clone" - "go.fm/pkg/bild/convolution" -) - -// Box returns a blurred (average) version of the image. -// Radius must be larger than 0. -func Box(src image.Image, radius float64) *image.RGBA { - if radius <= 0 { - return clone.AsRGBA(src) - } - - length := int(math.Ceil(2*radius + 1)) - k := convolution.NewKernel(length, length) - - for x := range length { - for y := range length { - k.Matrix[y*length+x] = 1 - } - } - - return convolution.Convolve(src, k.Normalized(), &convolution.Options{Bias: 0, Wrap: false, KeepAlpha: false}) -} - -// Gaussian returns a smoothly blurred version of the image using -// a Gaussian function. Radius must be larger than 0. -func Gaussian(src image.Image, radius float64) *image.RGBA { - if radius <= 0 { - return clone.AsRGBA(src) - } - - // Create the 1-d gaussian kernel - length := int(math.Ceil(2*radius + 1)) - k := convolution.NewKernel(length, 1) - for i, x := 0, -radius; i < length; i, x = i+1, x+1 { - k.Matrix[i] = math.Exp(-(x * x / 4 / radius)) - } - normK := k.Normalized() - - // Perform separable convolution - options := convolution.Options{Bias: 0, Wrap: false, KeepAlpha: false} - result := convolution.Convolve(src, normK, &options) - result = convolution.Convolve(result, normK.Transposed(), &options) - - return result -} diff --git a/pkg/bild/clone/clone.go b/pkg/bild/clone/clone.go deleted file mode 100644 index 563fdfd..0000000 --- a/pkg/bild/clone/clone.go +++ /dev/null @@ -1,156 +0,0 @@ -package clone - -import ( - "image" - "image/draw" - - "go.fm/pkg/bild/parallel" -) - -// PadMethod is the method used to fill padded pixels. -type PadMethod uint8 - -const ( - // NoFill leaves the padded pixels empty. - NoFill = iota - // EdgeExtend extends the closest edge pixel. - EdgeExtend - // EdgeWrap wraps around the pixels of an image. - EdgeWrap -) - -// AsRGBA returns an RGBA copy of the supplied image. -func AsRGBA(src image.Image) *image.RGBA { - bounds := src.Bounds() - img := image.NewRGBA(bounds) - draw.Draw(img, bounds, src, bounds.Min, draw.Src) - return img -} - -// AsShallowRGBA tries to cast to image.RGBA to get reference. Otherwise makes a copy -func AsShallowRGBA(src image.Image) *image.RGBA { - if rgba, ok := src.(*image.RGBA); ok { - return rgba - } - return AsRGBA(src) -} - -// Pad returns an RGBA copy of the src image parameter with its edges padded -// using the supplied PadMethod. -// Parameter padX and padY correspond to the amount of padding to be applied -// on each side. -// Parameter m is the PadMethod to fill the new pixels. -// -// Usage example: -// -// result := Pad(img, 5,5, EdgeExtend) -func Pad(src image.Image, padX, padY int, m PadMethod) *image.RGBA { - var result *image.RGBA - - switch m { - case EdgeExtend: - result = extend(src, padX, padY) - case NoFill: - result = noFill(src, padX, padY) - case EdgeWrap: - result = wrap(src, padX, padY) - default: - result = extend(src, padX, padY) - } - - return result -} - -func noFill(img image.Image, padX, padY int) *image.RGBA { - srcBounds := img.Bounds() - paddedW, paddedH := srcBounds.Dx()+2*padX, srcBounds.Dy()+2*padY - newBounds := image.Rect(0, 0, paddedW, paddedH) - fillBounds := image.Rect(padX, padY, padX+srcBounds.Dx(), padY+srcBounds.Dy()) - - dst := image.NewRGBA(newBounds) - draw.Draw(dst, fillBounds, img, srcBounds.Min, draw.Src) - - return dst -} - -func extend(img image.Image, padX, padY int) *image.RGBA { - dst := noFill(img, padX, padY) - paddedW, paddedH := dst.Bounds().Dx(), dst.Bounds().Dy() - - parallel.Line(paddedH, func(start, end int) { - for y := start; y < end; y++ { - iy := y - if iy < padY { - iy = padY - } else if iy >= paddedH-padY { - iy = paddedH - padY - 1 - } - - for x := 0; x < paddedW; x++ { - ix := x - if ix < padX { - ix = padX - } else if x >= paddedW-padX { - ix = paddedW - padX - 1 - } else if iy == y { - // This only enters if we are not in a y-padded area or - // x-padded area, so nothing to extend here. - // So simply jump to the next padded-x index. - x = paddedW - padX - 1 - continue - } - - dstPos := y*dst.Stride + x*4 - edgePos := iy*dst.Stride + ix*4 - - dst.Pix[dstPos+0] = dst.Pix[edgePos+0] - dst.Pix[dstPos+1] = dst.Pix[edgePos+1] - dst.Pix[dstPos+2] = dst.Pix[edgePos+2] - dst.Pix[dstPos+3] = dst.Pix[edgePos+3] - } - } - }) - - return dst -} - -func wrap(img image.Image, padX, padY int) *image.RGBA { - dst := noFill(img, padX, padY) - paddedW, paddedH := dst.Bounds().Dx(), dst.Bounds().Dy() - - parallel.Line(paddedH, func(start, end int) { - for y := start; y < end; y++ { - iy := y - if iy < padY { - iy = (paddedH - padY) - ((padY - y) % (paddedH - padY*2)) - } else if iy >= paddedH-padY { - iy = padY - ((padY - y) % (paddedH - padY*2)) - } - - for x := 0; x < paddedW; x++ { - ix := x - if ix < padX { - ix = (paddedW - padX) - ((padX - x) % (paddedW - padX*2)) - } else if ix >= paddedW-padX { - ix = padX - ((padX - x) % (paddedW - padX*2)) - } else if iy == y { - // This only enters if we are not in a y-padded area or - // x-padded area, so nothing to extend here. - // So simply jump to the next padded-x index. - x = paddedW - padX - 1 - continue - } - - dstPos := y*dst.Stride + x*4 - edgePos := iy*dst.Stride + ix*4 - - dst.Pix[dstPos+0] = dst.Pix[edgePos+0] - dst.Pix[dstPos+1] = dst.Pix[edgePos+1] - dst.Pix[dstPos+2] = dst.Pix[edgePos+2] - dst.Pix[dstPos+3] = dst.Pix[edgePos+3] - } - } - }) - - return dst -} diff --git a/pkg/bild/colors/colors.go b/pkg/bild/colors/colors.go deleted file mode 100644 index 867cc28..0000000 --- a/pkg/bild/colors/colors.go +++ /dev/null @@ -1,150 +0,0 @@ -package colors - -import ( - "fmt" - "image" - _ "image/gif" - _ "image/jpeg" - _ "image/png" - "io" - "math" - "net/http" - "sync/atomic" - "time" - - "go.fm/pkg/bild/parallel" -) - -func rgbToHsl(r, g, b float64) (h, s, l float64) { - r /= 255 - g /= 255 - b /= 255 - - max := math.Max(r, math.Max(g, b)) - min := math.Min(r, math.Min(g, b)) - l = (max + min) / 2 - - if max == min { - h, s = 0, 0 - } else { - d := max - min - if l > 0.5 { - s = d / (2 - max - min) - } else { - s = d / (max + min) - } - - switch max { - case r: - h = (g - b) / d - if g < b { - h += 6 - } - case g: - h = (b-r)/d + 2 - case b: - h = (r-g)/d + 4 - } - h /= 6 - } - return -} - -func hslToRgb(h, s, l float64) (r, g, b int) { - var rF, gF, bF float64 - - if s == 0 { - rF, gF, bF = l, l, l - } else { - var hue2rgb = func(p, q, t float64) float64 { - if t < 0 { - t += 1 - } - if t > 1 { - t -= 1 - } - if t < 1.0/6 { - return p + (q-p)*6*t - } - if t < 1.0/2 { - return q - } - if t < 2.0/3 { - return p + (q-p)*(2.0/3-t)*6 - } - return p - } - - var q float64 - if l < 0.5 { - q = l * (1 + s) - } else { - q = l + s - l*s - } - p := 2*l - q - rF = hue2rgb(p, q, h+1.0/3) - gF = hue2rgb(p, q, h) - bF = hue2rgb(p, q, h-1.0/3) - } - - return int(rF * 255), int(gF * 255), int(bF * 255) -} - -func Dominant(url string) (int, error) { - client := &http.Client{ - Timeout: 10 * time.Second, - } - resp, err := client.Get(url) - if err != nil { - return 0, err - } - defer resp.Body.Close() - - limitedReader := &io.LimitedReader{R: resp.Body, N: 10 << 20} - - img, _, err := image.Decode(limitedReader) - if err != nil { - return 0, err - } - - bounds := img.Bounds() - if bounds.Dx() > 4000 || bounds.Dy() > 4000 { - return 0x00ADD8, nil - } - height := bounds.Dy() - - var rTotal, gTotal, bTotal, count uint64 - - parallel.Line(height, func(start, end int) { - var rLocal, gLocal, bLocal, cLocal uint64 - for y := start; y < end; y++ { - for x := bounds.Min.X; x < bounds.Max.X; x++ { - r, g, b, _ := img.At(x, y).RGBA() - rLocal += uint64(r >> 8) - gLocal += uint64(g >> 8) - bLocal += uint64(b >> 8) - cLocal++ - } - } - atomic.AddUint64(&rTotal, rLocal) - atomic.AddUint64(&gTotal, gLocal) - atomic.AddUint64(&bTotal, bLocal) - atomic.AddUint64(&count, cLocal) - }) - - if count == 0 { - return 0, fmt.Errorf("image has no pixels") - } - - rAvg := float64(rTotal / count) - gAvg := float64(gTotal / count) - bAvg := float64(bTotal / count) - - h, s, l := rgbToHsl(rAvg, gAvg, bAvg) - s = math.Min(1.0, s*1.5) - - rBoost, gBoost, bBoost := hslToRgb(h, s, l) - - colorInt := (rBoost << 16) | (gBoost << 8) | bBoost - return colorInt, nil -} diff --git a/pkg/bild/convolution/convolution.go b/pkg/bild/convolution/convolution.go deleted file mode 100644 index 2bd3c51..0000000 --- a/pkg/bild/convolution/convolution.go +++ /dev/null @@ -1,133 +0,0 @@ -package convolution - -import ( - "image" - "math" - - "go.fm/pkg/bild/clone" - "go.fm/pkg/bild/parallel" -) - -// Options are the Convolve function parameters. -// Bias is added to each RGB channel after convoluting. Range is -255 to 255. -// Wrap sets if indices outside of image dimensions should be taken from the opposite side. -// KeepAlpha sets if alpha should be convolved or kept from the source image. -type Options struct { - Bias float64 - Wrap bool - KeepAlpha bool -} - -// Convolve applies a convolution matrix (kernel) to an image with the supplied options. -// -// Usage example: -// -// result := Convolve(img, kernel, &Options{Bias: 0, Wrap: false}) -func Convolve(img image.Image, k Matrix, o *Options) *image.RGBA { - // Config the convolution - bias := 0.0 - wrap := false - keepAlpha := false - if o != nil { - wrap = o.Wrap - bias = o.Bias - keepAlpha = o.KeepAlpha - } - - return execute(img, k, bias, wrap, keepAlpha) -} - -func execute(img image.Image, k Matrix, bias float64, wrap, keepAlpha bool) *image.RGBA { - // Kernel attributes - lenX := k.MaxX() - lenY := k.MaxY() - radiusX := lenX / 2 - radiusY := lenY / 2 - - // Pad the source image, basically pre-computing the pixels outside of image bounds - var src *image.RGBA - if wrap { - src = clone.Pad(img, radiusX, radiusY, clone.EdgeWrap) - } else { - src = clone.Pad(img, radiusX, radiusY, clone.EdgeExtend) - } - - // src bounds now includes padded pixels - srcBounds := src.Bounds() - srcW, srcH := srcBounds.Dx(), srcBounds.Dy() - dst := image.NewRGBA(img.Bounds()) - - // To keep alpha we simply don't convolve it - if keepAlpha { - // Notice we can't use lenY since it will be larger than the actual padding pixels - // as it includes the identity element - parallel.Line(srcH-(radiusY*2), func(start, end int) { - // Correct range so we don't iterate over the padded pixels on the main loop - for y := start + radiusY; y < end+radiusY; y++ { - for x := radiusX; x < srcW-radiusX; x++ { - - var r, g, b float64 - // Kernel has access to the padded pixels - for ky := range lenY { - iy := y - radiusY + ky - - for kx := range lenX { - ix := x - radiusX + kx - - kvalue := k.At(kx, ky) - ipos := iy*src.Stride + ix*4 - r += float64(src.Pix[ipos+0]) * kvalue - g += float64(src.Pix[ipos+1]) * kvalue - b += float64(src.Pix[ipos+2]) * kvalue - } - } - - // Map x and y indices to non-padded range - pos := (y-radiusY)*dst.Stride + (x-radiusX)*4 - - dst.Pix[pos+0] = uint8(math.Max(math.Min(r+bias, 255), 0)) - dst.Pix[pos+1] = uint8(math.Max(math.Min(g+bias, 255), 0)) - dst.Pix[pos+2] = uint8(math.Max(math.Min(b+bias, 255), 0)) - dst.Pix[pos+3] = src.Pix[y*src.Stride+x*4+3] - } - } - }) - } else { - // Notice we can't use lenY since it will be larger than the actual padding pixels - // as it includes the identity element - parallel.Line(srcH-(radiusY*2), func(start, end int) { - // Correct range so we don't iterate over the padded pixels on the main loop - for y := start + radiusY; y < end+radiusY; y++ { - for x := radiusX; x < srcW-radiusX; x++ { - - var r, g, b, a float64 - // Kernel has access to the padded pixels - for ky := range lenY { - iy := y - radiusY + ky - - for kx := range lenX { - ix := x - radiusX + kx - - kvalue := k.At(kx, ky) - ipos := iy*src.Stride + ix*4 - r += float64(src.Pix[ipos+0]) * kvalue - g += float64(src.Pix[ipos+1]) * kvalue - b += float64(src.Pix[ipos+2]) * kvalue - a += float64(src.Pix[ipos+3]) * kvalue - } - } - - // Map x and y indices to non-padded range - pos := (y-radiusY)*dst.Stride + (x-radiusX)*4 - - dst.Pix[pos+0] = uint8(math.Max(math.Min(r+bias, 255), 0)) - dst.Pix[pos+1] = uint8(math.Max(math.Min(g+bias, 255), 0)) - dst.Pix[pos+2] = uint8(math.Max(math.Min(b+bias, 255), 0)) - dst.Pix[pos+3] = uint8(math.Max(math.Min(a, 255), 0)) - } - } - }) - } - - return dst -} diff --git a/pkg/bild/convolution/kernel.go b/pkg/bild/convolution/kernel.go deleted file mode 100644 index e91e723..0000000 --- a/pkg/bild/convolution/kernel.go +++ /dev/null @@ -1,103 +0,0 @@ -package convolution - -import ( - "fmt" - "math" -) - -// Matrix interface. -// At returns the matrix value at position x, y. -// Normalized returns a new matrix with normalized values. -// MaxX returns the horizontal length. -// MaxY returns the vertical length. -type Matrix interface { - At(x, y int) float64 - Normalized() Matrix - MaxX() int - MaxY() int - Transposed() Matrix -} - -// NewKernel returns a kernel of the provided length. -func NewKernel(width, height int) *Kernel { - return &Kernel{make([]float64, width*height), width, height} -} - -// Kernel to be used as a convolution matrix. -type Kernel struct { - Matrix []float64 - Width int - Height int -} - -// Normalized returns a new Kernel with normalized values. -func (k *Kernel) Normalized() Matrix { - sum := k.Absum() - w := k.Width - h := k.Height - nk := NewKernel(w, h) - - // avoid division by 0 - if sum == 0 { - sum = 1 - } - - for i := 0; i < w*h; i++ { - nk.Matrix[i] = k.Matrix[i] / sum - } - - return nk -} - -// MaxX returns the horizontal length. -func (k *Kernel) MaxX() int { - return k.Width -} - -// MaxY returns the vertical length. -func (k *Kernel) MaxY() int { - return k.Height -} - -// At returns the matrix value at position x, y. -func (k *Kernel) At(x, y int) float64 { - return k.Matrix[y*k.Width+x] -} - -// Transposed returns a new Kernel that has the columns as rows and vice versa -func (k *Kernel) Transposed() Matrix { - w := k.Width - h := k.Height - nk := NewKernel(h, w) - - for x := range w { - for y := range h { - nk.Matrix[x*h+y] = k.Matrix[y*w+x] - } - } - - return nk -} - -// String returns the string representation of the matrix. -func (k *Kernel) String() string { - result := "" - stride := k.MaxX() - height := k.MaxY() - for y := range height { - result += "\n" - for x := range stride { - result += fmt.Sprintf("%-8.4f", k.At(x, y)) - } - } - return result -} - -// Absum returns the absolute cumulative value of the kernel. -func (k *Kernel) Absum() float64 { - var sum float64 - for _, v := range k.Matrix { - sum += math.Abs(v) - } - return sum -} diff --git a/pkg/bild/fcolor/fcolor.go b/pkg/bild/fcolor/fcolor.go deleted file mode 100644 index ffa3678..0000000 --- a/pkg/bild/fcolor/fcolor.go +++ /dev/null @@ -1,22 +0,0 @@ -package fcolor - -import "go.fm/pkg/bild/math/f64" - -// RGBAF64 represents an RGBA color using the range 0.0 to 1.0 with a float64 for each channel. -type RGBAF64 struct { - R, G, B, A float64 -} - -// NewRGBAF64 returns a new RGBAF64 color based on the provided uint8 values. -// uint8 value 0 maps to 0, 128 to 0.5 and 255 to 1.0. -func NewRGBAF64(r, g, b, a uint8) RGBAF64 { - return RGBAF64{float64(r) / 255, float64(g) / 255, float64(b) / 255, float64(a) / 255} -} - -// Clamp limits the channel values of the RGBAF64 color to the range 0.0 to 1.0. -func (c *RGBAF64) Clamp() { - c.R = f64.Clamp(c.R, 0, 1) - c.G = f64.Clamp(c.G, 0, 1) - c.B = f64.Clamp(c.B, 0, 1) - c.A = f64.Clamp(c.A, 0, 1) -} diff --git a/pkg/bild/font/font.go b/pkg/bild/font/font.go deleted file mode 100644 index 8086d5d..0000000 --- a/pkg/bild/font/font.go +++ /dev/null @@ -1,60 +0,0 @@ -package font - -import ( - "image" - "image/color" - "image/draw" - "log" - "os" - - "golang.org/x/image/font" - "golang.org/x/image/font/opentype" - "golang.org/x/image/math/fixed" -) - -// Font holds a loaded TTF font and can create faces of different sizes. -type Font struct { - ttf *opentype.Font -} - -// LoadFont loads a TTF font from a file path. -func LoadFont(path string) *Font { - data, err := os.ReadFile(path) - if err != nil { - log.Fatalf("failed to read font file: %v", err) - } - ttf, err := opentype.Parse(data) - if err != nil { - log.Fatalf("failed to parse font: %v", err) - } - return &Font{ttf: ttf} -} - -// Face returns a font.Face of the specified size (in points) and DPI. -func (f *Font) Face(size float64, dpi float64) font.Face { - face, err := opentype.NewFace(f.ttf, &opentype.FaceOptions{ - Size: size, - DPI: dpi, - Hinting: font.HintingFull, - }) - if err != nil { - log.Fatalf("failed to create font face: %v", err) - } - return face -} - -// DrawText draws text onto an image at a given position with color and font.Face. -func DrawText(canvas draw.Image, x, y int, text string, col color.Color, face font.Face) { - d := &font.Drawer{ - Dst: canvas, - Src: image.NewUniform(col), - Face: face, - Dot: fixed.Point26_6{X: fixed.I(x), Y: fixed.I(y)}, - } - d.DrawString(text) -} - -func Measure(f font.Face, s string) int { - d := &font.Drawer{Face: f} - return d.MeasureString(s).Ceil() -} diff --git a/pkg/bild/imgio/imgio.go b/pkg/bild/imgio/imgio.go deleted file mode 100644 index c15c9c4..0000000 --- a/pkg/bild/imgio/imgio.go +++ /dev/null @@ -1,112 +0,0 @@ -/*Package imgio provides basic image file input/output.*/ -package imgio - -import ( - "bytes" - "fmt" - "image" - "image/jpeg" - "image/png" - "io" - "net/http" - "os" -) - -// Encoder encodes the provided image and writes it -type Encoder func(io.Writer, image.Image) error - -// Open loads and decodes an image from a file and returns it. -// -// Usage example: -// -// // Decodes an image from a file with the given filename -// // returns an error if something went wrong -// img, err := Open("exampleName") -func Open(filename string) (image.Image, error) { - f, err := os.Open(filename) - if err != nil { - return nil, err - } - defer f.Close() - - img, _, err := image.Decode(f) - if err != nil { - return nil, err - } - - return img, nil -} - -// Fetch retrieves the raw image bytes from the given URL. -// -// Usage example: -// -// data, err := Fetch("https://example.com/image.png") -// if err != nil { -// // handle error -// } -func Fetch(url string) ([]byte, error) { - resp, err := http.Get(url) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("failed to fetch image: %s", resp.Status) - } - - data, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - - return data, nil -} - -// DecodeImage loads and decodes an image from a byte slice and returns it. -// -// Usage example: -// -// img, err := Decode(data) -// if err != nil { -// // handle error -// } -func Decode(data []byte) (image.Image, error) { - reader := bytes.NewReader(data) - img, _, err := image.Decode(reader) - if err != nil { - return nil, err - } - return img, nil -} - -// JPEGEncoder returns an encoder to JPEG given the argument 'quality' -func JPEGEncoder(quality int) Encoder { - return func(w io.Writer, img image.Image) error { - return jpeg.Encode(w, img, &jpeg.Options{Quality: quality}) - } -} - -// PNGEncoder returns an encoder to PNG -func PNGEncoder() Encoder { - return func(w io.Writer, img image.Image) error { - return png.Encode(w, img) - } -} - -// Encode encodes an image into a byte slice using the provided encoder. -// -// Usage example: -// -// data, err := Encode(img, imgio.JPEGEncoder(90)) -// if err != nil { -// // handle error -// } -func Encode(img image.Image, encoder Encoder) ([]byte, error) { - buf := new(bytes.Buffer) - if err := encoder(buf, img); err != nil { - return nil, err - } - return buf.Bytes(), nil -} diff --git a/pkg/bild/mask/mask.go b/pkg/bild/mask/mask.go deleted file mode 100644 index b553ed5..0000000 --- a/pkg/bild/mask/mask.go +++ /dev/null @@ -1,52 +0,0 @@ -package mask - -import ( - "image" - "image/color" - - "go.fm/pkg/bild/parallel" -) - -func Rounded(width, height, radius int) *image.Alpha { - mask := image.NewAlpha(image.Rect(0, 0, width, height)) - - parallel.Line(height, func(start, end int) { - for y := start; y < end; y++ { - for x := range width { - alpha := 255 - - // top-left corner - dx := float64(radius - x) - dy := float64(radius - y) - if dx > 0 && dy > 0 && dx*dx+dy*dy > float64(radius*radius) { - alpha = 0 - } - - // top-right corner - dx = float64(x - (width - radius - 1)) - dy = float64(radius - y) - if dx > 0 && dy > 0 && dx*dx+dy*dy > float64(radius*radius) { - alpha = 0 - } - - // bottom-left corner - dx = float64(radius - x) - dy = float64(y - (height - radius - 1)) - if dx > 0 && dy > 0 && dx*dx+dy*dy > float64(radius*radius) { - alpha = 0 - } - - // bottom-right corner - dx = float64(x - (width - radius - 1)) - dy = float64(y - (height - radius - 1)) - if dx > 0 && dy > 0 && dx*dx+dy*dy > float64(radius*radius) { - alpha = 0 - } - - mask.SetAlpha(x, y, color.Alpha{A: uint8(alpha)}) - } - } - }) - - return mask -} diff --git a/pkg/bild/math/f64/f64.go b/pkg/bild/math/f64/f64.go deleted file mode 100644 index cc85ec3..0000000 --- a/pkg/bild/math/f64/f64.go +++ /dev/null @@ -1,13 +0,0 @@ -package f64 - -// Clamp returns the value if it fits within the parameters min and max. -// Otherwise returns the closest boundary parameter value. -func Clamp(value, min, max float64) float64 { - if value > max { - return max - } - if value < min { - return min - } - return value -} diff --git a/pkg/bild/parallel/parallel.go b/pkg/bild/parallel/parallel.go deleted file mode 100644 index 3336327..0000000 --- a/pkg/bild/parallel/parallel.go +++ /dev/null @@ -1,36 +0,0 @@ -package parallel - -import ( - "runtime" - "sync" -) - -func init() { - runtime.GOMAXPROCS(runtime.NumCPU()) -} - -// Line dispatches a parameter fn into multiple goroutines by splitting the parameter length -// by the number of available CPUs and assigning the length parts into each fn. -func Line(length int, fn func(start, end int)) { - procs := runtime.GOMAXPROCS(0) - counter := length - partSize := length / procs - if procs <= 1 || partSize <= procs { - fn(0, length) - } else { - var wg sync.WaitGroup - for counter > 0 { - start := counter - partSize - end := counter - if start < 0 { - start = 0 - } - counter -= partSize - wg.Go(func() { - fn(start, end) - }) - } - - wg.Wait() - } -} diff --git a/pkg/bild/transform/filters.go b/pkg/bild/transform/filters.go deleted file mode 100644 index 85b512d..0000000 --- a/pkg/bild/transform/filters.go +++ /dev/null @@ -1,142 +0,0 @@ -/* -Package transform provides basic image transformation functions, such as resizing, rotation and flipping. -It includes a variety of resampling filters to handle interpolation in case that upsampling or downsampling is required. -*/ -package transform - -import "math" - -// ResampleFilter is used to evaluate sample points and interpolate between them. -// Support is the number of points required by the filter per 'side'. -// For example, a support of 1.0 means that the filter will get pixels on -// positions -1 and +1 away from it. -// Fn is the resample filter function to evaluate the samples. -type ResampleFilter struct { - Support float64 - Fn func(x float64) float64 -} - -// NearestNeighbor resampling filter assigns to each point the sample point nearest to it. -var NearestNeighbor ResampleFilter - -// Box resampling filter, only let pass values in the x < 0.5 range from sample. -// It produces similar results to the Nearest Neighbor method. -var Box ResampleFilter - -// Linear resampling filter interpolates linearly between the two nearest samples per dimension. -var Linear ResampleFilter - -// Gaussian resampling filter interpolates using a Gaussian function between the two nearest -// samples per dimension. -var Gaussian ResampleFilter - -// MitchellNetravali resampling filter interpolates between the four nearest samples per dimension. -var MitchellNetravali ResampleFilter - -// CatmullRom resampling filter interpolates between the four nearest samples per dimension. -var CatmullRom ResampleFilter - -// Lanczos resampling filter interpolates between the six nearest samples per dimension. -var Lanczos ResampleFilter - -func init() { - NearestNeighbor = ResampleFilter{ - Support: 0, - Fn: nil, - } - Box = ResampleFilter{ - Support: 0.5, - Fn: func(x float64) float64 { - if math.Abs(x) < 0.5 { - return 1 - } - return 0 - }, - } - Linear = ResampleFilter{ - Support: 1.0, - Fn: func(x float64) float64 { - x = math.Abs(x) - if x < 1.0 { - return 1.0 - x - } - return 0 - }, - } - Gaussian = ResampleFilter{ - Support: 1.0, - Fn: func(x float64) float64 { - x = math.Abs(x) - if x < 1.0 { - exp := 2.0 - x *= 2.0 - y := math.Pow(0.5, math.Pow(x, exp)) - base := math.Pow(0.5, math.Pow(2, exp)) - return (y - base) / (1 - base) - } - return 0 - }, - } - MitchellNetravali = ResampleFilter{ - Support: 2.0, - Fn: func(x float64) float64 { - b := 1.0 / 3 - c := 1.0 / 3 - var w [4]float64 - x = math.Abs(x) - - if x < 1.0 { - w[0] = 0 - w[1] = 6 - 2*b - w[2] = (-18 + 12*b + 6*c) * x * x - w[3] = (12 - 9*b - 6*c) * x * x * x - } else if x <= 2.0 { - w[0] = 8*b + 24*c - w[1] = (-12*b - 48*c) * x - w[2] = (6*b + 30*c) * x * x - w[3] = (-b - 6*c) * x * x * x - } else { - return 0 - } - - return (w[0] + w[1] + w[2] + w[3]) / 6 - }, - } - CatmullRom = ResampleFilter{ - Support: 2.0, - Fn: func(x float64) float64 { - b := 0.0 - c := 0.5 - var w [4]float64 - x = math.Abs(x) - - if x < 1.0 { - w[0] = 0 - w[1] = 6 - 2*b - w[2] = (-18 + 12*b + 6*c) * x * x - w[3] = (12 - 9*b - 6*c) * x * x * x - } else if x <= 2.0 { - w[0] = 8*b + 24*c - w[1] = (-12*b - 48*c) * x - w[2] = (6*b + 30*c) * x * x - w[3] = (-b - 6*c) * x * x * x - } else { - return 0 - } - - return (w[0] + w[1] + w[2] + w[3]) / 6 - }, - } - Lanczos = ResampleFilter{ - Support: 3.0, - Fn: func(x float64) float64 { - x = math.Abs(x) - if x == 0 { - return 1.0 - } else if x < 3.0 { - return (3.0 * math.Sin(math.Pi*x) * math.Sin(math.Pi*(x/3.0))) / (math.Pi * math.Pi * x * x) - } - return 0.0 - }, - } -} diff --git a/pkg/bild/transform/resize.go b/pkg/bild/transform/resize.go deleted file mode 100644 index 162c93a..0000000 --- a/pkg/bild/transform/resize.go +++ /dev/null @@ -1,180 +0,0 @@ -package transform - -import ( - "image" - "math" - - "go.fm/pkg/bild/clone" - "go.fm/pkg/bild/math/f64" - "go.fm/pkg/bild/parallel" -) - -// Resize returns a new image with its size adjusted to the new width and height. The filter -// param corresponds to the Resampling Filter to be used when interpolating between the sample points. -// -// Usage example: -// -// result := transform.Resize(img, 800, 600, transform.Linear) -func Resize(img image.Image, width, height int, filter ResampleFilter) *image.RGBA { - if width <= 0 || height <= 0 || img.Bounds().Empty() { - return image.NewRGBA(image.Rect(0, 0, 0, 0)) - } - - src := clone.AsShallowRGBA(img) - var dst *image.RGBA - - // NearestNeighbor is a special case, it's faster to compute without convolution matrix. - if filter.Support <= 0 { - dst = nearestNeighbor(src, width, height) - } else { - dst = resampleHorizontal(src, width, filter) - dst = resampleVertical(dst, height, filter) - } - - return dst -} - -// Crop returns a new image which contains the intersection between the rect and the image provided as params. -// Only the intersection is returned. If a rect larger than the image is provided, no fill is done to -// the 'empty' area. -// -// Usage example: -// -// result := transform.Crop(img, image.Rect(0, 0, 512, 256)) -func Crop(img image.Image, rect image.Rectangle) *image.RGBA { - src := clone.AsShallowRGBA(img) - return clone.AsRGBA(src.SubImage(rect)) -} - -func resampleHorizontal(src *image.RGBA, width int, filter ResampleFilter) *image.RGBA { - srcWidth, srcHeight := src.Bounds().Dx(), src.Bounds().Dy() - srcStride := src.Stride - - delta := float64(srcWidth) / float64(width) - // Scale must be at least 1. Special case for image size reduction filter radius. - scale := math.Max(delta, 1.0) - - dst := image.NewRGBA(image.Rect(0, 0, width, srcHeight)) - dstStride := dst.Stride - - filterRadius := math.Ceil(scale * filter.Support) - - parallel.Line(srcHeight, func(start, end int) { - for y := start; y < end; y++ { - for x := range width { - // value of x from src - ix := (float64(x)+0.5)*delta - 0.5 - istart, iend := int(ix-filterRadius+0.5), int(ix+filterRadius) - - if istart < 0 { - istart = 0 - } - if iend >= srcWidth { - iend = srcWidth - 1 - } - - var r, g, b, a float64 - var sum float64 - for kx := istart; kx <= iend; kx++ { - - srcPos := y*srcStride + kx*4 - // normalize the sample position to be evaluated by the filter - normPos := (float64(kx) - ix) / scale - fValue := filter.Fn(normPos) - - r += float64(src.Pix[srcPos+0]) * fValue - g += float64(src.Pix[srcPos+1]) * fValue - b += float64(src.Pix[srcPos+2]) * fValue - a += float64(src.Pix[srcPos+3]) * fValue - sum += fValue - } - - dstPos := y*dstStride + x*4 - dst.Pix[dstPos+0] = uint8(f64.Clamp((r/sum)+0.5, 0, 255)) - dst.Pix[dstPos+1] = uint8(f64.Clamp((g/sum)+0.5, 0, 255)) - dst.Pix[dstPos+2] = uint8(f64.Clamp((b/sum)+0.5, 0, 255)) - dst.Pix[dstPos+3] = uint8(f64.Clamp((a/sum)+0.5, 0, 255)) - } - } - }) - - return dst -} - -func resampleVertical(src *image.RGBA, height int, filter ResampleFilter) *image.RGBA { - srcWidth, srcHeight := src.Bounds().Dx(), src.Bounds().Dy() - srcStride := src.Stride - - delta := float64(srcHeight) / float64(height) - scale := math.Max(delta, 1.0) - - dst := image.NewRGBA(image.Rect(0, 0, srcWidth, height)) - dstStride := dst.Stride - - filterRadius := math.Ceil(scale * filter.Support) - - parallel.Line(height, func(start, end int) { - for y := start; y < end; y++ { - iy := (float64(y)+0.5)*delta - 0.5 - - istart, iend := int(iy-filterRadius+0.5), int(iy+filterRadius) - - if istart < 0 { - istart = 0 - } - if iend >= srcHeight { - iend = srcHeight - 1 - } - - for x := range srcWidth { - var r, g, b, a float64 - var sum float64 - for ky := istart; ky <= iend; ky++ { - - srcPos := ky*srcStride + x*4 - normPos := (float64(ky) - iy) / scale - fValue := filter.Fn(normPos) - - r += float64(src.Pix[srcPos+0]) * fValue - g += float64(src.Pix[srcPos+1]) * fValue - b += float64(src.Pix[srcPos+2]) * fValue - a += float64(src.Pix[srcPos+3]) * fValue - sum += fValue - } - - dstPos := y*dstStride + x*4 - dst.Pix[dstPos+0] = uint8(f64.Clamp((r/sum)+0.5, 0, 255)) - dst.Pix[dstPos+1] = uint8(f64.Clamp((g/sum)+0.5, 0, 255)) - dst.Pix[dstPos+2] = uint8(f64.Clamp((b/sum)+0.5, 0, 255)) - dst.Pix[dstPos+3] = uint8(f64.Clamp((a/sum)+0.5, 0, 255)) - } - } - }) - - return dst -} - -func nearestNeighbor(src *image.RGBA, width, height int) *image.RGBA { - srcW, srcH := src.Bounds().Dx(), src.Bounds().Dy() - srcStride := src.Stride - - dst := image.NewRGBA(image.Rect(0, 0, width, height)) - dstStride := dst.Stride - - dx := float64(srcW) / float64(width) - dy := float64(srcH) / float64(height) - - for y := range height { - for x := range width { - pos := y*dstStride + x*4 - ipos := int((float64(y)+0.5)*dy)*srcStride + int((float64(x)+0.5)*dx)*4 - - dst.Pix[pos+0] = src.Pix[ipos+0] - dst.Pix[pos+1] = src.Pix[ipos+1] - dst.Pix[pos+2] = src.Pix[ipos+2] - dst.Pix[pos+3] = src.Pix[ipos+3] - } - } - - return dst -} diff --git a/pkg/constants/emojis/emojis.go b/pkg/constants/emojis/emojis.go deleted file mode 100644 index d05604f..0000000 --- a/pkg/constants/emojis/emojis.go +++ /dev/null @@ -1,27 +0,0 @@ -package emojis - -var ( - EmojiCrown = "" - EmojiQuestionMark = "" - EmojiChat = "" - EmojiNote = "" - EmojiTop = "" - EmojiStar = "" - EmojiFire = "" - EmojiMic = "" - EmojiMic2 = "" - EmojiPlay = "" - EmojiAlbum = "" - EmojiCalendar = "" - - // status - EmojiCross = "" - EmojiCheck = "" - EmojiUpdate = "" - EmojiWarning = "" - - // rank - EmojiRankOne = "" - EmojiRankTwo = "" - EmojiRankThree = "" -) diff --git a/pkg/constants/errs/errs.go b/pkg/constants/errs/errs.go deleted file mode 100644 index 19054a1..0000000 --- a/pkg/constants/errs/errs.go +++ /dev/null @@ -1,25 +0,0 @@ -package errs - -import ( - "errors" - "fmt" -) - -var ( - // generic - ErrUserNotFound = errors.New("i coulnd't find that user") - ErrUserNotRegistered = errors.New("you need to set your last.fm username. use `/set-user` to get started") - ErrCommandDeferFailed = errors.New("failed to acknowledge command") - ErrCurrentTrackFetch = errors.New("couldn't fetch user's current track") - ErrNoTracksFound = errors.New("no tracks were found") - ErrUnexpected = errors.New("an unexpected error occurred, try again or visit the support server") - ErrNotListening = errors.New("this user is not listening to anything right now") - ErrNoListeners = errors.New("no one has listened to this, *yet*") - - // specific - ErrUsernameAlreadyUsed = errors.New("this username is already in use by another Discord user") - ErrSetUsername = errors.New("i couldn't set your last.fm username") - ErrUsernameAlreadySet = func(username string) error { - return fmt.Errorf("your username is already set to %s", username) - } -) diff --git a/pkg/constants/opts/opts.go b/pkg/constants/opts/opts.go deleted file mode 100644 index a42843c..0000000 --- a/pkg/constants/opts/opts.go +++ /dev/null @@ -1,11 +0,0 @@ -package opts - -import "github.com/disgoorg/disgo/discord" - -var ( - UserOption = discord.ApplicationCommandOptionString{ - Name: "user", - Description: "user to get data from", - Required: false, - } -) diff --git a/pkg/ctx/ctx.go b/pkg/ctx/ctx.go deleted file mode 100644 index 538e641..0000000 --- a/pkg/ctx/ctx.go +++ /dev/null @@ -1,47 +0,0 @@ -package ctx - -import ( - "context" - "strings" - "time" - - "github.com/disgoorg/disgo/events" - "github.com/disgoorg/snowflake/v2" - - "go.fm/cache" - "go.fm/db" - "go.fm/lfm" -) - -type CommandContext struct { - LastFM *lfm.LastFMApi - Database *db.Queries - Context context.Context - Start time.Time - Cache *cache.Cache -} - -func (ctx *CommandContext) GetUser( - e *events.ApplicationCommandInteractionCreate, -) (string, error) { - if rawUser, defined := e.SlashCommandInteractionData().OptString("user"); defined { - userID := normalizeUserInput(rawUser) - - if _, err := snowflake.Parse(userID); err == nil { - return ctx.Database.GetUser(ctx.Context, userID) - } - - return rawUser, nil - } - - userID := e.Member().User.ID.String() - return ctx.Database.GetUser(ctx.Context, userID) -} - -func normalizeUserInput(input string) string { - if strings.HasPrefix(input, "<@") && strings.HasSuffix(input, ">") { - trimmed := strings.TrimSuffix(strings.TrimPrefix(input, "<@"), ">") - return strings.TrimPrefix(trimmed, "!") - } - return input -} diff --git a/pkg/discord/markdown/markdown.go b/pkg/discord/markdown/markdown.go deleted file mode 100644 index 43b0475..0000000 --- a/pkg/discord/markdown/markdown.go +++ /dev/null @@ -1,200 +0,0 @@ -package markdown - -import ( - "strconv" - "strings" - "unicode/utf8" -) - -// getLongerStr returns the longer of two strings based on rune count. -func getLongerStr(a, b string) string { - if utf8.RuneCountInString(a) > utf8.RuneCountInString(b) { - return a - } - return b -} - -// GenerateTable creates a key-value aligned table from a slice of [2]string. -func GenerateTable(input [][2]string) string { - if len(input) == 0 { - return "" - } - - // Find the longest key - longest := input[0][0] - for _, pair := range input { - longest = getLongerStr(longest, pair[0]) - } - longestLen := utf8.RuneCountInString(longest) - - var b strings.Builder - for _, pair := range input { - key, value := pair[0], pair[1] - padding := longestLen - utf8.RuneCountInString(key) - b.WriteString(strings.Repeat(" ", padding)) - b.WriteString(key) - b.WriteString(": ") - b.WriteString(value) - b.WriteByte('\n') - } - return b.String() -} - -// GenerateList creates a table-like list with headers. -func GenerateList(keyName, valueName string, values [][2]string) string { - return GenerateListFixedDelim(keyName, valueName, values, utf8.RuneCountInString(keyName), utf8.RuneCountInString(valueName)) -} - -// GenerateListFixedDelim creates a table-like list with headers and custom delimiter lengths. -func GenerateListFixedDelim(keyName, valueName string, values [][2]string, keyDelimLen, valueDelimLen int) string { - if len(values) == 0 { - return "" - } - - // Find the longest between header and keys - longest := getLongerStr(keyName, values[0][0]) - for _, pair := range values { - longest = getLongerStr(longest, pair[0]) - } - longestLen := utf8.RuneCountInString(longest) - - var b strings.Builder - - // Header - b.WriteString(" ") - b.WriteString(strings.Repeat(" ", longestLen-utf8.RuneCountInString(keyName))) - b.WriteString(keyName) - b.WriteByte('\t') - b.WriteString(valueName) - b.WriteByte('\n') - - // Delimiter row - b.WriteString(" ") - b.WriteString(strings.Repeat(" ", longestLen-utf8.RuneCountInString(keyName))) - b.WriteString(strings.Repeat("-", keyDelimLen)) - b.WriteByte('\t') - b.WriteString(strings.Repeat("-", valueDelimLen)) - - // Values - for _, pair := range values { - key, value := pair[0], pair[1] - b.WriteByte('\n') - b.WriteString(" ") - b.WriteString(strings.Repeat(" ", longestLen-utf8.RuneCountInString(key))) - b.WriteString(key) - b.WriteByte('\t') - b.WriteString(value) - } - - return b.String() -} - -type TimestampStyle int - -const ( - FullLong TimestampStyle = iota - FullShort - DateLong - DateShort - TimeLong - TimeShort - Relative -) - -func (s TimestampStyle) String() string { - switch s { - case FullLong: - return "F" - case FullShort: - return "f" - case DateLong: - return "D" - case DateShort: - return "d" - case TimeLong: - return "T" - case TimeShort: - return "t" - case Relative: - return "R" - } - return "" -} - -type MD string - -func cut(s string, to int) string { - if utf8.RuneCountInString(s) <= to { - return s - } - var b strings.Builder - n := 0 - for _, r := range s { - if n >= to { - break - } - b.WriteRune(r) - n++ - } - return b.String() -} - -func (m MD) EscapeItalics() string { - s := cut(string(m), 1998) - var b strings.Builder - for _, r := range s { - if r == '_' || r == '*' { - b.WriteRune('\\') - } - b.WriteRune(r) - } - return b.String() -} - -func (m MD) EscapeBold() string { return strings.ReplaceAll(cut(string(m), 1998), "**", "\\*\\*") } -func (m MD) EscapeCodeString() string { return strings.ReplaceAll(cut(string(m), 1998), "`", "'") } -func (m MD) EscapeCodeBlock(lang string) string { - return strings.ReplaceAll(cut(string(m), 1988-len(lang)), "```", "`\u200b`\u200b`") -} -func (m MD) EscapeSpoiler() string { return strings.ReplaceAll(cut(string(m), 1996), "__", "||") } -func (m MD) EscapeStrikethrough() string { - return strings.ReplaceAll(cut(string(m), 1996), "~~", "\\~\\~") -} -func (m MD) EscapeUnderline() string { return strings.ReplaceAll(cut(string(m), 1996), "||", "__") } - -func (m MD) Italics() string { return "_" + m.EscapeItalics() + "_" } -func (m MD) Bold() string { return "**" + m.EscapeBold() + "**" } -func (m MD) CodeString() string { return "`" + m.EscapeCodeString() + "`" } -func (m MD) CodeBlock(lang string) string { - return "```" + lang + "\n" + m.EscapeCodeBlock(lang) + "\n```" -} -func (m MD) Spoiler() string { return "||" + m.EscapeItalics() + "||" } -func (m MD) Strikethrough() string { return "~~" + m.EscapeItalics() + "~~" } -func (m MD) Underline() string { return "__" + m.EscapeItalics() + "__" } -func (m MD) URL(url string, comment *string) string { - if comment != nil { - return "[" + string(m) + "](" + url + " '" + *comment + "')" - } - return "[" + string(m) + "](" + url + ")" -} -func (m MD) Timestamp(seconds int, style TimestampStyle) string { - return "" -} -func (m MD) Subtext() string { return "-# " + string(m) } - -func ParseCodeBlock(s string) string { - t := strings.TrimSpace(s) - if strings.HasPrefix(t, "```") && strings.HasSuffix(t, "```") { - r := strings.ReplaceAll(t, "\n", "\n ") - parts := strings.Split(r, " ") - if len(parts) > 1 { - joined := strings.Join(parts[1:], " ") - return joined[:len(joined)-3] - } - return "" - } - if strings.HasPrefix(t, "`") && strings.HasSuffix(t, "`") { - return t[1 : len(t)-1] - } - return s -} diff --git a/pkg/discord/reply/reply.go b/pkg/discord/reply/reply.go deleted file mode 100644 index 3a147ce..0000000 --- a/pkg/discord/reply/reply.go +++ /dev/null @@ -1,138 +0,0 @@ -package reply - -import ( - "fmt" - - "github.com/disgoorg/disgo/discord" - "github.com/disgoorg/disgo/events" - "go.fm/logger" - "go.fm/pkg/constants/emojis" - "go.fm/pkg/constants/errs" -) - -type ResponseBuilder struct { - e *events.ApplicationCommandInteractionCreate - content *string - embeds []discord.Embed - components []discord.LayoutComponent - flags discord.MessageFlags - ephemeral bool - files []*discord.File -} - -func New(e *events.ApplicationCommandInteractionCreate) *ResponseBuilder { - return &ResponseBuilder{ - e: e, - } -} - -func (r *ResponseBuilder) Content(msg string, a ...any) *ResponseBuilder { - if len(a) > 0 { - msg = fmt.Sprintf(msg, a...) - } - r.content = &msg - return r -} - -func (r *ResponseBuilder) Flags(flags discord.MessageFlags) *ResponseBuilder { - r.flags = flags - return r -} - -func (r *ResponseBuilder) File(file *discord.File) *ResponseBuilder { - r.files = append(r.files, file) - return r -} - -func (r *ResponseBuilder) Embed(embed discord.Embed) *ResponseBuilder { - r.embeds = append(r.embeds, embed) - return r -} - -func (r *ResponseBuilder) Component(component discord.LayoutComponent) *ResponseBuilder { - r.components = append(r.components, component) - return r -} - -func (r *ResponseBuilder) Ephemeral() *ResponseBuilder { - r.ephemeral = true - return r -} - -func (r *ResponseBuilder) Defer() error { - return r.e.DeferCreateMessage(r.ephemeral) -} - -func (r *ResponseBuilder) FollowUp() error { - msg := discord.MessageCreate{ - Content: *r.content, - Embeds: r.embeds, - Files: r.files, - AllowedMentions: &discord.AllowedMentions{}, - } - if r.ephemeral { - msg.Flags.Add(discord.MessageFlagEphemeral) - } - - _, err := r.e.Client().Rest.CreateFollowupMessage( - r.e.ApplicationID(), - r.e.Token(), - msg, - ) - return err -} - -func (r *ResponseBuilder) Send() { - _, err := r.e.Client().Rest.UpdateInteractionResponse( - r.e.ApplicationID(), - r.e.Token(), - discord.MessageUpdate{ - Components: &r.components, - Content: r.content, - Embeds: &r.embeds, - Files: r.files, - Flags: &r.flags, - AllowedMentions: &discord.AllowedMentions{}, - }, - ) - if err != nil { - logger.Log.Error(err.Error()) - Error(r.e, errs.ErrUnexpected) - } -} - -func (r *ResponseBuilder) Edit() { - _, err := r.e.Client().Rest.UpdateInteractionResponse( - r.e.ApplicationID(), - r.e.Token(), - discord.MessageUpdate{ - Components: &r.components, - Flags: &r.flags, - Content: r.content, - Files: r.files, - Embeds: &r.embeds, - AllowedMentions: &discord.AllowedMentions{}, - }, - ) - if err != nil { - logger.Log.Error(err.Error()) - Error(r.e, errs.ErrUnexpected) - } -} - -func QuickEmbed(title, description string) discord.Embed { - return discord.NewEmbedBuilder(). - SetTitle(title). - SetDescription(description). - SetColor(0x00ADD8). - Build() -} - -func Error(e *events.ApplicationCommandInteractionCreate, err error) { - embed := QuickEmbed(fmt.Sprintf("%s error", emojis.EmojiCross), err.Error()) - embed.Color = 0xE74C3C - - New(e). - Embed(embed). - Send() -} diff --git a/pkg/strng/strng.go b/pkg/strng/strng.go deleted file mode 100644 index b890de5..0000000 --- a/pkg/strng/strng.go +++ /dev/null @@ -1,13 +0,0 @@ -package strng - -import "unicode/utf8" - -func Truncate(s string, max int) string { - if utf8.RuneCountInString(s) <= max { - return s - } - if max <= 3 { - return string([]rune(s)[:max]) - } - return string([]rune(s)[:max-3]) + "..." -} diff --git a/sqlc.yaml b/sqlc.yaml deleted file mode 100644 index 8f58e92..0000000 --- a/sqlc.yaml +++ /dev/null @@ -1,14 +0,0 @@ -version: "2" -sql: - - engine: "sqlite" - queries: "db/sql/queries.sql" - schema: "db/sql/schema.sql" - database: - uri: "file:database.db" - gen: - go: - package: "db" - out: "db" - emit_json_tags: true - emit_prepared_queries: true - From f5e864e81d87920bbf814c5d25e63307325ab5e8 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Fri, 19 Sep 2025 22:23:25 +0200 Subject: [PATCH 02/29] bot base --- cmd/bot/bot.go | 67 ++++++++++ cmd/bot/commands.go | 5 + commands/commands.go | 47 +++++++ commands/ping/command.go | 23 ++++ events/events.go | 21 +++ go.mod | 11 ++ go.sum | 8 ++ zlog/zlog.go | 273 +++++++++++++++++++++++++++++++++++++++ 8 files changed, 455 insertions(+) create mode 100644 cmd/bot/commands.go create mode 100644 commands/commands.go create mode 100644 commands/ping/command.go create mode 100644 events/events.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 zlog/zlog.go diff --git a/cmd/bot/bot.go b/cmd/bot/bot.go index 06ab7d0..a72a609 100644 --- a/cmd/bot/bot.go +++ b/cmd/bot/bot.go @@ -1 +1,68 @@ package main + +import ( + "context" + "os" + + "github.com/diamondburned/arikawa/v3/api/cmdroute" + "github.com/diamondburned/arikawa/v3/discord" + "github.com/diamondburned/arikawa/v3/gateway" + "github.com/diamondburned/arikawa/v3/state" + + "go.fm/commands" + "go.fm/events" + "go.fm/zlog" +) + +func main() { + discordToken := os.Getenv("DISCORD_TOKEN") + if discordToken == "" { + zlog.Log.Fatal("missing DISCORD_TOKEN env") + } + + s := state.New("Bot " + discordToken) + r := cmdroute.NewRouter() + commands.RegisterCommands(r, s) + + // command handlers + if err := commands.Sync(s); err != nil { + zlog.Log.Fatalf("failed syncing commands: %v", err) + } + s.AddInteractionHandler(r) + + // event handlers + for _, event := range events.Events { + s.AddHandler(event) + } + zlog.Log.Debugf("added %d event handlers", len(events.Events)) + + // bot intents + s.AddIntents(gateway.IntentGuildMembers) + + // open gateway + if err := s.Open(context.Background()); err != nil { + zlog.Log.Fatalf("failed to open gateway: %v", err) + } + defer s.Close() + + // set status + err := s.Gateway().Send( + context.Background(), + &gateway.UpdatePresenceCommand{ + Since: discord.UnixMsTimestamp(0), + Status: discord.OnlineStatus, + Activities: []discord.Activity{ + { + Name: "your breath", + Type: discord.ListeningActivity, + }, + }, + AFK: false, + }, + ) + if err != nil { + zlog.Log.Warnf("failed to set status: %v", err) + } + + select {} +} diff --git a/cmd/bot/commands.go b/cmd/bot/commands.go new file mode 100644 index 0000000..14554e5 --- /dev/null +++ b/cmd/bot/commands.go @@ -0,0 +1,5 @@ +package main + +import ( + _ "go.fm/commands/ping" +) diff --git a/commands/commands.go b/commands/commands.go new file mode 100644 index 0000000..9a031a5 --- /dev/null +++ b/commands/commands.go @@ -0,0 +1,47 @@ +package commands + +import ( + "context" + + "github.com/diamondburned/arikawa/v3/api" + "github.com/diamondburned/arikawa/v3/api/cmdroute" + "github.com/diamondburned/arikawa/v3/state" + + "go.fm/zlog" +) + +type CommandContext struct { + Ctx context.Context + Data cmdroute.CommandData + St *state.State +} + +type CommandHandler func(c *CommandContext) *api.InteractionResponseData + +var allCommands = []api.CreateCommandData{} +var registry = map[string]CommandHandler{} + +func Register(meta api.CreateCommandData, handler CommandHandler) { + zlog.Log.Debugf("registered command %s", meta.Name) + + allCommands = append(allCommands, meta) + registry[meta.Name] = handler +} + +func RegisterCommands(r *cmdroute.Router, st *state.State) { + for name, handler := range registry { + h := handler + r.AddFunc(name, func(ctx context.Context, data cmdroute.CommandData) *api.InteractionResponseData { + return h(&CommandContext{ + Ctx: ctx, + Data: data, + St: st, + }) + }) + } +} + +func Sync(st *state.State) error { + zlog.Log.Debug("synced commands") + return cmdroute.OverwriteCommands(st, allCommands) +} diff --git a/commands/ping/command.go b/commands/ping/command.go new file mode 100644 index 0000000..63f552a --- /dev/null +++ b/commands/ping/command.go @@ -0,0 +1,23 @@ +package ping + +import ( + "go.fm/commands" + + "github.com/diamondburned/arikawa/v3/api" + "github.com/diamondburned/arikawa/v3/utils/json/option" +) + +var data = api.CreateCommandData{ + Name: "ping", + Description: "display bot's latency", +} + +func handler(c *commands.CommandContext) *api.InteractionResponseData { + return &api.InteractionResponseData{ + Content: option.NewNullableString("pong."), + } +} + +func init() { + commands.Register(data, handler) +} diff --git a/events/events.go b/events/events.go new file mode 100644 index 0000000..71641ab --- /dev/null +++ b/events/events.go @@ -0,0 +1,21 @@ +package events + +import ( + "github.com/diamondburned/arikawa/v3/gateway" + "go.fm/zlog" +) + +var Events []any + +func init() { + Events = append(Events, EventReady) +} + +func EventReady(c *gateway.ReadyEvent) { + zlog.Log.WithFields( + zlog.F{ + "username": c.User.Username, + "guild_count": len(c.Guilds), + }, + ).Info("client is ready") +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..d7b5c7e --- /dev/null +++ b/go.mod @@ -0,0 +1,11 @@ +module go.fm + +go 1.25.0 + +require github.com/diamondburned/arikawa/v3 v3.6.0 + +require ( + github.com/gorilla/schema v1.4.1 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + golang.org/x/time v0.10.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..4ec3cf8 --- /dev/null +++ b/go.sum @@ -0,0 +1,8 @@ +github.com/diamondburned/arikawa/v3 v3.6.0 h1:8sno6tO9F1TEkg1ChHfjuVX41a+uv3opcfWeNvbuhV4= +github.com/diamondburned/arikawa/v3 v3.6.0/go.mod h1:thocAM2X8lRDHuEZR5vWYaT4w+tb/vOKa1qm+r0gs5A= +github.com/gorilla/schema v1.4.1 h1:jUg5hUjCSDZpNGLuXQOgIWGdlgrIdYvgQ0wZtdK1M3E= +github.com/gorilla/schema v1.4.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= +golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= diff --git a/zlog/zlog.go b/zlog/zlog.go new file mode 100644 index 0000000..21d55da --- /dev/null +++ b/zlog/zlog.go @@ -0,0 +1,273 @@ +package zlog + +// modified version of https://github.com/nxtgo/zlog, released under +// public domain. + +import ( + "encoding/json" + "fmt" + "io" + "maps" + "os" + "runtime" + "sort" + "strings" + "sync" + "time" +) + +type Level int + +const ( + LevelDebug Level = iota + LevelInfo + LevelWarn + LevelError + LevelFatal +) + +func (l Level) String() string { + return [...]string{"DEBUG", "INFO", "WARN", "ERROR", "FATAL !"}[l] +} + +type F map[string]any + +var ( + ansiReset = "\u001b[0m" + ansiBlack = "\u001b[30m" + + defaultLevelColor = map[Level]string{ + LevelDebug: "\u001b[37m", + LevelInfo: "\u001b[34m", + LevelWarn: "\u001b[33m", + LevelError: "\u001b[31m", + LevelFatal: "\u001b[35;1m", + } + defaultLevelColorBg = map[Level]string{ + LevelDebug: "\u001b[47m", + LevelInfo: "\u001b[44m", + LevelWarn: "\u001b[43m", + LevelError: "\u001b[41m", + LevelFatal: "\u001b[45;1m", + } +) + +type Logger struct { + mu sync.Mutex + out io.Writer + level Level + timeStamp bool + timeFormat string + json bool + colors bool + caller bool + fields F + levelColor map[Level]string + levelColorBg map[Level]string +} + +var Log = new() + +func new() *Logger { + return &Logger{ + out: os.Stderr, + level: LevelDebug, + timeStamp: true, + timeFormat: time.RFC3339, + colors: isTerminal(os.Stderr), + caller: true, + fields: make(F), + levelColor: maps.Clone(defaultLevelColor), + levelColorBg: maps.Clone(defaultLevelColorBg), + } +} + +func (l *Logger) SetLevelColor(level Level, fg string) { + l.mu.Lock() + l.levelColor[level] = fg + l.mu.Unlock() +} +func (l *Logger) SetLevelBgColor(level Level, bg string) { + l.mu.Lock() + l.levelColorBg[level] = bg + l.mu.Unlock() +} + +func (l *Logger) SetOutput(w io.Writer) { + l.mu.Lock() + defer l.mu.Unlock() + l.out = w + if f, ok := w.(*os.File); ok { + l.colors = isTerminal(f) + } +} +func (l *Logger) SetLevel(level Level) { l.mu.Lock(); l.level = level; l.mu.Unlock() } +func (l *Logger) EnableTimestamps(on bool) { l.mu.Lock(); l.timeStamp = on; l.mu.Unlock() } +func (l *Logger) SetTimeFormat(tf string) { l.mu.Lock(); l.timeFormat = tf; l.mu.Unlock() } +func (l *Logger) SetJSON(on bool) { l.mu.Lock(); l.json = on; l.mu.Unlock() } +func (l *Logger) EnableColors(on bool) { l.mu.Lock(); l.colors = on; l.mu.Unlock() } +func (l *Logger) ShowCaller(on bool) { l.mu.Lock(); l.caller = on; l.mu.Unlock() } + +func (l *Logger) WithFields(f F) *Logger { + l.mu.Lock() + defer l.mu.Unlock() + newFields := make(F, len(l.fields)+len(f)) + maps.Copy(newFields, l.fields) + maps.Copy(newFields, f) + return &Logger{ + out: l.out, level: l.level, + timeStamp: l.timeStamp, timeFormat: l.timeFormat, + json: l.json, colors: l.colors, caller: l.caller, + fields: newFields, + levelColor: maps.Clone(l.levelColor), + levelColorBg: maps.Clone(l.levelColorBg), + } +} + +func isTerminal(f *os.File) bool { + fi, err := f.Stat() + return err == nil && fi.Mode()&os.ModeCharDevice != 0 +} + +func (l *Logger) Log(level Level, msg string, extra F) { + l.mu.Lock() + out, jsonMode, colors, timeStamp, tf, callerOn := l.out, l.json, l.colors, l.timeStamp, l.timeFormat, l.caller + base := make(F, len(l.fields)) + maps.Copy(base, l.fields) + l.mu.Unlock() + + if level < l.level { + return + } + maps.Copy(base, extra) + + var callerStr string + if callerOn { + if _, file, line, ok := runtime.Caller(3); ok { + callerStr = fmt.Sprintf("%s:%d", shortFile(file), line) + } + } + + if jsonMode { + entry := make(map[string]any, len(base)+4) + entry["level"], entry["msg"] = level.String(), msg + if timeStamp { + entry["time"] = time.Now().Format(tf) + } + if callerStr != "" { + entry["caller"] = callerStr + } + maps.Copy(entry, base) + if b, err := json.Marshal(entry); err != nil { + fmt.Fprintf(out, "json marshal error: %v\n", err) + return + } else { + fmt.Fprintln(out, string(b)) + } + if level == LevelFatal { + os.Exit(1) + } + return + } + + var b strings.Builder + if colors { + if c, ok := l.levelColor[level]; ok { + b.WriteString(c) + } + } + if timeStamp { + b.WriteString(time.Now().Format(tf) + " ") + } + if colors { + if c, ok := l.levelColorBg[level]; ok { + b.WriteString(c + ansiBlack) + } + } + + b.WriteString(" " + level.String() + " ") + if colors { + if c, ok := l.levelColor[level]; ok { + b.WriteString(ansiReset + c) + } + } + b.WriteString(" " + msg) + + if len(base) > 0 { + b.WriteString(" ") + keys := make([]string, 0, len(base)) + for k := range base { + keys = append(keys, k) + } + sort.Strings(keys) + for i, k := range keys { + if i > 0 { + b.WriteString(" ") + } + fmt.Fprintf(&b, "%s=%v", k, base[k]) + } + } + if callerStr != "" { + fmt.Fprintf(&b, " (%s)", callerStr) + } + if colors { + b.WriteString(ansiReset) + } + + fmt.Fprintln(out, b.String()) + if level == LevelFatal { + os.Exit(1) + } +} + +func shortFile(path string) string { + parts := strings.Split(path, "/") + if n := len(parts); n >= 2 { + return strings.Join(parts[n-2:], "/") + } + return path +} + +func (l *Logger) Debug(msg string) { l.Log(LevelDebug, msg, nil) } +func (l *Logger) Info(msg string) { l.Log(LevelInfo, msg, nil) } +func (l *Logger) Warn(msg string) { l.Log(LevelWarn, msg, nil) } +func (l *Logger) Error(msg string) { l.Log(LevelError, msg, nil) } +func (l *Logger) Fatal(msg string) { l.Log(LevelFatal, msg, nil) } + +func (l *Logger) Debugf(f string, a ...any) { l.Log(LevelDebug, fmt.Sprintf(f, a...), nil) } +func (l *Logger) Infof(f string, a ...any) { l.Log(LevelInfo, fmt.Sprintf(f, a...), nil) } +func (l *Logger) Warnf(f string, a ...any) { l.Log(LevelWarn, fmt.Sprintf(f, a...), nil) } +func (l *Logger) Errorf(f string, a ...any) { l.Log(LevelError, fmt.Sprintf(f, a...), nil) } +func (l *Logger) Fatalf(f string, a ...any) { l.Log(LevelFatal, fmt.Sprintf(f, a...), nil) } + +func (l *Logger) Debugw(msg string, f F, a ...any) { l.Log(LevelDebug, fmt.Sprintf(msg, a...), f) } +func (l *Logger) Infow(msg string, f F, a ...any) { l.Log(LevelInfo, fmt.Sprintf(msg, a...), f) } +func (l *Logger) Warnw(msg string, f F, a ...any) { l.Log(LevelWarn, fmt.Sprintf(msg, a...), f) } +func (l *Logger) Errorw(msg string, f F, a ...any) { l.Log(LevelError, fmt.Sprintf(msg, a...), f) } +func (l *Logger) Fatalw(msg string, f F, a ...any) { l.Log(LevelFatal, fmt.Sprintf(msg, a...), f) } + +func SetOutput(w io.Writer) { Log.SetOutput(w) } +func SetLevel(l Level) { Log.SetLevel(l) } +func EnableTimestamps(on bool) { Log.EnableTimestamps(on) } +func SetTimeFormat(tf string) { Log.SetTimeFormat(tf) } +func SetJSON(on bool) { Log.SetJSON(on) } +func EnableColors(on bool) { Log.EnableColors(on) } +func ShowCaller(on bool) { Log.ShowCaller(on) } +func WithFields(f F) *Logger { return Log.WithFields(f) } + +func ParseLevel(s string) (Level, error) { + switch strings.ToLower(strings.TrimSpace(s)) { + case "debug": + return LevelDebug, nil + case "info": + return LevelInfo, nil + case "warn", "warning": + return LevelWarn, nil + case "error", "err": + return LevelError, nil + case "fatal": + return LevelFatal, nil + default: + return LevelInfo, fmt.Errorf("unknown level: %s", s) + } +} From d08b77c8d2f34380fb091cc962da73191a7f26d2 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Fri, 19 Sep 2025 23:35:43 +0200 Subject: [PATCH 03/29] clearer structure --- commands/commands.go | 1 + commands/ping/command.go | 33 ++++++++++++++++++++++++++++++--- events/events.go | 4 ++-- zlog/zlog.go | 19 +------------------ 4 files changed, 34 insertions(+), 23 deletions(-) diff --git a/commands/commands.go b/commands/commands.go index 9a031a5..a03e06f 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -43,5 +43,6 @@ func RegisterCommands(r *cmdroute.Router, st *state.State) { func Sync(st *state.State) error { zlog.Log.Debug("synced commands") + return cmdroute.OverwriteCommands(st, allCommands) } diff --git a/commands/ping/command.go b/commands/ping/command.go index 63f552a..6ef7bd5 100644 --- a/commands/ping/command.go +++ b/commands/ping/command.go @@ -1,20 +1,47 @@ package ping import ( + "fmt" + "runtime" + "time" + "go.fm/commands" "github.com/diamondburned/arikawa/v3/api" "github.com/diamondburned/arikawa/v3/utils/json/option" ) +var startTime = time.Now() + var data = api.CreateCommandData{ - Name: "ping", - Description: "display bot's latency", + Name: "stats", + Description: "display bot's stats", } func handler(c *commands.CommandContext) *api.InteractionResponseData { + var m runtime.MemStats + runtime.ReadMemStats(&m) + + uptime := time.Since(startTime).Round(time.Second) + + stats := fmt.Sprintf( + "uptime: %s\n"+ + "goroutines: %d\n"+ + "memory: %.2f mb (heap: %.2f mb)\n"+ + "gc runs: %d\n"+ + "go version: %s %s/%s", + uptime, + runtime.NumGoroutine(), + float64(m.Alloc)/(1024*1024), + float64(m.HeapAlloc)/(1024*1024), + m.NumGC, + runtime.Version(), + runtime.GOOS, + runtime.GOARCH, + ) + return &api.InteractionResponseData{ - Content: option.NewNullableString("pong."), + Content: option.NewNullableString(stats), } } diff --git a/events/events.go b/events/events.go index 71641ab..d534bfb 100644 --- a/events/events.go +++ b/events/events.go @@ -14,8 +14,8 @@ func init() { func EventReady(c *gateway.ReadyEvent) { zlog.Log.WithFields( zlog.F{ - "username": c.User.Username, - "guild_count": len(c.Guilds), + "tag": c.User.Tag(), + "guilds": len(c.Guilds), }, ).Info("client is ready") } diff --git a/zlog/zlog.go b/zlog/zlog.go index 21d55da..eccc549 100644 --- a/zlog/zlog.go +++ b/zlog/zlog.go @@ -27,7 +27,7 @@ const ( ) func (l Level) String() string { - return [...]string{"DEBUG", "INFO", "WARN", "ERROR", "FATAL !"}[l] + return [...]string{"DBG", "INF", "WRN", "ERR", "FTL"}[l] } type F map[string]any @@ -254,20 +254,3 @@ func SetJSON(on bool) { Log.SetJSON(on) } func EnableColors(on bool) { Log.EnableColors(on) } func ShowCaller(on bool) { Log.ShowCaller(on) } func WithFields(f F) *Logger { return Log.WithFields(f) } - -func ParseLevel(s string) (Level, error) { - switch strings.ToLower(strings.TrimSpace(s)) { - case "debug": - return LevelDebug, nil - case "info": - return LevelInfo, nil - case "warn", "warning": - return LevelWarn, nil - case "error", "err": - return LevelError, nil - case "fatal": - return LevelFatal, nil - default: - return LevelInfo, fmt.Errorf("unknown level: %s", s) - } -} From e2d8650e6dbb2cfe3227f085a8fc8041c76f0ed3 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Sat, 20 Sep 2025 00:25:08 +0200 Subject: [PATCH 04/29] reply helper --- cmd/bot/commands.go | 2 +- commands/commands.go | 26 ++- commands/{ping => stats}/command.go | 26 +-- pkg/emojis/emojis.go | 27 +++ pkg/reply/reply.go | 269 ++++++++++++++++++++++++++++ 5 files changed, 328 insertions(+), 22 deletions(-) rename commands/{ping => stats}/command.go (59%) create mode 100644 pkg/emojis/emojis.go create mode 100644 pkg/reply/reply.go diff --git a/cmd/bot/commands.go b/cmd/bot/commands.go index 14554e5..5d58ef9 100644 --- a/cmd/bot/commands.go +++ b/cmd/bot/commands.go @@ -1,5 +1,5 @@ package main import ( - _ "go.fm/commands/ping" + _ "go.fm/commands/stats" ) diff --git a/commands/commands.go b/commands/commands.go index a03e06f..378da01 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -7,16 +7,18 @@ import ( "github.com/diamondburned/arikawa/v3/api/cmdroute" "github.com/diamondburned/arikawa/v3/state" + "go.fm/pkg/reply" "go.fm/zlog" ) type CommandContext struct { - Ctx context.Context - Data cmdroute.CommandData - St *state.State + Ctx context.Context + Data cmdroute.CommandData + St *state.State + Reply *reply.ResponseManager } -type CommandHandler func(c *CommandContext) *api.InteractionResponseData +type CommandHandler func(c *CommandContext) error var allCommands = []api.CreateCommandData{} var registry = map[string]CommandHandler{} @@ -32,11 +34,19 @@ func RegisterCommands(r *cmdroute.Router, st *state.State) { for name, handler := range registry { h := handler r.AddFunc(name, func(ctx context.Context, data cmdroute.CommandData) *api.InteractionResponseData { - return h(&CommandContext{ - Ctx: ctx, - Data: data, - St: st, + replyManager := reply.New(st, data.Event) + err := h(&CommandContext{ + Ctx: ctx, + Data: data, + St: st, + Reply: replyManager, }) + + if err != nil { + replyManager.QuickEmbed(reply.ErrorEmbed(err.Error())) + } + + return nil }) } } diff --git a/commands/ping/command.go b/commands/stats/command.go similarity index 59% rename from commands/ping/command.go rename to commands/stats/command.go index 6ef7bd5..6e2005f 100644 --- a/commands/ping/command.go +++ b/commands/stats/command.go @@ -1,4 +1,4 @@ -package ping +package stats import ( "fmt" @@ -8,7 +8,7 @@ import ( "go.fm/commands" "github.com/diamondburned/arikawa/v3/api" - "github.com/diamondburned/arikawa/v3/utils/json/option" + "github.com/diamondburned/arikawa/v3/discord" ) var startTime = time.Now() @@ -18,18 +18,20 @@ var data = api.CreateCommandData{ Description: "display bot's stats", } -func handler(c *commands.CommandContext) *api.InteractionResponseData { +func handler(c *commands.CommandContext) error { var m runtime.MemStats runtime.ReadMemStats(&m) uptime := time.Since(startTime).Round(time.Second) - stats := fmt.Sprintf( - "uptime: %s\n"+ - "goroutines: %d\n"+ - "memory: %.2f mb (heap: %.2f mb)\n"+ - "gc runs: %d\n"+ - "go version: %s %s/%s", + embed := discord.Embed{Description: fmt.Sprintf( + "**uptime:** %s\n"+ + "**goroutines:** %d\n"+ + "**memory:** %.2f mb\n"+ + "**heap:** %.2f mb\n"+ + "**gc runs:** %d\n"+ + "**go version:** %s\n"+ + "**platform:** %s/%s", uptime, runtime.NumGoroutine(), float64(m.Alloc)/(1024*1024), @@ -38,11 +40,9 @@ func handler(c *commands.CommandContext) *api.InteractionResponseData { runtime.Version(), runtime.GOOS, runtime.GOARCH, - ) + )} - return &api.InteractionResponseData{ - Content: option.NewNullableString(stats), - } + return c.Reply.QuickEmbed(embed) } func init() { diff --git a/pkg/emojis/emojis.go b/pkg/emojis/emojis.go new file mode 100644 index 0000000..d05604f --- /dev/null +++ b/pkg/emojis/emojis.go @@ -0,0 +1,27 @@ +package emojis + +var ( + EmojiCrown = "" + EmojiQuestionMark = "" + EmojiChat = "" + EmojiNote = "" + EmojiTop = "" + EmojiStar = "" + EmojiFire = "" + EmojiMic = "" + EmojiMic2 = "" + EmojiPlay = "" + EmojiAlbum = "" + EmojiCalendar = "" + + // status + EmojiCross = "" + EmojiCheck = "" + EmojiUpdate = "" + EmojiWarning = "" + + // rank + EmojiRankOne = "" + EmojiRankTwo = "" + EmojiRankThree = "" +) diff --git a/pkg/reply/reply.go b/pkg/reply/reply.go new file mode 100644 index 0000000..ba85542 --- /dev/null +++ b/pkg/reply/reply.go @@ -0,0 +1,269 @@ +package reply + +import ( + "context" + "fmt" + "time" + + "github.com/diamondburned/arikawa/v3/api" + "github.com/diamondburned/arikawa/v3/discord" + "github.com/diamondburned/arikawa/v3/state" + "github.com/diamondburned/arikawa/v3/utils/json/option" + "go.fm/pkg/emojis" +) + +type ResponseManager struct { + state *state.State + interaction *discord.InteractionEvent + token string + appID discord.AppID + deferred bool + responded bool +} + +func New(s *state.State, i *discord.InteractionEvent) *ResponseManager { + return &ResponseManager{ + state: s, + interaction: i, + token: i.Token, + appID: i.AppID, + } +} + +type ResponseBuilder struct { + manager *ResponseManager + data api.InteractionResponseData +} + +func (rm *ResponseManager) Reply() *ResponseBuilder { + return &ResponseBuilder{ + manager: rm, + data: api.InteractionResponseData{}, + } +} + +func (rm *ResponseManager) Defer(flags ...discord.MessageFlags) *DeferredResponse { + if rm.responded { + return &DeferredResponse{manager: rm, err: fmt.Errorf("already responded")} + } + + var combinedFlags discord.MessageFlags + for _, flag := range flags { + combinedFlags |= flag + } + + response := api.InteractionResponse{Type: api.DeferredMessageInteractionWithSource} + if combinedFlags != 0 { + response.Data = &api.InteractionResponseData{Flags: combinedFlags} + } + + err := rm.state.RespondInteraction(rm.interaction.ID, rm.token, response) + rm.deferred = true + rm.responded = true + + return &DeferredResponse{manager: rm, err: err} +} + +func (rm *ResponseManager) FollowUp() *FollowUpBuilder { + return &FollowUpBuilder{manager: rm, data: api.InteractionResponseData{}} +} + +func (rb *ResponseBuilder) Content(content string) *ResponseBuilder { + rb.data.Content = option.NewNullableString(content) + return rb +} + +func (rb *ResponseBuilder) Embed(embed discord.Embed) *ResponseBuilder { + rb.data.Embeds = &[]discord.Embed{embed} + return rb +} + +func (rb *ResponseBuilder) Embeds(embeds ...discord.Embed) *ResponseBuilder { + rb.data.Embeds = &embeds + return rb +} + +func (rb *ResponseBuilder) Components(components discord.ContainerComponents) *ResponseBuilder { + rb.data.Components = &components + return rb +} + +func (rb *ResponseBuilder) Flags(flags ...discord.MessageFlags) *ResponseBuilder { + for _, flag := range flags { + rb.data.Flags |= flag + } + return rb +} + +func (rb *ResponseBuilder) Send() error { + if rb.manager.responded { + return fmt.Errorf("already responded") + } + + err := rb.manager.state.RespondInteraction( + rb.manager.interaction.ID, + rb.manager.token, + api.InteractionResponse{ + Type: api.MessageInteractionWithSource, + Data: &rb.data, + }, + ) + + rb.manager.responded = true + return err +} + +type DeferredResponse struct { + manager *ResponseManager + err error +} + +func (dr *DeferredResponse) Error() error { + return dr.err +} + +func (dr *DeferredResponse) Edit() *EditBuilder { + return &EditBuilder{manager: dr.manager, data: api.EditInteractionResponseData{}} +} + +type EditBuilder struct { + manager *ResponseManager + data api.EditInteractionResponseData +} + +func (eb *EditBuilder) Content(content string) *EditBuilder { + eb.data.Content = option.NewNullableString(content) + return eb +} + +func (eb *EditBuilder) Embed(embed discord.Embed) *EditBuilder { + eb.data.Embeds = &[]discord.Embed{embed} + return eb +} + +func (eb *EditBuilder) Embeds(embeds ...discord.Embed) *EditBuilder { + eb.data.Embeds = &embeds + return eb +} + +func (eb *EditBuilder) Components(components discord.ContainerComponents) *EditBuilder { + eb.data.Components = &components + return eb +} + +func (eb *EditBuilder) Clear() *EditBuilder { + eb.data.Content = option.NewNullableString("") + eb.data.Embeds = &[]discord.Embed{} + eb.data.Components = &discord.ContainerComponents{} + return eb +} + +func (eb *EditBuilder) Send() (*discord.Message, error) { + return eb.manager.state.EditInteractionResponse(eb.manager.appID, eb.manager.token, eb.data) +} + +type FollowUpBuilder struct { + manager *ResponseManager + data api.InteractionResponseData +} + +func (fb *FollowUpBuilder) Content(content string) *FollowUpBuilder { + fb.data.Content = option.NewNullableString(content) + return fb +} + +func (fb *FollowUpBuilder) Embed(embed discord.Embed) *FollowUpBuilder { + fb.data.Embeds = &[]discord.Embed{embed} + return fb +} + +func (fb *FollowUpBuilder) Embeds(embeds ...discord.Embed) *FollowUpBuilder { + fb.data.Embeds = &embeds + return fb +} + +func (fb *FollowUpBuilder) Components(components discord.ContainerComponents) *FollowUpBuilder { + fb.data.Components = &components + return fb +} + +func (fb *FollowUpBuilder) Flags(flags ...discord.MessageFlags) *FollowUpBuilder { + for _, flag := range flags { + fb.data.Flags |= flag + } + return fb +} + +func (fb *FollowUpBuilder) Send() (*discord.Message, error) { + return fb.manager.state.FollowUpInteraction(fb.manager.appID, fb.manager.token, fb.data) +} + +func (rm *ResponseManager) Quick(content string, flags ...discord.MessageFlags) error { + builder := rm.Reply().Content(content) + if len(flags) > 0 { + builder = builder.Flags(flags...) + } + return builder.Send() +} + +func (rm *ResponseManager) QuickEmbed(embed discord.Embed, flags ...discord.MessageFlags) error { + builder := rm.Reply().Embed(embed) + if len(flags) > 0 { + builder = builder.Flags(flags...) + } + return builder.Send() +} + +func (rm *ResponseManager) AutoDefer(fn func() (*EditBuilder, error), flags ...discord.MessageFlags) error { + deferred := rm.Defer(flags...) + if deferred.Error() != nil { + return deferred.Error() + } + + editBuilder, err := fn() + if err != nil { + _, err := deferred.Edit().Content(fmt.Sprintf("โŒ Error: %v", err)).Send() + return err + } + + _, err = editBuilder.Send() + return err +} + +func ErrorEmbed(description string) discord.Embed { + return discord.Embed{ + Description: fmt.Sprintf("%s %s", emojis.EmojiCross, description), + Color: 0xFF0000, + } +} + +func SuccessEmbed(description string) discord.Embed { + return discord.Embed{ + Description: fmt.Sprintf("%s %s", emojis.EmojiCheck, description), + Color: 0x00FF00, + } +} + +func InfoEmbed(description string) discord.Embed { + return discord.Embed{ + Description: fmt.Sprintf("%s %s", emojis.EmojiChat, description), + Color: 0x0099FF, + } +} + +func WithTimeout(ctx context.Context, timeout time.Duration, fn func() error) error { + ctx, cancel := context.WithTimeout(ctx, timeout) + defer cancel() + + done := make(chan error, 1) + go func() { + done <- fn() + }() + + select { + case err := <-done: + return err + case <-ctx.Done(): + return ctx.Err() + } +} From 3255f75dfacbc8118e70ec3c17e58604232ae6e1 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Sat, 20 Sep 2025 02:06:13 +0200 Subject: [PATCH 05/29] database twin :v: --- cmd/bot/bot.go | 12 +++- cmd/bot/commands.go | 1 + commands/commands.go | 5 +- commands/setuser/command.go | 59 ++++++++++++++++++ db/db.go | 118 ++++++++++++++++++++++++++++++++++++ db/models.go | 15 +++++ db/queries.sql.go | 62 +++++++++++++++++++ db/sql/queries.sql | 18 ++++++ db/sql/schema.sql | 8 +++ db/start.go | 40 ++++++++++++ go.mod | 5 +- go.sum | 2 + pkg/reply/reply.go | 10 +-- sqlc.yaml | 14 +++++ zlog/zlog.go | 4 +- 15 files changed, 362 insertions(+), 11 deletions(-) create mode 100644 commands/setuser/command.go create mode 100644 db/db.go create mode 100644 db/models.go create mode 100644 db/queries.sql.go create mode 100644 db/sql/queries.sql create mode 100644 db/sql/schema.sql create mode 100644 db/start.go create mode 100644 sqlc.yaml diff --git a/cmd/bot/bot.go b/cmd/bot/bot.go index a72a609..48cfde1 100644 --- a/cmd/bot/bot.go +++ b/cmd/bot/bot.go @@ -10,6 +10,7 @@ import ( "github.com/diamondburned/arikawa/v3/state" "go.fm/commands" + "go.fm/db" "go.fm/events" "go.fm/zlog" ) @@ -22,7 +23,14 @@ func main() { s := state.New("Bot " + discordToken) r := cmdroute.NewRouter() - commands.RegisterCommands(r, s) + q, db, err := db.Start(context.Background(), "file:database.db?_foreign_keys=on") + if err != nil { + zlog.Log.Fatalf("failed to connect database: %v", err) + } + defer db.Close() + + // register commands + commands.RegisterCommands(r, s, q) // command handlers if err := commands.Sync(s); err != nil { @@ -46,7 +54,7 @@ func main() { defer s.Close() // set status - err := s.Gateway().Send( + err = s.Gateway().Send( context.Background(), &gateway.UpdatePresenceCommand{ Since: discord.UnixMsTimestamp(0), diff --git a/cmd/bot/commands.go b/cmd/bot/commands.go index 5d58ef9..6f23b91 100644 --- a/cmd/bot/commands.go +++ b/cmd/bot/commands.go @@ -1,5 +1,6 @@ package main import ( + _ "go.fm/commands/setuser" _ "go.fm/commands/stats" ) diff --git a/commands/commands.go b/commands/commands.go index 378da01..47ba8d7 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -7,6 +7,7 @@ import ( "github.com/diamondburned/arikawa/v3/api/cmdroute" "github.com/diamondburned/arikawa/v3/state" + "go.fm/db" "go.fm/pkg/reply" "go.fm/zlog" ) @@ -16,6 +17,7 @@ type CommandContext struct { Data cmdroute.CommandData St *state.State Reply *reply.ResponseManager + Db *db.Queries } type CommandHandler func(c *CommandContext) error @@ -30,7 +32,7 @@ func Register(meta api.CreateCommandData, handler CommandHandler) { registry[meta.Name] = handler } -func RegisterCommands(r *cmdroute.Router, st *state.State) { +func RegisterCommands(r *cmdroute.Router, st *state.State, q *db.Queries) { for name, handler := range registry { h := handler r.AddFunc(name, func(ctx context.Context, data cmdroute.CommandData) *api.InteractionResponseData { @@ -40,6 +42,7 @@ func RegisterCommands(r *cmdroute.Router, st *state.State) { Data: data, St: st, Reply: replyManager, + Db: q, }) if err != nil { diff --git a/commands/setuser/command.go b/commands/setuser/command.go new file mode 100644 index 0000000..cb72ae4 --- /dev/null +++ b/commands/setuser/command.go @@ -0,0 +1,59 @@ +package setuser + +import ( + "database/sql" + "errors" + "fmt" + "github.com/diamondburned/arikawa/v3/api" + "github.com/diamondburned/arikawa/v3/discord" + "go.fm/commands" + "go.fm/db" + "go.fm/pkg/reply" +) + +var data = api.CreateCommandData{ + Name: "set-user", + Description: "set your last.fm username for go.fm", + Options: discord.CommandOptions{ + discord.NewStringOption("username", "your last.fm username", true), + }, +} + +var options struct { + Username string `discord:"username"` +} + +func handler(c *commands.CommandContext) error { + return c.Reply.AutoDefer(func(edit *reply.EditBuilder) error { + if err := c.Data.Options.Unmarshal(&options); err != nil { + return err + } + + userID := c.Data.Event.Member.User.ID + + user, err := c.Db.GetUserByLastFM(c.Ctx, options.Username) + if err != nil && !errors.Is(err, sql.ErrNoRows) { + return fmt.Errorf("failed to check username: %w", err) + } + if err == nil && user.UserID != userID.String() { + return fmt.Errorf("the username **%s** is already linked to another discord user", options.Username) + } + if err == nil && user.UserID == userID.String() { + return fmt.Errorf("your username is already set to **%s**", options.Username) + } + + err = c.Db.UpsertUser(c.Ctx, db.UpsertUserParams{ + UserID: userID.String(), + LastfmUsername: options.Username, + }) + if err != nil { + return fmt.Errorf("failed to update username: %w", err) + } + + _, err = edit.Embed(reply.SuccessEmbed(fmt.Sprintf("updated your username to **%s**", options.Username))).Send() + return err + }) +} +func init() { + commands.Register(data, handler) +} diff --git a/db/db.go b/db/db.go new file mode 100644 index 0000000..9ba5d23 --- /dev/null +++ b/db/db.go @@ -0,0 +1,118 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.30.0 + +package db + +import ( + "context" + "database/sql" + "fmt" +) + +type DBTX interface { + ExecContext(context.Context, string, ...interface{}) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...interface{}) *sql.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +func Prepare(ctx context.Context, db DBTX) (*Queries, error) { + q := Queries{db: db} + var err error + if q.deleteUserStmt, err = db.PrepareContext(ctx, deleteUser); err != nil { + return nil, fmt.Errorf("error preparing query DeleteUser: %w", err) + } + if q.getUserByIDStmt, err = db.PrepareContext(ctx, getUserByID); err != nil { + return nil, fmt.Errorf("error preparing query GetUserByID: %w", err) + } + if q.getUserByLastFMStmt, err = db.PrepareContext(ctx, getUserByLastFM); err != nil { + return nil, fmt.Errorf("error preparing query GetUserByLastFM: %w", err) + } + if q.upsertUserStmt, err = db.PrepareContext(ctx, upsertUser); err != nil { + return nil, fmt.Errorf("error preparing query UpsertUser: %w", err) + } + return &q, nil +} + +func (q *Queries) Close() error { + var err error + if q.deleteUserStmt != nil { + if cerr := q.deleteUserStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing deleteUserStmt: %w", cerr) + } + } + if q.getUserByIDStmt != nil { + if cerr := q.getUserByIDStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing getUserByIDStmt: %w", cerr) + } + } + if q.getUserByLastFMStmt != nil { + if cerr := q.getUserByLastFMStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing getUserByLastFMStmt: %w", cerr) + } + } + if q.upsertUserStmt != nil { + if cerr := q.upsertUserStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing upsertUserStmt: %w", cerr) + } + } + return err +} + +func (q *Queries) exec(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (sql.Result, error) { + switch { + case stmt != nil && q.tx != nil: + return q.tx.StmtContext(ctx, stmt).ExecContext(ctx, args...) + case stmt != nil: + return stmt.ExecContext(ctx, args...) + default: + return q.db.ExecContext(ctx, query, args...) + } +} + +func (q *Queries) query(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (*sql.Rows, error) { + switch { + case stmt != nil && q.tx != nil: + return q.tx.StmtContext(ctx, stmt).QueryContext(ctx, args...) + case stmt != nil: + return stmt.QueryContext(ctx, args...) + default: + return q.db.QueryContext(ctx, query, args...) + } +} + +func (q *Queries) queryRow(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) *sql.Row { + switch { + case stmt != nil && q.tx != nil: + return q.tx.StmtContext(ctx, stmt).QueryRowContext(ctx, args...) + case stmt != nil: + return stmt.QueryRowContext(ctx, args...) + default: + return q.db.QueryRowContext(ctx, query, args...) + } +} + +type Queries struct { + db DBTX + tx *sql.Tx + deleteUserStmt *sql.Stmt + getUserByIDStmt *sql.Stmt + getUserByLastFMStmt *sql.Stmt + upsertUserStmt *sql.Stmt +} + +func (q *Queries) WithTx(tx *sql.Tx) *Queries { + return &Queries{ + db: tx, + tx: tx, + deleteUserStmt: q.deleteUserStmt, + getUserByIDStmt: q.getUserByIDStmt, + getUserByLastFMStmt: q.getUserByLastFMStmt, + upsertUserStmt: q.upsertUserStmt, + } +} diff --git a/db/models.go b/db/models.go new file mode 100644 index 0000000..7098ff2 --- /dev/null +++ b/db/models.go @@ -0,0 +1,15 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.30.0 + +package db + +import ( + "time" +) + +type User struct { + UserID string + LastfmUsername string + CreatedAt *time.Time +} diff --git a/db/queries.sql.go b/db/queries.sql.go new file mode 100644 index 0000000..4109df8 --- /dev/null +++ b/db/queries.sql.go @@ -0,0 +1,62 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.30.0 +// source: queries.sql + +package db + +import ( + "context" +) + +const deleteUser = `-- name: DeleteUser :exec +DELETE FROM users +WHERE user_id = ?1 +` + +func (q *Queries) DeleteUser(ctx context.Context, userID string) error { + _, err := q.exec(ctx, q.deleteUserStmt, deleteUser, userID) + return err +} + +const getUserByID = `-- name: GetUserByID :one +SELECT user_id, lastfm_username, created_at +FROM users +WHERE user_id = ?1 +` + +func (q *Queries) GetUserByID(ctx context.Context, userID string) (User, error) { + row := q.queryRow(ctx, q.getUserByIDStmt, getUserByID, userID) + var i User + err := row.Scan(&i.UserID, &i.LastfmUsername, &i.CreatedAt) + return i, err +} + +const getUserByLastFM = `-- name: GetUserByLastFM :one +SELECT user_id, lastfm_username, created_at +FROM users +WHERE lastfm_username = ?1 +` + +func (q *Queries) GetUserByLastFM(ctx context.Context, lastfmUsername string) (User, error) { + row := q.queryRow(ctx, q.getUserByLastFMStmt, getUserByLastFM, lastfmUsername) + var i User + err := row.Scan(&i.UserID, &i.LastfmUsername, &i.CreatedAt) + return i, err +} + +const upsertUser = `-- name: UpsertUser :exec +INSERT INTO users (user_id, lastfm_username) +VALUES (?1, ?2) +ON CONFLICT(user_id) DO UPDATE SET lastfm_username = excluded.lastfm_username +` + +type UpsertUserParams struct { + UserID string + LastfmUsername string +} + +func (q *Queries) UpsertUser(ctx context.Context, arg UpsertUserParams) error { + _, err := q.exec(ctx, q.upsertUserStmt, upsertUser, arg.UserID, arg.LastfmUsername) + return err +} diff --git a/db/sql/queries.sql b/db/sql/queries.sql new file mode 100644 index 0000000..9a6c299 --- /dev/null +++ b/db/sql/queries.sql @@ -0,0 +1,18 @@ +-- name: UpsertUser :exec +INSERT INTO users (user_id, lastfm_username) +VALUES (:user_id, :lastfm_username) +ON CONFLICT(user_id) DO UPDATE SET lastfm_username = excluded.lastfm_username; + +-- name: GetUserByID :one +SELECT user_id, lastfm_username, created_at +FROM users +WHERE user_id = :user_id; + +-- name: GetUserByLastFM :one +SELECT user_id, lastfm_username, created_at +FROM users +WHERE lastfm_username = :lastfm_username; + +-- name: DeleteUser :exec +DELETE FROM users +WHERE user_id = :user_id; diff --git a/db/sql/schema.sql b/db/sql/schema.sql new file mode 100644 index 0000000..0e11f0b --- /dev/null +++ b/db/sql/schema.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS users ( + user_id TEXT PRIMARY KEY, + lastfm_username TEXT NOT NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP +); + +CREATE UNIQUE INDEX IF NOT EXISTS idx_users_lastfm_username +ON users(lastfm_username); diff --git a/db/start.go b/db/start.go new file mode 100644 index 0000000..5462386 --- /dev/null +++ b/db/start.go @@ -0,0 +1,40 @@ +package db + +import ( + "context" + "database/sql" + "fmt" + "time" + + _ "embed" + + _ "github.com/mattn/go-sqlite3" + "go.fm/zlog" +) + +//go:embed sql/schema.sql +var schema string + +func Start(ctx context.Context, path string) (*Queries, *sql.DB, error) { + sqlDB, err := sql.Open("sqlite3", path) + if err != nil { + return nil, nil, fmt.Errorf("failed to open database: %w", err) + } + + sqlDB.SetMaxOpenConns(1) + sqlDB.SetConnMaxLifetime(time.Minute) + + if _, err := sqlDB.ExecContext(ctx, schema); err != nil { + sqlDB.Close() + return nil, nil, fmt.Errorf("failed to create schema: %w", err) + } + + queries, err := Prepare(ctx, sqlDB) + if err != nil { + return nil, nil, fmt.Errorf("failed to prepare queries: %w", err) + } + + zlog.Log.Info("started database connection") + + return queries, sqlDB, nil +} diff --git a/go.mod b/go.mod index d7b5c7e..5cd9cdb 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,10 @@ module go.fm go 1.25.0 -require github.com/diamondburned/arikawa/v3 v3.6.0 +require ( + github.com/diamondburned/arikawa/v3 v3.6.0 + github.com/mattn/go-sqlite3 v1.14.32 +) require ( github.com/gorilla/schema v1.4.1 // indirect diff --git a/go.sum b/go.sum index 4ec3cf8..f66bd4b 100644 --- a/go.sum +++ b/go.sum @@ -4,5 +4,7 @@ github.com/gorilla/schema v1.4.1 h1:jUg5hUjCSDZpNGLuXQOgIWGdlgrIdYvgQ0wZtdK1M3E= github.com/gorilla/schema v1.4.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= +github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= diff --git a/pkg/reply/reply.go b/pkg/reply/reply.go index ba85542..226142f 100644 --- a/pkg/reply/reply.go +++ b/pkg/reply/reply.go @@ -214,20 +214,20 @@ func (rm *ResponseManager) QuickEmbed(embed discord.Embed, flags ...discord.Mess return builder.Send() } -func (rm *ResponseManager) AutoDefer(fn func() (*EditBuilder, error), flags ...discord.MessageFlags) error { +func (rm *ResponseManager) AutoDefer(fn func(edit *EditBuilder) error, flags ...discord.MessageFlags) error { deferred := rm.Defer(flags...) if deferred.Error() != nil { return deferred.Error() } - editBuilder, err := fn() + editBuilder := deferred.Edit() + err := fn(editBuilder) if err != nil { - _, err := deferred.Edit().Content(fmt.Sprintf("โŒ Error: %v", err)).Send() + _, err := editBuilder.Clear().Embed(ErrorEmbed(err.Error())).Send() return err } - _, err = editBuilder.Send() - return err + return nil } func ErrorEmbed(description string) discord.Embed { diff --git a/sqlc.yaml b/sqlc.yaml new file mode 100644 index 0000000..5c7fc95 --- /dev/null +++ b/sqlc.yaml @@ -0,0 +1,14 @@ +version: "2" + +sql: + - engine: "sqlite" + schema: "db/sql/schema.sql" + queries: "db/sql/queries.sql" + database: + uri: "file:database.db?_foreign_keys=on" + gen: + go: + package: "db" + out: "db" + emit_prepared_queries: true + emit_interface: false diff --git a/zlog/zlog.go b/zlog/zlog.go index eccc549..7d256db 100644 --- a/zlog/zlog.go +++ b/zlog/zlog.go @@ -41,14 +41,14 @@ var ( LevelInfo: "\u001b[34m", LevelWarn: "\u001b[33m", LevelError: "\u001b[31m", - LevelFatal: "\u001b[35;1m", + LevelFatal: "\u001b[35m", } defaultLevelColorBg = map[Level]string{ LevelDebug: "\u001b[47m", LevelInfo: "\u001b[44m", LevelWarn: "\u001b[43m", LevelError: "\u001b[41m", - LevelFatal: "\u001b[45;1m", + LevelFatal: "\u001b[45m", } ) From db9af70cb9e82efd2daaf1b2e6b38814fec7f750 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Sat, 20 Sep 2025 16:11:00 +0200 Subject: [PATCH 06/29] load envs on makefile --- Makefile | 5 +++++ README.md | 33 +++++++++++++++++++++++++++++++-- cmd/bot/bot.go | 4 +--- commands/commands.go | 22 +++++----------------- commands/setuser/command.go | 5 +++-- commands/stats/command.go | 8 +++----- commands/types.go | 24 ++++++++++++++++++++++++ pkg/reply/reply.go | 3 +-- 8 files changed, 73 insertions(+), 31 deletions(-) create mode 100644 commands/types.go diff --git a/Makefile b/Makefile index 3dd0311..ca0e71d 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,8 @@ +ifneq (,$(wildcard .env)) + include .env + export +endif + module := go.fm bin := gofm pkg := ./cmd/bot diff --git a/README.md b/README.md index 2818d96..7a288cc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,34 @@ # go.fm -your last.fm stats within Discord. +your last.fm stats within Discord, isn't it great? -### readme wip. +## installation + +### clone repo (via http or ssh) + +```sh +$ git clone https://github.com/nxtgo/go.fm +``` + +### create an .env + +```env +DISCORD_TOKEN=token_here +``` + +### run using Makefile + +```sh +$ make build; make run +``` + +running without Make **won't work** as Makefile loads +env file. if you want to avoid using Make, pass the +env variables on command invokation or use a [go env loader](https://github.com/nxtgo/env). + +# license + +all original content in this project is dedicated to the public domain under the +[CC0 1.0 universal](https://creativecommons.org/publicdomain/zero/1.0/). +this grants you the freedom to use, modify, and distribute the content +without any restrictions or attribution requirements. diff --git a/cmd/bot/bot.go b/cmd/bot/bot.go index 48cfde1..acb8ee8 100644 --- a/cmd/bot/bot.go +++ b/cmd/bot/bot.go @@ -2,17 +2,15 @@ package main import ( "context" - "os" - "github.com/diamondburned/arikawa/v3/api/cmdroute" "github.com/diamondburned/arikawa/v3/discord" "github.com/diamondburned/arikawa/v3/gateway" "github.com/diamondburned/arikawa/v3/state" - "go.fm/commands" "go.fm/db" "go.fm/events" "go.fm/zlog" + "os" ) func main() { diff --git a/commands/commands.go b/commands/commands.go index 47ba8d7..4af9631 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -2,26 +2,14 @@ package commands import ( "context" - "github.com/diamondburned/arikawa/v3/api" "github.com/diamondburned/arikawa/v3/api/cmdroute" "github.com/diamondburned/arikawa/v3/state" - "go.fm/db" "go.fm/pkg/reply" "go.fm/zlog" ) -type CommandContext struct { - Ctx context.Context - Data cmdroute.CommandData - St *state.State - Reply *reply.ResponseManager - Db *db.Queries -} - -type CommandHandler func(c *CommandContext) error - var allCommands = []api.CreateCommandData{} var registry = map[string]CommandHandler{} @@ -38,11 +26,11 @@ func RegisterCommands(r *cmdroute.Router, st *state.State, q *db.Queries) { r.AddFunc(name, func(ctx context.Context, data cmdroute.CommandData) *api.InteractionResponseData { replyManager := reply.New(st, data.Event) err := h(&CommandContext{ - Ctx: ctx, - Data: data, - St: st, - Reply: replyManager, - Db: q, + Context: ctx, + Data: data, + State: st, + Reply: replyManager, + Query: q, }) if err != nil { diff --git a/commands/setuser/command.go b/commands/setuser/command.go index cb72ae4..2485f18 100644 --- a/commands/setuser/command.go +++ b/commands/setuser/command.go @@ -31,7 +31,7 @@ func handler(c *commands.CommandContext) error { userID := c.Data.Event.Member.User.ID - user, err := c.Db.GetUserByLastFM(c.Ctx, options.Username) + user, err := c.Query.GetUserByLastFM(c.Context, options.Username) if err != nil && !errors.Is(err, sql.ErrNoRows) { return fmt.Errorf("failed to check username: %w", err) } @@ -42,7 +42,7 @@ func handler(c *commands.CommandContext) error { return fmt.Errorf("your username is already set to **%s**", options.Username) } - err = c.Db.UpsertUser(c.Ctx, db.UpsertUserParams{ + err = c.Query.UpsertUser(c.Context, db.UpsertUserParams{ UserID: userID.String(), LastfmUsername: options.Username, }) @@ -54,6 +54,7 @@ func handler(c *commands.CommandContext) error { return err }) } + func init() { commands.Register(data, handler) } diff --git a/commands/stats/command.go b/commands/stats/command.go index 6e2005f..3d6d1ec 100644 --- a/commands/stats/command.go +++ b/commands/stats/command.go @@ -2,13 +2,11 @@ package stats import ( "fmt" - "runtime" - "time" - - "go.fm/commands" - "github.com/diamondburned/arikawa/v3/api" "github.com/diamondburned/arikawa/v3/discord" + "go.fm/commands" + "runtime" + "time" ) var startTime = time.Now() diff --git a/commands/types.go b/commands/types.go new file mode 100644 index 0000000..87eb392 --- /dev/null +++ b/commands/types.go @@ -0,0 +1,24 @@ +package commands + +import ( + "context" + + "github.com/diamondburned/arikawa/v3/api/cmdroute" + "github.com/diamondburned/arikawa/v3/state" + "go.fm/db" + "go.fm/pkg/reply" +) + +type CommandContext struct { + Context context.Context + Data cmdroute.CommandData + State *state.State + Reply *reply.ResponseManager + Query *db.Queries +} + +type CommandHandler func(c *CommandContext) error + +func (ctx *CommandContext) GetUserOrFallback() { + panic("GetUserOrFallback shouldn't be called, not implemented yet, lol") +} diff --git a/pkg/reply/reply.go b/pkg/reply/reply.go index 226142f..c4ff512 100644 --- a/pkg/reply/reply.go +++ b/pkg/reply/reply.go @@ -3,13 +3,12 @@ package reply import ( "context" "fmt" - "time" - "github.com/diamondburned/arikawa/v3/api" "github.com/diamondburned/arikawa/v3/discord" "github.com/diamondburned/arikawa/v3/state" "github.com/diamondburned/arikawa/v3/utils/json/option" "go.fm/pkg/emojis" + "time" ) type ResponseManager struct { From 070c696870d74f9ba5e3a1198fe299c1bbc3db77 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Sun, 21 Sep 2025 00:43:40 +0200 Subject: [PATCH 07/29] i fucking hate discord --- cmd/bot/commands.go | 1 + commands/commands.go | 30 ++++++--- commands/profile/command.go | 46 ++++++++++++++ commands/setuser/command.go | 6 ++ commands/types.go | 37 ++++++++++- last.fm/client.go | 118 ++++++++++++++++++++++++++++++++++++ last.fm/services.go | 19 ++++++ last.fm/user.go | 40 ++++++++++++ last.fm/user_types.go | 68 +++++++++++++++++++++ 9 files changed, 356 insertions(+), 9 deletions(-) create mode 100644 commands/profile/command.go create mode 100644 last.fm/client.go create mode 100644 last.fm/services.go create mode 100644 last.fm/user.go create mode 100644 last.fm/user_types.go diff --git a/cmd/bot/commands.go b/cmd/bot/commands.go index 6f23b91..f958b19 100644 --- a/cmd/bot/commands.go +++ b/cmd/bot/commands.go @@ -1,6 +1,7 @@ package main import ( + _ "go.fm/commands/profile" _ "go.fm/commands/setuser" _ "go.fm/commands/stats" ) diff --git a/commands/commands.go b/commands/commands.go index 4af9631..8b7bc44 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -2,10 +2,14 @@ package commands import ( "context" + "os" + "time" + "github.com/diamondburned/arikawa/v3/api" "github.com/diamondburned/arikawa/v3/api/cmdroute" "github.com/diamondburned/arikawa/v3/state" "go.fm/db" + lastfm "go.fm/last.fm" "go.fm/pkg/reply" "go.fm/zlog" ) @@ -21,20 +25,33 @@ func Register(meta api.CreateCommandData, handler CommandHandler) { } func RegisterCommands(r *cmdroute.Router, st *state.State, q *db.Queries) { + lastFMApiKey := os.Getenv("LASTFM_API_KEY") + if lastFMApiKey == "" { + zlog.Log.Fatal("missing LASTFM_API_KEY env") + } + for name, handler := range registry { h := handler r.AddFunc(name, func(ctx context.Context, data cmdroute.CommandData) *api.InteractionResponseData { - replyManager := reply.New(st, data.Event) - err := h(&CommandContext{ + commandContext := &CommandContext{ Context: ctx, Data: data, State: st, - Reply: replyManager, + Reply: reply.New(st, data.Event), Query: q, - }) + Last: lastfm.NewServicesWithAPIKey(lastFMApiKey, lastfm.WithTimeout(time.Second*15)), + } + + defer func() { + if rec := recover(); rec != nil { + zlog.Log.Errorf("panic occurred in command handler: %v", rec) + commandContext.Reply.QuickEmbed(reply.ErrorEmbed("something happened :(")) + } + }() + err := h(commandContext) if err != nil { - replyManager.QuickEmbed(reply.ErrorEmbed(err.Error())) + commandContext.Reply.QuickEmbed(reply.ErrorEmbed(err.Error())) } return nil @@ -43,7 +60,6 @@ func RegisterCommands(r *cmdroute.Router, st *state.State, q *db.Queries) { } func Sync(st *state.State) error { - zlog.Log.Debug("synced commands") - + defer zlog.Log.Debug("synced commands") return cmdroute.OverwriteCommands(st, allCommands) } diff --git a/commands/profile/command.go b/commands/profile/command.go new file mode 100644 index 0000000..9abb0c2 --- /dev/null +++ b/commands/profile/command.go @@ -0,0 +1,46 @@ +package profile + +import ( + "github.com/diamondburned/arikawa/v3/api" + "github.com/diamondburned/arikawa/v3/discord" + "go.fm/commands" + lastfm "go.fm/last.fm" + "go.fm/pkg/reply" +) + +var data = api.CreateCommandData{ + Name: "profile", + Description: "display your last.fm profile or another user's", + Options: discord.CommandOptions{ + discord.NewStringOption("user", "user to display profile from", false), + }, +} + +var options struct { + User *string `discord:"user"` +} + +func handler(c *commands.CommandContext) error { + return c.Reply.AutoDefer(func(edit *reply.EditBuilder) error { + if err := c.Data.Options.Unmarshal(&options); err != nil { + return err + } + + username, err := c.GetUserOrFallback() + if err != nil { + return err + } + + user, err := c.Last.User.GetInfo(lastfm.P{"user": username}) + if err != nil { + return err + } + + _, err = edit.Content(user.Name).Send() + return err + }) +} + +func init() { + commands.Register(data, handler) +} diff --git a/commands/setuser/command.go b/commands/setuser/command.go index 2485f18..3a051ed 100644 --- a/commands/setuser/command.go +++ b/commands/setuser/command.go @@ -4,10 +4,12 @@ import ( "database/sql" "errors" "fmt" + "github.com/diamondburned/arikawa/v3/api" "github.com/diamondburned/arikawa/v3/discord" "go.fm/commands" "go.fm/db" + lastfm "go.fm/last.fm" "go.fm/pkg/reply" ) @@ -29,6 +31,10 @@ func handler(c *commands.CommandContext) error { return err } + if _, err := c.Last.User.GetInfo(lastfm.P{"user": options.Username}); err != nil { + return fmt.Errorf("user **%s** doesn't exist in last.fm", options.Username) + } + userID := c.Data.Event.Member.User.ID user, err := c.Query.GetUserByLastFM(c.Context, options.Username) diff --git a/commands/types.go b/commands/types.go index 87eb392..18d8f97 100644 --- a/commands/types.go +++ b/commands/types.go @@ -2,10 +2,13 @@ package commands import ( "context" + "strings" "github.com/diamondburned/arikawa/v3/api/cmdroute" + "github.com/diamondburned/arikawa/v3/discord" "github.com/diamondburned/arikawa/v3/state" "go.fm/db" + lastfm "go.fm/last.fm" "go.fm/pkg/reply" ) @@ -15,10 +18,40 @@ type CommandContext struct { State *state.State Reply *reply.ResponseManager Query *db.Queries + Last *lastfm.Services } type CommandHandler func(c *CommandContext) error -func (ctx *CommandContext) GetUserOrFallback() { - panic("GetUserOrFallback shouldn't be called, not implemented yet, lol") +func (ctx *CommandContext) GetUserOrFallback() (string, error) { + optionData := ctx.Data.Options.Find("user") + option := optionData.String() + + if option == "" { + user, err := ctx.Query.GetUserByID(ctx.Context, ctx.Data.Event.Member.User.ID.String()) + if err != nil { + return "", err + } + return user.LastfmUsername, nil + } + + userOption := normalizeUserInput(option) + + if _, err := discord.ParseSnowflake(userOption); err == nil { + user, err := ctx.Query.GetUserByID(ctx.Context, userOption) + if err != nil { + return "", err + } + return user.LastfmUsername, nil + } + + return userOption, nil +} + +func normalizeUserInput(input string) string { + if strings.HasPrefix(input, "<@") && strings.HasSuffix(input, ">") { + trimmed := strings.TrimSuffix(strings.TrimPrefix(input, "<@"), ">") + return strings.TrimPrefix(trimmed, "!") + } + return input } diff --git a/last.fm/client.go b/last.fm/client.go new file mode 100644 index 0000000..db119c2 --- /dev/null +++ b/last.fm/client.go @@ -0,0 +1,118 @@ +package lastfm + +import ( + "encoding/xml" + "fmt" + "io" + "net/http" + "net/url" + "time" +) + +const ( + BaseURL = "https://ws.audioscrobbler.com/2.0/" +) + +// Params....... +type P map[string]any + +// Client represents the Last.fm API client +type Client struct { + APIKey string + HTTPClient *http.Client + BaseURL string +} + +// ClientOption represents a configuration option for the client +type ClientOption func(*Client) + +// NewClient creates a new Last.fm API client +func NewClient(apiKey string, options ...ClientOption) *Client { + client := &Client{ + APIKey: apiKey, + BaseURL: BaseURL, + HTTPClient: &http.Client{ + Timeout: 30 * time.Second, + }, + } + + for _, option := range options { + option(client) + } + + return client +} + +// WithHTTPClient sets a custom HTTP client +func WithHTTPClient(httpClient *http.Client) ClientOption { + return func(c *Client) { + c.HTTPClient = httpClient + } +} + +// WithTimeout sets a custom timeout for HTTP requests +func WithTimeout(timeout time.Duration) ClientOption { + return func(c *Client) { + c.HTTPClient.Timeout = timeout + } +} + +// WithBaseURL sets a custom base URL (useful for testing) +func WithBaseURL(baseURL string) ClientOption { + return func(c *Client) { + c.BaseURL = baseURL + } +} + +// buildURL constructs the API URL with parameters +func (c *Client) buildURL(method string, params P) string { + u, _ := url.Parse(c.BaseURL) + q := u.Query() + + q.Set("method", method) + q.Set("api_key", c.APIKey) + + for key, value := range params { + if value != "" { + q.Set(key, fmt.Sprintf("%v", value)) + } + } + + u.RawQuery = q.Encode() + return u.String() +} + +// makeRequest performs an HTTP GET request to the Last.fm API +func (c *Client) makeRequest(method string, params P) ([]byte, error) { + url := c.buildURL(method, params) + + resp, err := c.HTTPClient.Get(url) + if err != nil { + return nil, fmt.Errorf("failed to make request: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("API request failed with status %d", resp.StatusCode) + } + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("failed to read response body: %w", err) + } + + var errorResp struct { + XMLName xml.Name `xml:"lfm"` + Status string `xml:"status,attr"` + Error struct { + Code int `xml:"code,attr"` + Text string `xml:",chardata"` + } `xml:"error"` + } + + if err := xml.Unmarshal(body, &errorResp); err == nil && errorResp.Status == "failed" { + return nil, fmt.Errorf("last.fm error %d: %s", errorResp.Error.Code, errorResp.Error.Text) + } + + return body, nil +} diff --git a/last.fm/services.go b/last.fm/services.go new file mode 100644 index 0000000..89326d8 --- /dev/null +++ b/last.fm/services.go @@ -0,0 +1,19 @@ +package lastfm + +// Services groups all Last.fm API services +type Services struct { + User *UserService +} + +// NewServices creates a new services group with all available services +func NewServices(client *Client) *Services { + return &Services{ + User: NewUserService(client), + } +} + +// NewServicesWithAPIKey is a convenience function to create services with just an API key +func NewServicesWithAPIKey(apiKey string, options ...ClientOption) *Services { + client := NewClient(apiKey, options...) + return NewServices(client) +} diff --git a/last.fm/user.go b/last.fm/user.go new file mode 100644 index 0000000..1732a03 --- /dev/null +++ b/last.fm/user.go @@ -0,0 +1,40 @@ +package lastfm + +import ( + "encoding/xml" + "fmt" +) + +type UserService struct { + client *Client +} + +func NewUserService(client *Client) *UserService { + return &UserService{ + client: client, + } +} + +type userInfoResponse struct { + XMLName xml.Name `xml:"lfm"` + Status string `xml:"status,attr"` + User User `xml:"user"` +} + +func (s *UserService) GetInfo(params P) (*User, error) { + if params["user"] == "" { + return nil, fmt.Errorf("user parameter is required") + } + + body, err := s.client.makeRequest("user.getinfo", params) + if err != nil { + return nil, fmt.Errorf("failed to get user info: %w", err) + } + + var response userInfoResponse + if err := xml.Unmarshal(body, &response); err != nil { + return nil, fmt.Errorf("failed to unmarshal response: %w", err) + } + + return &response.User, nil +} diff --git a/last.fm/user_types.go b/last.fm/user_types.go new file mode 100644 index 0000000..eab139a --- /dev/null +++ b/last.fm/user_types.go @@ -0,0 +1,68 @@ +package lastfm + +import ( + "strconv" + "time" +) + +// User represents a Last.fm user +type User struct { + Name string `xml:"name"` + RealName string `xml:"realname"` + URL string `xml:"url"` + Country string `xml:"country"` + Age string `xml:"age"` + Gender string `xml:"gender"` + Subscriber string `xml:"subscriber"` + PlayCount int64 `xml:"playcount"` + Registered Timestamp `xml:"registered"` + Images []Image `xml:"image"` +} + +// Image represents a Last.fm image +type Image struct { + Size string `xml:"size,attr"` + URL string `xml:",chardata"` +} + +// Timestamp represents a Last.fm timestamp +type Timestamp struct { + UnixTime string `xml:"unixtime,attr"` + Text string `xml:",chardata"` +} + +func (t Timestamp) Time() (time.Time, error) { + if t.UnixTime == "" { + return time.Time{}, nil + } + + unixTime, err := strconv.ParseInt(t.UnixTime, 10, 64) + if err != nil { + return time.Time{}, err + } + + return time.Unix(unixTime, 0), nil +} + +func (u *User) GetImageBySize(size string) *Image { + for _, img := range u.Images { + if img.Size == size { + return &img + } + } + return nil +} + +func (u *User) GetLargestImage() Image { + sizes := []string{"mega", "extralarge", "large", "medium", "small"} + for _, size := range sizes { + if img := u.GetImageBySize(size); img != nil && img.URL != "" { + return *img + } + } + return Image{Size: "none", URL: ""} +} + +func (u *User) GetPlayCount() int64 { + return u.PlayCount +} From d5ec4252318fb0fce8cea171bcbcf5a2254d3551 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Sun, 21 Sep 2025 05:56:02 +0200 Subject: [PATCH 08/29] i had to fix the fucking lib myself bro wtf --- cmd/bot/bot.go | 9 +- commands/commands.go | 16 +-- commands/profile/command.go | 17 +++- commands/setuser/command.go | 4 +- commands/stats/command.go | 22 +++-- commands/types.go | 6 +- events/events.go | 16 +-- go.mod | 2 +- go.sum | 4 +- pkg/components/components.go | 130 +++++++++++++++++++++++++ pkg/reply/deferred.go | 16 +++ pkg/reply/edit.go | 76 +++++++++++++++ pkg/reply/followup.go | 43 +++++++++ pkg/reply/reply.go | 182 ++--------------------------------- pkg/reply/response.go | 109 +++++++++++++++++++++ zlog/zlog.go | 26 +++-- 16 files changed, 456 insertions(+), 222 deletions(-) create mode 100644 pkg/components/components.go create mode 100644 pkg/reply/deferred.go create mode 100644 pkg/reply/edit.go create mode 100644 pkg/reply/followup.go create mode 100644 pkg/reply/response.go diff --git a/cmd/bot/bot.go b/cmd/bot/bot.go index acb8ee8..0ffdc5d 100644 --- a/cmd/bot/bot.go +++ b/cmd/bot/bot.go @@ -2,10 +2,10 @@ package main import ( "context" - "github.com/diamondburned/arikawa/v3/api/cmdroute" - "github.com/diamondburned/arikawa/v3/discord" - "github.com/diamondburned/arikawa/v3/gateway" - "github.com/diamondburned/arikawa/v3/state" + "github.com/nxtgo/arikawa/v3/api/cmdroute" + "github.com/nxtgo/arikawa/v3/discord" + "github.com/nxtgo/arikawa/v3/gateway" + "github.com/nxtgo/arikawa/v3/state" "go.fm/commands" "go.fm/db" "go.fm/events" @@ -40,7 +40,6 @@ func main() { for _, event := range events.Events { s.AddHandler(event) } - zlog.Log.Debugf("added %d event handlers", len(events.Events)) // bot intents s.AddIntents(gateway.IntentGuildMembers) diff --git a/commands/commands.go b/commands/commands.go index 8b7bc44..e5f32d0 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -5,9 +5,9 @@ import ( "os" "time" - "github.com/diamondburned/arikawa/v3/api" - "github.com/diamondburned/arikawa/v3/api/cmdroute" - "github.com/diamondburned/arikawa/v3/state" + "github.com/nxtgo/arikawa/v3/api" + "github.com/nxtgo/arikawa/v3/api/cmdroute" + "github.com/nxtgo/arikawa/v3/state" "go.fm/db" lastfm "go.fm/last.fm" "go.fm/pkg/reply" @@ -42,15 +42,9 @@ func RegisterCommands(r *cmdroute.Router, st *state.State, q *db.Queries) { Last: lastfm.NewServicesWithAPIKey(lastFMApiKey, lastfm.WithTimeout(time.Second*15)), } - defer func() { - if rec := recover(); rec != nil { - zlog.Log.Errorf("panic occurred in command handler: %v", rec) - commandContext.Reply.QuickEmbed(reply.ErrorEmbed("something happened :(")) - } - }() - err := h(commandContext) if err != nil { + zlog.Log.Warn(err.Error()) commandContext.Reply.QuickEmbed(reply.ErrorEmbed(err.Error())) } @@ -60,6 +54,6 @@ func RegisterCommands(r *cmdroute.Router, st *state.State, q *db.Queries) { } func Sync(st *state.State) error { - defer zlog.Log.Debug("synced commands") + defer zlog.Log.Infow("synced commands", zlog.F{"count": len(allCommands)}) return cmdroute.OverwriteCommands(st, allCommands) } diff --git a/commands/profile/command.go b/commands/profile/command.go index 9abb0c2..4bd3cb1 100644 --- a/commands/profile/command.go +++ b/commands/profile/command.go @@ -1,10 +1,11 @@ package profile import ( - "github.com/diamondburned/arikawa/v3/api" - "github.com/diamondburned/arikawa/v3/discord" + "github.com/nxtgo/arikawa/v3/api" + "github.com/nxtgo/arikawa/v3/discord" "go.fm/commands" lastfm "go.fm/last.fm" + "go.fm/pkg/components" "go.fm/pkg/reply" ) @@ -36,7 +37,17 @@ func handler(c *commands.CommandContext) error { return err } - _, err = edit.Content(user.Name).Send() + container := components.NewContainer(703487, + components.NewSection( + components.NewTextDisplayf("# %s's profile", user.Name), + ).WithAccessory( + components.NewThumbnail(user.GetLargestImage().URL), + ), + components.NewTextDisplay("profile test"), + components.NewDivider(), + ) + + _, err = edit.ComponentsV2(container).Send() return err }) } diff --git a/commands/setuser/command.go b/commands/setuser/command.go index 3a051ed..1fa0522 100644 --- a/commands/setuser/command.go +++ b/commands/setuser/command.go @@ -5,8 +5,8 @@ import ( "errors" "fmt" - "github.com/diamondburned/arikawa/v3/api" - "github.com/diamondburned/arikawa/v3/discord" + "github.com/nxtgo/arikawa/v3/api" + "github.com/nxtgo/arikawa/v3/discord" "go.fm/commands" "go.fm/db" lastfm "go.fm/last.fm" diff --git a/commands/stats/command.go b/commands/stats/command.go index 3d6d1ec..d0c5210 100644 --- a/commands/stats/command.go +++ b/commands/stats/command.go @@ -2,8 +2,7 @@ package stats import ( "fmt" - "github.com/diamondburned/arikawa/v3/api" - "github.com/diamondburned/arikawa/v3/discord" + "github.com/nxtgo/arikawa/v3/api" "go.fm/commands" "runtime" "time" @@ -22,7 +21,7 @@ func handler(c *commands.CommandContext) error { uptime := time.Since(startTime).Round(time.Second) - embed := discord.Embed{Description: fmt.Sprintf( + stats := fmt.Sprintf( "**uptime:** %s\n"+ "**goroutines:** %d\n"+ "**memory:** %.2f mb\n"+ @@ -38,9 +37,20 @@ func handler(c *commands.CommandContext) error { runtime.Version(), runtime.GOOS, runtime.GOARCH, - )} - - return c.Reply.QuickEmbed(embed) + ) + + container := map[string]any{ + "accent_color": 703487, + "type": 17, + "components": []any{ + map[string]any{ + "type": 10, + "content": stats, + }, + }, + } + + return c.Reply.Reply().Flags(1 << 15).ComponentsV2(container).Send() } func init() { diff --git a/commands/types.go b/commands/types.go index 18d8f97..6247ef1 100644 --- a/commands/types.go +++ b/commands/types.go @@ -4,9 +4,9 @@ import ( "context" "strings" - "github.com/diamondburned/arikawa/v3/api/cmdroute" - "github.com/diamondburned/arikawa/v3/discord" - "github.com/diamondburned/arikawa/v3/state" + "github.com/nxtgo/arikawa/v3/api/cmdroute" + "github.com/nxtgo/arikawa/v3/discord" + "github.com/nxtgo/arikawa/v3/state" "go.fm/db" lastfm "go.fm/last.fm" "go.fm/pkg/reply" diff --git a/events/events.go b/events/events.go index d534bfb..ce76e36 100644 --- a/events/events.go +++ b/events/events.go @@ -1,21 +1,23 @@ package events import ( - "github.com/diamondburned/arikawa/v3/gateway" + "github.com/nxtgo/arikawa/v3/gateway" "go.fm/zlog" ) var Events []any +var EventLogger func(name string) *zlog.Logger func init() { Events = append(Events, EventReady) + EventLogger = func(name string) *zlog.Logger { + return zlog.WithFields(zlog.F{"event_name": name}) + } } func EventReady(c *gateway.ReadyEvent) { - zlog.Log.WithFields( - zlog.F{ - "tag": c.User.Tag(), - "guilds": len(c.Guilds), - }, - ).Info("client is ready") + EventLogger("ready").Infow("client ready", zlog.F{ + "tag": c.User.Tag(), + "guilds": len(c.Guilds), + }) } diff --git a/go.mod b/go.mod index 5cd9cdb..c1e459b 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module go.fm go 1.25.0 require ( - github.com/diamondburned/arikawa/v3 v3.6.0 github.com/mattn/go-sqlite3 v1.14.32 + github.com/nxtgo/arikawa/v3 v3.0.0-20250921013437-308638597d52 ) require ( diff --git a/go.sum b/go.sum index f66bd4b..3e6a345 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,10 @@ -github.com/diamondburned/arikawa/v3 v3.6.0 h1:8sno6tO9F1TEkg1ChHfjuVX41a+uv3opcfWeNvbuhV4= -github.com/diamondburned/arikawa/v3 v3.6.0/go.mod h1:thocAM2X8lRDHuEZR5vWYaT4w+tb/vOKa1qm+r0gs5A= github.com/gorilla/schema v1.4.1 h1:jUg5hUjCSDZpNGLuXQOgIWGdlgrIdYvgQ0wZtdK1M3E= github.com/gorilla/schema v1.4.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/nxtgo/arikawa/v3 v3.0.0-20250921013437-308638597d52 h1:xzaKaxK3MrnBsSkGTvhXLFPKPOhRYkar6KB1AyX7GPo= +github.com/nxtgo/arikawa/v3 v3.0.0-20250921013437-308638597d52/go.mod h1:BxHFNaM4Y5w9DIiogWgvq1T7MQ3d7AbkT7ZmcJOFM98= golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= diff --git a/pkg/components/components.go b/pkg/components/components.go new file mode 100644 index 0000000..e9324d0 --- /dev/null +++ b/pkg/components/components.go @@ -0,0 +1,130 @@ +package components + +import "fmt" + +type ComponentType int + +const ( + TypeActionRow ComponentType = 1 + TypeButton ComponentType = 2 + TypeTextDisplay ComponentType = 10 + TypeThumbnail ComponentType = 11 + TypeSection ComponentType = 9 + TypeDivider ComponentType = 14 + TypeContainer ComponentType = 17 +) + +type Component interface { + componentType() ComponentType +} + +type ContainerComponent interface { + Component + isContainer() +} + +type Container struct { + Type ComponentType `json:"type"` + AccentColor int `json:"accent_color,omitempty"` + Components []Component `json:"components"` +} + +func (c *Container) componentType() ComponentType { return TypeContainer } +func (c *Container) isContainer() {} + +type Section struct { + Type ComponentType `json:"type"` + Components []Component `json:"components"` + Accessory Component `json:"accessory,omitempty"` +} + +func (s *Section) componentType() ComponentType { return TypeSection } +func (s *Section) isContainer() {} + +type TextDisplay struct { + Type ComponentType `json:"type"` + Content string `json:"content"` +} + +func (t *TextDisplay) componentType() ComponentType { return TypeTextDisplay } + +type Thumbnail struct { + Type ComponentType `json:"type"` + Media Media `json:"media"` +} + +func (t *Thumbnail) componentType() ComponentType { return TypeThumbnail } + +type Media struct { + URL string `json:"url"` +} + +type Divider struct { + Type ComponentType `json:"type"` + Divider bool `json:"divider"` +} + +func (d *Divider) componentType() ComponentType { return TypeDivider } + +type ActionRow struct { + Type ComponentType `json:"type"` + Components []Component `json:"components"` +} + +func (a *ActionRow) componentType() ComponentType { return TypeActionRow } + +type Button struct { + Type ComponentType `json:"type"` + Style int `json:"style"` + Label string `json:"label"` + CustomID string `json:"custom_id"` + Emoji *Emoji `json:"emoji,omitempty"` +} + +func (b *Button) componentType() ComponentType { return TypeButton } + +type Emoji struct { + Name string `json:"name"` +} + +func NewContainer(accent int, children ...Component) *Container { + return &Container{Type: TypeContainer, AccentColor: accent, Components: children} +} + +func NewSection(children ...Component) *Section { + return &Section{Type: TypeSection, Components: children} +} + +func (s *Section) WithAccessory(accessory Component) *Section { + s.Accessory = accessory + return s +} + +func NewTextDisplay(content string) *TextDisplay { + return &TextDisplay{Type: TypeTextDisplay, Content: content} +} + +func NewTextDisplayf(content string, args ...any) *TextDisplay { + return &TextDisplay{Type: TypeTextDisplay, Content: fmt.Sprintf(content, args...)} +} + +func NewThumbnail(url string) *Thumbnail { + return &Thumbnail{Type: TypeThumbnail, Media: Media{URL: url}} +} + +func NewDivider() *Divider { + return &Divider{Type: TypeDivider, Divider: true} +} + +func NewActionRow(children ...Component) *ActionRow { + return &ActionRow{Type: TypeActionRow, Components: children} +} + +func NewButton(style int, label, customID string) *Button { + return &Button{Type: TypeButton, Style: style, Label: label, CustomID: customID} +} + +func (b *Button) WithEmoji(name string) *Button { + b.Emoji = &Emoji{Name: name} + return b +} diff --git a/pkg/reply/deferred.go b/pkg/reply/deferred.go new file mode 100644 index 0000000..14c1afa --- /dev/null +++ b/pkg/reply/deferred.go @@ -0,0 +1,16 @@ +package reply + +import "github.com/nxtgo/arikawa/v3/api" + +type DeferredResponse struct { + manager *ResponseManager + err error +} + +func (dr *DeferredResponse) Error() error { + return dr.err +} + +func (dr *DeferredResponse) Edit() *EditBuilder { + return &EditBuilder{manager: dr.manager, data: api.EditInteractionResponseData{}} +} diff --git a/pkg/reply/edit.go b/pkg/reply/edit.go new file mode 100644 index 0000000..dd7371d --- /dev/null +++ b/pkg/reply/edit.go @@ -0,0 +1,76 @@ +package reply + +import ( + "fmt" + + "github.com/nxtgo/arikawa/v3/api" + "github.com/nxtgo/arikawa/v3/discord" + "github.com/nxtgo/arikawa/v3/utils/json" + "github.com/nxtgo/arikawa/v3/utils/json/option" +) + +type EditBuilder struct { + manager *ResponseManager + data api.EditInteractionResponseData +} + +func (eb *EditBuilder) Content(content string) *EditBuilder { + eb.data.Content = option.NewNullableString(content) + return eb +} + +func (eb *EditBuilder) Embed(embed discord.Embed) *EditBuilder { + eb.data.Embeds = &[]discord.Embed{embed} + return eb +} + +func (eb *EditBuilder) Embeds(embeds ...discord.Embed) *EditBuilder { + eb.data.Embeds = &embeds + return eb +} + +func (eb *EditBuilder) ComponentsV2(components any) *EditBuilder { + eb.Clear() + eb.Flags(1 << 15) + raw, _ := json.Marshal(components) + + comp, err := discord.ParseComponent(raw) + if err != nil { + panic(err) + } + + cc := discord.ContainerComponents{comp.(discord.ContainerComponent)} + eb.data.Components = &cc + + return eb +} + +func (eb *EditBuilder) Components(components discord.ContainerComponents) *EditBuilder { + eb.data.Components = &components + return eb +} + +func (eb *EditBuilder) Flags(flags ...discord.MessageFlags) *EditBuilder { + for _, flag := range flags { + eb.data.Flags |= flag + } + return eb +} + +func (eb *EditBuilder) Clear() *EditBuilder { + eb.data.Content = nil + eb.data.Embeds = nil + eb.data.Components = nil + + return eb +} + +func (eb *EditBuilder) Send() (*discord.Message, error) { + raw, err := json.Marshal(eb.data) + if err != nil { + fmt.Printf("Failed to marshal eb.data: %v\n", err) + } else { + fmt.Printf("EditBuilder data:\n%s\n", string(raw)) + } + return eb.manager.state.EditInteractionResponse(eb.manager.appID, eb.manager.token, eb.data) +} diff --git a/pkg/reply/followup.go b/pkg/reply/followup.go new file mode 100644 index 0000000..f4d692e --- /dev/null +++ b/pkg/reply/followup.go @@ -0,0 +1,43 @@ +package reply + +import ( + "github.com/nxtgo/arikawa/v3/api" + "github.com/nxtgo/arikawa/v3/discord" + "github.com/nxtgo/arikawa/v3/utils/json/option" +) + +type FollowUpBuilder struct { + manager *ResponseManager + data api.InteractionResponseData +} + +func (fb *FollowUpBuilder) Content(content string) *FollowUpBuilder { + fb.data.Content = option.NewNullableString(content) + return fb +} + +func (fb *FollowUpBuilder) Embed(embed discord.Embed) *FollowUpBuilder { + fb.data.Embeds = &[]discord.Embed{embed} + return fb +} + +func (fb *FollowUpBuilder) Embeds(embeds ...discord.Embed) *FollowUpBuilder { + fb.data.Embeds = &embeds + return fb +} + +func (fb *FollowUpBuilder) Components(components discord.ContainerComponents) *FollowUpBuilder { + fb.data.Components = &components + return fb +} + +func (fb *FollowUpBuilder) Flags(flags ...discord.MessageFlags) *FollowUpBuilder { + for _, flag := range flags { + fb.data.Flags |= flag + } + return fb +} + +func (fb *FollowUpBuilder) Send() (*discord.Message, error) { + return fb.manager.state.FollowUpInteraction(fb.manager.appID, fb.manager.token, fb.data) +} diff --git a/pkg/reply/reply.go b/pkg/reply/reply.go index c4ff512..5952fd4 100644 --- a/pkg/reply/reply.go +++ b/pkg/reply/reply.go @@ -3,12 +3,12 @@ package reply import ( "context" "fmt" - "github.com/diamondburned/arikawa/v3/api" - "github.com/diamondburned/arikawa/v3/discord" - "github.com/diamondburned/arikawa/v3/state" - "github.com/diamondburned/arikawa/v3/utils/json/option" - "go.fm/pkg/emojis" "time" + + "github.com/nxtgo/arikawa/v3/discord" + "github.com/nxtgo/arikawa/v3/state" + "go.fm/pkg/emojis" + "go.fm/zlog" ) type ResponseManager struct { @@ -29,174 +29,6 @@ func New(s *state.State, i *discord.InteractionEvent) *ResponseManager { } } -type ResponseBuilder struct { - manager *ResponseManager - data api.InteractionResponseData -} - -func (rm *ResponseManager) Reply() *ResponseBuilder { - return &ResponseBuilder{ - manager: rm, - data: api.InteractionResponseData{}, - } -} - -func (rm *ResponseManager) Defer(flags ...discord.MessageFlags) *DeferredResponse { - if rm.responded { - return &DeferredResponse{manager: rm, err: fmt.Errorf("already responded")} - } - - var combinedFlags discord.MessageFlags - for _, flag := range flags { - combinedFlags |= flag - } - - response := api.InteractionResponse{Type: api.DeferredMessageInteractionWithSource} - if combinedFlags != 0 { - response.Data = &api.InteractionResponseData{Flags: combinedFlags} - } - - err := rm.state.RespondInteraction(rm.interaction.ID, rm.token, response) - rm.deferred = true - rm.responded = true - - return &DeferredResponse{manager: rm, err: err} -} - -func (rm *ResponseManager) FollowUp() *FollowUpBuilder { - return &FollowUpBuilder{manager: rm, data: api.InteractionResponseData{}} -} - -func (rb *ResponseBuilder) Content(content string) *ResponseBuilder { - rb.data.Content = option.NewNullableString(content) - return rb -} - -func (rb *ResponseBuilder) Embed(embed discord.Embed) *ResponseBuilder { - rb.data.Embeds = &[]discord.Embed{embed} - return rb -} - -func (rb *ResponseBuilder) Embeds(embeds ...discord.Embed) *ResponseBuilder { - rb.data.Embeds = &embeds - return rb -} - -func (rb *ResponseBuilder) Components(components discord.ContainerComponents) *ResponseBuilder { - rb.data.Components = &components - return rb -} - -func (rb *ResponseBuilder) Flags(flags ...discord.MessageFlags) *ResponseBuilder { - for _, flag := range flags { - rb.data.Flags |= flag - } - return rb -} - -func (rb *ResponseBuilder) Send() error { - if rb.manager.responded { - return fmt.Errorf("already responded") - } - - err := rb.manager.state.RespondInteraction( - rb.manager.interaction.ID, - rb.manager.token, - api.InteractionResponse{ - Type: api.MessageInteractionWithSource, - Data: &rb.data, - }, - ) - - rb.manager.responded = true - return err -} - -type DeferredResponse struct { - manager *ResponseManager - err error -} - -func (dr *DeferredResponse) Error() error { - return dr.err -} - -func (dr *DeferredResponse) Edit() *EditBuilder { - return &EditBuilder{manager: dr.manager, data: api.EditInteractionResponseData{}} -} - -type EditBuilder struct { - manager *ResponseManager - data api.EditInteractionResponseData -} - -func (eb *EditBuilder) Content(content string) *EditBuilder { - eb.data.Content = option.NewNullableString(content) - return eb -} - -func (eb *EditBuilder) Embed(embed discord.Embed) *EditBuilder { - eb.data.Embeds = &[]discord.Embed{embed} - return eb -} - -func (eb *EditBuilder) Embeds(embeds ...discord.Embed) *EditBuilder { - eb.data.Embeds = &embeds - return eb -} - -func (eb *EditBuilder) Components(components discord.ContainerComponents) *EditBuilder { - eb.data.Components = &components - return eb -} - -func (eb *EditBuilder) Clear() *EditBuilder { - eb.data.Content = option.NewNullableString("") - eb.data.Embeds = &[]discord.Embed{} - eb.data.Components = &discord.ContainerComponents{} - return eb -} - -func (eb *EditBuilder) Send() (*discord.Message, error) { - return eb.manager.state.EditInteractionResponse(eb.manager.appID, eb.manager.token, eb.data) -} - -type FollowUpBuilder struct { - manager *ResponseManager - data api.InteractionResponseData -} - -func (fb *FollowUpBuilder) Content(content string) *FollowUpBuilder { - fb.data.Content = option.NewNullableString(content) - return fb -} - -func (fb *FollowUpBuilder) Embed(embed discord.Embed) *FollowUpBuilder { - fb.data.Embeds = &[]discord.Embed{embed} - return fb -} - -func (fb *FollowUpBuilder) Embeds(embeds ...discord.Embed) *FollowUpBuilder { - fb.data.Embeds = &embeds - return fb -} - -func (fb *FollowUpBuilder) Components(components discord.ContainerComponents) *FollowUpBuilder { - fb.data.Components = &components - return fb -} - -func (fb *FollowUpBuilder) Flags(flags ...discord.MessageFlags) *FollowUpBuilder { - for _, flag := range flags { - fb.data.Flags |= flag - } - return fb -} - -func (fb *FollowUpBuilder) Send() (*discord.Message, error) { - return fb.manager.state.FollowUpInteraction(fb.manager.appID, fb.manager.token, fb.data) -} - func (rm *ResponseManager) Quick(content string, flags ...discord.MessageFlags) error { builder := rm.Reply().Content(content) if len(flags) > 0 { @@ -219,9 +51,11 @@ func (rm *ResponseManager) AutoDefer(fn func(edit *EditBuilder) error, flags ... return deferred.Error() } - editBuilder := deferred.Edit() + editBuilder := deferred.Edit().Flags(flags...) err := fn(editBuilder) + if err != nil { + zlog.Log.Error(err.Error()) _, err := editBuilder.Clear().Embed(ErrorEmbed(err.Error())).Send() return err } diff --git a/pkg/reply/response.go b/pkg/reply/response.go new file mode 100644 index 0000000..fa35e95 --- /dev/null +++ b/pkg/reply/response.go @@ -0,0 +1,109 @@ +package reply + +import ( + "fmt" + + "github.com/nxtgo/arikawa/v3/api" + "github.com/nxtgo/arikawa/v3/discord" + "github.com/nxtgo/arikawa/v3/utils/json" + "github.com/nxtgo/arikawa/v3/utils/json/option" +) + +type ResponseBuilder struct { + manager *ResponseManager + data api.InteractionResponseData +} + +func (rm *ResponseManager) Reply() *ResponseBuilder { + return &ResponseBuilder{ + manager: rm, + data: api.InteractionResponseData{}, + } +} + +func (rm *ResponseManager) Defer(flags ...discord.MessageFlags) *DeferredResponse { + if rm.responded { + return &DeferredResponse{manager: rm, err: fmt.Errorf("already responded")} + } + + var combinedFlags discord.MessageFlags + for _, flag := range flags { + combinedFlags |= flag + } + + response := api.InteractionResponse{ + Type: api.DeferredMessageInteractionWithSource, + Data: &api.InteractionResponseData{Flags: combinedFlags}, + } + + err := rm.state.RespondInteraction(rm.interaction.ID, rm.token, response) + rm.deferred = true + rm.responded = true + + return &DeferredResponse{manager: rm, err: err} +} + +func (rm *ResponseManager) FollowUp() *FollowUpBuilder { + return &FollowUpBuilder{manager: rm, data: api.InteractionResponseData{}} +} + +// no + +func (rb *ResponseBuilder) Content(content string) *ResponseBuilder { + rb.data.Content = option.NewNullableString(content) + return rb +} + +func (rb *ResponseBuilder) Embed(embed discord.Embed) *ResponseBuilder { + rb.data.Embeds = &[]discord.Embed{embed} + return rb +} + +func (rb *ResponseBuilder) Embeds(embeds ...discord.Embed) *ResponseBuilder { + rb.data.Embeds = &embeds + return rb +} + +func (rb *ResponseBuilder) ComponentsV2(components any) *ResponseBuilder { + raw, _ := json.Marshal(components) + + comp, err := discord.ParseComponent(raw) + if err != nil { + panic(err) + } + + cc := discord.ContainerComponents{comp.(discord.ContainerComponent)} + rb.data.Components = &cc + + return rb +} + +func (rb *ResponseBuilder) Components(components discord.ContainerComponents) *ResponseBuilder { + rb.data.Components = &components + return rb +} + +func (rb *ResponseBuilder) Flags(flags ...discord.MessageFlags) *ResponseBuilder { + for _, flag := range flags { + rb.data.Flags |= flag + } + return rb +} + +func (rb *ResponseBuilder) Send() error { + if rb.manager.responded { + return fmt.Errorf("already responded") + } + + err := rb.manager.state.RespondInteraction( + rb.manager.interaction.ID, + rb.manager.token, + api.InteractionResponse{ + Type: api.MessageInteractionWithSource, + Data: &rb.data, + }, + ) + + rb.manager.responded = true + return err +} diff --git a/zlog/zlog.go b/zlog/zlog.go index 7d256db..369bcb0 100644 --- a/zlog/zlog.go +++ b/zlog/zlog.go @@ -27,7 +27,7 @@ const ( ) func (l Level) String() string { - return [...]string{"DBG", "INF", "WRN", "ERR", "FTL"}[l] + return [...]string{" DBG ", " INF ", " WRN ", " ERR ", " !!! "}[l] } type F map[string]any @@ -37,18 +37,18 @@ var ( ansiBlack = "\u001b[30m" defaultLevelColor = map[Level]string{ - LevelDebug: "\u001b[37m", - LevelInfo: "\u001b[34m", + LevelDebug: "\u001b[35m", + LevelInfo: "\u001b[36m", LevelWarn: "\u001b[33m", LevelError: "\u001b[31m", - LevelFatal: "\u001b[35m", + LevelFatal: "\u001b[35;1m", } defaultLevelColorBg = map[Level]string{ - LevelDebug: "\u001b[47m", - LevelInfo: "\u001b[44m", + LevelDebug: "\u001b[45m", + LevelInfo: "\u001b[46m", LevelWarn: "\u001b[43m", LevelError: "\u001b[41m", - LevelFatal: "\u001b[45m", + LevelFatal: "\u001b[45;1m", } ) @@ -185,7 +185,7 @@ func (l *Logger) Log(level Level, msg string, extra F) { } } - b.WriteString(" " + level.String() + " ") + b.WriteString(level.String()) if colors { if c, ok := l.levelColor[level]; ok { b.WriteString(ansiReset + c) @@ -204,7 +204,17 @@ func (l *Logger) Log(level Level, msg string, extra F) { if i > 0 { b.WriteString(" ") } + if colors { + if c, ok := l.levelColorBg[level]; ok { + b.WriteString(c + ansiBlack) + } + } fmt.Fprintf(&b, "%s=%v", k, base[k]) + if colors { + if c, ok := l.levelColor[level]; ok { + b.WriteString(ansiReset + c) + } + } } } if callerStr != "" { From 92e6d9cb312fc142f25316983bce2c83ca3ecc0a Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Sun, 21 Sep 2025 05:57:24 +0200 Subject: [PATCH 09/29] use new api --- commands/stats/command.go | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/commands/stats/command.go b/commands/stats/command.go index d0c5210..b9fb8ed 100644 --- a/commands/stats/command.go +++ b/commands/stats/command.go @@ -2,10 +2,12 @@ package stats import ( "fmt" - "github.com/nxtgo/arikawa/v3/api" - "go.fm/commands" "runtime" "time" + + "github.com/nxtgo/arikawa/v3/api" + "go.fm/commands" + "go.fm/pkg/components" ) var startTime = time.Now() @@ -39,16 +41,9 @@ func handler(c *commands.CommandContext) error { runtime.GOARCH, ) - container := map[string]any{ - "accent_color": 703487, - "type": 17, - "components": []any{ - map[string]any{ - "type": 10, - "content": stats, - }, - }, - } + container := components.NewContainer(703487, + components.NewTextDisplay(stats), + ) return c.Reply.Reply().Flags(1 << 15).ComponentsV2(container).Send() } From 4ad657ec418320b8284b9d43bd4f3f1334d02589 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Sun, 21 Sep 2025 05:58:27 +0200 Subject: [PATCH 10/29] simplify methods --- commands/stats/command.go | 2 +- pkg/reply/response.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/commands/stats/command.go b/commands/stats/command.go index b9fb8ed..0c7ab38 100644 --- a/commands/stats/command.go +++ b/commands/stats/command.go @@ -45,7 +45,7 @@ func handler(c *commands.CommandContext) error { components.NewTextDisplay(stats), ) - return c.Reply.Reply().Flags(1 << 15).ComponentsV2(container).Send() + return c.Reply.Reply().ComponentsV2(container).Send() } func init() { diff --git a/pkg/reply/response.go b/pkg/reply/response.go index fa35e95..035d13b 100644 --- a/pkg/reply/response.go +++ b/pkg/reply/response.go @@ -65,6 +65,7 @@ func (rb *ResponseBuilder) Embeds(embeds ...discord.Embed) *ResponseBuilder { } func (rb *ResponseBuilder) ComponentsV2(components any) *ResponseBuilder { + rb.Flags(1 << 15) raw, _ := json.Marshal(components) comp, err := discord.ParseComponent(raw) From 39ee44d58c90b9b3cf40f67f99fdc8ce0527d2f2 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Sun, 21 Sep 2025 17:49:16 +0200 Subject: [PATCH 11/29] env --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7a288cc..b1b2e57 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,11 @@ your last.fm stats within Discord, isn't it great? $ git clone https://github.com/nxtgo/go.fm ``` -### create an .env +### create a .env ```env DISCORD_TOKEN=token_here +LASTFM_API_KEY=your_api_owo ``` ### run using Makefile From b4ec131102c5092b3aa70538567392f04ba4bd42 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Sun, 21 Sep 2025 18:21:03 +0200 Subject: [PATCH 12/29] fm command --- cmd/bot/commands.go | 1 + commands/fm/fm.go | 75 +++++++++++++++++++++++++++++++++++ commands/profile/command.go | 2 +- last.fm/track_types.go | 79 +++++++++++++++++++++++++++++++++++++ last.fm/user.go | 24 +++++++++++ last.fm/user_types.go | 10 +++++ 6 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 commands/fm/fm.go create mode 100644 last.fm/track_types.go diff --git a/cmd/bot/commands.go b/cmd/bot/commands.go index f958b19..3d3b6d8 100644 --- a/cmd/bot/commands.go +++ b/cmd/bot/commands.go @@ -1,6 +1,7 @@ package main import ( + _ "go.fm/commands/fm" _ "go.fm/commands/profile" _ "go.fm/commands/setuser" _ "go.fm/commands/stats" diff --git a/commands/fm/fm.go b/commands/fm/fm.go new file mode 100644 index 0000000..1bbed95 --- /dev/null +++ b/commands/fm/fm.go @@ -0,0 +1,75 @@ +package fm + +import ( + "time" + + "github.com/nxtgo/arikawa/v3/api" + "github.com/nxtgo/arikawa/v3/discord" + "go.fm/commands" + lastfm "go.fm/last.fm" + "go.fm/pkg/components" + "go.fm/pkg/reply" +) + +var data = api.CreateCommandData{ + Name: "fm", + Description: "display your current track or another user's", + Options: discord.CommandOptions{ + discord.NewStringOption("user", "user to display track from", false), + }, +} + +var options struct { + User *string `discord:"user"` +} + +func handler(c *commands.CommandContext) error { + return c.Reply.AutoDefer(func(edit *reply.EditBuilder) error { + if err := c.Data.Options.Unmarshal(&options); err != nil { + return err + } + + username, err := c.GetUserOrFallback() + if err != nil { + return err + } + + res, err := c.Last.User.GetRecentTracks(lastfm.P{"user": username, "limit": 1}) + if err != nil { + return err + } + + var container *components.Container + + lastTrack := res.Tracks[0] + if lastTrack.NowPlaying == "true" { + container = components.NewContainer(703487, + components.NewSection( + components.NewTextDisplayf("# %s", lastTrack.Name), + components.NewTextDisplayf("**%s** **ยท** %s", lastTrack.Artist.Name, lastTrack.Album.Name), + components.NewTextDisplayf("-# *Current track for %s*", res.User), + ).WithAccessory(components.NewThumbnail(lastTrack.GetLargestImage().URL)), + ) + } else { + playtime, err := lastTrack.GetPlayTime() + if err != nil { + playtime = time.Now() + } + + container = components.NewContainer(703487, + components.NewSection( + components.NewTextDisplayf("# %s", lastTrack.Name), + components.NewTextDisplayf("**%s** **ยท** %s", lastTrack.Artist.Name, lastTrack.Album.Name), + components.NewTextDisplayf("-# *Last track for %s, scrobbled at %s*", res.User, playtime.Format(time.Kitchen)), + ).WithAccessory(components.NewThumbnail(lastTrack.GetLargestImage().URL)), + ) + } + + _, err = edit.ComponentsV2(container).Send() + return err + }) +} + +func init() { + commands.Register(data, handler) +} diff --git a/commands/profile/command.go b/commands/profile/command.go index 4bd3cb1..bdd7592 100644 --- a/commands/profile/command.go +++ b/commands/profile/command.go @@ -43,7 +43,7 @@ func handler(c *commands.CommandContext) error { ).WithAccessory( components.NewThumbnail(user.GetLargestImage().URL), ), - components.NewTextDisplay("profile test"), + components.NewTextDisplay("this command is wip."), components.NewDivider(), ) diff --git a/last.fm/track_types.go b/last.fm/track_types.go new file mode 100644 index 0000000..5364b62 --- /dev/null +++ b/last.fm/track_types.go @@ -0,0 +1,79 @@ +package lastfm + +import ( + "strconv" + "time" +) + +// Track represents a Last.fm track +type Track struct { + Artist TrackArtist `xml:"artist"` + Name string `xml:"name"` + Streamable string `xml:"streamable"` + MBID string `xml:"mbid"` + Album TrackAlbum `xml:"album"` + URL string `xml:"url"` + Images []Image `xml:"image"` + Date *TrackDate `xml:"date"` + NowPlaying string `xml:"nowplaying,attr"` +} + +// TrackArtist represents an artist in a track +type TrackArtist struct { + MBID string `xml:"mbid,attr"` + Name string `xml:",chardata"` +} + +// TrackAlbum represents an album in a track +type TrackAlbum struct { + MBID string `xml:"mbid,attr"` + Name string `xml:",chardata"` +} + +// TrackDate represents a track's play date +type TrackDate struct { + UTS string `xml:"uts,attr"` + Text string `xml:",chardata"` +} + +// IsNowPlaying returns true if the track is currently playing +func (t *Track) IsNowPlaying() bool { + return t.NowPlaying == "true" +} + +// GetPlayTime returns the track's play time as a Go time.Time +func (t *Track) GetPlayTime() (time.Time, error) { + if t.Date == nil || t.Date.UTS == "" { + return time.Time{}, nil + } + + unixTime, err := strconv.ParseInt(t.Date.UTS, 10, 64) + if err != nil { + return time.Time{}, err + } + + return time.Unix(unixTime, 0), nil +} + +// GetLargestImage returns the largest available image for the track +func (t *Track) GetLargestImage() *Image { + sizes := []string{"mega", "extralarge", "large", "medium", "small"} + for _, size := range sizes { + for _, img := range t.Images { + if img.Size == size && img.URL != "" { + return &img + } + } + } + return nil +} + +// GetImageBySize returns an image of the specified size for the track +func (t *Track) GetImageBySize(size string) *Image { + for _, img := range t.Images { + if img.Size == size && img.URL != "" { + return &img + } + } + return nil +} diff --git a/last.fm/user.go b/last.fm/user.go index 1732a03..6648c15 100644 --- a/last.fm/user.go +++ b/last.fm/user.go @@ -21,6 +21,12 @@ type userInfoResponse struct { User User `xml:"user"` } +type recentTracksResponse struct { + XMLName xml.Name `xml:"lfm"` + Status string `xml:"status,attr"` + RecentTracks RecentTracks `xml:"recenttracks"` +} + func (s *UserService) GetInfo(params P) (*User, error) { if params["user"] == "" { return nil, fmt.Errorf("user parameter is required") @@ -38,3 +44,21 @@ func (s *UserService) GetInfo(params P) (*User, error) { return &response.User, nil } + +func (s *UserService) GetRecentTracks(params P) (*RecentTracks, error) { + if params["user"] == "" { + return nil, fmt.Errorf("user parameter is required") + } + + body, err := s.client.makeRequest("user.getrecenttracks", params) + if err != nil { + return nil, fmt.Errorf("failed to get recent tracks: %w", err) + } + + var response recentTracksResponse + if err := xml.Unmarshal(body, &response); err != nil { + return nil, fmt.Errorf("failed to unmarshal response: %w", err) + } + + return &response.RecentTracks, nil +} diff --git a/last.fm/user_types.go b/last.fm/user_types.go index eab139a..6c88b31 100644 --- a/last.fm/user_types.go +++ b/last.fm/user_types.go @@ -31,6 +31,16 @@ type Timestamp struct { Text string `xml:",chardata"` } +// RecentTracks represents the recent tracks response +type RecentTracks struct { + User string `xml:"user,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Tracks []Track `xml:"track"` +} + func (t Timestamp) Time() (time.Time, error) { if t.UnixTime == "" { return time.Time{}, nil From 2d0afc5cd3200c2b54a9a2852bcb8747997401ff Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Sun, 21 Sep 2025 19:14:30 +0200 Subject: [PATCH 13/29] last.fm cache --- cmd/bot/bot.go | 9 ++++-- commands/commands.go | 25 ++++++++++++----- commands/types.go | 1 + go.mod | 1 + go.sum | 2 ++ last.fm/cache.go | 65 ++++++++++++++++++++++++++++++++++++++++++++ last.fm/client.go | 9 ++++++ last.fm/services.go | 11 +++----- last.fm/user.go | 12 ++++++++ pkg/reply/edit.go | 8 ------ 10 files changed, 119 insertions(+), 24 deletions(-) create mode 100644 last.fm/cache.go diff --git a/cmd/bot/bot.go b/cmd/bot/bot.go index 0ffdc5d..ed7a224 100644 --- a/cmd/bot/bot.go +++ b/cmd/bot/bot.go @@ -2,6 +2,8 @@ package main import ( "context" + "os" + "github.com/nxtgo/arikawa/v3/api/cmdroute" "github.com/nxtgo/arikawa/v3/discord" "github.com/nxtgo/arikawa/v3/gateway" @@ -9,8 +11,8 @@ import ( "go.fm/commands" "go.fm/db" "go.fm/events" + lastfm "go.fm/last.fm" "go.fm/zlog" - "os" ) func main() { @@ -21,6 +23,9 @@ func main() { s := state.New("Bot " + discordToken) r := cmdroute.NewRouter() + c := lastfm.NewCache() + defer c.Close() + q, db, err := db.Start(context.Background(), "file:database.db?_foreign_keys=on") if err != nil { zlog.Log.Fatalf("failed to connect database: %v", err) @@ -28,7 +33,7 @@ func main() { defer db.Close() // register commands - commands.RegisterCommands(r, s, q) + commands.RegisterCommands(r, s, q, c) // command handlers if err := commands.Sync(s); err != nil { diff --git a/commands/commands.go b/commands/commands.go index e5f32d0..be9b8e3 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -2,9 +2,6 @@ package commands import ( "context" - "os" - "time" - "github.com/nxtgo/arikawa/v3/api" "github.com/nxtgo/arikawa/v3/api/cmdroute" "github.com/nxtgo/arikawa/v3/state" @@ -12,6 +9,8 @@ import ( lastfm "go.fm/last.fm" "go.fm/pkg/reply" "go.fm/zlog" + "os" + "time" ) var allCommands = []api.CreateCommandData{} @@ -24,7 +23,7 @@ func Register(meta api.CreateCommandData, handler CommandHandler) { registry[meta.Name] = handler } -func RegisterCommands(r *cmdroute.Router, st *state.State, q *db.Queries) { +func RegisterCommands(r *cmdroute.Router, st *state.State, q *db.Queries, c *lastfm.Cache) { lastFMApiKey := os.Getenv("LASTFM_API_KEY") if lastFMApiKey == "" { zlog.Log.Fatal("missing LASTFM_API_KEY env") @@ -34,15 +33,27 @@ func RegisterCommands(r *cmdroute.Router, st *state.State, q *db.Queries) { h := handler r.AddFunc(name, func(ctx context.Context, data cmdroute.CommandData) *api.InteractionResponseData { commandContext := &CommandContext{ + // command mandatory stuff Context: ctx, Data: data, State: st, - Reply: reply.New(st, data.Event), - Query: q, - Last: lastfm.NewServicesWithAPIKey(lastFMApiKey, lastfm.WithTimeout(time.Second*15)), + + // reply helper + Reply: reply.New(st, data.Event), + + // database + Query: q, + + // last.fm stuff + Last: lastfm.NewServices(lastFMApiKey, c), + Cache: c, } + // debugging purposes + start := time.Now() err := h(commandContext) + zlog.Log.Debugw("executed command %s", zlog.F{"time": time.Since(start)}, name) + // debugging purposes if err != nil { zlog.Log.Warn(err.Error()) commandContext.Reply.QuickEmbed(reply.ErrorEmbed(err.Error())) diff --git a/commands/types.go b/commands/types.go index 6247ef1..3eca413 100644 --- a/commands/types.go +++ b/commands/types.go @@ -19,6 +19,7 @@ type CommandContext struct { Reply *reply.ResponseManager Query *db.Queries Last *lastfm.Services + Cache *lastfm.Cache } type CommandHandler func(c *CommandContext) error diff --git a/go.mod b/go.mod index c1e459b..a023340 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.25.0 require ( github.com/mattn/go-sqlite3 v1.14.32 github.com/nxtgo/arikawa/v3 v3.0.0-20250921013437-308638597d52 + github.com/nxtgo/gce v0.0.0-20250910001932-ff8e22b0e630 ) require ( diff --git a/go.sum b/go.sum index 3e6a345..14c1795 100644 --- a/go.sum +++ b/go.sum @@ -6,5 +6,7 @@ github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuE github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/nxtgo/arikawa/v3 v3.0.0-20250921013437-308638597d52 h1:xzaKaxK3MrnBsSkGTvhXLFPKPOhRYkar6KB1AyX7GPo= github.com/nxtgo/arikawa/v3 v3.0.0-20250921013437-308638597d52/go.mod h1:BxHFNaM4Y5w9DIiogWgvq1T7MQ3d7AbkT7ZmcJOFM98= +github.com/nxtgo/gce v0.0.0-20250910001932-ff8e22b0e630 h1:q6YDsr4P1r0iViA9p04SmBNVK2+wP6m6dLZsKXhPhDs= +github.com/nxtgo/gce v0.0.0-20250910001932-ff8e22b0e630/go.mod h1:Lo1Rn6XM9r74u2JPtznKRojJuvZLd5e8V6dqUOP/yJo= golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= diff --git a/last.fm/cache.go b/last.fm/cache.go new file mode 100644 index 0000000..093e599 --- /dev/null +++ b/last.fm/cache.go @@ -0,0 +1,65 @@ +package lastfm + +import ( + "crypto/sha256" + "fmt" + "sort" + "strings" + "time" + + "github.com/nxtgo/gce" +) + +type Cache struct { + User *gce.Cache[string, User] + // todo: more cache +} + +func NewCache() *Cache { + return &Cache{ + User: gce.New[string, User]( + gce.WithDefaultTTL(30*time.Minute), + gce.WithMaxEntries(10_000), + ), + } +} + +type CacheStats struct { + Name string + Stats gce.Stats +} + +func (c *Cache) Stats() []CacheStats { + return []CacheStats{ + {"User", c.User.Stats()}, + } +} + +func (c *Cache) Close() { + c.User.Close() +} + +func GenerateCacheKey(method string, args P) string { + if len(args) == 0 { + return method + } + + keys := make([]string, 0, len(args)) + for k := range args { + keys = append(keys, k) + } + sort.Strings(keys) + + var sb strings.Builder + sb.WriteString(method) + for _, k := range keys { + sb.WriteByte('|') + sb.WriteString(k) + sb.WriteByte(':') + fmt.Fprint(&sb, args[k]) + } + + hash := sha256.Sum256([]byte(sb.String())) + + return fmt.Sprintf("%s|%x", method, hash[:16]) +} diff --git a/last.fm/client.go b/last.fm/client.go index db119c2..71333a1 100644 --- a/last.fm/client.go +++ b/last.fm/client.go @@ -21,6 +21,7 @@ type Client struct { APIKey string HTTPClient *http.Client BaseURL string + Cache *Cache } // ClientOption represents a configuration option for the client @@ -34,6 +35,7 @@ func NewClient(apiKey string, options ...ClientOption) *Client { HTTPClient: &http.Client{ Timeout: 30 * time.Second, }, + Cache: nil, } for _, option := range options { @@ -43,6 +45,13 @@ func NewClient(apiKey string, options ...ClientOption) *Client { return client } +// WithCache sets a custom cache client +func WithCache(cache *Cache) ClientOption { + return func(c *Client) { + c.Cache = cache + } +} + // WithHTTPClient sets a custom HTTP client func WithHTTPClient(httpClient *http.Client) ClientOption { return func(c *Client) { diff --git a/last.fm/services.go b/last.fm/services.go index 89326d8..33a7339 100644 --- a/last.fm/services.go +++ b/last.fm/services.go @@ -1,19 +1,16 @@ package lastfm +import "time" + // Services groups all Last.fm API services type Services struct { User *UserService } // NewServices creates a new services group with all available services -func NewServices(client *Client) *Services { +func NewServices(k string, c *Cache) *Services { + client := NewClient(k, WithTimeout(time.Second*10), WithCache(c)) return &Services{ User: NewUserService(client), } } - -// NewServicesWithAPIKey is a convenience function to create services with just an API key -func NewServicesWithAPIKey(apiKey string, options ...ClientOption) *Services { - client := NewClient(apiKey, options...) - return NewServices(client) -} diff --git a/last.fm/user.go b/last.fm/user.go index 6648c15..fa43e4e 100644 --- a/last.fm/user.go +++ b/last.fm/user.go @@ -3,6 +3,8 @@ package lastfm import ( "encoding/xml" "fmt" + + "go.fm/zlog" ) type UserService struct { @@ -32,6 +34,14 @@ func (s *UserService) GetInfo(params P) (*User, error) { return nil, fmt.Errorf("user parameter is required") } + key := GenerateCacheKey("user.getinfo", params) + zlog.Log.Debugf("using cache key %s", key) + + if user, cached := s.client.Cache.User.Get(key); cached { + zlog.Log.Debug("using cached user") + return &user, nil + } + body, err := s.client.makeRequest("user.getinfo", params) if err != nil { return nil, fmt.Errorf("failed to get user info: %w", err) @@ -42,6 +52,8 @@ func (s *UserService) GetInfo(params P) (*User, error) { return nil, fmt.Errorf("failed to unmarshal response: %w", err) } + s.client.Cache.User.Set(key, response.User, 0) + return &response.User, nil } diff --git a/pkg/reply/edit.go b/pkg/reply/edit.go index dd7371d..0e2fcdc 100644 --- a/pkg/reply/edit.go +++ b/pkg/reply/edit.go @@ -1,8 +1,6 @@ package reply import ( - "fmt" - "github.com/nxtgo/arikawa/v3/api" "github.com/nxtgo/arikawa/v3/discord" "github.com/nxtgo/arikawa/v3/utils/json" @@ -66,11 +64,5 @@ func (eb *EditBuilder) Clear() *EditBuilder { } func (eb *EditBuilder) Send() (*discord.Message, error) { - raw, err := json.Marshal(eb.data) - if err != nil { - fmt.Printf("Failed to marshal eb.data: %v\n", err) - } else { - fmt.Printf("EditBuilder data:\n%s\n", string(raw)) - } return eb.manager.state.EditInteractionResponse(eb.manager.appID, eb.manager.token, eb.data) } From 01ba934501f8efdebb1af04ad73cac7a60fb0f6e Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Sun, 21 Sep 2025 19:17:48 +0200 Subject: [PATCH 14/29] move recenttrack type --- last.fm/track_types.go | 79 ------------------------------------------ last.fm/user_types.go | 73 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 79 deletions(-) delete mode 100644 last.fm/track_types.go diff --git a/last.fm/track_types.go b/last.fm/track_types.go deleted file mode 100644 index 5364b62..0000000 --- a/last.fm/track_types.go +++ /dev/null @@ -1,79 +0,0 @@ -package lastfm - -import ( - "strconv" - "time" -) - -// Track represents a Last.fm track -type Track struct { - Artist TrackArtist `xml:"artist"` - Name string `xml:"name"` - Streamable string `xml:"streamable"` - MBID string `xml:"mbid"` - Album TrackAlbum `xml:"album"` - URL string `xml:"url"` - Images []Image `xml:"image"` - Date *TrackDate `xml:"date"` - NowPlaying string `xml:"nowplaying,attr"` -} - -// TrackArtist represents an artist in a track -type TrackArtist struct { - MBID string `xml:"mbid,attr"` - Name string `xml:",chardata"` -} - -// TrackAlbum represents an album in a track -type TrackAlbum struct { - MBID string `xml:"mbid,attr"` - Name string `xml:",chardata"` -} - -// TrackDate represents a track's play date -type TrackDate struct { - UTS string `xml:"uts,attr"` - Text string `xml:",chardata"` -} - -// IsNowPlaying returns true if the track is currently playing -func (t *Track) IsNowPlaying() bool { - return t.NowPlaying == "true" -} - -// GetPlayTime returns the track's play time as a Go time.Time -func (t *Track) GetPlayTime() (time.Time, error) { - if t.Date == nil || t.Date.UTS == "" { - return time.Time{}, nil - } - - unixTime, err := strconv.ParseInt(t.Date.UTS, 10, 64) - if err != nil { - return time.Time{}, err - } - - return time.Unix(unixTime, 0), nil -} - -// GetLargestImage returns the largest available image for the track -func (t *Track) GetLargestImage() *Image { - sizes := []string{"mega", "extralarge", "large", "medium", "small"} - for _, size := range sizes { - for _, img := range t.Images { - if img.Size == size && img.URL != "" { - return &img - } - } - } - return nil -} - -// GetImageBySize returns an image of the specified size for the track -func (t *Track) GetImageBySize(size string) *Image { - for _, img := range t.Images { - if img.Size == size && img.URL != "" { - return &img - } - } - return nil -} diff --git a/last.fm/user_types.go b/last.fm/user_types.go index 6c88b31..983cb3a 100644 --- a/last.fm/user_types.go +++ b/last.fm/user_types.go @@ -31,6 +31,79 @@ type Timestamp struct { Text string `xml:",chardata"` } +// RecentTrack represents a Last.fm track +type RecentTrack struct { + Artist RecentTrackArtist `xml:"artist"` + Name string `xml:"name"` + Streamable string `xml:"streamable"` + MBID string `xml:"mbid"` + Album RecentTrackAlbum `xml:"album"` + URL string `xml:"url"` + Images []Image `xml:"image"` + Date *RecentTrackDate `xml:"date"` + NowPlaying string `xml:"nowplaying,attr"` +} + +// RecentTrackArtist represents an artist in a track +type RecentTrackArtist struct { + MBID string `xml:"mbid,attr"` + Name string `xml:",chardata"` +} + +// RecentTrackAlbum represents an album in a track +type RecentTrackAlbum struct { + MBID string `xml:"mbid,attr"` + Name string `xml:",chardata"` +} + +// RecentTrackDate represents a track's play date +type RecentTrackDate struct { + UTS string `xml:"uts,attr"` + Text string `xml:",chardata"` +} + +// IsNowPlaying returns true if the track is currently playing +func (t *RecentTrack) IsNowPlaying() bool { + return t.NowPlaying == "true" +} + +// GetPlayTime returns the track's play time as a Go time.Time +func (t *RecentTrack) GetPlayTime() (time.Time, error) { + if t.Date == nil || t.Date.UTS == "" { + return time.Time{}, nil + } + + unixTime, err := strconv.ParseInt(t.Date.UTS, 10, 64) + if err != nil { + return time.Time{}, err + } + + return time.Unix(unixTime, 0), nil +} + +// GetLargestImage returns the largest available image for the track +func (t *RecentTrack) GetLargestImage() *Image { + sizes := []string{"mega", "extralarge", "large", "medium", "small"} + for _, size := range sizes { + for _, img := range t.Images { + if img.Size == size && img.URL != "" { + return &img + } + } + } + return nil +} + +// GetImageBySize returns an image of the specified size for the track +func (t *RecentTrack) GetImageBySize(size string) *Image { + for _, img := range t.Images { + if img.Size == size && img.URL != "" { + return &img + } + } + return nil +} + // RecentTracks represents the recent tracks response type RecentTracks struct { User string `xml:"user,attr"` From a3d7b2b72930277c1800abaca7c80c6b2c063957 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Sun, 21 Sep 2025 19:18:20 +0200 Subject: [PATCH 15/29] my bad --- last.fm/user_types.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/last.fm/user_types.go b/last.fm/user_types.go index 983cb3a..5cbceea 100644 --- a/last.fm/user_types.go +++ b/last.fm/user_types.go @@ -106,12 +106,12 @@ func (t *RecentTrack) GetImageBySize(size string) *Image { // RecentTracks represents the recent tracks response type RecentTracks struct { - User string `xml:"user,attr"` - Page int `xml:"page,attr"` - PerPage int `xml:"perPage,attr"` - TotalPages int `xml:"totalPages,attr"` - Total int `xml:"total,attr"` - Tracks []Track `xml:"track"` + User string `xml:"user,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Tracks []RecentTrack `xml:"track"` } func (t Timestamp) Time() (time.Time, error) { From dfba70423b43b8a4de583cd6661effa1de0f13b5 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Sun, 21 Sep 2025 22:20:06 +0200 Subject: [PATCH 16/29] update command --- cmd/bot/commands.go | 1 + commands/fm/fm.go | 29 ++++++++------- commands/update/update.go | 69 ++++++++++++++++++++++++++++++++++++ pkg/components/components.go | 28 +++++++++++---- 4 files changed, 106 insertions(+), 21 deletions(-) create mode 100644 commands/update/update.go diff --git a/cmd/bot/commands.go b/cmd/bot/commands.go index 3d3b6d8..c5094de 100644 --- a/cmd/bot/commands.go +++ b/cmd/bot/commands.go @@ -5,4 +5,5 @@ import ( _ "go.fm/commands/profile" _ "go.fm/commands/setuser" _ "go.fm/commands/stats" + _ "go.fm/commands/update" ) diff --git a/commands/fm/fm.go b/commands/fm/fm.go index 1bbed95..17a2e65 100644 --- a/commands/fm/fm.go +++ b/commands/fm/fm.go @@ -39,32 +39,31 @@ func handler(c *commands.CommandContext) error { return err } - var container *components.Container + var text *components.TextDisplay lastTrack := res.Tracks[0] if lastTrack.NowPlaying == "true" { - container = components.NewContainer(703487, - components.NewSection( - components.NewTextDisplayf("# %s", lastTrack.Name), - components.NewTextDisplayf("**%s** **ยท** %s", lastTrack.Artist.Name, lastTrack.Album.Name), - components.NewTextDisplayf("-# *Current track for %s*", res.User), - ).WithAccessory(components.NewThumbnail(lastTrack.GetLargestImage().URL)), - ) + text = components.NewTextDisplayf("-# *Current track for %s*", res.User) } else { playtime, err := lastTrack.GetPlayTime() if err != nil { playtime = time.Now() } - container = components.NewContainer(703487, - components.NewSection( - components.NewTextDisplayf("# %s", lastTrack.Name), - components.NewTextDisplayf("**%s** **ยท** %s", lastTrack.Artist.Name, lastTrack.Album.Name), - components.NewTextDisplayf("-# *Last track for %s, scrobbled at %s*", res.User, playtime.Format(time.Kitchen)), - ).WithAccessory(components.NewThumbnail(lastTrack.GetLargestImage().URL)), - ) + text = components.NewTextDisplayf("-# *Last track for %s, scrobbled at %s*", res.User, playtime.Format(time.Kitchen)) } + container := components.NewContainer(703487, + components.NewSection( + components.NewTextDisplayf("# %s", lastTrack.Name), + components.NewTextDisplayf("**%s** **ยท** %s", lastTrack.Artist.Name, lastTrack.Album.Name), + text, + ).WithAccessory(components.NewThumbnail(lastTrack.GetLargestImage().URL)), + components.NewActionRow( + components.NewButton(components.ButtonStyleLink, "Last.fm", nil).WithEmoji("1418269025959546943").WithURL(lastTrack.URL), + ), + ) + _, err = edit.ComponentsV2(container).Send() return err }) diff --git a/commands/update/update.go b/commands/update/update.go new file mode 100644 index 0000000..db0029d --- /dev/null +++ b/commands/update/update.go @@ -0,0 +1,69 @@ +package update + +import ( + "fmt" + "strings" + + "github.com/nxtgo/arikawa/v3/api" + "github.com/nxtgo/arikawa/v3/discord" + "go.fm/commands" + lastfm "go.fm/last.fm" + "go.fm/pkg/reply" +) + +var data = api.CreateCommandData{ + Name: "update", + Description: "update your data or another user's", + Options: discord.CommandOptions{ + discord.NewStringOption("data", "comma-separated list of data to update", true), + discord.NewStringOption("user", "user to update data for", false), + }, +} + +var options struct { + User *string `discord:"user"` + Data string `discord:"data"` +} + +// todo: data types +func handler(c *commands.CommandContext) error { + return c.Reply.AutoDefer(func(edit *reply.EditBuilder) error { + if err := c.Data.Options.Unmarshal(&options); err != nil { + return err + } + + username, err := c.GetUserOrFallback() + if err != nil { + return err + } + + dataTypes := strings.Split(options.Data, ",") + for i := range dataTypes { + dataTypes[i] = strings.TrimSpace(strings.ToLower(dataTypes[i])) + } + + userParams := lastfm.P{"user": username} + + for _, t := range dataTypes { + switch t { + case "profile", "getinfo": + go c.Last.User.GetInfo(userParams) + default: + return fmt.Errorf("unknown data type: %s", t) + } + } + + _, err = edit.Content( + fmt.Sprintf( + "updated the following data for `%s`:\n\\- %s", + username, + strings.Join(dataTypes, "\n\\- "), + ), + ).Send() + return err + }) +} + +func init() { + commands.Register(data, handler) +} diff --git a/pkg/components/components.go b/pkg/components/components.go index e9324d0..a238ea8 100644 --- a/pkg/components/components.go +++ b/pkg/components/components.go @@ -3,6 +3,7 @@ package components import "fmt" type ComponentType int +type ButtonStyle int const ( TypeActionRow ComponentType = 1 @@ -13,6 +14,13 @@ const ( TypeDivider ComponentType = 14 TypeContainer ComponentType = 17 ) +const ( + ButtonStylePrimary ButtonStyle = iota + 1 + ButtonStyleSecondary + ButtonStyleSuccess + ButtonStyleDanger + ButtonStyleLink +) type Component interface { componentType() ComponentType @@ -75,16 +83,19 @@ func (a *ActionRow) componentType() ComponentType { return TypeActionRow } type Button struct { Type ComponentType `json:"type"` - Style int `json:"style"` + Style ButtonStyle `json:"style"` Label string `json:"label"` - CustomID string `json:"custom_id"` + CustomID *string `json:"custom_id,omitempty"` Emoji *Emoji `json:"emoji,omitempty"` + URL *string `json:"url,omitempty"` } func (b *Button) componentType() ComponentType { return TypeButton } type Emoji struct { - Name string `json:"name"` + Name *string `json:"name,omitempty"` + ID string `json:"id"` + Animated bool `json:"animated"` } func NewContainer(accent int, children ...Component) *Container { @@ -120,11 +131,16 @@ func NewActionRow(children ...Component) *ActionRow { return &ActionRow{Type: TypeActionRow, Components: children} } -func NewButton(style int, label, customID string) *Button { +func NewButton(style ButtonStyle, label string, customID *string) *Button { return &Button{Type: TypeButton, Style: style, Label: label, CustomID: customID} } -func (b *Button) WithEmoji(name string) *Button { - b.Emoji = &Emoji{Name: name} +func (b *Button) WithURL(url string) *Button { + b.URL = &url + return b +} + +func (b *Button) WithEmoji(id string) *Button { + b.Emoji = &Emoji{ID: id} return b } From 8b1e5ecd52c887f769b4e9baff5367c9e4a4f5d2 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Mon, 22 Sep 2025 03:46:31 +0200 Subject: [PATCH 17/29] add top methods --- commands/profile/command.go | 7 +- commands/update/update.go | 8 ++- last.fm/cache.go | 25 ++++++- last.fm/user.go | 106 +++++++++++++++++++++++++++-- last.fm/user_types.go | 128 +++++++++++++++++++++++++++++++++--- 5 files changed, 256 insertions(+), 18 deletions(-) diff --git a/commands/profile/command.go b/commands/profile/command.go index bdd7592..d7f1fa2 100644 --- a/commands/profile/command.go +++ b/commands/profile/command.go @@ -37,13 +37,18 @@ func handler(c *commands.CommandContext) error { return err } + topAlbumsRes, err := c.Last.User.GetTopAlbums(lastfm.P{"user": username}) + if err != nil { + return err + } + container := components.NewContainer(703487, components.NewSection( components.NewTextDisplayf("# %s's profile", user.Name), ).WithAccessory( components.NewThumbnail(user.GetLargestImage().URL), ), - components.NewTextDisplay("this command is wip."), + components.NewTextDisplayf("you have %d top albums", topAlbumsRes.Total), components.NewDivider(), ) diff --git a/commands/update/update.go b/commands/update/update.go index db0029d..5630dc8 100644 --- a/commands/update/update.go +++ b/commands/update/update.go @@ -25,7 +25,7 @@ var options struct { Data string `discord:"data"` } -// todo: data types +// todo: let the user know which data is available to update func handler(c *commands.CommandContext) error { return c.Reply.AutoDefer(func(edit *reply.EditBuilder) error { if err := c.Data.Options.Unmarshal(&options); err != nil { @@ -48,6 +48,12 @@ func handler(c *commands.CommandContext) error { switch t { case "profile", "getinfo": go c.Last.User.GetInfo(userParams) + case "topalbums": + go c.Last.User.GetTopAlbums(userParams) + case "topartists": + go c.Last.User.GetTopArtists(userParams) + case "toptracks": + go c.Last.User.GetTopTracks(userParams) default: return fmt.Errorf("unknown data type: %s", t) } diff --git a/last.fm/cache.go b/last.fm/cache.go index 093e599..631b1d5 100644 --- a/last.fm/cache.go +++ b/last.fm/cache.go @@ -11,14 +11,29 @@ import ( ) type Cache struct { - User *gce.Cache[string, User] + User *gce.Cache[string, User] + UserTopAlbums *gce.Cache[string, TopAlbums] + UserTopArtists *gce.Cache[string, TopArtists] + UserTopTracks *gce.Cache[string, TopTracks] // todo: more cache } func NewCache() *Cache { return &Cache{ User: gce.New[string, User]( - gce.WithDefaultTTL(30*time.Minute), + gce.WithDefaultTTL(time.Minute*30), + gce.WithMaxEntries(10_000), + ), + UserTopAlbums: gce.New[string, TopAlbums]( + gce.WithDefaultTTL(time.Hour*6), + gce.WithMaxEntries(10_000), + ), + UserTopArtists: gce.New[string, TopArtists]( + gce.WithDefaultTTL(time.Hour*6), + gce.WithMaxEntries(10_000), + ), + UserTopTracks: gce.New[string, TopTracks]( + gce.WithDefaultTTL(time.Hour*6), gce.WithMaxEntries(10_000), ), } @@ -32,11 +47,17 @@ type CacheStats struct { func (c *Cache) Stats() []CacheStats { return []CacheStats{ {"User", c.User.Stats()}, + {"UserTopAlbums", c.UserTopAlbums.Stats()}, + {"UserTopArtists", c.UserTopArtists.Stats()}, + {"UserTopTracks", c.UserTopTracks.Stats()}, } } func (c *Cache) Close() { c.User.Close() + c.UserTopAlbums.Close() + c.UserTopArtists.Close() + c.UserTopTracks.Close() } func GenerateCacheKey(method string, args P) string { diff --git a/last.fm/user.go b/last.fm/user.go index fa43e4e..9d37458 100644 --- a/last.fm/user.go +++ b/last.fm/user.go @@ -3,8 +3,6 @@ package lastfm import ( "encoding/xml" "fmt" - - "go.fm/zlog" ) type UserService struct { @@ -29,16 +27,34 @@ type recentTracksResponse struct { RecentTracks RecentTracks `xml:"recenttracks"` } +type topAlbumsResponse struct { + XMLName xml.Name `xml:"lfm"` + Status string `xml:"status,attr"` + TopAlbums TopAlbums `xml:"topalbums"` +} + +type topArtistsResponse struct { + XMLName xml.Name `xml:"lfm"` + Status string `xml:"status,attr"` + TopArtists TopArtists `xml:"topartists"` +} + +type topTracksResponse struct { + XMLName xml.Name `xml:"lfm"` + Status string `xml:"status,attr"` + TopTracks TopTracks `xml:"toptracks"` +} + +/// user-based methods + func (s *UserService) GetInfo(params P) (*User, error) { if params["user"] == "" { return nil, fmt.Errorf("user parameter is required") } key := GenerateCacheKey("user.getinfo", params) - zlog.Log.Debugf("using cache key %s", key) if user, cached := s.client.Cache.User.Get(key); cached { - zlog.Log.Debug("using cached user") return &user, nil } @@ -57,6 +73,8 @@ func (s *UserService) GetInfo(params P) (*User, error) { return &response.User, nil } +/// user tracks + func (s *UserService) GetRecentTracks(params P) (*RecentTracks, error) { if params["user"] == "" { return nil, fmt.Errorf("user parameter is required") @@ -74,3 +92,83 @@ func (s *UserService) GetRecentTracks(params P) (*RecentTracks, error) { return &response.RecentTracks, nil } + +/// user tops + +func (s *UserService) GetTopAlbums(params P) (*TopAlbums, error) { + if params["user"] == "" { + return nil, fmt.Errorf("user parameter is required") + } + + key := GenerateCacheKey("user.gettopalbums", params) + + if topAlbums, cached := s.client.Cache.UserTopAlbums.Get(key); cached { + return &topAlbums, nil + } + + body, err := s.client.makeRequest("user.gettopalbums", params) + if err != nil { + return nil, fmt.Errorf("failed to get top albums: %w", err) + } + + var response topAlbumsResponse + if err := xml.Unmarshal(body, &response); err != nil { + return nil, fmt.Errorf("failed to unmarshal response: %w", err) + } + + s.client.Cache.UserTopAlbums.Set(key, response.TopAlbums, 0) + + return &response.TopAlbums, nil +} + +func (s *UserService) GetTopArtists(params P) (*TopArtists, error) { + if params["user"] == "" { + return nil, fmt.Errorf("user parameter is required") + } + + key := GenerateCacheKey("user.gettopartists", params) + + if topArtists, cached := s.client.Cache.UserTopArtists.Get(key); cached { + return &topArtists, nil + } + + body, err := s.client.makeRequest("user.gettopartists", params) + if err != nil { + return nil, fmt.Errorf("failed to get top artists: %w", err) + } + + var response topArtistsResponse + if err := xml.Unmarshal(body, &response); err != nil { + return nil, fmt.Errorf("failed to unmarshal response: %w", err) + } + + s.client.Cache.UserTopArtists.Set(key, response.TopArtists, 0) + + return &response.TopArtists, nil +} + +func (s *UserService) GetTopTracks(params P) (*TopTracks, error) { + if params["user"] == "" { + return nil, fmt.Errorf("user parameter is required") + } + + key := GenerateCacheKey("user.gettoptracks", params) + + if topTracks, cached := s.client.Cache.UserTopTracks.Get(key); cached { + return &topTracks, nil + } + + body, err := s.client.makeRequest("user.gettoptracks", params) + if err != nil { + return nil, fmt.Errorf("failed to get top tracks: %w", err) + } + + var response topTracksResponse + if err := xml.Unmarshal(body, &response); err != nil { + return nil, fmt.Errorf("failed to unmarshal response: %w", err) + } + + s.client.Cache.UserTopTracks.Set(key, response.TopTracks, 0) + + return &response.TopTracks, nil +} diff --git a/last.fm/user_types.go b/last.fm/user_types.go index 5cbceea..8ff15a0 100644 --- a/last.fm/user_types.go +++ b/last.fm/user_types.go @@ -1,6 +1,10 @@ package lastfm import ( + "encoding/json" + "fmt" + "net/http" + "net/url" "strconv" "time" ) @@ -31,6 +35,71 @@ type Timestamp struct { Text string `xml:",chardata"` } +// TopAlbums wraps the list of albums and pagination info +type TopAlbums struct { + User string `xml:"user,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Albums []TopAlbum `xml:"album"` +} + +// TopAlbum represents a single album +type TopAlbum struct { + Rank int `xml:"rank,attr"` + Name string `xml:"name"` + Playcount int `xml:"playcount"` + MBID string `xml:"mbid"` + URL string `xml:"url"` + Artist MinifiedArtist `xml:"artist"` + Images []Image `xml:"image"` +} + +// TopArtists wraps the list of artists and pagination info +type TopArtists struct { + User string `xml:"user,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Artists []TopArtist `xml:"artist"` +} + +// TopArtist represents a single artist +type TopArtist struct { + Rank int `xml:"rank,attr"` + Name string `xml:"name"` + Playcount int `xml:"playcount"` + MBID string `xml:"mbid"` + URL string `xml:"url"` + Streamable bool `xml:"streamable"` + Images []Image `xml:"image"` +} + +// TopTracks wraps the list of tracks and pagination info +type TopTracks struct { + User string `xml:"user,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Tracks []TopTrack `xml:"track"` +} + +// TopTrack represents a single track +type TopTrack struct { + Rank int `xml:"rank,attr"` + Name string `xml:"name"` + Duration int `xml:"duration"` + Playcount int `xml:"playcount"` + MBID string `xml:"mbid"` + URL string `xml:"url"` + Streamable bool `xml:"streamable"` // Can be "0" or "1" in XML + Artist MinifiedArtist `xml:"artist"` + Images []Image `xml:"image"` +} + // RecentTrack represents a Last.fm track type RecentTrack struct { Artist RecentTrackArtist `xml:"artist"` @@ -44,6 +113,16 @@ type RecentTrack struct { NowPlaying string `xml:"nowplaying,attr"` } +// RecentTracks represents the recent tracks response +type RecentTracks struct { + User string `xml:"user,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Tracks []RecentTrack `xml:"track"` +} + // RecentTrackArtist represents an artist in a track type RecentTrackArtist struct { MBID string `xml:"mbid,attr"` @@ -62,6 +141,13 @@ type RecentTrackDate struct { Text string `xml:",chardata"` } +// MinifiedArtist represents the artist with less data idk +type MinifiedArtist struct { + Name string `xml:"name"` + MBID string `xml:"mbid"` + URL string `xml:"url"` +} + // IsNowPlaying returns true if the track is currently playing func (t *RecentTrack) IsNowPlaying() bool { return t.NowPlaying == "true" @@ -104,16 +190,6 @@ func (t *RecentTrack) GetImageBySize(size string) *Image { return nil } -// RecentTracks represents the recent tracks response -type RecentTracks struct { - User string `xml:"user,attr"` - Page int `xml:"page,attr"` - PerPage int `xml:"perPage,attr"` - TotalPages int `xml:"totalPages,attr"` - Total int `xml:"total,attr"` - Tracks []RecentTrack `xml:"track"` -} - func (t Timestamp) Time() (time.Time, error) { if t.UnixTime == "" { return time.Time{}, nil @@ -149,3 +225,35 @@ func (u *User) GetLargestImage() Image { func (u *User) GetPlayCount() int64 { return u.PlayCount } + +type deezerSearchResponse struct { + Data []deezerArtist `json:"data"` +} + +type deezerArtist struct { + ID int `json:"id"` + Name string `json:"name"` + Picture string `json:"picture"` +} + +// GetDeezerImage fetches the artist image from Deezer +func (a *MinifiedArtist) GetDeezerImage() (string, error) { + baseURL := "https://api.deezer.com/search/artist" + query := url.QueryEscape(a.Name) + resp, err := http.Get(fmt.Sprintf("%s?q=%s", baseURL, query)) + if err != nil { + return "", err + } + defer resp.Body.Close() + + var result deezerSearchResponse + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + return "", err + } + + if len(result.Data) == 0 { + return "", fmt.Errorf("artist not found on Deezer") + } + + return result.Data[0].Picture, nil +} From 0f9206b40643a6fc1e7856910b5de7d5eb066bb8 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Mon, 22 Sep 2025 05:46:42 +0200 Subject: [PATCH 18/29] ill finish this later gng :wilted_rose: :v: --- assets/font/Inter_24pt-Regular.ttf | Bin 0 -> 342732 bytes assets/img/broken.png | Bin 0 -> 19714 bytes assets/img/chart_gradient.png | Bin 0 -> 51893 bytes bild/LICENSE | 21 ++ bild/README.md | 12 + bild/blend/blend.go | 380 +++++++++++++++++++++++++++++ bild/blur/blur.go | 52 ++++ bild/clone/clone.go | 156 ++++++++++++ bild/colors/colors.go | 150 ++++++++++++ bild/convolution/convolution.go | 133 ++++++++++ bild/convolution/kernel.go | 103 ++++++++ bild/fcolor/fcolor.go | 22 ++ bild/font/font.go | 60 +++++ bild/imgio/imgio.go | 112 +++++++++ bild/mask/mask.go | 52 ++++ bild/math/f64/f64.go | 13 + bild/parallel/parallel.go | 36 +++ bild/transform/filters.go | 142 +++++++++++ bild/transform/resize.go | 180 ++++++++++++++ cmd/bot/commands.go | 1 + commands/chart/chart.go | 220 +++++++++++++++++ commands/update/update.go | 22 +- go.mod | 2 + go.sum | 4 + last.fm/user_types.go | 15 +- pkg/reply/edit.go | 9 +- pkg/reply/followup.go | 43 ---- pkg/reply/response.go | 9 - 28 files changed, 1886 insertions(+), 63 deletions(-) create mode 100644 assets/font/Inter_24pt-Regular.ttf create mode 100644 assets/img/broken.png create mode 100644 assets/img/chart_gradient.png create mode 100644 bild/LICENSE create mode 100644 bild/README.md create mode 100644 bild/blend/blend.go create mode 100644 bild/blur/blur.go create mode 100644 bild/clone/clone.go create mode 100644 bild/colors/colors.go create mode 100644 bild/convolution/convolution.go create mode 100644 bild/convolution/kernel.go create mode 100644 bild/fcolor/fcolor.go create mode 100644 bild/font/font.go create mode 100644 bild/imgio/imgio.go create mode 100644 bild/mask/mask.go create mode 100644 bild/math/f64/f64.go create mode 100644 bild/parallel/parallel.go create mode 100644 bild/transform/filters.go create mode 100644 bild/transform/resize.go create mode 100644 commands/chart/chart.go delete mode 100644 pkg/reply/followup.go diff --git a/assets/font/Inter_24pt-Regular.ttf b/assets/font/Inter_24pt-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6b088a71193dc27290d27f910bc5d73214f3bbc1 GIT binary patch literal 342732 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

(ooqSGyr+~wg7v7X~!Ms4b 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

rife;5RpkCf%7@_EqLdp!t}|B70o-Azq!r|v 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 z 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

ERBva=-o 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ૂ`3XTd_s$gG`pq+cNfzhxxM*6D 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 Duw-^W literal 0 HcmV?d00001 diff --git a/assets/img/broken.png b/assets/img/broken.png new file mode 100644 index 0000000000000000000000000000000000000000..338dac7d7646900a8cb1089ed23fdbc2062aa17d GIT binary patch literal 19714 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 XUM>?n@;@1PWEq2}tDnm{r-UW|`W-&9 literal 0 HcmV?d00001 diff --git a/assets/img/chart_gradient.png b/assets/img/chart_gradient.png new file mode 100644 index 0000000000000000000000000000000000000000..79d81a30a4233c228bdec81415016904e3ccbbc1 GIT binary patch literal 51893 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 Wwvl{Zc}sl&0000 0.5 { + r = 1 - (1-2*(c0.R-0.5))*(1-c1.R) + } else { + r = 2 * c0.R * c1.R + } + if c0.G > 0.5 { + g = 1 - (1-2*(c0.G-0.5))*(1-c1.G) + } else { + g = 2 * c0.G * c1.G + } + if c0.B > 0.5 { + b = 1 - (1-2*(c0.B-0.5))*(1-c1.B) + } else { + b = 2 * c0.B * c1.B + } + + c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} + return alphaComp(c0, c2) + }) + + return dst +} + +// SoftLight combines the foreground and background images by using Pegtop's Soft Light formula and +// returns the resulting image. +func SoftLight(bg image.Image, fg image.Image) *image.RGBA { + dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { + r := (1-2*c1.R)*c0.R*c0.R + 2*c0.R*c1.R + g := (1-2*c1.G)*c0.G*c0.G + 2*c0.G*c1.G + b := (1-2*c1.B)*c0.B*c0.B + 2*c0.B*c1.B + + c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} + return alphaComp(c0, c2) + }) + return dst +} + +// Screen combines the foreground and background images by inverting, multiplying and inverting the output. +// The result is a brighter image which is then returned. +func Screen(bg image.Image, fg image.Image) *image.RGBA { + dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { + r := 1 - (1-c0.R)*(1-c1.R) + g := 1 - (1-c0.G)*(1-c1.G) + b := 1 - (1-c0.B)*(1-c1.B) + + c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} + return alphaComp(c0, c2) + }) + + return dst +} + +// Difference calculates the absolute difference between the foreground and background images and +// returns the resulting image. +func Difference(bg image.Image, fg image.Image) *image.RGBA { + dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { + r := math.Abs(c0.R - c1.R) + g := math.Abs(c0.G - c1.G) + b := math.Abs(c0.B - c1.B) + + c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} + return alphaComp(c0, c2) + }) + + return dst +} + +// Divide combines the foreground and background images by diving the values from the background +// by the foreground and returns the resulting image. +func Divide(bg image.Image, fg image.Image) *image.RGBA { + dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { + var r, g, b float64 + if c1.R == 0 { + r = 1 + } else { + r = c0.R / c1.R + } + if c1.G == 0 { + g = 1 + } else { + g = c0.G / c1.G + } + if c1.B == 0 { + b = 1 + } else { + b = c0.B / c1.B + } + + c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} + return alphaComp(c0, c2) + }) + + return dst +} + +// ColorBurn combines the foreground and background images by dividing the inverted +// background by the foreground image and then inverting the result which is then returned. +func ColorBurn(bg image.Image, fg image.Image) *image.RGBA { + dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { + var r, g, b float64 + if c1.R == 0 { + r = 0 + } else { + r = 1 - (1-c0.R)/c1.R + } + if c1.G == 0 { + g = 0 + } else { + g = 1 - (1-c0.G)/c1.G + } + if c1.B == 0 { + b = 0 + } else { + b = 1 - (1-c0.B)/c1.B + } + + c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} + return alphaComp(c0, c2) + }) + + return dst +} + +// Exclusion combines the foreground and background images applying the Exclusion blend mode and +// returns the resulting image. +func Exclusion(bg image.Image, fg image.Image) *image.RGBA { + dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { + r := 0.5 - 2*(c0.R-0.5)*(c1.R-0.5) + g := 0.5 - 2*(c0.G-0.5)*(c1.G-0.5) + b := 0.5 - 2*(c0.B-0.5)*(c1.B-0.5) + + c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} + return alphaComp(c0, c2) + }) + + return dst + +} + +// ColorDodge combines the foreground and background images by dividing background by the +// inverted foreground image and returns the result. +func ColorDodge(bg image.Image, fg image.Image) *image.RGBA { + dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { + var r, g, b float64 + if c1.R == 1 { + r = 1 + } else { + r = c0.R / (1 - c1.R) + } + if c1.G == 1 { + g = 1 + } else { + g = c0.G / (1 - c1.G) + } + if c1.B == 1 { + b = 1 + } else { + b = c0.B / (1 - c1.B) + } + + c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} + return alphaComp(c0, c2) + }) + + return dst +} + +// LinearBurn combines the foreground and background images by adding them and +// then subtracting 255 (1.0 in normalized scale). The resulting image is then returned. +func LinearBurn(bg image.Image, fg image.Image) *image.RGBA { + dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { + r := c0.R + c1.R - 1 + g := c0.G + c1.G - 1 + b := c0.B + c1.B - 1 + + c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} + return alphaComp(c0, c2) + }) + + return dst +} + +// LinearLight combines the foreground and background images by a mix of a Linear Dodge and +// Linear Burn operation. The resulting image is then returned. +func LinearLight(bg image.Image, fg image.Image) *image.RGBA { + dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { + var r, g, b float64 + if c1.R > 0.5 { + r = c0.R + 2*c1.R - 0.5 + } else { + r = c0.R + 2*c1.R - 1 + } + if c1.G > 0.5 { + g = c0.G + 2*c1.G - 0.5 + } else { + g = c0.G + 2*c1.G - 1 + } + if c1.B > 0.5 { + b = c0.B + 2*c1.B - 0.5 + } else { + b = c0.B + 2*c1.B - 1 + } + + c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} + return alphaComp(c0, c2) + }) + + return dst +} + +// Subtract combines the foreground and background images by Subtracting the background from the +// foreground. The result is then returned. +func Subtract(bg image.Image, fg image.Image) *image.RGBA { + dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { + r := c1.R - c0.R + g := c1.G - c0.G + b := c1.B - c0.B + + c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} + return alphaComp(c0, c2) + }) + + return dst +} + +// Opacity returns an image which blends the two input images by the percentage provided. +// Percent must be of range 0 <= percent <= 1.0 +func Opacity(bg image.Image, fg image.Image, percent float64) *image.RGBA { + percent = f64.Clamp(percent, 0, 1.0) + + dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { + r := c1.R*percent + (1-percent)*c0.R + g := c1.G*percent + (1-percent)*c0.G + b := c1.B*percent + (1-percent)*c0.B + + c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} + return alphaComp(c0, c2) + }) + + return dst +} + +// Darken combines the foreground and background images by picking the darkest value per channel +// for each pixel. The result is then returned. +func Darken(bg image.Image, fg image.Image) *image.RGBA { + dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { + r := math.Min(c0.R, c1.R) + g := math.Min(c0.G, c1.G) + b := math.Min(c0.B, c1.B) + + c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} + return alphaComp(c0, c2) + }) + + return dst +} + +// Lighten combines the foreground and background images by picking the brightest value per channel +// for each pixel. The result is then returned. +func Lighten(bg image.Image, fg image.Image) *image.RGBA { + dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { + r := math.Max(c0.R, c1.R) + g := math.Max(c0.G, c1.G) + b := math.Max(c0.B, c1.B) + + c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} + return alphaComp(c0, c2) + }) + + return dst +} + +// Blend two images together by applying the provided function for each pixel. +// If images differ in size, the minimum width and height will be picked from each one +// when creating the resulting image. +func Blend(bg image.Image, fg image.Image, fn func(fcolor.RGBAF64, fcolor.RGBAF64) fcolor.RGBAF64) *image.RGBA { + bgBounds := bg.Bounds() + fgBounds := fg.Bounds() + + var w, h int + w = min(bgBounds.Dx(), fgBounds.Dx()) + h = min(bgBounds.Dy(), fgBounds.Dy()) + + bgSrc := clone.AsShallowRGBA(bg) + fgSrc := clone.AsShallowRGBA(fg) + dst := image.NewRGBA(image.Rect(0, 0, w, h)) + + parallel.Line(h, func(start, end int) { + for y := start; y < end; y++ { + for x := 0; x < w; x++ { + bgPos := y*bgSrc.Stride + x*4 + fgPos := y*fgSrc.Stride + x*4 + result := fn( + fcolor.NewRGBAF64(bgSrc.Pix[bgPos+0], bgSrc.Pix[bgPos+1], bgSrc.Pix[bgPos+2], bgSrc.Pix[bgPos+3]), + fcolor.NewRGBAF64(fgSrc.Pix[fgPos+0], fgSrc.Pix[fgPos+1], fgSrc.Pix[fgPos+2], fgSrc.Pix[fgPos+3])) + + result.Clamp() + dstPos := y*dst.Stride + x*4 + dst.Pix[dstPos+0] = uint8(result.R * 255) + dst.Pix[dstPos+1] = uint8(result.G * 255) + dst.Pix[dstPos+2] = uint8(result.B * 255) + dst.Pix[dstPos+3] = uint8(result.A * 255) + } + + } + }) + + return dst +} + +// alphaComp returns a new color after compositing the two colors +// based on the foreground's alpha channel. +func alphaComp(bg, fg fcolor.RGBAF64) fcolor.RGBAF64 { + fg.Clamp() + fga := fg.A + + r := (fg.R * fga / 1) + ((1 - fga) * bg.R / 1) + g := (fg.G * fga / 1) + ((1 - fga) * bg.G / 1) + b := (fg.B * fga / 1) + ((1 - fga) * bg.B / 1) + a := bg.A + fga + + return fcolor.RGBAF64{R: r, G: g, B: b, A: a} +} diff --git a/bild/blur/blur.go b/bild/blur/blur.go new file mode 100644 index 0000000..8fa01d1 --- /dev/null +++ b/bild/blur/blur.go @@ -0,0 +1,52 @@ +/*Package blur provides image blurring functions.*/ +package blur + +import ( + "image" + "math" + + "go.fm/bild/clone" + "go.fm/bild/convolution" +) + +// Box returns a blurred (average) version of the image. +// Radius must be larger than 0. +func Box(src image.Image, radius float64) *image.RGBA { + if radius <= 0 { + return clone.AsRGBA(src) + } + + length := int(math.Ceil(2*radius + 1)) + k := convolution.NewKernel(length, length) + + for x := range length { + for y := range length { + k.Matrix[y*length+x] = 1 + } + } + + return convolution.Convolve(src, k.Normalized(), &convolution.Options{Bias: 0, Wrap: false, KeepAlpha: false}) +} + +// Gaussian returns a smoothly blurred version of the image using +// a Gaussian function. Radius must be larger than 0. +func Gaussian(src image.Image, radius float64) *image.RGBA { + if radius <= 0 { + return clone.AsRGBA(src) + } + + // Create the 1-d gaussian kernel + length := int(math.Ceil(2*radius + 1)) + k := convolution.NewKernel(length, 1) + for i, x := 0, -radius; i < length; i, x = i+1, x+1 { + k.Matrix[i] = math.Exp(-(x * x / 4 / radius)) + } + normK := k.Normalized() + + // Perform separable convolution + options := convolution.Options{Bias: 0, Wrap: false, KeepAlpha: false} + result := convolution.Convolve(src, normK, &options) + result = convolution.Convolve(result, normK.Transposed(), &options) + + return result +} diff --git a/bild/clone/clone.go b/bild/clone/clone.go new file mode 100644 index 0000000..406bd82 --- /dev/null +++ b/bild/clone/clone.go @@ -0,0 +1,156 @@ +package clone + +import ( + "image" + "image/draw" + + "go.fm/bild/parallel" +) + +// PadMethod is the method used to fill padded pixels. +type PadMethod uint8 + +const ( + // NoFill leaves the padded pixels empty. + NoFill = iota + // EdgeExtend extends the closest edge pixel. + EdgeExtend + // EdgeWrap wraps around the pixels of an image. + EdgeWrap +) + +// AsRGBA returns an RGBA copy of the supplied image. +func AsRGBA(src image.Image) *image.RGBA { + bounds := src.Bounds() + img := image.NewRGBA(bounds) + draw.Draw(img, bounds, src, bounds.Min, draw.Src) + return img +} + +// AsShallowRGBA tries to cast to image.RGBA to get reference. Otherwise makes a copy +func AsShallowRGBA(src image.Image) *image.RGBA { + if rgba, ok := src.(*image.RGBA); ok { + return rgba + } + return AsRGBA(src) +} + +// Pad returns an RGBA copy of the src image parameter with its edges padded +// using the supplied PadMethod. +// Parameter padX and padY correspond to the amount of padding to be applied +// on each side. +// Parameter m is the PadMethod to fill the new pixels. +// +// Usage example: +// +// result := Pad(img, 5,5, EdgeExtend) +func Pad(src image.Image, padX, padY int, m PadMethod) *image.RGBA { + var result *image.RGBA + + switch m { + case EdgeExtend: + result = extend(src, padX, padY) + case NoFill: + result = noFill(src, padX, padY) + case EdgeWrap: + result = wrap(src, padX, padY) + default: + result = extend(src, padX, padY) + } + + return result +} + +func noFill(img image.Image, padX, padY int) *image.RGBA { + srcBounds := img.Bounds() + paddedW, paddedH := srcBounds.Dx()+2*padX, srcBounds.Dy()+2*padY + newBounds := image.Rect(0, 0, paddedW, paddedH) + fillBounds := image.Rect(padX, padY, padX+srcBounds.Dx(), padY+srcBounds.Dy()) + + dst := image.NewRGBA(newBounds) + draw.Draw(dst, fillBounds, img, srcBounds.Min, draw.Src) + + return dst +} + +func extend(img image.Image, padX, padY int) *image.RGBA { + dst := noFill(img, padX, padY) + paddedW, paddedH := dst.Bounds().Dx(), dst.Bounds().Dy() + + parallel.Line(paddedH, func(start, end int) { + for y := start; y < end; y++ { + iy := y + if iy < padY { + iy = padY + } else if iy >= paddedH-padY { + iy = paddedH - padY - 1 + } + + for x := 0; x < paddedW; x++ { + ix := x + if ix < padX { + ix = padX + } else if x >= paddedW-padX { + ix = paddedW - padX - 1 + } else if iy == y { + // This only enters if we are not in a y-padded area or + // x-padded area, so nothing to extend here. + // So simply jump to the next padded-x index. + x = paddedW - padX - 1 + continue + } + + dstPos := y*dst.Stride + x*4 + edgePos := iy*dst.Stride + ix*4 + + dst.Pix[dstPos+0] = dst.Pix[edgePos+0] + dst.Pix[dstPos+1] = dst.Pix[edgePos+1] + dst.Pix[dstPos+2] = dst.Pix[edgePos+2] + dst.Pix[dstPos+3] = dst.Pix[edgePos+3] + } + } + }) + + return dst +} + +func wrap(img image.Image, padX, padY int) *image.RGBA { + dst := noFill(img, padX, padY) + paddedW, paddedH := dst.Bounds().Dx(), dst.Bounds().Dy() + + parallel.Line(paddedH, func(start, end int) { + for y := start; y < end; y++ { + iy := y + if iy < padY { + iy = (paddedH - padY) - ((padY - y) % (paddedH - padY*2)) + } else if iy >= paddedH-padY { + iy = padY - ((padY - y) % (paddedH - padY*2)) + } + + for x := 0; x < paddedW; x++ { + ix := x + if ix < padX { + ix = (paddedW - padX) - ((padX - x) % (paddedW - padX*2)) + } else if ix >= paddedW-padX { + ix = padX - ((padX - x) % (paddedW - padX*2)) + } else if iy == y { + // This only enters if we are not in a y-padded area or + // x-padded area, so nothing to extend here. + // So simply jump to the next padded-x index. + x = paddedW - padX - 1 + continue + } + + dstPos := y*dst.Stride + x*4 + edgePos := iy*dst.Stride + ix*4 + + dst.Pix[dstPos+0] = dst.Pix[edgePos+0] + dst.Pix[dstPos+1] = dst.Pix[edgePos+1] + dst.Pix[dstPos+2] = dst.Pix[edgePos+2] + dst.Pix[dstPos+3] = dst.Pix[edgePos+3] + } + } + }) + + return dst +} diff --git a/bild/colors/colors.go b/bild/colors/colors.go new file mode 100644 index 0000000..5e26b8d --- /dev/null +++ b/bild/colors/colors.go @@ -0,0 +1,150 @@ +package colors + +import ( + "fmt" + "image" + _ "image/gif" + _ "image/jpeg" + _ "image/png" + "io" + "math" + "net/http" + "sync/atomic" + "time" + + "go.fm/bild/parallel" +) + +func rgbToHsl(r, g, b float64) (h, s, l float64) { + r /= 255 + g /= 255 + b /= 255 + + max := math.Max(r, math.Max(g, b)) + min := math.Min(r, math.Min(g, b)) + l = (max + min) / 2 + + if max == min { + h, s = 0, 0 + } else { + d := max - min + if l > 0.5 { + s = d / (2 - max - min) + } else { + s = d / (max + min) + } + + switch max { + case r: + h = (g - b) / d + if g < b { + h += 6 + } + case g: + h = (b-r)/d + 2 + case b: + h = (r-g)/d + 4 + } + h /= 6 + } + return +} + +func hslToRgb(h, s, l float64) (r, g, b int) { + var rF, gF, bF float64 + + if s == 0 { + rF, gF, bF = l, l, l + } else { + var hue2rgb = func(p, q, t float64) float64 { + if t < 0 { + t += 1 + } + if t > 1 { + t -= 1 + } + if t < 1.0/6 { + return p + (q-p)*6*t + } + if t < 1.0/2 { + return q + } + if t < 2.0/3 { + return p + (q-p)*(2.0/3-t)*6 + } + return p + } + + var q float64 + if l < 0.5 { + q = l * (1 + s) + } else { + q = l + s - l*s + } + p := 2*l - q + rF = hue2rgb(p, q, h+1.0/3) + gF = hue2rgb(p, q, h) + bF = hue2rgb(p, q, h-1.0/3) + } + + return int(rF * 255), int(gF * 255), int(bF * 255) +} + +func Dominant(url string) (int, error) { + client := &http.Client{ + Timeout: 10 * time.Second, + } + resp, err := client.Get(url) + if err != nil { + return 0, err + } + defer resp.Body.Close() + + limitedReader := &io.LimitedReader{R: resp.Body, N: 10 << 20} + + img, _, err := image.Decode(limitedReader) + if err != nil { + return 0, err + } + + bounds := img.Bounds() + if bounds.Dx() > 4000 || bounds.Dy() > 4000 { + return 0x00ADD8, nil + } + height := bounds.Dy() + + var rTotal, gTotal, bTotal, count uint64 + + parallel.Line(height, func(start, end int) { + var rLocal, gLocal, bLocal, cLocal uint64 + for y := start; y < end; y++ { + for x := bounds.Min.X; x < bounds.Max.X; x++ { + r, g, b, _ := img.At(x, y).RGBA() + rLocal += uint64(r >> 8) + gLocal += uint64(g >> 8) + bLocal += uint64(b >> 8) + cLocal++ + } + } + atomic.AddUint64(&rTotal, rLocal) + atomic.AddUint64(&gTotal, gLocal) + atomic.AddUint64(&bTotal, bLocal) + atomic.AddUint64(&count, cLocal) + }) + + if count == 0 { + return 0, fmt.Errorf("image has no pixels") + } + + rAvg := float64(rTotal / count) + gAvg := float64(gTotal / count) + bAvg := float64(bTotal / count) + + h, s, l := rgbToHsl(rAvg, gAvg, bAvg) + s = math.Min(1.0, s*1.5) + + rBoost, gBoost, bBoost := hslToRgb(h, s, l) + + colorInt := (rBoost << 16) | (gBoost << 8) | bBoost + return colorInt, nil +} diff --git a/bild/convolution/convolution.go b/bild/convolution/convolution.go new file mode 100644 index 0000000..b440bac --- /dev/null +++ b/bild/convolution/convolution.go @@ -0,0 +1,133 @@ +package convolution + +import ( + "image" + "math" + + "go.fm/bild/clone" + "go.fm/bild/parallel" +) + +// Options are the Convolve function parameters. +// Bias is added to each RGB channel after convoluting. Range is -255 to 255. +// Wrap sets if indices outside of image dimensions should be taken from the opposite side. +// KeepAlpha sets if alpha should be convolved or kept from the source image. +type Options struct { + Bias float64 + Wrap bool + KeepAlpha bool +} + +// Convolve applies a convolution matrix (kernel) to an image with the supplied options. +// +// Usage example: +// +// result := Convolve(img, kernel, &Options{Bias: 0, Wrap: false}) +func Convolve(img image.Image, k Matrix, o *Options) *image.RGBA { + // Config the convolution + bias := 0.0 + wrap := false + keepAlpha := false + if o != nil { + wrap = o.Wrap + bias = o.Bias + keepAlpha = o.KeepAlpha + } + + return execute(img, k, bias, wrap, keepAlpha) +} + +func execute(img image.Image, k Matrix, bias float64, wrap, keepAlpha bool) *image.RGBA { + // Kernel attributes + lenX := k.MaxX() + lenY := k.MaxY() + radiusX := lenX / 2 + radiusY := lenY / 2 + + // Pad the source image, basically pre-computing the pixels outside of image bounds + var src *image.RGBA + if wrap { + src = clone.Pad(img, radiusX, radiusY, clone.EdgeWrap) + } else { + src = clone.Pad(img, radiusX, radiusY, clone.EdgeExtend) + } + + // src bounds now includes padded pixels + srcBounds := src.Bounds() + srcW, srcH := srcBounds.Dx(), srcBounds.Dy() + dst := image.NewRGBA(img.Bounds()) + + // To keep alpha we simply don't convolve it + if keepAlpha { + // Notice we can't use lenY since it will be larger than the actual padding pixels + // as it includes the identity element + parallel.Line(srcH-(radiusY*2), func(start, end int) { + // Correct range so we don't iterate over the padded pixels on the main loop + for y := start + radiusY; y < end+radiusY; y++ { + for x := radiusX; x < srcW-radiusX; x++ { + + var r, g, b float64 + // Kernel has access to the padded pixels + for ky := range lenY { + iy := y - radiusY + ky + + for kx := range lenX { + ix := x - radiusX + kx + + kvalue := k.At(kx, ky) + ipos := iy*src.Stride + ix*4 + r += float64(src.Pix[ipos+0]) * kvalue + g += float64(src.Pix[ipos+1]) * kvalue + b += float64(src.Pix[ipos+2]) * kvalue + } + } + + // Map x and y indices to non-padded range + pos := (y-radiusY)*dst.Stride + (x-radiusX)*4 + + dst.Pix[pos+0] = uint8(math.Max(math.Min(r+bias, 255), 0)) + dst.Pix[pos+1] = uint8(math.Max(math.Min(g+bias, 255), 0)) + dst.Pix[pos+2] = uint8(math.Max(math.Min(b+bias, 255), 0)) + dst.Pix[pos+3] = src.Pix[y*src.Stride+x*4+3] + } + } + }) + } else { + // Notice we can't use lenY since it will be larger than the actual padding pixels + // as it includes the identity element + parallel.Line(srcH-(radiusY*2), func(start, end int) { + // Correct range so we don't iterate over the padded pixels on the main loop + for y := start + radiusY; y < end+radiusY; y++ { + for x := radiusX; x < srcW-radiusX; x++ { + + var r, g, b, a float64 + // Kernel has access to the padded pixels + for ky := range lenY { + iy := y - radiusY + ky + + for kx := range lenX { + ix := x - radiusX + kx + + kvalue := k.At(kx, ky) + ipos := iy*src.Stride + ix*4 + r += float64(src.Pix[ipos+0]) * kvalue + g += float64(src.Pix[ipos+1]) * kvalue + b += float64(src.Pix[ipos+2]) * kvalue + a += float64(src.Pix[ipos+3]) * kvalue + } + } + + // Map x and y indices to non-padded range + pos := (y-radiusY)*dst.Stride + (x-radiusX)*4 + + dst.Pix[pos+0] = uint8(math.Max(math.Min(r+bias, 255), 0)) + dst.Pix[pos+1] = uint8(math.Max(math.Min(g+bias, 255), 0)) + dst.Pix[pos+2] = uint8(math.Max(math.Min(b+bias, 255), 0)) + dst.Pix[pos+3] = uint8(math.Max(math.Min(a, 255), 0)) + } + } + }) + } + + return dst +} diff --git a/bild/convolution/kernel.go b/bild/convolution/kernel.go new file mode 100644 index 0000000..e91e723 --- /dev/null +++ b/bild/convolution/kernel.go @@ -0,0 +1,103 @@ +package convolution + +import ( + "fmt" + "math" +) + +// Matrix interface. +// At returns the matrix value at position x, y. +// Normalized returns a new matrix with normalized values. +// MaxX returns the horizontal length. +// MaxY returns the vertical length. +type Matrix interface { + At(x, y int) float64 + Normalized() Matrix + MaxX() int + MaxY() int + Transposed() Matrix +} + +// NewKernel returns a kernel of the provided length. +func NewKernel(width, height int) *Kernel { + return &Kernel{make([]float64, width*height), width, height} +} + +// Kernel to be used as a convolution matrix. +type Kernel struct { + Matrix []float64 + Width int + Height int +} + +// Normalized returns a new Kernel with normalized values. +func (k *Kernel) Normalized() Matrix { + sum := k.Absum() + w := k.Width + h := k.Height + nk := NewKernel(w, h) + + // avoid division by 0 + if sum == 0 { + sum = 1 + } + + for i := 0; i < w*h; i++ { + nk.Matrix[i] = k.Matrix[i] / sum + } + + return nk +} + +// MaxX returns the horizontal length. +func (k *Kernel) MaxX() int { + return k.Width +} + +// MaxY returns the vertical length. +func (k *Kernel) MaxY() int { + return k.Height +} + +// At returns the matrix value at position x, y. +func (k *Kernel) At(x, y int) float64 { + return k.Matrix[y*k.Width+x] +} + +// Transposed returns a new Kernel that has the columns as rows and vice versa +func (k *Kernel) Transposed() Matrix { + w := k.Width + h := k.Height + nk := NewKernel(h, w) + + for x := range w { + for y := range h { + nk.Matrix[x*h+y] = k.Matrix[y*w+x] + } + } + + return nk +} + +// String returns the string representation of the matrix. +func (k *Kernel) String() string { + result := "" + stride := k.MaxX() + height := k.MaxY() + for y := range height { + result += "\n" + for x := range stride { + result += fmt.Sprintf("%-8.4f", k.At(x, y)) + } + } + return result +} + +// Absum returns the absolute cumulative value of the kernel. +func (k *Kernel) Absum() float64 { + var sum float64 + for _, v := range k.Matrix { + sum += math.Abs(v) + } + return sum +} diff --git a/bild/fcolor/fcolor.go b/bild/fcolor/fcolor.go new file mode 100644 index 0000000..b36bf5c --- /dev/null +++ b/bild/fcolor/fcolor.go @@ -0,0 +1,22 @@ +package fcolor + +import "go.fm/bild/math/f64" + +// RGBAF64 represents an RGBA color using the range 0.0 to 1.0 with a float64 for each channel. +type RGBAF64 struct { + R, G, B, A float64 +} + +// NewRGBAF64 returns a new RGBAF64 color based on the provided uint8 values. +// uint8 value 0 maps to 0, 128 to 0.5 and 255 to 1.0. +func NewRGBAF64(r, g, b, a uint8) RGBAF64 { + return RGBAF64{float64(r) / 255, float64(g) / 255, float64(b) / 255, float64(a) / 255} +} + +// Clamp limits the channel values of the RGBAF64 color to the range 0.0 to 1.0. +func (c *RGBAF64) Clamp() { + c.R = f64.Clamp(c.R, 0, 1) + c.G = f64.Clamp(c.G, 0, 1) + c.B = f64.Clamp(c.B, 0, 1) + c.A = f64.Clamp(c.A, 0, 1) +} diff --git a/bild/font/font.go b/bild/font/font.go new file mode 100644 index 0000000..8086d5d --- /dev/null +++ b/bild/font/font.go @@ -0,0 +1,60 @@ +package font + +import ( + "image" + "image/color" + "image/draw" + "log" + "os" + + "golang.org/x/image/font" + "golang.org/x/image/font/opentype" + "golang.org/x/image/math/fixed" +) + +// Font holds a loaded TTF font and can create faces of different sizes. +type Font struct { + ttf *opentype.Font +} + +// LoadFont loads a TTF font from a file path. +func LoadFont(path string) *Font { + data, err := os.ReadFile(path) + if err != nil { + log.Fatalf("failed to read font file: %v", err) + } + ttf, err := opentype.Parse(data) + if err != nil { + log.Fatalf("failed to parse font: %v", err) + } + return &Font{ttf: ttf} +} + +// Face returns a font.Face of the specified size (in points) and DPI. +func (f *Font) Face(size float64, dpi float64) font.Face { + face, err := opentype.NewFace(f.ttf, &opentype.FaceOptions{ + Size: size, + DPI: dpi, + Hinting: font.HintingFull, + }) + if err != nil { + log.Fatalf("failed to create font face: %v", err) + } + return face +} + +// DrawText draws text onto an image at a given position with color and font.Face. +func DrawText(canvas draw.Image, x, y int, text string, col color.Color, face font.Face) { + d := &font.Drawer{ + Dst: canvas, + Src: image.NewUniform(col), + Face: face, + Dot: fixed.Point26_6{X: fixed.I(x), Y: fixed.I(y)}, + } + d.DrawString(text) +} + +func Measure(f font.Face, s string) int { + d := &font.Drawer{Face: f} + return d.MeasureString(s).Ceil() +} diff --git a/bild/imgio/imgio.go b/bild/imgio/imgio.go new file mode 100644 index 0000000..c15c9c4 --- /dev/null +++ b/bild/imgio/imgio.go @@ -0,0 +1,112 @@ +/*Package imgio provides basic image file input/output.*/ +package imgio + +import ( + "bytes" + "fmt" + "image" + "image/jpeg" + "image/png" + "io" + "net/http" + "os" +) + +// Encoder encodes the provided image and writes it +type Encoder func(io.Writer, image.Image) error + +// Open loads and decodes an image from a file and returns it. +// +// Usage example: +// +// // Decodes an image from a file with the given filename +// // returns an error if something went wrong +// img, err := Open("exampleName") +func Open(filename string) (image.Image, error) { + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + + img, _, err := image.Decode(f) + if err != nil { + return nil, err + } + + return img, nil +} + +// Fetch retrieves the raw image bytes from the given URL. +// +// Usage example: +// +// data, err := Fetch("https://example.com/image.png") +// if err != nil { +// // handle error +// } +func Fetch(url string) ([]byte, error) { + resp, err := http.Get(url) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("failed to fetch image: %s", resp.Status) + } + + data, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + return data, nil +} + +// DecodeImage loads and decodes an image from a byte slice and returns it. +// +// Usage example: +// +// img, err := Decode(data) +// if err != nil { +// // handle error +// } +func Decode(data []byte) (image.Image, error) { + reader := bytes.NewReader(data) + img, _, err := image.Decode(reader) + if err != nil { + return nil, err + } + return img, nil +} + +// JPEGEncoder returns an encoder to JPEG given the argument 'quality' +func JPEGEncoder(quality int) Encoder { + return func(w io.Writer, img image.Image) error { + return jpeg.Encode(w, img, &jpeg.Options{Quality: quality}) + } +} + +// PNGEncoder returns an encoder to PNG +func PNGEncoder() Encoder { + return func(w io.Writer, img image.Image) error { + return png.Encode(w, img) + } +} + +// Encode encodes an image into a byte slice using the provided encoder. +// +// Usage example: +// +// data, err := Encode(img, imgio.JPEGEncoder(90)) +// if err != nil { +// // handle error +// } +func Encode(img image.Image, encoder Encoder) ([]byte, error) { + buf := new(bytes.Buffer) + if err := encoder(buf, img); err != nil { + return nil, err + } + return buf.Bytes(), nil +} diff --git a/bild/mask/mask.go b/bild/mask/mask.go new file mode 100644 index 0000000..5cbedec --- /dev/null +++ b/bild/mask/mask.go @@ -0,0 +1,52 @@ +package mask + +import ( + "image" + "image/color" + + "go.fm/bild/parallel" +) + +func Rounded(width, height, radius int) *image.Alpha { + mask := image.NewAlpha(image.Rect(0, 0, width, height)) + + parallel.Line(height, func(start, end int) { + for y := start; y < end; y++ { + for x := range width { + alpha := 255 + + // top-left corner + dx := float64(radius - x) + dy := float64(radius - y) + if dx > 0 && dy > 0 && dx*dx+dy*dy > float64(radius*radius) { + alpha = 0 + } + + // top-right corner + dx = float64(x - (width - radius - 1)) + dy = float64(radius - y) + if dx > 0 && dy > 0 && dx*dx+dy*dy > float64(radius*radius) { + alpha = 0 + } + + // bottom-left corner + dx = float64(radius - x) + dy = float64(y - (height - radius - 1)) + if dx > 0 && dy > 0 && dx*dx+dy*dy > float64(radius*radius) { + alpha = 0 + } + + // bottom-right corner + dx = float64(x - (width - radius - 1)) + dy = float64(y - (height - radius - 1)) + if dx > 0 && dy > 0 && dx*dx+dy*dy > float64(radius*radius) { + alpha = 0 + } + + mask.SetAlpha(x, y, color.Alpha{A: uint8(alpha)}) + } + } + }) + + return mask +} diff --git a/bild/math/f64/f64.go b/bild/math/f64/f64.go new file mode 100644 index 0000000..cc85ec3 --- /dev/null +++ b/bild/math/f64/f64.go @@ -0,0 +1,13 @@ +package f64 + +// Clamp returns the value if it fits within the parameters min and max. +// Otherwise returns the closest boundary parameter value. +func Clamp(value, min, max float64) float64 { + if value > max { + return max + } + if value < min { + return min + } + return value +} diff --git a/bild/parallel/parallel.go b/bild/parallel/parallel.go new file mode 100644 index 0000000..3336327 --- /dev/null +++ b/bild/parallel/parallel.go @@ -0,0 +1,36 @@ +package parallel + +import ( + "runtime" + "sync" +) + +func init() { + runtime.GOMAXPROCS(runtime.NumCPU()) +} + +// Line dispatches a parameter fn into multiple goroutines by splitting the parameter length +// by the number of available CPUs and assigning the length parts into each fn. +func Line(length int, fn func(start, end int)) { + procs := runtime.GOMAXPROCS(0) + counter := length + partSize := length / procs + if procs <= 1 || partSize <= procs { + fn(0, length) + } else { + var wg sync.WaitGroup + for counter > 0 { + start := counter - partSize + end := counter + if start < 0 { + start = 0 + } + counter -= partSize + wg.Go(func() { + fn(start, end) + }) + } + + wg.Wait() + } +} diff --git a/bild/transform/filters.go b/bild/transform/filters.go new file mode 100644 index 0000000..85b512d --- /dev/null +++ b/bild/transform/filters.go @@ -0,0 +1,142 @@ +/* +Package transform provides basic image transformation functions, such as resizing, rotation and flipping. +It includes a variety of resampling filters to handle interpolation in case that upsampling or downsampling is required. +*/ +package transform + +import "math" + +// ResampleFilter is used to evaluate sample points and interpolate between them. +// Support is the number of points required by the filter per 'side'. +// For example, a support of 1.0 means that the filter will get pixels on +// positions -1 and +1 away from it. +// Fn is the resample filter function to evaluate the samples. +type ResampleFilter struct { + Support float64 + Fn func(x float64) float64 +} + +// NearestNeighbor resampling filter assigns to each point the sample point nearest to it. +var NearestNeighbor ResampleFilter + +// Box resampling filter, only let pass values in the x < 0.5 range from sample. +// It produces similar results to the Nearest Neighbor method. +var Box ResampleFilter + +// Linear resampling filter interpolates linearly between the two nearest samples per dimension. +var Linear ResampleFilter + +// Gaussian resampling filter interpolates using a Gaussian function between the two nearest +// samples per dimension. +var Gaussian ResampleFilter + +// MitchellNetravali resampling filter interpolates between the four nearest samples per dimension. +var MitchellNetravali ResampleFilter + +// CatmullRom resampling filter interpolates between the four nearest samples per dimension. +var CatmullRom ResampleFilter + +// Lanczos resampling filter interpolates between the six nearest samples per dimension. +var Lanczos ResampleFilter + +func init() { + NearestNeighbor = ResampleFilter{ + Support: 0, + Fn: nil, + } + Box = ResampleFilter{ + Support: 0.5, + Fn: func(x float64) float64 { + if math.Abs(x) < 0.5 { + return 1 + } + return 0 + }, + } + Linear = ResampleFilter{ + Support: 1.0, + Fn: func(x float64) float64 { + x = math.Abs(x) + if x < 1.0 { + return 1.0 - x + } + return 0 + }, + } + Gaussian = ResampleFilter{ + Support: 1.0, + Fn: func(x float64) float64 { + x = math.Abs(x) + if x < 1.0 { + exp := 2.0 + x *= 2.0 + y := math.Pow(0.5, math.Pow(x, exp)) + base := math.Pow(0.5, math.Pow(2, exp)) + return (y - base) / (1 - base) + } + return 0 + }, + } + MitchellNetravali = ResampleFilter{ + Support: 2.0, + Fn: func(x float64) float64 { + b := 1.0 / 3 + c := 1.0 / 3 + var w [4]float64 + x = math.Abs(x) + + if x < 1.0 { + w[0] = 0 + w[1] = 6 - 2*b + w[2] = (-18 + 12*b + 6*c) * x * x + w[3] = (12 - 9*b - 6*c) * x * x * x + } else if x <= 2.0 { + w[0] = 8*b + 24*c + w[1] = (-12*b - 48*c) * x + w[2] = (6*b + 30*c) * x * x + w[3] = (-b - 6*c) * x * x * x + } else { + return 0 + } + + return (w[0] + w[1] + w[2] + w[3]) / 6 + }, + } + CatmullRom = ResampleFilter{ + Support: 2.0, + Fn: func(x float64) float64 { + b := 0.0 + c := 0.5 + var w [4]float64 + x = math.Abs(x) + + if x < 1.0 { + w[0] = 0 + w[1] = 6 - 2*b + w[2] = (-18 + 12*b + 6*c) * x * x + w[3] = (12 - 9*b - 6*c) * x * x * x + } else if x <= 2.0 { + w[0] = 8*b + 24*c + w[1] = (-12*b - 48*c) * x + w[2] = (6*b + 30*c) * x * x + w[3] = (-b - 6*c) * x * x * x + } else { + return 0 + } + + return (w[0] + w[1] + w[2] + w[3]) / 6 + }, + } + Lanczos = ResampleFilter{ + Support: 3.0, + Fn: func(x float64) float64 { + x = math.Abs(x) + if x == 0 { + return 1.0 + } else if x < 3.0 { + return (3.0 * math.Sin(math.Pi*x) * math.Sin(math.Pi*(x/3.0))) / (math.Pi * math.Pi * x * x) + } + return 0.0 + }, + } +} diff --git a/bild/transform/resize.go b/bild/transform/resize.go new file mode 100644 index 0000000..bface76 --- /dev/null +++ b/bild/transform/resize.go @@ -0,0 +1,180 @@ +package transform + +import ( + "image" + "math" + + "go.fm/bild/clone" + "go.fm/bild/math/f64" + "go.fm/bild/parallel" +) + +// Resize returns a new image with its size adjusted to the new width and height. The filter +// param corresponds to the Resampling Filter to be used when interpolating between the sample points. +// +// Usage example: +// +// result := transform.Resize(img, 800, 600, transform.Linear) +func Resize(img image.Image, width, height int, filter ResampleFilter) *image.RGBA { + if width <= 0 || height <= 0 || img.Bounds().Empty() { + return image.NewRGBA(image.Rect(0, 0, 0, 0)) + } + + src := clone.AsShallowRGBA(img) + var dst *image.RGBA + + // NearestNeighbor is a special case, it's faster to compute without convolution matrix. + if filter.Support <= 0 { + dst = nearestNeighbor(src, width, height) + } else { + dst = resampleHorizontal(src, width, filter) + dst = resampleVertical(dst, height, filter) + } + + return dst +} + +// Crop returns a new image which contains the intersection between the rect and the image provided as params. +// Only the intersection is returned. If a rect larger than the image is provided, no fill is done to +// the 'empty' area. +// +// Usage example: +// +// result := transform.Crop(img, image.Rect(0, 0, 512, 256)) +func Crop(img image.Image, rect image.Rectangle) *image.RGBA { + src := clone.AsShallowRGBA(img) + return clone.AsRGBA(src.SubImage(rect)) +} + +func resampleHorizontal(src *image.RGBA, width int, filter ResampleFilter) *image.RGBA { + srcWidth, srcHeight := src.Bounds().Dx(), src.Bounds().Dy() + srcStride := src.Stride + + delta := float64(srcWidth) / float64(width) + // Scale must be at least 1. Special case for image size reduction filter radius. + scale := math.Max(delta, 1.0) + + dst := image.NewRGBA(image.Rect(0, 0, width, srcHeight)) + dstStride := dst.Stride + + filterRadius := math.Ceil(scale * filter.Support) + + parallel.Line(srcHeight, func(start, end int) { + for y := start; y < end; y++ { + for x := range width { + // value of x from src + ix := (float64(x)+0.5)*delta - 0.5 + istart, iend := int(ix-filterRadius+0.5), int(ix+filterRadius) + + if istart < 0 { + istart = 0 + } + if iend >= srcWidth { + iend = srcWidth - 1 + } + + var r, g, b, a float64 + var sum float64 + for kx := istart; kx <= iend; kx++ { + + srcPos := y*srcStride + kx*4 + // normalize the sample position to be evaluated by the filter + normPos := (float64(kx) - ix) / scale + fValue := filter.Fn(normPos) + + r += float64(src.Pix[srcPos+0]) * fValue + g += float64(src.Pix[srcPos+1]) * fValue + b += float64(src.Pix[srcPos+2]) * fValue + a += float64(src.Pix[srcPos+3]) * fValue + sum += fValue + } + + dstPos := y*dstStride + x*4 + dst.Pix[dstPos+0] = uint8(f64.Clamp((r/sum)+0.5, 0, 255)) + dst.Pix[dstPos+1] = uint8(f64.Clamp((g/sum)+0.5, 0, 255)) + dst.Pix[dstPos+2] = uint8(f64.Clamp((b/sum)+0.5, 0, 255)) + dst.Pix[dstPos+3] = uint8(f64.Clamp((a/sum)+0.5, 0, 255)) + } + } + }) + + return dst +} + +func resampleVertical(src *image.RGBA, height int, filter ResampleFilter) *image.RGBA { + srcWidth, srcHeight := src.Bounds().Dx(), src.Bounds().Dy() + srcStride := src.Stride + + delta := float64(srcHeight) / float64(height) + scale := math.Max(delta, 1.0) + + dst := image.NewRGBA(image.Rect(0, 0, srcWidth, height)) + dstStride := dst.Stride + + filterRadius := math.Ceil(scale * filter.Support) + + parallel.Line(height, func(start, end int) { + for y := start; y < end; y++ { + iy := (float64(y)+0.5)*delta - 0.5 + + istart, iend := int(iy-filterRadius+0.5), int(iy+filterRadius) + + if istart < 0 { + istart = 0 + } + if iend >= srcHeight { + iend = srcHeight - 1 + } + + for x := range srcWidth { + var r, g, b, a float64 + var sum float64 + for ky := istart; ky <= iend; ky++ { + + srcPos := ky*srcStride + x*4 + normPos := (float64(ky) - iy) / scale + fValue := filter.Fn(normPos) + + r += float64(src.Pix[srcPos+0]) * fValue + g += float64(src.Pix[srcPos+1]) * fValue + b += float64(src.Pix[srcPos+2]) * fValue + a += float64(src.Pix[srcPos+3]) * fValue + sum += fValue + } + + dstPos := y*dstStride + x*4 + dst.Pix[dstPos+0] = uint8(f64.Clamp((r/sum)+0.5, 0, 255)) + dst.Pix[dstPos+1] = uint8(f64.Clamp((g/sum)+0.5, 0, 255)) + dst.Pix[dstPos+2] = uint8(f64.Clamp((b/sum)+0.5, 0, 255)) + dst.Pix[dstPos+3] = uint8(f64.Clamp((a/sum)+0.5, 0, 255)) + } + } + }) + + return dst +} + +func nearestNeighbor(src *image.RGBA, width, height int) *image.RGBA { + srcW, srcH := src.Bounds().Dx(), src.Bounds().Dy() + srcStride := src.Stride + + dst := image.NewRGBA(image.Rect(0, 0, width, height)) + dstStride := dst.Stride + + dx := float64(srcW) / float64(width) + dy := float64(srcH) / float64(height) + + for y := range height { + for x := range width { + pos := y*dstStride + x*4 + ipos := int((float64(y)+0.5)*dy)*srcStride + int((float64(x)+0.5)*dx)*4 + + dst.Pix[pos+0] = src.Pix[ipos+0] + dst.Pix[pos+1] = src.Pix[ipos+1] + dst.Pix[pos+2] = src.Pix[ipos+2] + dst.Pix[pos+3] = src.Pix[ipos+3] + } + } + + return dst +} diff --git a/cmd/bot/commands.go b/cmd/bot/commands.go index c5094de..aae9436 100644 --- a/cmd/bot/commands.go +++ b/cmd/bot/commands.go @@ -1,6 +1,7 @@ package main import ( + _ "go.fm/commands/chart" _ "go.fm/commands/fm" _ "go.fm/commands/profile" _ "go.fm/commands/setuser" diff --git a/commands/chart/chart.go b/commands/chart/chart.go new file mode 100644 index 0000000..36a492a --- /dev/null +++ b/commands/chart/chart.go @@ -0,0 +1,220 @@ +package chart + +import ( + "bytes" + "errors" + "fmt" + "image" + "image/color" + "image/draw" + "image/gif" + "net/http" + + "github.com/nxtgo/arikawa/v3/api" + "github.com/nxtgo/arikawa/v3/discord" + "github.com/nxtgo/arikawa/v3/utils/sendpart" + "go.fm/bild/font" + "go.fm/bild/imgio" + "go.fm/bild/transform" + "go.fm/commands" + lastfm "go.fm/last.fm" + "go.fm/pkg/reply" +) + +var ( + maxGridSize = 10 + minGridSize = 3 + defaultPeriod = "overall" +) + +type Entry struct { + Image image.Image + Name string + Artist string +} + +type deezerSearchResponse struct { + Data []struct { + Picture string `json:"picture"` + } `json:"data"` +} + +var data = api.CreateCommandData{ + Name: "chart", + Description: "Your top artists/tracks/albums but with images", + Options: discord.CommandOptions{ + &discord.StringOption{ + OptionName: "type", + Description: "artist, track or album", + Choices: []discord.StringChoice{ + {Name: "artist", Value: "artist"}, + {Name: "track", Value: "track"}, + {Name: "album", Value: "album"}, + }, + Required: true, + }, + discord.NewIntegerOption("grid-size", fmt.Sprintf("grid size (NxN) (min: %d, max: %d, default: min)", minGridSize, maxGridSize), false), + &discord.StringOption{ + OptionName: "period", + Description: fmt.Sprintf("overall, 7day, 1month, 3month, 6month or 12month (default: %s)", defaultPeriod), + Choices: []discord.StringChoice{ + {Name: "overall", Value: "overall"}, + {Name: "7day", Value: "7day"}, + {Name: "1month", Value: "1month"}, + {Name: "3month", Value: "3month"}, + {Name: "6month", Value: "6month"}, + {Name: "12month", Value: "12month"}, + }, + Required: false, + }, + discord.NewStringOption("user", "user to fetch chart for", false), + }, +} + +var options struct { + User *string `discord:"user"` + Type string `discord:"type"` + GridSize *int `discord:"grid-size"` + Period *string `discord:"period"` +} + +func handler(c *commands.CommandContext) error { + return c.Reply.AutoDefer(func(edit *reply.EditBuilder) error { + if err := c.Data.Options.Unmarshal(&options); err != nil { + return err + } + + gridSize := minGridSize + if options.GridSize != nil { + gridSize = *options.GridSize + } + + period := defaultPeriod + if options.Period != nil { + period = *options.Period + } + + username, err := c.GetUserOrFallback() + if err != nil { + return err + } + + brokenImage, _ := imgio.Open("assets/img/broken.png") + brokenImage = transform.Resize(brokenImage, 300, 300, transform.Gaussian) + + fetchImage := func(url string) image.Image { + resp, err := http.Get(url) + if err != nil { + return brokenImage + } + defer resp.Body.Close() + + img, _, err := image.Decode(resp.Body) + if err == nil { + return img + } + + gifImg, err := gif.Decode(resp.Body) + if err != nil { + return brokenImage + } + return gifImg + } + + var entries []Entry + + switch options.Type { + case "artist": + topArtists, err := c.Last.User.GetTopArtists(lastfm.P{"user": username, "limit": gridSize * gridSize, "period": period}) + if err != nil { + return err + } + + for _, a := range topArtists.Artists { + imgURL, err := a.GetDeezerImage() + if err != nil || imgURL == "" { + entries = append(entries, Entry{Image: brokenImage, Name: a.Name}) + continue + } + img := fetchImage(imgURL) + img = transform.Resize(img, 300, 300, transform.Gaussian) + entries = append(entries, Entry{Image: img, Name: a.Name}) + } + + case "track": + topTracks, err := c.Last.User.GetTopTracks(lastfm.P{"user": username, "limit": gridSize * gridSize, "period": period}) + if err != nil { + return err + } + for _, t := range topTracks.Tracks { + img := brokenImage + if len(t.Images) > 0 { + img = fetchImage(t.Images[len(t.Images)-1].URL) + } + entries = append(entries, Entry{Image: img, Name: t.Name, Artist: t.Artist.Name}) + } + + case "album": + topAlbums, err := c.Last.User.GetTopAlbums(lastfm.P{"user": username, "limit": gridSize * gridSize, "period": period}) + if err != nil { + return err + } + for _, a := range topAlbums.Albums { + img := brokenImage + if len(a.Images) > 0 { + img = fetchImage(a.Images[len(a.Images)-1].URL) + } + entries = append(entries, Entry{Image: img, Name: a.Name, Artist: a.Artist.Name}) + } + } + + if len(entries) == 0 { + return errors.New("no entries found") + } + + inter := font.LoadFont("assets/font/Inter_24pt-Regular.ttf") + labelFace := inter.Face(20, 72) + subFace := inter.Face(16, 72) + + firstBounds := entries[0].Image.Bounds() + cellWidth := firstBounds.Dx() + cellHeight := firstBounds.Dy() + canvasWidth := cellWidth * gridSize + canvasHeight := cellHeight * gridSize + canvas := image.NewRGBA(image.Rect(0, 0, canvasWidth, canvasHeight)) + + chartGradient, err := imgio.Open("assets/img/chart_gradient.png") + if err != nil { + return err + } + + for i, entry := range entries { + row := i / gridSize + col := i % gridSize + x := col * cellWidth + y := row * cellHeight + rect := image.Rect(x, y, x+cellWidth, y+cellHeight) + + draw.Draw(canvas, rect, entry.Image, image.Point{}, draw.Over) + draw.Draw(canvas, rect, chartGradient, image.Point{}, draw.Over) + font.DrawText(canvas, x+15, y+labelFace.Metrics().Ascent.Ceil()+15, entry.Name, color.White, labelFace) + + if entry.Artist != "" { + font.DrawText(canvas, x+15, y+labelFace.Metrics().Ascent.Ceil()+subFace.Metrics().Ascent.Ceil()+25, + entry.Artist, color.RGBA{170, 170, 170, 255}, subFace) + } + } + + result, err := imgio.Encode(canvas, imgio.PNGEncoder()) + if err != nil { + return err + } + + _, err = edit.File(sendpart.File{Name: "chart.png", Reader: bytes.NewReader(result)}).Send() + return err + }) +} + +func init() { + commands.Register(data, handler) +} diff --git a/commands/update/update.go b/commands/update/update.go index 5630dc8..2f91e15 100644 --- a/commands/update/update.go +++ b/commands/update/update.go @@ -47,15 +47,35 @@ func handler(c *commands.CommandContext) error { for _, t := range dataTypes { switch t { case "profile", "getinfo": + c.Cache.User.Delete(lastfm.GenerateCacheKey("user.getinfo", userParams)) go c.Last.User.GetInfo(userParams) + case "topalbums": + c.Cache.User.Delete(lastfm.GenerateCacheKey("user.gettopalbums", userParams)) go c.Last.User.GetTopAlbums(userParams) + case "topartists": + c.Cache.User.Delete(lastfm.GenerateCacheKey("user.gettopartists", userParams)) go c.Last.User.GetTopArtists(userParams) + case "toptracks": + c.Cache.User.Delete(lastfm.GenerateCacheKey("user.gettoptracks", userParams)) go c.Last.User.GetTopTracks(userParams) + + case "all": + fallthrough default: - return fmt.Errorf("unknown data type: %s", t) + c.Cache.User.Delete(lastfm.GenerateCacheKey("user.getinfo", userParams)) + go c.Last.User.GetInfo(userParams) + + c.Cache.User.Delete(lastfm.GenerateCacheKey("user.gettopalbums", userParams)) + go c.Last.User.GetTopAlbums(userParams) + + c.Cache.User.Delete(lastfm.GenerateCacheKey("user.gettopartists", userParams)) + go c.Last.User.GetTopArtists(userParams) + + c.Cache.User.Delete(lastfm.GenerateCacheKey("user.gettoptracks", userParams)) + go c.Last.User.GetTopTracks(userParams) } } diff --git a/go.mod b/go.mod index a023340..b09772e 100644 --- a/go.mod +++ b/go.mod @@ -6,10 +6,12 @@ require ( github.com/mattn/go-sqlite3 v1.14.32 github.com/nxtgo/arikawa/v3 v3.0.0-20250921013437-308638597d52 github.com/nxtgo/gce v0.0.0-20250910001932-ff8e22b0e630 + golang.org/x/image v0.31.0 ) require ( github.com/gorilla/schema v1.4.1 // indirect github.com/gorilla/websocket v1.5.3 // indirect + golang.org/x/text v0.29.0 // indirect golang.org/x/time v0.10.0 // indirect ) diff --git a/go.sum b/go.sum index 14c1795..9f2f06c 100644 --- a/go.sum +++ b/go.sum @@ -8,5 +8,9 @@ github.com/nxtgo/arikawa/v3 v3.0.0-20250921013437-308638597d52 h1:xzaKaxK3MrnBsS github.com/nxtgo/arikawa/v3 v3.0.0-20250921013437-308638597d52/go.mod h1:BxHFNaM4Y5w9DIiogWgvq1T7MQ3d7AbkT7ZmcJOFM98= github.com/nxtgo/gce v0.0.0-20250910001932-ff8e22b0e630 h1:q6YDsr4P1r0iViA9p04SmBNVK2+wP6m6dLZsKXhPhDs= github.com/nxtgo/gce v0.0.0-20250910001932-ff8e22b0e630/go.mod h1:Lo1Rn6XM9r74u2JPtznKRojJuvZLd5e8V6dqUOP/yJo= +golang.org/x/image v0.31.0 h1:mLChjE2MV6g1S7oqbXC0/UcKijjm5fnJLUYKIYrLESA= +golang.org/x/image v0.31.0/go.mod h1:R9ec5Lcp96v9FTF+ajwaH3uGxPH4fKfHHAVbUILxghA= +golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= +golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= diff --git a/last.fm/user_types.go b/last.fm/user_types.go index 8ff15a0..df77ea8 100644 --- a/last.fm/user_types.go +++ b/last.fm/user_types.go @@ -6,6 +6,7 @@ import ( "net/http" "net/url" "strconv" + "strings" "time" ) @@ -233,11 +234,11 @@ type deezerSearchResponse struct { type deezerArtist struct { ID int `json:"id"` Name string `json:"name"` - Picture string `json:"picture"` + Picture string `json:"picture_big"` } -// GetDeezerImage fetches the artist image from Deezer -func (a *MinifiedArtist) GetDeezerImage() (string, error) { +// GetDeezerImage fetches the artist image from Deezer matching the exact name +func (a *TopArtist) GetDeezerImage() (string, error) { baseURL := "https://api.deezer.com/search/artist" query := url.QueryEscape(a.Name) resp, err := http.Get(fmt.Sprintf("%s?q=%s", baseURL, query)) @@ -251,9 +252,11 @@ func (a *MinifiedArtist) GetDeezerImage() (string, error) { return "", err } - if len(result.Data) == 0 { - return "", fmt.Errorf("artist not found on Deezer") + for _, artist := range result.Data { + if strings.EqualFold(artist.Name, a.Name) { + return artist.Picture, nil + } } - return result.Data[0].Picture, nil + return "", fmt.Errorf("artist %q not found on Deezer", a.Name) } diff --git a/pkg/reply/edit.go b/pkg/reply/edit.go index 0e2fcdc..680dda0 100644 --- a/pkg/reply/edit.go +++ b/pkg/reply/edit.go @@ -5,6 +5,7 @@ import ( "github.com/nxtgo/arikawa/v3/discord" "github.com/nxtgo/arikawa/v3/utils/json" "github.com/nxtgo/arikawa/v3/utils/json/option" + "github.com/nxtgo/arikawa/v3/utils/sendpart" ) type EditBuilder struct { @@ -17,13 +18,13 @@ func (eb *EditBuilder) Content(content string) *EditBuilder { return eb } -func (eb *EditBuilder) Embed(embed discord.Embed) *EditBuilder { - eb.data.Embeds = &[]discord.Embed{embed} +func (eb *EditBuilder) File(file sendpart.File) *EditBuilder { + eb.data.Files = append(eb.data.Files, file) return eb } -func (eb *EditBuilder) Embeds(embeds ...discord.Embed) *EditBuilder { - eb.data.Embeds = &embeds +func (eb *EditBuilder) Embed(embed discord.Embed) *EditBuilder { + eb.data.Embeds = &[]discord.Embed{embed} return eb } diff --git a/pkg/reply/followup.go b/pkg/reply/followup.go deleted file mode 100644 index f4d692e..0000000 --- a/pkg/reply/followup.go +++ /dev/null @@ -1,43 +0,0 @@ -package reply - -import ( - "github.com/nxtgo/arikawa/v3/api" - "github.com/nxtgo/arikawa/v3/discord" - "github.com/nxtgo/arikawa/v3/utils/json/option" -) - -type FollowUpBuilder struct { - manager *ResponseManager - data api.InteractionResponseData -} - -func (fb *FollowUpBuilder) Content(content string) *FollowUpBuilder { - fb.data.Content = option.NewNullableString(content) - return fb -} - -func (fb *FollowUpBuilder) Embed(embed discord.Embed) *FollowUpBuilder { - fb.data.Embeds = &[]discord.Embed{embed} - return fb -} - -func (fb *FollowUpBuilder) Embeds(embeds ...discord.Embed) *FollowUpBuilder { - fb.data.Embeds = &embeds - return fb -} - -func (fb *FollowUpBuilder) Components(components discord.ContainerComponents) *FollowUpBuilder { - fb.data.Components = &components - return fb -} - -func (fb *FollowUpBuilder) Flags(flags ...discord.MessageFlags) *FollowUpBuilder { - for _, flag := range flags { - fb.data.Flags |= flag - } - return fb -} - -func (fb *FollowUpBuilder) Send() (*discord.Message, error) { - return fb.manager.state.FollowUpInteraction(fb.manager.appID, fb.manager.token, fb.data) -} diff --git a/pkg/reply/response.go b/pkg/reply/response.go index 035d13b..e1df5e8 100644 --- a/pkg/reply/response.go +++ b/pkg/reply/response.go @@ -43,10 +43,6 @@ func (rm *ResponseManager) Defer(flags ...discord.MessageFlags) *DeferredRespons return &DeferredResponse{manager: rm, err: err} } -func (rm *ResponseManager) FollowUp() *FollowUpBuilder { - return &FollowUpBuilder{manager: rm, data: api.InteractionResponseData{}} -} - // no func (rb *ResponseBuilder) Content(content string) *ResponseBuilder { @@ -59,11 +55,6 @@ func (rb *ResponseBuilder) Embed(embed discord.Embed) *ResponseBuilder { return rb } -func (rb *ResponseBuilder) Embeds(embeds ...discord.Embed) *ResponseBuilder { - rb.data.Embeds = &embeds - return rb -} - func (rb *ResponseBuilder) ComponentsV2(components any) *ResponseBuilder { rb.Flags(1 << 15) raw, _ := json.Marshal(components) From a508362af888c80e19b6b50bbdf3725fc4183ce3 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Tue, 23 Sep 2025 02:02:46 +0200 Subject: [PATCH 19/29] profile canvas wip --- assets/font/Inter_24pt-Bold.ttf | Bin 0 -> 344032 bytes assets/img/profile_layout.png | Bin 0 -> 6881 bytes bild/imgio/imgio.go | 25 +++++ commands/chart/chart.go | 165 ++++++++++++++++++++++---------- commands/commands.go | 3 +- commands/fm/fm.go | 11 ++- commands/profile/canvas.go | 90 +++++++++++++++++ commands/profile/command.go | 8 +- pkg/reply/edit.go | 7 ++ pkg/reply/reply.go | 2 +- 10 files changed, 255 insertions(+), 56 deletions(-) create mode 100644 assets/font/Inter_24pt-Bold.ttf create mode 100644 assets/img/profile_layout.png create mode 100644 commands/profile/canvas.go diff --git a/assets/font/Inter_24pt-Bold.ttf b/assets/font/Inter_24pt-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e974d96fc818cdefd0a3cd06f02e13508dcb3b66 GIT binary patch literal 344032 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 literal 0 HcmV?d00001 diff --git a/assets/img/profile_layout.png b/assets/img/profile_layout.png new file mode 100644 index 0000000000000000000000000000000000000000..dc40d6ec8a95f21fc87169d9f1ff386afcead36c GIT binary patch literal 6881 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 JhSRwl`al2828#dy literal 0 HcmV?d00001 diff --git a/bild/imgio/imgio.go b/bild/imgio/imgio.go index c15c9c4..ffc79f0 100644 --- a/bild/imgio/imgio.go +++ b/bild/imgio/imgio.go @@ -64,6 +64,31 @@ func Fetch(url string) ([]byte, error) { return data, nil } +// FromUrl retrieves an image from the given URL and decodes it. +func FromUrl(url string) (image.Image, error) { + resp, err := http.Get(url) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("failed to fetch image: %s", resp.Status) + } + + data, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + img, _, err := image.Decode(bytes.NewReader(data)) + if err != nil { + return nil, err + } + + return img, nil +} + // DecodeImage loads and decodes an image from a byte slice and returns it. // // Usage example: diff --git a/commands/chart/chart.go b/commands/chart/chart.go index 36a492a..dd255b7 100644 --- a/commands/chart/chart.go +++ b/commands/chart/chart.go @@ -7,8 +7,9 @@ import ( "image" "image/color" "image/draw" - "image/gif" "net/http" + "sync" + "time" "github.com/nxtgo/arikawa/v3/api" "github.com/nxtgo/arikawa/v3/discord" @@ -25,20 +26,25 @@ var ( maxGridSize = 10 minGridSize = 3 defaultPeriod = "overall" + brokenImage image.Image + maxConcurrent = 8 ) +var httpClient = &http.Client{ + Transport: &http.Transport{ + MaxIdleConns: 100, + MaxIdleConnsPerHost: 10, + IdleConnTimeout: 90 * time.Second, + }, + Timeout: 10 * time.Second, +} + type Entry struct { Image image.Image Name string Artist string } -type deezerSearchResponse struct { - Data []struct { - Picture string `json:"picture"` - } `json:"data"` -} - var data = api.CreateCommandData{ Name: "chart", Description: "Your top artists/tracks/albums but with images", @@ -99,29 +105,7 @@ func handler(c *commands.CommandContext) error { return err } - brokenImage, _ := imgio.Open("assets/img/broken.png") - brokenImage = transform.Resize(brokenImage, 300, 300, transform.Gaussian) - - fetchImage := func(url string) image.Image { - resp, err := http.Get(url) - if err != nil { - return brokenImage - } - defer resp.Body.Close() - - img, _, err := image.Decode(resp.Body) - if err == nil { - return img - } - - gifImg, err := gif.Decode(resp.Body) - if err != nil { - return brokenImage - } - return gifImg - } - - var entries []Entry + entries := make([]Entry, 0, gridSize*gridSize) switch options.Type { case "artist": @@ -130,15 +114,25 @@ func handler(c *commands.CommandContext) error { return err } - for _, a := range topArtists.Artists { + urls := make([]string, len(topArtists.Artists)) + names := make([]string, len(topArtists.Artists)) + for i, a := range topArtists.Artists { imgURL, err := a.GetDeezerImage() if err != nil || imgURL == "" { - entries = append(entries, Entry{Image: brokenImage, Name: a.Name}) - continue + urls[i] = "" + } else { + urls[i] = imgURL + } + names[i] = a.Name + } + fetched := fetchEntries(urls) + for i, e := range fetched { + if e.Image == nil { + e.Image = brokenImage } - img := fetchImage(imgURL) - img = transform.Resize(img, 300, 300, transform.Gaussian) - entries = append(entries, Entry{Image: img, Name: a.Name}) + e.Image = transform.Resize(e.Image, 300, 300, transform.NearestNeighbor) + e.Name = names[i] + entries = append(entries, e) } case "track": @@ -146,12 +140,25 @@ func handler(c *commands.CommandContext) error { if err != nil { return err } - for _, t := range topTracks.Tracks { - img := brokenImage + + urls := make([]string, len(topTracks.Tracks)) + names := make([]string, len(topTracks.Tracks)) + artists := make([]string, len(topTracks.Tracks)) + for i, t := range topTracks.Tracks { if len(t.Images) > 0 { - img = fetchImage(t.Images[len(t.Images)-1].URL) + urls[i] = t.Images[len(t.Images)-1].URL + } + names[i] = t.Name + artists[i] = t.Artist.Name + } + fetched := fetchEntries(urls) + for i, e := range fetched { + if e.Image == nil { + e.Image = brokenImage } - entries = append(entries, Entry{Image: img, Name: t.Name, Artist: t.Artist.Name}) + e.Name = names[i] + e.Artist = artists[i] + entries = append(entries, e) } case "album": @@ -159,12 +166,25 @@ func handler(c *commands.CommandContext) error { if err != nil { return err } - for _, a := range topAlbums.Albums { - img := brokenImage + + urls := make([]string, len(topAlbums.Albums)) + names := make([]string, len(topAlbums.Albums)) + artists := make([]string, len(topAlbums.Albums)) + for i, a := range topAlbums.Albums { if len(a.Images) > 0 { - img = fetchImage(a.Images[len(a.Images)-1].URL) + urls[i] = a.Images[len(a.Images)-1].URL } - entries = append(entries, Entry{Image: img, Name: a.Name, Artist: a.Artist.Name}) + names[i] = a.Name + artists[i] = a.Artist.Name + } + fetched := fetchEntries(urls) + for i, e := range fetched { + if e.Image == nil { + e.Image = brokenImage + } + e.Name = names[i] + e.Artist = artists[i] + entries = append(entries, e) } } @@ -172,9 +192,11 @@ func handler(c *commands.CommandContext) error { return errors.New("no entries found") } - inter := font.LoadFont("assets/font/Inter_24pt-Regular.ttf") - labelFace := inter.Face(20, 72) - subFace := inter.Face(16, 72) + interRegular := font.LoadFont("assets/font/Inter_24pt-Regular.ttf") + interBold := font.LoadFont("assets/font/Inter_24pt-Bold.ttf") + + labelFace := interBold.Face(20, 72) + subFace := interRegular.Face(16, 72) firstBounds := entries[0].Image.Bounds() cellWidth := firstBounds.Dx() @@ -188,6 +210,9 @@ func handler(c *commands.CommandContext) error { return err } + labelAscent := labelFace.Metrics().Ascent.Ceil() + subAscent := subFace.Metrics().Ascent.Ceil() + for i, entry := range entries { row := i / gridSize col := i % gridSize @@ -197,10 +222,11 @@ func handler(c *commands.CommandContext) error { draw.Draw(canvas, rect, entry.Image, image.Point{}, draw.Over) draw.Draw(canvas, rect, chartGradient, image.Point{}, draw.Over) - font.DrawText(canvas, x+15, y+labelFace.Metrics().Ascent.Ceil()+15, entry.Name, color.White, labelFace) + + font.DrawText(canvas, x+15, y+labelAscent+15, entry.Name, color.White, labelFace) if entry.Artist != "" { - font.DrawText(canvas, x+15, y+labelFace.Metrics().Ascent.Ceil()+subFace.Metrics().Ascent.Ceil()+25, + font.DrawText(canvas, x+15, y+labelAscent+subAscent+20, entry.Artist, color.RGBA{170, 170, 170, 255}, subFace) } } @@ -210,11 +236,50 @@ func handler(c *commands.CommandContext) error { return err } - _, err = edit.File(sendpart.File{Name: "chart.png", Reader: bytes.NewReader(result)}).Send() + _, err = edit.Contentf("%s %s chart for %s", period, options.Type, username).File(sendpart.File{Name: "chart.png", Reader: bytes.NewReader(result)}).Send() return err }) } func init() { + // todo: remove this in the future* + brokenImage, _ = imgio.Open("assets/img/broken.png") + brokenImage = transform.Resize(brokenImage, 300, 300, transform.NearestNeighbor) commands.Register(data, handler) } + +func fetchImage(url string) image.Image { + if url == "" { + return nil + } + resp, err := httpClient.Get(url) + if err != nil { + return nil + } + defer resp.Body.Close() + + img, _, err := image.Decode(resp.Body) + if err != nil { + return nil + } + return img +} + +func fetchEntries(urls []string) []Entry { + entries := make([]Entry, len(urls)) + var wg sync.WaitGroup + sem := make(chan struct{}, maxConcurrent) + + for i, url := range urls { + i, url := i, url + wg.Go(func() { + sem <- struct{}{} + defer func() { <-sem }() + + entries[i].Image = fetchImage(url) + }) + } + + wg.Wait() + return entries +} diff --git a/commands/commands.go b/commands/commands.go index be9b8e3..e7bd080 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -53,9 +53,8 @@ func RegisterCommands(r *cmdroute.Router, st *state.State, q *db.Queries, c *las start := time.Now() err := h(commandContext) zlog.Log.Debugw("executed command %s", zlog.F{"time": time.Since(start)}, name) - // debugging purposes + if err != nil { - zlog.Log.Warn(err.Error()) commandContext.Reply.QuickEmbed(reply.ErrorEmbed(err.Error())) } diff --git a/commands/fm/fm.go b/commands/fm/fm.go index 17a2e65..686603c 100644 --- a/commands/fm/fm.go +++ b/commands/fm/fm.go @@ -5,6 +5,7 @@ import ( "github.com/nxtgo/arikawa/v3/api" "github.com/nxtgo/arikawa/v3/discord" + "go.fm/bild/colors" "go.fm/commands" lastfm "go.fm/last.fm" "go.fm/pkg/components" @@ -53,12 +54,18 @@ func handler(c *commands.CommandContext) error { text = components.NewTextDisplayf("-# *Last track for %s, scrobbled at %s*", res.User, playtime.Format(time.Kitchen)) } - container := components.NewContainer(703487, + thumbnail := lastTrack.GetLargestImage().URL + color := 0x703487 + if dominantColor, err := colors.Dominant(thumbnail); err == nil { + color = dominantColor + } + + container := components.NewContainer(color, components.NewSection( components.NewTextDisplayf("# %s", lastTrack.Name), components.NewTextDisplayf("**%s** **ยท** %s", lastTrack.Artist.Name, lastTrack.Album.Name), text, - ).WithAccessory(components.NewThumbnail(lastTrack.GetLargestImage().URL)), + ).WithAccessory(components.NewThumbnail(thumbnail)), components.NewActionRow( components.NewButton(components.ButtonStyleLink, "Last.fm", nil).WithEmoji("1418269025959546943").WithURL(lastTrack.URL), ), diff --git a/commands/profile/canvas.go b/commands/profile/canvas.go new file mode 100644 index 0000000..37d817c --- /dev/null +++ b/commands/profile/canvas.go @@ -0,0 +1,90 @@ +package profile + +import ( + "bytes" + "fmt" + "image" + "image/color" + "image/draw" + + "github.com/nxtgo/arikawa/v3/utils/sendpart" + "go.fm/bild/blur" + "go.fm/bild/font" + "go.fm/bild/imgio" + "go.fm/bild/mask" + "go.fm/bild/transform" + lastfm "go.fm/last.fm" + "go.fm/pkg/reply" +) + +var ( + profileWidth = 740 + profileHeight = 260 + + avatarX = 23 + avatarY = 45 + avatarWidth = 120 + avatarHeight = 120 + + containerX = 23 + containerY = 187 + containerW = 120 + containerH = 21 +) + +func renderCanvas(edit *reply.EditBuilder, user *lastfm.User) error { + inter := font.LoadFont("assets/font/Inter_24pt-Bold.ttf") + face := inter.Face(14, 72) + + canvas := image.NewRGBA(image.Rect(0, 0, profileWidth, profileHeight)) + layout, err := imgio.Open("assets/img/profile_layout.png") + if err != nil { + return err + } + avatar, err := imgio.FromUrl(user.GetLargestImage().URL) + if err != nil { + return err + } + + // background + background := transform.Resize(avatar, profileWidth, profileHeight, transform.NearestNeighbor) + background = blur.Gaussian(background, 30) + backgroundMask := mask.Rounded(profileWidth, profileHeight, 30) + + // avatar + avatar = transform.Resize(avatar, avatarWidth, avatarHeight, transform.NearestNeighbor) + avatarMask := mask.Rounded(avatarWidth, avatarHeight, 15) + avatarRect := image.Rect( + avatarX, + avatarY, + avatarX+avatarWidth, + avatarY+avatarHeight, + ) + + // draw stuff onto the canvas + draw.DrawMask(canvas, image.Rect(0, 0, profileWidth, profileHeight), background, image.Point{0, 0}, backgroundMask, image.Point{0, 0}, draw.Over) + draw.Draw(canvas, image.Rect(0, 0, profileWidth, profileHeight), layout, image.Point{0, 0}, draw.Over) + draw.DrawMask(canvas, avatarRect, avatar, image.Point{0, 0}, avatarMask, image.Point{0, 0}, draw.Over) + + // text + scrobbles := fmt.Sprintf("%d", user.GetPlayCount()) + faceAscent := face.Metrics().Ascent.Ceil() + faceDescent := face.Metrics().Descent.Ceil() + + textWidth := font.Measure(face, scrobbles) + textHeight := faceAscent + faceDescent + + textX := containerX + (containerW-textWidth)/2 + textY := containerY + (containerH-textHeight)/2 + faceAscent + + // draw the text onto the canvas + font.DrawText(canvas, textX, textY, scrobbles, color.White, face) + + result, err := imgio.Encode(canvas, imgio.PNGEncoder()) + if err != nil { + return err + } + + _, err = edit.File(sendpart.File{Name: "profile.png", Reader: bytes.NewReader(result)}).Send() + return nil +} diff --git a/commands/profile/command.go b/commands/profile/command.go index d7f1fa2..646d098 100644 --- a/commands/profile/command.go +++ b/commands/profile/command.go @@ -14,11 +14,13 @@ var data = api.CreateCommandData{ Description: "display your last.fm profile or another user's", Options: discord.CommandOptions{ discord.NewStringOption("user", "user to display profile from", false), + discord.NewBooleanOption("canvas", "display as an image", false), }, } var options struct { - User *string `discord:"user"` + User *string `discord:"user"` + Canvas *bool `discord:"canvas"` } func handler(c *commands.CommandContext) error { @@ -37,6 +39,10 @@ func handler(c *commands.CommandContext) error { return err } + if options.Canvas != nil && *options.Canvas { + return renderCanvas(edit, user) + } + topAlbumsRes, err := c.Last.User.GetTopAlbums(lastfm.P{"user": username}) if err != nil { return err diff --git a/pkg/reply/edit.go b/pkg/reply/edit.go index 680dda0..e716fed 100644 --- a/pkg/reply/edit.go +++ b/pkg/reply/edit.go @@ -1,6 +1,8 @@ package reply import ( + "fmt" + "github.com/nxtgo/arikawa/v3/api" "github.com/nxtgo/arikawa/v3/discord" "github.com/nxtgo/arikawa/v3/utils/json" @@ -18,6 +20,11 @@ func (eb *EditBuilder) Content(content string) *EditBuilder { return eb } +func (eb *EditBuilder) Contentf(content string, args ...any) *EditBuilder { + eb.data.Content = option.NewNullableString(fmt.Sprintf(content, args...)) + return eb +} + func (eb *EditBuilder) File(file sendpart.File) *EditBuilder { eb.data.Files = append(eb.data.Files, file) return eb diff --git a/pkg/reply/reply.go b/pkg/reply/reply.go index 5952fd4..ba1db51 100644 --- a/pkg/reply/reply.go +++ b/pkg/reply/reply.go @@ -55,7 +55,7 @@ func (rm *ResponseManager) AutoDefer(fn func(edit *EditBuilder) error, flags ... err := fn(editBuilder) if err != nil { - zlog.Log.Error(err.Error()) + zlog.Log.Warnf("command error handled correctly: %v", err) _, err := editBuilder.Clear().Embed(ErrorEmbed(err.Error())).Send() return err } From 3480065cd96c44cef3d3b6d8f56e1fe4ee242517 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Wed, 24 Sep 2025 00:16:50 +0200 Subject: [PATCH 20/29] new structure --- cmd/bot/bot.go | 78 -------------- cmd/bot/commands.go | 12 +-- cmd/bot/main.go | 40 +++++++ events/events.go | 23 ---- internal/bot/bot/bot.go | 97 +++++++++++++++++ internal/bot/bot/events/events.go | 62 +++++++++++ .../bot/commands}/chart/chart.go | 12 +-- .../bot/commands}/commands.go | 23 ++-- {commands => internal/bot/commands}/fm/fm.go | 10 +- .../bot/commands}/profile/canvas.go | 14 +-- .../bot/commands}/profile/command.go | 8 +- .../bot/commands}/setuser/command.go | 10 +- .../bot/commands}/stats/command.go | 4 +- {commands => internal/bot/commands}/types.go | 8 +- .../bot/commands}/update/update.go | 6 +- .../bot/discord}/components/components.go | 0 internal/bot/discord/emojis/emojis.go | 40 +++++++ .../bot/discord/reply/defer.go | 0 {pkg => internal/bot/discord}/reply/edit.go | 0 internal/bot/discord/reply/helpers.go | 48 +++++++++ .../bot/discord/reply/reply.go | 54 +++++++++- {bild => internal/bot/image}/LICENSE | 0 {bild => internal/bot/image}/README.md | 2 - {bild => internal/bot/image}/blend/blend.go | 8 +- {bild => internal/bot/image}/blur/blur.go | 4 +- {bild => internal/bot/image}/clone/clone.go | 2 +- {bild => internal/bot/image}/colors/colors.go | 2 +- .../bot/image}/convolution/convolution.go | 4 +- .../bot/image}/convolution/kernel.go | 0 {bild => internal/bot/image}/fcolor/fcolor.go | 2 +- {bild => internal/bot/image}/font/font.go | 0 {bild => internal/bot/image}/imgio/imgio.go | 0 {bild => internal/bot/image}/mask/mask.go | 2 +- {bild => internal/bot/image}/math/f64/f64.go | 0 .../bot/image}/parallel/parallel.go | 0 .../bot/image}/transform/filters.go | 0 .../bot/image}/transform/resize.go | 6 +- {last.fm => internal/bot/lastfm}/cache.go | 0 {last.fm => internal/bot/lastfm}/client.go | 0 {last.fm => internal/bot/lastfm}/services.go | 0 {last.fm => internal/bot/lastfm}/user.go | 0 .../bot/lastfm}/user_types.go | 0 .../bot/logging/logging.go | 20 +++- .../bot/persistence}/sql/queries.sql | 0 .../bot/persistence}/sql/schema.sql | 0 {db => internal/bot/persistence/sqlc}/db.go | 2 +- .../bot/persistence/sqlc}/models.go | 6 +- .../bot/persistence/sqlc}/queries.sql.go | 2 +- .../bot/persistence/sqlc}/start.go | 16 ++- pkg/emojis/emojis.go | 27 ----- pkg/reply/reply.go | 102 ------------------ sqlc.yaml | 8 +- 52 files changed, 443 insertions(+), 321 deletions(-) delete mode 100644 cmd/bot/bot.go create mode 100644 cmd/bot/main.go delete mode 100644 events/events.go create mode 100644 internal/bot/bot/bot.go create mode 100644 internal/bot/bot/events/events.go rename {commands => internal/bot/commands}/chart/chart.go (97%) rename {commands => internal/bot/commands}/commands.go (71%) rename {commands => internal/bot/commands}/fm/fm.go (91%) rename {commands => internal/bot/commands}/profile/canvas.go (90%) rename {commands => internal/bot/commands}/profile/command.go (91%) rename {commands => internal/bot/commands}/setuser/command.go (89%) rename {commands => internal/bot/commands}/stats/command.go (92%) rename {commands => internal/bot/commands}/types.go (90%) rename {commands => internal/bot/commands}/update/update.go (96%) rename {pkg => internal/bot/discord}/components/components.go (100%) create mode 100644 internal/bot/discord/emojis/emojis.go rename pkg/reply/deferred.go => internal/bot/discord/reply/defer.go (100%) rename {pkg => internal/bot/discord}/reply/edit.go (100%) create mode 100644 internal/bot/discord/reply/helpers.go rename pkg/reply/response.go => internal/bot/discord/reply/reply.go (64%) rename {bild => internal/bot/image}/LICENSE (100%) rename {bild => internal/bot/image}/README.md (97%) rename {bild => internal/bot/image}/blend/blend.go (98%) rename {bild => internal/bot/image}/blur/blur.go (94%) rename {bild => internal/bot/image}/clone/clone.go (99%) rename {bild => internal/bot/image}/colors/colors.go (98%) rename {bild => internal/bot/image}/convolution/convolution.go (98%) rename {bild => internal/bot/image}/convolution/kernel.go (100%) rename {bild => internal/bot/image}/fcolor/fcolor.go (93%) rename {bild => internal/bot/image}/font/font.go (100%) rename {bild => internal/bot/image}/imgio/imgio.go (100%) rename {bild => internal/bot/image}/mask/mask.go (96%) rename {bild => internal/bot/image}/math/f64/f64.go (100%) rename {bild => internal/bot/image}/parallel/parallel.go (100%) rename {bild => internal/bot/image}/transform/filters.go (100%) rename {bild => internal/bot/image}/transform/resize.go (97%) rename {last.fm => internal/bot/lastfm}/cache.go (100%) rename {last.fm => internal/bot/lastfm}/client.go (100%) rename {last.fm => internal/bot/lastfm}/services.go (100%) rename {last.fm => internal/bot/lastfm}/user.go (100%) rename {last.fm => internal/bot/lastfm}/user_types.go (100%) rename zlog/zlog.go => internal/bot/logging/logging.go (89%) rename {db => internal/bot/persistence}/sql/queries.sql (100%) rename {db => internal/bot/persistence}/sql/schema.sql (100%) rename {db => internal/bot/persistence/sqlc}/db.go (99%) rename {db => internal/bot/persistence/sqlc}/models.go (72%) rename {db => internal/bot/persistence/sqlc}/queries.sql.go (99%) rename {db => internal/bot/persistence/sqlc}/start.go (75%) delete mode 100644 pkg/emojis/emojis.go delete mode 100644 pkg/reply/reply.go diff --git a/cmd/bot/bot.go b/cmd/bot/bot.go deleted file mode 100644 index ed7a224..0000000 --- a/cmd/bot/bot.go +++ /dev/null @@ -1,78 +0,0 @@ -package main - -import ( - "context" - "os" - - "github.com/nxtgo/arikawa/v3/api/cmdroute" - "github.com/nxtgo/arikawa/v3/discord" - "github.com/nxtgo/arikawa/v3/gateway" - "github.com/nxtgo/arikawa/v3/state" - "go.fm/commands" - "go.fm/db" - "go.fm/events" - lastfm "go.fm/last.fm" - "go.fm/zlog" -) - -func main() { - discordToken := os.Getenv("DISCORD_TOKEN") - if discordToken == "" { - zlog.Log.Fatal("missing DISCORD_TOKEN env") - } - - s := state.New("Bot " + discordToken) - r := cmdroute.NewRouter() - c := lastfm.NewCache() - defer c.Close() - - q, db, err := db.Start(context.Background(), "file:database.db?_foreign_keys=on") - if err != nil { - zlog.Log.Fatalf("failed to connect database: %v", err) - } - defer db.Close() - - // register commands - commands.RegisterCommands(r, s, q, c) - - // command handlers - if err := commands.Sync(s); err != nil { - zlog.Log.Fatalf("failed syncing commands: %v", err) - } - s.AddInteractionHandler(r) - - // event handlers - for _, event := range events.Events { - s.AddHandler(event) - } - - // bot intents - s.AddIntents(gateway.IntentGuildMembers) - - // open gateway - if err := s.Open(context.Background()); err != nil { - zlog.Log.Fatalf("failed to open gateway: %v", err) - } - defer s.Close() - - // set status - err = s.Gateway().Send( - context.Background(), - &gateway.UpdatePresenceCommand{ - Since: discord.UnixMsTimestamp(0), - Status: discord.OnlineStatus, - Activities: []discord.Activity{ - { - Name: "your breath", - Type: discord.ListeningActivity, - }, - }, - AFK: false, - }, - ) - if err != nil { - zlog.Log.Warnf("failed to set status: %v", err) - } - - select {} -} diff --git a/cmd/bot/commands.go b/cmd/bot/commands.go index aae9436..880ad66 100644 --- a/cmd/bot/commands.go +++ b/cmd/bot/commands.go @@ -1,10 +1,10 @@ package main import ( - _ "go.fm/commands/chart" - _ "go.fm/commands/fm" - _ "go.fm/commands/profile" - _ "go.fm/commands/setuser" - _ "go.fm/commands/stats" - _ "go.fm/commands/update" + _ "go.fm/internal/bot/commands/chart" + _ "go.fm/internal/bot/commands/fm" + _ "go.fm/internal/bot/commands/profile" + _ "go.fm/internal/bot/commands/setuser" + _ "go.fm/internal/bot/commands/stats" + _ "go.fm/internal/bot/commands/update" ) diff --git a/cmd/bot/main.go b/cmd/bot/main.go new file mode 100644 index 0000000..0c6a0c3 --- /dev/null +++ b/cmd/bot/main.go @@ -0,0 +1,40 @@ +package main + +import ( + "context" + "os" + "os/signal" + "syscall" + + "go.fm/internal/bot/bot" + "go.fm/internal/bot/logging" +) + +func getEnv(key, fallback string) string { + if v := os.Getenv(key); v != "" { + return v + } + return fallback +} + +func main() { + token := os.Getenv("DISCORD_TOKEN") + lastfmKey := os.Getenv("LASTFM_API_KEY") + dbPath := getEnv("DATABASE_PATH", "file:database.db?_foreign_keys=on") + + if token == "" || lastfmKey == "" { + logging.Fatal("DISCORD_TOKEN and LASTFM_API_KEY must be set") + } + + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) + defer cancel() + + b, err := bot.NewBot(ctx, token, dbPath, lastfmKey) + if err != nil { + logging.Fatalf("failed to create bot: %v", err) + } + + if err := b.Run(ctx); err != nil { + logging.Fatalf("bot stopped with error: %v", err) + } +} diff --git a/events/events.go b/events/events.go deleted file mode 100644 index ce76e36..0000000 --- a/events/events.go +++ /dev/null @@ -1,23 +0,0 @@ -package events - -import ( - "github.com/nxtgo/arikawa/v3/gateway" - "go.fm/zlog" -) - -var Events []any -var EventLogger func(name string) *zlog.Logger - -func init() { - Events = append(Events, EventReady) - EventLogger = func(name string) *zlog.Logger { - return zlog.WithFields(zlog.F{"event_name": name}) - } -} - -func EventReady(c *gateway.ReadyEvent) { - EventLogger("ready").Infow("client ready", zlog.F{ - "tag": c.User.Tag(), - "guilds": len(c.Guilds), - }) -} diff --git a/internal/bot/bot/bot.go b/internal/bot/bot/bot.go new file mode 100644 index 0000000..bab811f --- /dev/null +++ b/internal/bot/bot/bot.go @@ -0,0 +1,97 @@ +package bot + +import ( + "context" + "database/sql" + "os" + "os/signal" + "syscall" + + "github.com/nxtgo/arikawa/v3/api/cmdroute" + "github.com/nxtgo/arikawa/v3/gateway" + "github.com/nxtgo/arikawa/v3/state" + "go.fm/internal/bot/bot/events" + "go.fm/internal/bot/commands" + "go.fm/internal/bot/lastfm" + "go.fm/internal/bot/logging" + "go.fm/internal/bot/persistence/sqlc" +) + +// package for bot stuff idk. +// functions that open connections should also return +// a function to close that connection :pray: + +type Bot struct { + State *state.State + Query *sqlc.Queries + Database *sql.DB + LastFM *lastfm.Services + Cache *lastfm.Cache + Registry *events.Registry +} + +func NewBot(ctx context.Context, token, dbPath, lastfmKey string) (*Bot, error) { + logging.Info("starting bot...") + + // database + q, db, err := sqlc.Start(ctx, dbPath) + if err != nil { + return nil, err + } + + // lastfm + cache := lastfm.NewCache() + lastfm := lastfm.NewServices(lastfmKey, cache) + + // bot state + st := state.New("Bot " + token) + st.AddIntents(gateway.IntentGuilds) + st.AddIntents(gateway.IntentGuildMessages) + + // events + reg := events.NewRegistry() + events.RegisterDefaultEvents(reg) + + // commands + r := cmdroute.NewRouter() + commands.RegisterCommands(r, st, q, cache) + if err := commands.Sync(st); err != nil { + logging.Fatalf("failed syncing commands: %v", err) + } + st.AddInteractionHandler(r) + + return &Bot{ + State: st, + Query: q, + Database: db, + LastFM: lastfm, + Cache: cache, + Registry: reg, + }, nil +} + +func (b *Bot) Run(ctx context.Context) error { + b.State.AddHandler(func(e *gateway.ReadyEvent) { + b.Registry.Dispatch(events.TypeName(e), e) + }) + + if err := b.State.Open(ctx); err != nil { + return err + } + defer b.State.Close() + defer b.Database.Close() + defer b.Cache.Close() + + logging.Info("bot is running") + + stop := make(chan os.Signal, 1) + signal.Notify(stop, os.Interrupt, syscall.SIGTERM) + + select { + case <-ctx.Done(): + case <-stop: + } + + logging.Info("shutting down") + return nil +} diff --git a/internal/bot/bot/events/events.go b/internal/bot/bot/events/events.go new file mode 100644 index 0000000..786a1d6 --- /dev/null +++ b/internal/bot/bot/events/events.go @@ -0,0 +1,62 @@ +package events + +import ( + "reflect" + + "github.com/nxtgo/arikawa/v3/gateway" + "go.fm/internal/bot/logging" +) + +func TypeName(evt any) string { + return reflect.TypeOf(evt).String() +} + +// Handler is a generic event handler signature. +type Handler func(evt any) + +// Registry holds all event handlers by event type. +type Registry struct { + Handlers map[string][]Handler + logger func(name string) *logging.Logger +} + +// NewRegistry creates a new event registry. +func NewRegistry() *Registry { + return &Registry{ + Handlers: make(map[string][]Handler), + logger: func(name string) *logging.Logger { + return logging.WithFields(logging.F{"event_name": name}) + }, + } +} + +// On registers a handler for a given event type. +func (r *Registry) On(eventName string, h Handler) { + r.Handlers[eventName] = append(r.Handlers[eventName], h) +} + +// Dispatch executes all handlers for a given event. +func (r *Registry) Dispatch(eventName string, evt any) { + log := r.logger(eventName) + for _, h := range r.Handlers[eventName] { + func() { + defer func() { + if rec := recover(); rec != nil { + log.Errorw("panic in event handler", logging.F{"recover": rec}) + } + }() + h(evt) + }() + } +} + +func RegisterDefaultEvents(r *Registry) { + r.On(TypeName(&gateway.ReadyEvent{}), func(evt any) { + if c, ok := evt.(*gateway.ReadyEvent); ok { + r.logger("ready").Infow("client ready", logging.F{ + "tag": c.User.Tag(), + "guilds": len(c.Guilds), + }) + } + }) +} diff --git a/commands/chart/chart.go b/internal/bot/commands/chart/chart.go similarity index 97% rename from commands/chart/chart.go rename to internal/bot/commands/chart/chart.go index dd255b7..88be041 100644 --- a/commands/chart/chart.go +++ b/internal/bot/commands/chart/chart.go @@ -14,12 +14,12 @@ import ( "github.com/nxtgo/arikawa/v3/api" "github.com/nxtgo/arikawa/v3/discord" "github.com/nxtgo/arikawa/v3/utils/sendpart" - "go.fm/bild/font" - "go.fm/bild/imgio" - "go.fm/bild/transform" - "go.fm/commands" - lastfm "go.fm/last.fm" - "go.fm/pkg/reply" + "go.fm/internal/bot/commands" + "go.fm/internal/bot/discord/reply" + "go.fm/internal/bot/image/font" + "go.fm/internal/bot/image/imgio" + "go.fm/internal/bot/image/transform" + "go.fm/internal/bot/lastfm" ) var ( diff --git a/commands/commands.go b/internal/bot/commands/commands.go similarity index 71% rename from commands/commands.go rename to internal/bot/commands/commands.go index e7bd080..3fe0575 100644 --- a/commands/commands.go +++ b/internal/bot/commands/commands.go @@ -2,31 +2,32 @@ package commands import ( "context" + "os" + "time" + "github.com/nxtgo/arikawa/v3/api" "github.com/nxtgo/arikawa/v3/api/cmdroute" "github.com/nxtgo/arikawa/v3/state" - "go.fm/db" - lastfm "go.fm/last.fm" - "go.fm/pkg/reply" - "go.fm/zlog" - "os" - "time" + "go.fm/internal/bot/discord/reply" + "go.fm/internal/bot/lastfm" + "go.fm/internal/bot/logging" + "go.fm/internal/bot/persistence/sqlc" ) var allCommands = []api.CreateCommandData{} var registry = map[string]CommandHandler{} func Register(meta api.CreateCommandData, handler CommandHandler) { - zlog.Log.Debugf("registered command %s", meta.Name) + logging.Debugf("registered command %s", meta.Name) allCommands = append(allCommands, meta) registry[meta.Name] = handler } -func RegisterCommands(r *cmdroute.Router, st *state.State, q *db.Queries, c *lastfm.Cache) { +func RegisterCommands(r *cmdroute.Router, st *state.State, q *sqlc.Queries, c *lastfm.Cache) { lastFMApiKey := os.Getenv("LASTFM_API_KEY") if lastFMApiKey == "" { - zlog.Log.Fatal("missing LASTFM_API_KEY env") + logging.Fatal("missing LASTFM_API_KEY env") } for name, handler := range registry { @@ -52,7 +53,7 @@ func RegisterCommands(r *cmdroute.Router, st *state.State, q *db.Queries, c *las // debugging purposes start := time.Now() err := h(commandContext) - zlog.Log.Debugw("executed command %s", zlog.F{"time": time.Since(start)}, name) + logging.Debugw("executed command %s", logging.F{"time": time.Since(start)}, name) if err != nil { commandContext.Reply.QuickEmbed(reply.ErrorEmbed(err.Error())) @@ -64,6 +65,6 @@ func RegisterCommands(r *cmdroute.Router, st *state.State, q *db.Queries, c *las } func Sync(st *state.State) error { - defer zlog.Log.Infow("synced commands", zlog.F{"count": len(allCommands)}) + defer logging.Infow("synced commands", logging.F{"count": len(allCommands)}) return cmdroute.OverwriteCommands(st, allCommands) } diff --git a/commands/fm/fm.go b/internal/bot/commands/fm/fm.go similarity index 91% rename from commands/fm/fm.go rename to internal/bot/commands/fm/fm.go index 686603c..6b3ecfe 100644 --- a/commands/fm/fm.go +++ b/internal/bot/commands/fm/fm.go @@ -5,11 +5,11 @@ import ( "github.com/nxtgo/arikawa/v3/api" "github.com/nxtgo/arikawa/v3/discord" - "go.fm/bild/colors" - "go.fm/commands" - lastfm "go.fm/last.fm" - "go.fm/pkg/components" - "go.fm/pkg/reply" + "go.fm/internal/bot/commands" + "go.fm/internal/bot/discord/components" + "go.fm/internal/bot/discord/reply" + "go.fm/internal/bot/image/colors" + "go.fm/internal/bot/lastfm" ) var data = api.CreateCommandData{ diff --git a/commands/profile/canvas.go b/internal/bot/commands/profile/canvas.go similarity index 90% rename from commands/profile/canvas.go rename to internal/bot/commands/profile/canvas.go index 37d817c..6ee5fa5 100644 --- a/commands/profile/canvas.go +++ b/internal/bot/commands/profile/canvas.go @@ -8,13 +8,13 @@ import ( "image/draw" "github.com/nxtgo/arikawa/v3/utils/sendpart" - "go.fm/bild/blur" - "go.fm/bild/font" - "go.fm/bild/imgio" - "go.fm/bild/mask" - "go.fm/bild/transform" - lastfm "go.fm/last.fm" - "go.fm/pkg/reply" + "go.fm/internal/bot/discord/reply" + "go.fm/internal/bot/image/blur" + "go.fm/internal/bot/image/font" + "go.fm/internal/bot/image/imgio" + "go.fm/internal/bot/image/mask" + "go.fm/internal/bot/image/transform" + "go.fm/internal/bot/lastfm" ) var ( diff --git a/commands/profile/command.go b/internal/bot/commands/profile/command.go similarity index 91% rename from commands/profile/command.go rename to internal/bot/commands/profile/command.go index 646d098..d952b11 100644 --- a/commands/profile/command.go +++ b/internal/bot/commands/profile/command.go @@ -3,10 +3,10 @@ package profile import ( "github.com/nxtgo/arikawa/v3/api" "github.com/nxtgo/arikawa/v3/discord" - "go.fm/commands" - lastfm "go.fm/last.fm" - "go.fm/pkg/components" - "go.fm/pkg/reply" + "go.fm/internal/bot/commands" + "go.fm/internal/bot/discord/components" + "go.fm/internal/bot/discord/reply" + "go.fm/internal/bot/lastfm" ) var data = api.CreateCommandData{ diff --git a/commands/setuser/command.go b/internal/bot/commands/setuser/command.go similarity index 89% rename from commands/setuser/command.go rename to internal/bot/commands/setuser/command.go index 1fa0522..b91af35 100644 --- a/commands/setuser/command.go +++ b/internal/bot/commands/setuser/command.go @@ -7,10 +7,10 @@ import ( "github.com/nxtgo/arikawa/v3/api" "github.com/nxtgo/arikawa/v3/discord" - "go.fm/commands" - "go.fm/db" - lastfm "go.fm/last.fm" - "go.fm/pkg/reply" + "go.fm/internal/bot/commands" + "go.fm/internal/bot/discord/reply" + "go.fm/internal/bot/lastfm" + "go.fm/internal/bot/persistence/sqlc" ) var data = api.CreateCommandData{ @@ -48,7 +48,7 @@ func handler(c *commands.CommandContext) error { return fmt.Errorf("your username is already set to **%s**", options.Username) } - err = c.Query.UpsertUser(c.Context, db.UpsertUserParams{ + err = c.Query.UpsertUser(c.Context, sqlc.UpsertUserParams{ UserID: userID.String(), LastfmUsername: options.Username, }) diff --git a/commands/stats/command.go b/internal/bot/commands/stats/command.go similarity index 92% rename from commands/stats/command.go rename to internal/bot/commands/stats/command.go index 0c7ab38..004a555 100644 --- a/commands/stats/command.go +++ b/internal/bot/commands/stats/command.go @@ -6,8 +6,8 @@ import ( "time" "github.com/nxtgo/arikawa/v3/api" - "go.fm/commands" - "go.fm/pkg/components" + "go.fm/internal/bot/commands" + "go.fm/internal/bot/discord/components" ) var startTime = time.Now() diff --git a/commands/types.go b/internal/bot/commands/types.go similarity index 90% rename from commands/types.go rename to internal/bot/commands/types.go index 3eca413..19e0a23 100644 --- a/commands/types.go +++ b/internal/bot/commands/types.go @@ -7,9 +7,9 @@ import ( "github.com/nxtgo/arikawa/v3/api/cmdroute" "github.com/nxtgo/arikawa/v3/discord" "github.com/nxtgo/arikawa/v3/state" - "go.fm/db" - lastfm "go.fm/last.fm" - "go.fm/pkg/reply" + "go.fm/internal/bot/discord/reply" + "go.fm/internal/bot/lastfm" + "go.fm/internal/bot/persistence/sqlc" ) type CommandContext struct { @@ -17,7 +17,7 @@ type CommandContext struct { Data cmdroute.CommandData State *state.State Reply *reply.ResponseManager - Query *db.Queries + Query *sqlc.Queries Last *lastfm.Services Cache *lastfm.Cache } diff --git a/commands/update/update.go b/internal/bot/commands/update/update.go similarity index 96% rename from commands/update/update.go rename to internal/bot/commands/update/update.go index 2f91e15..592c194 100644 --- a/commands/update/update.go +++ b/internal/bot/commands/update/update.go @@ -6,9 +6,9 @@ import ( "github.com/nxtgo/arikawa/v3/api" "github.com/nxtgo/arikawa/v3/discord" - "go.fm/commands" - lastfm "go.fm/last.fm" - "go.fm/pkg/reply" + "go.fm/internal/bot/commands" + "go.fm/internal/bot/discord/reply" + "go.fm/internal/bot/lastfm" ) var data = api.CreateCommandData{ diff --git a/pkg/components/components.go b/internal/bot/discord/components/components.go similarity index 100% rename from pkg/components/components.go rename to internal/bot/discord/components/components.go diff --git a/internal/bot/discord/emojis/emojis.go b/internal/bot/discord/emojis/emojis.go new file mode 100644 index 0000000..3578d58 --- /dev/null +++ b/internal/bot/discord/emojis/emojis.go @@ -0,0 +1,40 @@ +package emojis + +type Emoji struct { + ID string + Name string + Animated bool +} + +func (e Emoji) String() string { + if e.Animated { + return "" + } + return "<:" + e.Name + ":" + e.ID + ">" +} + +var ( + EmojiCrown = Emoji{ID: "1418014546462773348", Name: "crown", Animated: true} + EmojiQuestionMark = Emoji{ID: "1418015866695581708", Name: "question", Animated: true} + EmojiChat = Emoji{ID: "1418013205992575116", Name: "chat", Animated: true} + EmojiNote = Emoji{ID: "1418015996651765770", Name: "note", Animated: true} + EmojiTop = Emoji{ID: "1418012513584283709", Name: "top", Animated: true} + EmojiStar = Emoji{ID: "1418011800724705310", Name: "star", Animated: true} + EmojiFire = Emoji{ID: "1418017773354881156", Name: "fire", Animated: true} + EmojiMic = Emoji{ID: "1418021307089551471", Name: "mic", Animated: true} + EmojiMic2 = Emoji{ID: "1418021315708981258", Name: "mic2", Animated: true} + EmojiPlay = Emoji{ID: "1418021326228295692", Name: "play", Animated: true} + EmojiAlbum = Emoji{ID: "1418021336110075944", Name: "album", Animated: true} + EmojiCalendar = Emoji{ID: "1418022075527860244", Name: "calendar", Animated: true} + + // status + EmojiCross = Emoji{ID: "1418016016642080848", Name: "cross", Animated: true} + EmojiCheck = Emoji{ID: "1418016005732565002", Name: "check", Animated: true} + EmojiUpdate = Emoji{ID: "1418014272415469578", Name: "update", Animated: true} + EmojiWarning = Emoji{ID: "1418013632293507204", Name: "warning", Animated: true} + + // rank + EmojiRankOne = Emoji{ID: "1418015934312087582", Name: "rank1", Animated: true} + EmojiRankTwo = Emoji{ID: "1418015960862036139", Name: "rank2", Animated: true} + EmojiRankThree = Emoji{ID: "1418015987562709022", Name: "rank3", Animated: true} +) diff --git a/pkg/reply/deferred.go b/internal/bot/discord/reply/defer.go similarity index 100% rename from pkg/reply/deferred.go rename to internal/bot/discord/reply/defer.go diff --git a/pkg/reply/edit.go b/internal/bot/discord/reply/edit.go similarity index 100% rename from pkg/reply/edit.go rename to internal/bot/discord/reply/edit.go diff --git a/internal/bot/discord/reply/helpers.go b/internal/bot/discord/reply/helpers.go new file mode 100644 index 0000000..d16430d --- /dev/null +++ b/internal/bot/discord/reply/helpers.go @@ -0,0 +1,48 @@ +package reply + +import ( + "context" + "fmt" + "time" + + "github.com/nxtgo/arikawa/v3/discord" + "go.fm/internal/bot/discord/emojis" +) + +func ErrorEmbed(description string) discord.Embed { + return discord.Embed{ + Description: fmt.Sprintf("%s %s", emojis.EmojiCross, description), + Color: 0xFF0000, + } +} + +func SuccessEmbed(description string) discord.Embed { + return discord.Embed{ + Description: fmt.Sprintf("%s %s", emojis.EmojiCheck, description), + Color: 0x00FF00, + } +} + +func InfoEmbed(description string) discord.Embed { + return discord.Embed{ + Description: fmt.Sprintf("%s %s", emojis.EmojiChat, description), + Color: 0x0099FF, + } +} + +func WithTimeout(ctx context.Context, timeout time.Duration, fn func() error) error { + ctx, cancel := context.WithTimeout(ctx, timeout) + defer cancel() + + done := make(chan error, 1) + go func() { + done <- fn() + }() + + select { + case err := <-done: + return err + case <-ctx.Done(): + return ctx.Err() + } +} diff --git a/pkg/reply/response.go b/internal/bot/discord/reply/reply.go similarity index 64% rename from pkg/reply/response.go rename to internal/bot/discord/reply/reply.go index e1df5e8..0933ed4 100644 --- a/pkg/reply/response.go +++ b/internal/bot/discord/reply/reply.go @@ -1,19 +1,38 @@ package reply import ( + "encoding/json" "fmt" "github.com/nxtgo/arikawa/v3/api" "github.com/nxtgo/arikawa/v3/discord" - "github.com/nxtgo/arikawa/v3/utils/json" + "github.com/nxtgo/arikawa/v3/state" "github.com/nxtgo/arikawa/v3/utils/json/option" ) +type ResponseManager struct { + state *state.State + interaction *discord.InteractionEvent + token string + appID discord.AppID + deferred bool + responded bool +} + type ResponseBuilder struct { manager *ResponseManager data api.InteractionResponseData } +func New(s *state.State, i *discord.InteractionEvent) *ResponseManager { + return &ResponseManager{ + state: s, + interaction: i, + token: i.Token, + appID: i.AppID, + } +} + func (rm *ResponseManager) Reply() *ResponseBuilder { return &ResponseBuilder{ manager: rm, @@ -43,7 +62,38 @@ func (rm *ResponseManager) Defer(flags ...discord.MessageFlags) *DeferredRespons return &DeferredResponse{manager: rm, err: err} } -// no +func (rm *ResponseManager) Quick(content string, flags ...discord.MessageFlags) error { + builder := rm.Reply().Content(content) + if len(flags) > 0 { + builder = builder.Flags(flags...) + } + return builder.Send() +} + +func (rm *ResponseManager) QuickEmbed(embed discord.Embed, flags ...discord.MessageFlags) error { + builder := rm.Reply().Embed(embed) + if len(flags) > 0 { + builder = builder.Flags(flags...) + } + return builder.Send() +} + +func (rm *ResponseManager) AutoDefer(fn func(edit *EditBuilder) error, flags ...discord.MessageFlags) error { + deferred := rm.Defer(flags...) + if deferred.Error() != nil { + return deferred.Error() + } + + editBuilder := deferred.Edit().Flags(flags...) + err := fn(editBuilder) + + if err != nil { + _, err := editBuilder.Clear().Embed(ErrorEmbed(err.Error())).Send() + return err + } + + return nil +} func (rb *ResponseBuilder) Content(content string) *ResponseBuilder { rb.data.Content = option.NewNullableString(content) diff --git a/bild/LICENSE b/internal/bot/image/LICENSE similarity index 100% rename from bild/LICENSE rename to internal/bot/image/LICENSE diff --git a/bild/README.md b/internal/bot/image/README.md similarity index 97% rename from bild/README.md rename to internal/bot/image/README.md index d3f663d..f54e823 100644 --- a/bild/README.md +++ b/internal/bot/image/README.md @@ -1,5 +1,3 @@ -# pkg/bild - this directory contains code adapted from [anthonynsimon/bild](https://github.com/anthonynsimon/bild), which is licensed under the mit license. diff --git a/bild/blend/blend.go b/internal/bot/image/blend/blend.go similarity index 98% rename from bild/blend/blend.go rename to internal/bot/image/blend/blend.go index c8b1038..50c65ba 100644 --- a/bild/blend/blend.go +++ b/internal/bot/image/blend/blend.go @@ -4,10 +4,10 @@ import ( "image" "math" - "go.fm/bild/clone" - "go.fm/bild/fcolor" - "go.fm/bild/math/f64" - "go.fm/bild/parallel" + "go.fm/internal/bot/image/clone" + "go.fm/internal/bot/image/fcolor" + "go.fm/internal/bot/image/math/f64" + "go.fm/internal/bot/image/parallel" ) // Normal combines the foreground and background images by placing the foreground over the diff --git a/bild/blur/blur.go b/internal/bot/image/blur/blur.go similarity index 94% rename from bild/blur/blur.go rename to internal/bot/image/blur/blur.go index 8fa01d1..36ece62 100644 --- a/bild/blur/blur.go +++ b/internal/bot/image/blur/blur.go @@ -5,8 +5,8 @@ import ( "image" "math" - "go.fm/bild/clone" - "go.fm/bild/convolution" + "go.fm/internal/bot/image/clone" + "go.fm/internal/bot/image/convolution" ) // Box returns a blurred (average) version of the image. diff --git a/bild/clone/clone.go b/internal/bot/image/clone/clone.go similarity index 99% rename from bild/clone/clone.go rename to internal/bot/image/clone/clone.go index 406bd82..04e1bd6 100644 --- a/bild/clone/clone.go +++ b/internal/bot/image/clone/clone.go @@ -4,7 +4,7 @@ import ( "image" "image/draw" - "go.fm/bild/parallel" + "go.fm/internal/bot/image/parallel" ) // PadMethod is the method used to fill padded pixels. diff --git a/bild/colors/colors.go b/internal/bot/image/colors/colors.go similarity index 98% rename from bild/colors/colors.go rename to internal/bot/image/colors/colors.go index 5e26b8d..704dc87 100644 --- a/bild/colors/colors.go +++ b/internal/bot/image/colors/colors.go @@ -12,7 +12,7 @@ import ( "sync/atomic" "time" - "go.fm/bild/parallel" + "go.fm/internal/bot/image/parallel" ) func rgbToHsl(r, g, b float64) (h, s, l float64) { diff --git a/bild/convolution/convolution.go b/internal/bot/image/convolution/convolution.go similarity index 98% rename from bild/convolution/convolution.go rename to internal/bot/image/convolution/convolution.go index b440bac..c2f1eed 100644 --- a/bild/convolution/convolution.go +++ b/internal/bot/image/convolution/convolution.go @@ -4,8 +4,8 @@ import ( "image" "math" - "go.fm/bild/clone" - "go.fm/bild/parallel" + "go.fm/internal/bot/image/clone" + "go.fm/internal/bot/image/parallel" ) // Options are the Convolve function parameters. diff --git a/bild/convolution/kernel.go b/internal/bot/image/convolution/kernel.go similarity index 100% rename from bild/convolution/kernel.go rename to internal/bot/image/convolution/kernel.go diff --git a/bild/fcolor/fcolor.go b/internal/bot/image/fcolor/fcolor.go similarity index 93% rename from bild/fcolor/fcolor.go rename to internal/bot/image/fcolor/fcolor.go index b36bf5c..7e26023 100644 --- a/bild/fcolor/fcolor.go +++ b/internal/bot/image/fcolor/fcolor.go @@ -1,6 +1,6 @@ package fcolor -import "go.fm/bild/math/f64" +import "go.fm/internal/bot/image/math/f64" // RGBAF64 represents an RGBA color using the range 0.0 to 1.0 with a float64 for each channel. type RGBAF64 struct { diff --git a/bild/font/font.go b/internal/bot/image/font/font.go similarity index 100% rename from bild/font/font.go rename to internal/bot/image/font/font.go diff --git a/bild/imgio/imgio.go b/internal/bot/image/imgio/imgio.go similarity index 100% rename from bild/imgio/imgio.go rename to internal/bot/image/imgio/imgio.go diff --git a/bild/mask/mask.go b/internal/bot/image/mask/mask.go similarity index 96% rename from bild/mask/mask.go rename to internal/bot/image/mask/mask.go index 5cbedec..67af198 100644 --- a/bild/mask/mask.go +++ b/internal/bot/image/mask/mask.go @@ -4,7 +4,7 @@ import ( "image" "image/color" - "go.fm/bild/parallel" + "go.fm/internal/bot/image/parallel" ) func Rounded(width, height, radius int) *image.Alpha { diff --git a/bild/math/f64/f64.go b/internal/bot/image/math/f64/f64.go similarity index 100% rename from bild/math/f64/f64.go rename to internal/bot/image/math/f64/f64.go diff --git a/bild/parallel/parallel.go b/internal/bot/image/parallel/parallel.go similarity index 100% rename from bild/parallel/parallel.go rename to internal/bot/image/parallel/parallel.go diff --git a/bild/transform/filters.go b/internal/bot/image/transform/filters.go similarity index 100% rename from bild/transform/filters.go rename to internal/bot/image/transform/filters.go diff --git a/bild/transform/resize.go b/internal/bot/image/transform/resize.go similarity index 97% rename from bild/transform/resize.go rename to internal/bot/image/transform/resize.go index bface76..6c47e65 100644 --- a/bild/transform/resize.go +++ b/internal/bot/image/transform/resize.go @@ -4,9 +4,9 @@ import ( "image" "math" - "go.fm/bild/clone" - "go.fm/bild/math/f64" - "go.fm/bild/parallel" + "go.fm/internal/bot/image/clone" + "go.fm/internal/bot/image/math/f64" + "go.fm/internal/bot/image/parallel" ) // Resize returns a new image with its size adjusted to the new width and height. The filter diff --git a/last.fm/cache.go b/internal/bot/lastfm/cache.go similarity index 100% rename from last.fm/cache.go rename to internal/bot/lastfm/cache.go diff --git a/last.fm/client.go b/internal/bot/lastfm/client.go similarity index 100% rename from last.fm/client.go rename to internal/bot/lastfm/client.go diff --git a/last.fm/services.go b/internal/bot/lastfm/services.go similarity index 100% rename from last.fm/services.go rename to internal/bot/lastfm/services.go diff --git a/last.fm/user.go b/internal/bot/lastfm/user.go similarity index 100% rename from last.fm/user.go rename to internal/bot/lastfm/user.go diff --git a/last.fm/user_types.go b/internal/bot/lastfm/user_types.go similarity index 100% rename from last.fm/user_types.go rename to internal/bot/lastfm/user_types.go diff --git a/zlog/zlog.go b/internal/bot/logging/logging.go similarity index 89% rename from zlog/zlog.go rename to internal/bot/logging/logging.go index 369bcb0..f4de429 100644 --- a/zlog/zlog.go +++ b/internal/bot/logging/logging.go @@ -1,4 +1,4 @@ -package zlog +package logging // modified version of https://github.com/nxtgo/zlog, released under // public domain. @@ -256,6 +256,24 @@ func (l *Logger) Warnw(msg string, f F, a ...any) { l.Log(LevelWarn, fmt.Sprint func (l *Logger) Errorw(msg string, f F, a ...any) { l.Log(LevelError, fmt.Sprintf(msg, a...), f) } func (l *Logger) Fatalw(msg string, f F, a ...any) { l.Log(LevelFatal, fmt.Sprintf(msg, a...), f) } +func Debug(msg string) { Log.Debug(msg) } +func Info(msg string) { Log.Info(msg) } +func Warn(msg string) { Log.Warn(msg) } +func Error(msg string) { Log.Error(msg) } +func Fatal(msg string) { Log.Fatal(msg) } + +func Debugf(f string, a ...any) { Log.Debugf(f, a...) } +func Infof(f string, a ...any) { Log.Infof(f, a...) } +func Warnf(f string, a ...any) { Log.Warnf(f, a...) } +func Errorf(f string, a ...any) { Log.Errorf(f, a...) } +func Fatalf(f string, a ...any) { Log.Fatalf(f, a...) } + +func Debugw(msg string, f F, a ...any) { Log.Debugw(msg, f, a...) } +func Infow(msg string, f F, a ...any) { Log.Infow(msg, f, a...) } +func Warnw(msg string, f F, a ...any) { Log.Warnw(msg, f, a...) } +func Errorw(msg string, f F, a ...any) { Log.Errorw(msg, f, a...) } +func Fatalw(msg string, f F, a ...any) { Log.Fatalw(msg, f, a...) } + func SetOutput(w io.Writer) { Log.SetOutput(w) } func SetLevel(l Level) { Log.SetLevel(l) } func EnableTimestamps(on bool) { Log.EnableTimestamps(on) } diff --git a/db/sql/queries.sql b/internal/bot/persistence/sql/queries.sql similarity index 100% rename from db/sql/queries.sql rename to internal/bot/persistence/sql/queries.sql diff --git a/db/sql/schema.sql b/internal/bot/persistence/sql/schema.sql similarity index 100% rename from db/sql/schema.sql rename to internal/bot/persistence/sql/schema.sql diff --git a/db/db.go b/internal/bot/persistence/sqlc/db.go similarity index 99% rename from db/db.go rename to internal/bot/persistence/sqlc/db.go index 9ba5d23..4354f55 100644 --- a/db/db.go +++ b/internal/bot/persistence/sqlc/db.go @@ -2,7 +2,7 @@ // versions: // sqlc v1.30.0 -package db +package sqlc import ( "context" diff --git a/db/models.go b/internal/bot/persistence/sqlc/models.go similarity index 72% rename from db/models.go rename to internal/bot/persistence/sqlc/models.go index 7098ff2..f441911 100644 --- a/db/models.go +++ b/internal/bot/persistence/sqlc/models.go @@ -2,14 +2,14 @@ // versions: // sqlc v1.30.0 -package db +package sqlc import ( - "time" + "database/sql" ) type User struct { UserID string LastfmUsername string - CreatedAt *time.Time + CreatedAt sql.NullTime } diff --git a/db/queries.sql.go b/internal/bot/persistence/sqlc/queries.sql.go similarity index 99% rename from db/queries.sql.go rename to internal/bot/persistence/sqlc/queries.sql.go index 4109df8..148f827 100644 --- a/db/queries.sql.go +++ b/internal/bot/persistence/sqlc/queries.sql.go @@ -3,7 +3,7 @@ // sqlc v1.30.0 // source: queries.sql -package db +package sqlc import ( "context" diff --git a/db/start.go b/internal/bot/persistence/sqlc/start.go similarity index 75% rename from db/start.go rename to internal/bot/persistence/sqlc/start.go index 5462386..7ad73ed 100644 --- a/db/start.go +++ b/internal/bot/persistence/sqlc/start.go @@ -1,19 +1,17 @@ -package db +package sqlc import ( "context" "database/sql" + "embed" "fmt" "time" - _ "embed" - _ "github.com/mattn/go-sqlite3" - "go.fm/zlog" ) -//go:embed sql/schema.sql -var schema string +var schemaLocation = "../sql/schema.sql" +var schema embed.FS func Start(ctx context.Context, path string) (*Queries, *sql.DB, error) { sqlDB, err := sql.Open("sqlite3", path) @@ -24,7 +22,9 @@ func Start(ctx context.Context, path string) (*Queries, *sql.DB, error) { sqlDB.SetMaxOpenConns(1) sqlDB.SetConnMaxLifetime(time.Minute) - if _, err := sqlDB.ExecContext(ctx, schema); err != nil { + schema, _ := schema.ReadFile(schemaLocation) + + if _, err := sqlDB.ExecContext(ctx, string(schema)); err != nil { sqlDB.Close() return nil, nil, fmt.Errorf("failed to create schema: %w", err) } @@ -34,7 +34,5 @@ func Start(ctx context.Context, path string) (*Queries, *sql.DB, error) { return nil, nil, fmt.Errorf("failed to prepare queries: %w", err) } - zlog.Log.Info("started database connection") - return queries, sqlDB, nil } diff --git a/pkg/emojis/emojis.go b/pkg/emojis/emojis.go deleted file mode 100644 index d05604f..0000000 --- a/pkg/emojis/emojis.go +++ /dev/null @@ -1,27 +0,0 @@ -package emojis - -var ( - EmojiCrown = "" - EmojiQuestionMark = "" - EmojiChat = "" - EmojiNote = "" - EmojiTop = "" - EmojiStar = "" - EmojiFire = "" - EmojiMic = "" - EmojiMic2 = "" - EmojiPlay = "" - EmojiAlbum = "" - EmojiCalendar = "" - - // status - EmojiCross = "" - EmojiCheck = "" - EmojiUpdate = "" - EmojiWarning = "" - - // rank - EmojiRankOne = "" - EmojiRankTwo = "" - EmojiRankThree = "" -) diff --git a/pkg/reply/reply.go b/pkg/reply/reply.go deleted file mode 100644 index ba1db51..0000000 --- a/pkg/reply/reply.go +++ /dev/null @@ -1,102 +0,0 @@ -package reply - -import ( - "context" - "fmt" - "time" - - "github.com/nxtgo/arikawa/v3/discord" - "github.com/nxtgo/arikawa/v3/state" - "go.fm/pkg/emojis" - "go.fm/zlog" -) - -type ResponseManager struct { - state *state.State - interaction *discord.InteractionEvent - token string - appID discord.AppID - deferred bool - responded bool -} - -func New(s *state.State, i *discord.InteractionEvent) *ResponseManager { - return &ResponseManager{ - state: s, - interaction: i, - token: i.Token, - appID: i.AppID, - } -} - -func (rm *ResponseManager) Quick(content string, flags ...discord.MessageFlags) error { - builder := rm.Reply().Content(content) - if len(flags) > 0 { - builder = builder.Flags(flags...) - } - return builder.Send() -} - -func (rm *ResponseManager) QuickEmbed(embed discord.Embed, flags ...discord.MessageFlags) error { - builder := rm.Reply().Embed(embed) - if len(flags) > 0 { - builder = builder.Flags(flags...) - } - return builder.Send() -} - -func (rm *ResponseManager) AutoDefer(fn func(edit *EditBuilder) error, flags ...discord.MessageFlags) error { - deferred := rm.Defer(flags...) - if deferred.Error() != nil { - return deferred.Error() - } - - editBuilder := deferred.Edit().Flags(flags...) - err := fn(editBuilder) - - if err != nil { - zlog.Log.Warnf("command error handled correctly: %v", err) - _, err := editBuilder.Clear().Embed(ErrorEmbed(err.Error())).Send() - return err - } - - return nil -} - -func ErrorEmbed(description string) discord.Embed { - return discord.Embed{ - Description: fmt.Sprintf("%s %s", emojis.EmojiCross, description), - Color: 0xFF0000, - } -} - -func SuccessEmbed(description string) discord.Embed { - return discord.Embed{ - Description: fmt.Sprintf("%s %s", emojis.EmojiCheck, description), - Color: 0x00FF00, - } -} - -func InfoEmbed(description string) discord.Embed { - return discord.Embed{ - Description: fmt.Sprintf("%s %s", emojis.EmojiChat, description), - Color: 0x0099FF, - } -} - -func WithTimeout(ctx context.Context, timeout time.Duration, fn func() error) error { - ctx, cancel := context.WithTimeout(ctx, timeout) - defer cancel() - - done := make(chan error, 1) - go func() { - done <- fn() - }() - - select { - case err := <-done: - return err - case <-ctx.Done(): - return ctx.Err() - } -} diff --git a/sqlc.yaml b/sqlc.yaml index 5c7fc95..a92aafc 100644 --- a/sqlc.yaml +++ b/sqlc.yaml @@ -2,13 +2,13 @@ version: "2" sql: - engine: "sqlite" - schema: "db/sql/schema.sql" - queries: "db/sql/queries.sql" + schema: "internal/bot/persistence/sql/schema.sql" + queries: "internal/bot/persistence/sql/queries.sql" database: uri: "file:database.db?_foreign_keys=on" gen: go: - package: "db" - out: "db" + package: "sqlc" + out: "internal/bot/persistence/sqlc" emit_prepared_queries: true emit_interface: false From fe7220ea7883b40d918a4e218e0c52262fcea529 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Thu, 25 Sep 2025 01:03:42 +0200 Subject: [PATCH 21/29] refactor --- internal/bot/commands/chart/canvas.go | 47 +++++ internal/bot/commands/chart/chart.go | 260 ++++++++++---------------- 2 files changed, 149 insertions(+), 158 deletions(-) create mode 100644 internal/bot/commands/chart/canvas.go diff --git a/internal/bot/commands/chart/canvas.go b/internal/bot/commands/chart/canvas.go new file mode 100644 index 0000000..38a8cc3 --- /dev/null +++ b/internal/bot/commands/chart/canvas.go @@ -0,0 +1,47 @@ +package chart + +import ( + "image" + "image/color" + "image/draw" + + "go.fm/internal/bot/image/font" + "go.fm/internal/bot/image/imgio" +) + +func renderChart(entries []Entry, grid int) ([]byte, error) { + interRegular := font.LoadFont("assets/font/Inter_24pt-Regular.ttf") + interBold := font.LoadFont("assets/font/Inter_24pt-Bold.ttf") + + labelSize, subSize := 20.0, 16.0 + if grid >= 10 { + labelSize, subSize = 12, 10 + } + + labelFace := interBold.Face(labelSize, 72) + subFace := interRegular.Face(subSize, 72) + labelAscent, subAscent := labelFace.Metrics().Ascent.Ceil(), subFace.Metrics().Ascent.Ceil() + + cell := entries[0].Image.Bounds() + canvas := image.NewRGBA(image.Rect(0, 0, cell.Dx()*grid, cell.Dy()*grid)) + + gradient, err := imgio.Open("assets/img/chart_gradient.png") + if err != nil { + return nil, err + } + + for i, entry := range entries { + x, y := (i%grid)*cell.Dx(), (i/grid)*cell.Dy() + rect := image.Rect(x, y, x+cell.Dx(), y+cell.Dy()) + + draw.Draw(canvas, rect, entry.Image, image.Point{}, draw.Over) + draw.Draw(canvas, rect, gradient, image.Point{}, draw.Over) + + font.DrawText(canvas, x+8, y+labelAscent+8, entry.Name, color.White, labelFace) + if entry.Artist != "" { + font.DrawText(canvas, x+8, y+labelAscent+subAscent+12, + entry.Artist, color.RGBA{170, 170, 170, 255}, subFace) + } + } + return imgio.Encode(canvas, imgio.PNGEncoder()) +} diff --git a/internal/bot/commands/chart/chart.go b/internal/bot/commands/chart/chart.go index 88be041..0af8b8d 100644 --- a/internal/bot/commands/chart/chart.go +++ b/internal/bot/commands/chart/chart.go @@ -5,8 +5,6 @@ import ( "errors" "fmt" "image" - "image/color" - "image/draw" "net/http" "sync" "time" @@ -16,7 +14,6 @@ import ( "github.com/nxtgo/arikawa/v3/utils/sendpart" "go.fm/internal/bot/commands" "go.fm/internal/bot/discord/reply" - "go.fm/internal/bot/image/font" "go.fm/internal/bot/image/imgio" "go.fm/internal/bot/image/transform" "go.fm/internal/bot/lastfm" @@ -26,18 +23,17 @@ var ( maxGridSize = 10 minGridSize = 3 defaultPeriod = "overall" - brokenImage image.Image maxConcurrent = 8 -) -var httpClient = &http.Client{ - Transport: &http.Transport{ - MaxIdleConns: 100, - MaxIdleConnsPerHost: 10, - IdleConnTimeout: 90 * time.Second, - }, - Timeout: 10 * time.Second, -} + httpClient = &http.Client{ + Transport: &http.Transport{ + MaxIdleConns: 100, + MaxIdleConnsPerHost: 10, + IdleConnTimeout: 90 * time.Second, + }, + Timeout: 10 * time.Second, + } +) type Entry struct { Image image.Image @@ -59,7 +55,8 @@ var data = api.CreateCommandData{ }, Required: true, }, - discord.NewIntegerOption("grid-size", fmt.Sprintf("grid size (NxN) (min: %d, max: %d, default: min)", minGridSize, maxGridSize), false), + discord.NewIntegerOption("grid-size", + fmt.Sprintf("grid size (NxN) (min: %d, max: %d, default: min)", minGridSize, maxGridSize), false), &discord.StringOption{ OptionName: "period", Description: fmt.Sprintf("overall, 7day, 1month, 3month, 6month or 12month (default: %s)", defaultPeriod), @@ -71,7 +68,6 @@ var data = api.CreateCommandData{ {Name: "6month", Value: "6month"}, {Name: "12month", Value: "12month"}, }, - Required: false, }, discord.NewStringOption("user", "user to fetch chart for", false), }, @@ -90,9 +86,9 @@ func handler(c *commands.CommandContext) error { return err } - gridSize := minGridSize + grid := minGridSize if options.GridSize != nil { - gridSize = *options.GridSize + grid = *options.GridSize } period := defaultPeriod @@ -100,152 +96,115 @@ func handler(c *commands.CommandContext) error { period = *options.Period } - username, err := c.GetUserOrFallback() + user, err := c.GetUserOrFallback() if err != nil { return err } - entries := make([]Entry, 0, gridSize*gridSize) - - switch options.Type { - case "artist": - topArtists, err := c.Last.User.GetTopArtists(lastfm.P{"user": username, "limit": gridSize * gridSize, "period": period}) - if err != nil { - return err - } - - urls := make([]string, len(topArtists.Artists)) - names := make([]string, len(topArtists.Artists)) - for i, a := range topArtists.Artists { - imgURL, err := a.GetDeezerImage() - if err != nil || imgURL == "" { - urls[i] = "" - } else { - urls[i] = imgURL - } - names[i] = a.Name - } - fetched := fetchEntries(urls) - for i, e := range fetched { - if e.Image == nil { - e.Image = brokenImage - } - e.Image = transform.Resize(e.Image, 300, 300, transform.NearestNeighbor) - e.Name = names[i] - entries = append(entries, e) - } - - case "track": - topTracks, err := c.Last.User.GetTopTracks(lastfm.P{"user": username, "limit": gridSize * gridSize, "period": period}) - if err != nil { - return err - } - - urls := make([]string, len(topTracks.Tracks)) - names := make([]string, len(topTracks.Tracks)) - artists := make([]string, len(topTracks.Tracks)) - for i, t := range topTracks.Tracks { - if len(t.Images) > 0 { - urls[i] = t.Images[len(t.Images)-1].URL - } - names[i] = t.Name - artists[i] = t.Artist.Name - } - fetched := fetchEntries(urls) - for i, e := range fetched { - if e.Image == nil { - e.Image = brokenImage - } - e.Name = names[i] - e.Artist = artists[i] - entries = append(entries, e) - } - - case "album": - topAlbums, err := c.Last.User.GetTopAlbums(lastfm.P{"user": username, "limit": gridSize * gridSize, "period": period}) - if err != nil { - return err - } - - urls := make([]string, len(topAlbums.Albums)) - names := make([]string, len(topAlbums.Albums)) - artists := make([]string, len(topAlbums.Albums)) - for i, a := range topAlbums.Albums { - if len(a.Images) > 0 { - urls[i] = a.Images[len(a.Images)-1].URL - } - names[i] = a.Name - artists[i] = a.Artist.Name - } - fetched := fetchEntries(urls) - for i, e := range fetched { - if e.Image == nil { - e.Image = brokenImage - } - e.Name = names[i] - e.Artist = artists[i] - entries = append(entries, e) - } + entries, err := fetchChartEntries(c, options.Type, user, grid, period) + if err != nil { + return err } - if len(entries) == 0 { return errors.New("no entries found") } - interRegular := font.LoadFont("assets/font/Inter_24pt-Regular.ttf") - interBold := font.LoadFont("assets/font/Inter_24pt-Bold.ttf") - - labelFace := interBold.Face(20, 72) - subFace := interRegular.Face(16, 72) - - firstBounds := entries[0].Image.Bounds() - cellWidth := firstBounds.Dx() - cellHeight := firstBounds.Dy() - canvasWidth := cellWidth * gridSize - canvasHeight := cellHeight * gridSize - canvas := image.NewRGBA(image.Rect(0, 0, canvasWidth, canvasHeight)) - - chartGradient, err := imgio.Open("assets/img/chart_gradient.png") + img, err := renderChart(entries, grid) if err != nil { return err } - labelAscent := labelFace.Metrics().Ascent.Ceil() - subAscent := subFace.Metrics().Ascent.Ceil() - - for i, entry := range entries { - row := i / gridSize - col := i % gridSize - x := col * cellWidth - y := row * cellHeight - rect := image.Rect(x, y, x+cellWidth, y+cellHeight) - - draw.Draw(canvas, rect, entry.Image, image.Point{}, draw.Over) - draw.Draw(canvas, rect, chartGradient, image.Point{}, draw.Over) + _, err = edit. + Contentf("%s %s chart for %s", period, options.Type, user). + File(sendpart.File{Name: "chart.png", Reader: bytes.NewReader(img)}). + Send() + return err + }) +} - font.DrawText(canvas, x+15, y+labelAscent+15, entry.Name, color.White, labelFace) +func fetchChartEntries(c *commands.CommandContext, kind, user string, grid int, period string) ([]Entry, error) { + limit := grid * grid - if entry.Artist != "" { - font.DrawText(canvas, x+15, y+labelAscent+subAscent+20, - entry.Artist, color.RGBA{170, 170, 170, 255}, subFace) + var urls, names, artists []string + switch kind { + case "artist": + res, err := c.Last.User.GetTopArtists(lastfm.P{"user": user, "limit": limit, "period": period}) + if err != nil { + return nil, err + } + urls, names = make([]string, len(res.Artists)), make([]string, len(res.Artists)) + for i, a := range res.Artists { + if u, _ := a.GetDeezerImage(); u != "" { + urls[i] = u } + names[i] = a.Name } - - result, err := imgio.Encode(canvas, imgio.PNGEncoder()) + case "track": + res, err := c.Last.User.GetTopTracks(lastfm.P{"user": user, "limit": limit, "period": period}) if err != nil { - return err + return nil, err } + urls, names, artists = make([]string, len(res.Tracks)), make([]string, len(res.Tracks)), make([]string, len(res.Tracks)) + for i, t := range res.Tracks { + if len(t.Images) > 0 { + urls[i] = t.Images[len(t.Images)-1].URL + } + names[i], artists[i] = t.Name, t.Artist.Name + } + case "album": + res, err := c.Last.User.GetTopAlbums(lastfm.P{"user": user, "limit": limit, "period": period}) + if err != nil { + return nil, err + } + urls, names, artists = make([]string, len(res.Albums)), make([]string, len(res.Albums)), make([]string, len(res.Albums)) + for i, a := range res.Albums { + if len(a.Images) > 0 { + urls[i] = a.Images[len(a.Images)-1].URL + } + names[i], artists[i] = a.Name, a.Artist.Name + } + } - _, err = edit.Contentf("%s %s chart for %s", period, options.Type, username).File(sendpart.File{Name: "chart.png", Reader: bytes.NewReader(result)}).Send() - return err - }) + cellSize := 300 + if grid >= 10 { + cellSize = 100 + } + + broken, _ := imgio.Open("assets/img/broken.png") + broken = transform.Resize(broken, cellSize, cellSize, transform.NearestNeighbor) + + fetched := fetchEntries(urls) + entries := make([]Entry, len(fetched)) + for i, e := range fetched { + if e.Image == nil { + e.Image = broken + } + e.Image = transform.Resize(e.Image, cellSize, cellSize, transform.NearestNeighbor) + e.Name = names[i] + if artists != nil { + e.Artist = artists[i] + } + entries[i] = e + } + return entries, nil } -func init() { - // todo: remove this in the future* - brokenImage, _ = imgio.Open("assets/img/broken.png") - brokenImage = transform.Resize(brokenImage, 300, 300, transform.NearestNeighbor) - commands.Register(data, handler) +func fetchEntries(urls []string) []Entry { + entries := make([]Entry, len(urls)) + var wg sync.WaitGroup + sem := make(chan struct{}, maxConcurrent) + + for i, url := range urls { + wg.Add(1) + go func(i int, url string) { + defer wg.Done() + sem <- struct{}{} + defer func() { <-sem }() + entries[i].Image = fetchImage(url) + }(i, url) + } + wg.Wait() + return entries } func fetchImage(url string) image.Image { @@ -265,21 +224,6 @@ func fetchImage(url string) image.Image { return img } -func fetchEntries(urls []string) []Entry { - entries := make([]Entry, len(urls)) - var wg sync.WaitGroup - sem := make(chan struct{}, maxConcurrent) - - for i, url := range urls { - i, url := i, url - wg.Go(func() { - sem <- struct{}{} - defer func() { <-sem }() - - entries[i].Image = fetchImage(url) - }) - } - - wg.Wait() - return entries +func init() { + commands.Register(data, handler) } From 701a9fd79a5264595820b3ffd84fb3157c7abf9f Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Thu, 25 Sep 2025 23:06:48 +0200 Subject: [PATCH 22/29] use `wg.Go()` --- internal/bot/bot/bot.go | 1 + internal/bot/commands/chart/chart.go | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/internal/bot/bot/bot.go b/internal/bot/bot/bot.go index bab811f..2eb7002 100644 --- a/internal/bot/bot/bot.go +++ b/internal/bot/bot/bot.go @@ -71,6 +71,7 @@ func NewBot(ctx context.Context, token, dbPath, lastfmKey string) (*Bot, error) } func (b *Bot) Run(ctx context.Context) error { + // automatize ts pls b.State.AddHandler(func(e *gateway.ReadyEvent) { b.Registry.Dispatch(events.TypeName(e), e) }) diff --git a/internal/bot/commands/chart/chart.go b/internal/bot/commands/chart/chart.go index 0af8b8d..76e5490 100644 --- a/internal/bot/commands/chart/chart.go +++ b/internal/bot/commands/chart/chart.go @@ -195,14 +195,15 @@ func fetchEntries(urls []string) []Entry { sem := make(chan struct{}, maxConcurrent) for i, url := range urls { - wg.Add(1) - go func(i int, url string) { - defer wg.Done() + i, url := i, url + wg.Go(func() { sem <- struct{}{} defer func() { <-sem }() + entries[i].Image = fetchImage(url) - }(i, url) + }) } + wg.Wait() return entries } From d486d1b6df97d640006f871f37449edc943d7319 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Fri, 26 Sep 2025 00:21:55 +0200 Subject: [PATCH 23/29] ookk --- internal/bot/commands/chart/canvas.go | 1 + internal/bot/commands/chart/chart.go | 10 ++- internal/bot/commands/fm/fm.go | 7 +- internal/bot/commands/update/update.go | 74 +++++++++++-------- internal/bot/discord/components/components.go | 48 ++++++++++-- 5 files changed, 98 insertions(+), 42 deletions(-) diff --git a/internal/bot/commands/chart/canvas.go b/internal/bot/commands/chart/canvas.go index 38a8cc3..34a37fa 100644 --- a/internal/bot/commands/chart/canvas.go +++ b/internal/bot/commands/chart/canvas.go @@ -43,5 +43,6 @@ func renderChart(entries []Entry, grid int) ([]byte, error) { entry.Artist, color.RGBA{170, 170, 170, 255}, subFace) } } + return imgio.Encode(canvas, imgio.PNGEncoder()) } diff --git a/internal/bot/commands/chart/chart.go b/internal/bot/commands/chart/chart.go index 76e5490..09c1241 100644 --- a/internal/bot/commands/chart/chart.go +++ b/internal/bot/commands/chart/chart.go @@ -13,6 +13,7 @@ import ( "github.com/nxtgo/arikawa/v3/discord" "github.com/nxtgo/arikawa/v3/utils/sendpart" "go.fm/internal/bot/commands" + "go.fm/internal/bot/discord/components" "go.fm/internal/bot/discord/reply" "go.fm/internal/bot/image/imgio" "go.fm/internal/bot/image/transform" @@ -114,8 +115,15 @@ func handler(c *commands.CommandContext) error { return err } + component := components.NewContainer(0, + components.NewTextDisplayf("# %s %s chart for %s", period, options.Type, user), + components.NewMediaGallery( + components.NewMediaGalleryItem("attachment://chart.png"), + ), + ) + _, err = edit. - Contentf("%s %s chart for %s", period, options.Type, user). + ComponentsV2(component). File(sendpart.File{Name: "chart.png", Reader: bytes.NewReader(img)}). Send() return err diff --git a/internal/bot/commands/fm/fm.go b/internal/bot/commands/fm/fm.go index 6b3ecfe..5fb5004 100644 --- a/internal/bot/commands/fm/fm.go +++ b/internal/bot/commands/fm/fm.go @@ -54,9 +54,10 @@ func handler(c *commands.CommandContext) error { text = components.NewTextDisplayf("-# *Last track for %s, scrobbled at %s*", res.User, playtime.Format(time.Kitchen)) } - thumbnail := lastTrack.GetLargestImage().URL + largeThumbnail := lastTrack.GetLargestImage().URL + smallThumbnail := lastTrack.GetImageBySize("small").URL color := 0x703487 - if dominantColor, err := colors.Dominant(thumbnail); err == nil { + if dominantColor, err := colors.Dominant(smallThumbnail); err == nil { color = dominantColor } @@ -65,7 +66,7 @@ func handler(c *commands.CommandContext) error { components.NewTextDisplayf("# %s", lastTrack.Name), components.NewTextDisplayf("**%s** **ยท** %s", lastTrack.Artist.Name, lastTrack.Album.Name), text, - ).WithAccessory(components.NewThumbnail(thumbnail)), + ).WithAccessory(components.NewThumbnail(largeThumbnail)), components.NewActionRow( components.NewButton(components.ButtonStyleLink, "Last.fm", nil).WithEmoji("1418269025959546943").WithURL(lastTrack.URL), ), diff --git a/internal/bot/commands/update/update.go b/internal/bot/commands/update/update.go index 592c194..d9a16fb 100644 --- a/internal/bot/commands/update/update.go +++ b/internal/bot/commands/update/update.go @@ -2,6 +2,7 @@ package update import ( "fmt" + "slices" "strings" "github.com/nxtgo/arikawa/v3/api" @@ -11,11 +12,22 @@ import ( "go.fm/internal/bot/lastfm" ) +var validDataTypes = []string{ + "profile", "getinfo", + "topalbums", + "topartists", + "toptracks", + "all", +} + var data = api.CreateCommandData{ Name: "update", - Description: "update your data or another user's", + Description: "Update your Last.fm data or another user's", Options: discord.CommandOptions{ - discord.NewStringOption("data", "comma-separated list of data to update", true), + discord.NewStringOption("data", + "comma-separated list of data to update", + true, + ), discord.NewStringOption("user", "user to update data for", false), }, } @@ -25,7 +37,6 @@ var options struct { Data string `discord:"data"` } -// todo: let the user know which data is available to update func handler(c *commands.CommandContext) error { return c.Reply.AutoDefer(func(edit *reply.EditBuilder) error { if err := c.Data.Options.Unmarshal(&options); err != nil { @@ -42,54 +53,55 @@ func handler(c *commands.CommandContext) error { dataTypes[i] = strings.TrimSpace(strings.ToLower(dataTypes[i])) } + for _, t := range dataTypes { + if !slices.Contains(validDataTypes, t) { + return fmt.Errorf("`%s` is not a valid data type. valid options: %s", t, strings.Join(validDataTypes, ", ")) + } + } + userParams := lastfm.P{"user": username} + updated := make([]string, 0, len(dataTypes)) for _, t := range dataTypes { switch t { case "profile", "getinfo": - c.Cache.User.Delete(lastfm.GenerateCacheKey("user.getinfo", userParams)) - go c.Last.User.GetInfo(userParams) + update(c, "user.getinfo", c.Last.User.GetInfo, userParams) + updated = append(updated, "profile") case "topalbums": - c.Cache.User.Delete(lastfm.GenerateCacheKey("user.gettopalbums", userParams)) - go c.Last.User.GetTopAlbums(userParams) + update(c, "user.gettopalbums", c.Last.User.GetTopAlbums, userParams) + updated = append(updated, "topalbums") case "topartists": - c.Cache.User.Delete(lastfm.GenerateCacheKey("user.gettopartists", userParams)) - go c.Last.User.GetTopArtists(userParams) + update(c, "user.gettopartists", c.Last.User.GetTopArtists, userParams) + updated = append(updated, "topartists") case "toptracks": - c.Cache.User.Delete(lastfm.GenerateCacheKey("user.gettoptracks", userParams)) - go c.Last.User.GetTopTracks(userParams) + update(c, "user.gettoptracks", c.Last.User.GetTopTracks, userParams) + updated = append(updated, "toptracks") case "all": - fallthrough - default: - c.Cache.User.Delete(lastfm.GenerateCacheKey("user.getinfo", userParams)) - go c.Last.User.GetInfo(userParams) - - c.Cache.User.Delete(lastfm.GenerateCacheKey("user.gettopalbums", userParams)) - go c.Last.User.GetTopAlbums(userParams) - - c.Cache.User.Delete(lastfm.GenerateCacheKey("user.gettopartists", userParams)) - go c.Last.User.GetTopArtists(userParams) - - c.Cache.User.Delete(lastfm.GenerateCacheKey("user.gettoptracks", userParams)) - go c.Last.User.GetTopTracks(userParams) + update(c, "user.getinfo", c.Last.User.GetInfo, userParams) + update(c, "user.gettopalbums", c.Last.User.GetTopAlbums, userParams) + update(c, "user.gettopartists", c.Last.User.GetTopArtists, userParams) + update(c, "user.gettoptracks", c.Last.User.GetTopTracks, userParams) + updated = append(updated, "all") } } - _, err = edit.Content( - fmt.Sprintf( - "updated the following data for `%s`:\n\\- %s", - username, - strings.Join(dataTypes, "\n\\- "), - ), - ).Send() + embed := reply.SuccessEmbed(fmt.Sprintf("updated the following data for `%s`:\n\\- %s", + username, + strings.Join(updated, "\n\\- "))) + _, err = edit.Embed(embed).Send() return err }) } +func update[T any](c *commands.CommandContext, key string, fn func(lastfm.P) (*T, error), params lastfm.P) { + c.Cache.User.Delete(lastfm.GenerateCacheKey(key, params)) + go fn(params) +} + func init() { commands.Register(data, handler) } diff --git a/internal/bot/discord/components/components.go b/internal/bot/discord/components/components.go index a238ea8..9736c1b 100644 --- a/internal/bot/discord/components/components.go +++ b/internal/bot/discord/components/components.go @@ -6,14 +6,16 @@ type ComponentType int type ButtonStyle int const ( - TypeActionRow ComponentType = 1 - TypeButton ComponentType = 2 - TypeTextDisplay ComponentType = 10 - TypeThumbnail ComponentType = 11 - TypeSection ComponentType = 9 - TypeDivider ComponentType = 14 - TypeContainer ComponentType = 17 + TypeActionRow ComponentType = 1 + TypeButton ComponentType = 2 + TypeSection ComponentType = 9 + TypeTextDisplay ComponentType = 10 + TypeThumbnail ComponentType = 11 + TypeMediaGallery ComponentType = 12 + TypeDivider ComponentType = 14 + TypeContainer ComponentType = 17 ) + const ( ButtonStylePrimary ButtonStyle = iota + 1 ButtonStyleSecondary @@ -98,6 +100,20 @@ type Emoji struct { Animated bool `json:"animated"` } +type MediaGallery struct { + Type ComponentType `json:"type"` + ID *int `json:"id,omitempty"` + Items []MediaGalleryItem `json:"items"` +} + +func (m *MediaGallery) componentType() ComponentType { return TypeMediaGallery } + +type MediaGalleryItem struct { + Media Media `json:"media"` + Description string `json:"description,omitempty"` + Spoiler bool `json:"spoiler,omitempty"` +} + func NewContainer(accent int, children ...Component) *Container { return &Container{Type: TypeContainer, AccentColor: accent, Components: children} } @@ -144,3 +160,21 @@ func (b *Button) WithEmoji(id string) *Button { b.Emoji = &Emoji{ID: id} return b } + +func NewMediaGallery(items ...MediaGalleryItem) *MediaGallery { + return &MediaGallery{Type: TypeMediaGallery, Items: items} +} + +func NewMediaGalleryItem(url string) MediaGalleryItem { + return MediaGalleryItem{Media: Media{URL: url}} +} + +func (m MediaGalleryItem) WithDescription(desc string) MediaGalleryItem { + m.Description = desc + return m +} + +func (m MediaGalleryItem) WithSpoiler() MediaGalleryItem { + m.Spoiler = true + return m +} From 51c4c7fd4617a03af36bb7be87e583bdab5c79e8 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Sat, 27 Sep 2025 05:29:22 +0200 Subject: [PATCH 24/29] fm canvas --- assets/img/backgrounds/profile.png | Bin 0 -> 58088 bytes assets/img/layouts/profile.png | Bin 0 -> 271908 bytes internal/bot/commands/fm/canvas.go | 112 ++++++++++++++++++++++++ internal/bot/commands/fm/fm.go | 9 +- internal/bot/commands/profile/canvas.go | 56 +++++++----- internal/bot/image/mask/mask.go | 20 +++++ 6 files changed, 172 insertions(+), 25 deletions(-) create mode 100644 assets/img/backgrounds/profile.png create mode 100644 assets/img/layouts/profile.png create mode 100644 internal/bot/commands/fm/canvas.go diff --git a/assets/img/backgrounds/profile.png b/assets/img/backgrounds/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..279be4a1a01ce66c32502197215a2aa25e585f19 GIT binary patch literal 58088 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

(ooqSGyr+~wg7v7X~!Ms4b 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

rife;5RpkCf%7@_EqLdp!t}|B70o-Azq!r|v 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 z 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

ERBva=-o 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ૂ`3XTd_s$gG`pq+cNfzhxxM*6D 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 Y|J#0Q;`odirvLx|07*qoM6N<$g3(>=V*mgE literal 0 HcmV?d00001 diff --git a/assets/img/layouts/profile.png b/assets/img/layouts/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..fdf469db56e5ede30892c2b2ef7b69aec76f8664 GIT binary patch literal 271908 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 r(9;_ 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 wuVrdEf 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 m?AMR1-}v$iW={F@Z2uX;MB}~{Ccgv#0000M literal 0 HcmV?d00001 diff --git a/internal/bot/commands/fm/canvas.go b/internal/bot/commands/fm/canvas.go new file mode 100644 index 0000000..9cdfefb --- /dev/null +++ b/internal/bot/commands/fm/canvas.go @@ -0,0 +1,112 @@ +package fm + +import ( + "bytes" + "image" + "image/color" + "image/draw" + + "github.com/nxtgo/arikawa/v3/utils/sendpart" + "go.fm/internal/bot/discord/reply" + "go.fm/internal/bot/image/blur" + "go.fm/internal/bot/image/font" + "go.fm/internal/bot/image/imgio" + "go.fm/internal/bot/image/mask" + "go.fm/internal/bot/image/transform" + "go.fm/internal/bot/lastfm" +) + +var ( + fmWidth = 555 + fmHeight = 147 + + titleX = 20 + titleY = 26 + artistX = 20 + artistY = 84 + + coverY = 0 + coverWidth = 313 + coverHeight = 147 + textSampleW = 400 + titleSampleH = 50 + artistSampleH = 30 +) + +func renderCanvas(edit *reply.EditBuilder, track *lastfm.RecentTrack) error { + interBold := font.LoadFont("assets/font/Inter_24pt-Bold.ttf") + titleFace := interBold.Face(48, 72) + artistFace := interBold.Face(24, 72) + + canvas := image.NewNRGBA(image.Rect(0, 0, fmWidth, fmHeight)) + + coverImage, err := imgio.FromUrl(track.GetLargestImage().URL) + if err != nil { + return err + } + + // blur background + blurredCover := transform.Resize(coverImage, fmWidth, fmHeight, transform.Gaussian) + blurredCover = blur.Gaussian(blurredCover, 30) + draw.Draw(canvas, canvas.Bounds(), blurredCover, image.Point{}, draw.Over) + + // mask + sharpCover := transform.Resize(coverImage, coverWidth, coverHeight, transform.Gaussian) + gradientMask := mask.GradientHorizontal(coverWidth, coverHeight, true) + coverEndX := fmWidth - coverWidth + draw.DrawMask(canvas, + image.Rect(coverEndX, coverY, coverEndX+coverWidth, coverY+coverHeight), + sharpCover, + image.Point{}, + gradientMask, + image.Point{}, + draw.Over, + ) + + // text + titleColor := getContrastColor(canvas, titleX, titleY, textSampleW, titleSampleH) + artistColor := getContrastColor(canvas, artistX, artistY, textSampleW, artistSampleH) + + titleAscent := titleFace.Metrics().Ascent.Ceil() + font.DrawText(canvas, titleX, titleY+titleAscent, track.Name, titleColor, titleFace) + + artistAscent := artistFace.Metrics().Ascent.Ceil() + font.DrawText(canvas, artistX, artistY+artistAscent, track.Artist.Name, artistColor, artistFace) + + // rounded corners + roundedMask := mask.Rounded(fmWidth, fmHeight, 20) + final := image.NewNRGBA(canvas.Bounds()) + draw.DrawMask(final, final.Bounds(), canvas, image.Point{}, roundedMask, image.Point{}, draw.Over) + + result, err := imgio.Encode(final, imgio.PNGEncoder()) + if err != nil { + return err + } + _, err = edit.File(sendpart.File{Name: "profile.png", Reader: bytes.NewReader(result)}).Send() + return err +} + +func getContrastColor(img image.Image, x, y, w, h int) color.Color { + var total float64 + count := 0 + + bounds := img.Bounds() + for iy := y; iy < y+h && iy < bounds.Max.Y; iy++ { + for ix := x; ix < x+w && ix < bounds.Max.X; ix++ { + r, g, b, _ := img.At(ix, iy).RGBA() + lum := 0.299*float64(r>>8) + 0.587*float64(g>>8) + 0.114*float64(b>>8) + total += lum + count++ + } + } + + if count == 0 { + return color.White + } + + avgLum := total / float64(count) + if avgLum > 128 { + return color.Black + } + return color.White +} diff --git a/internal/bot/commands/fm/fm.go b/internal/bot/commands/fm/fm.go index 5fb5004..4356866 100644 --- a/internal/bot/commands/fm/fm.go +++ b/internal/bot/commands/fm/fm.go @@ -17,11 +17,13 @@ var data = api.CreateCommandData{ Description: "display your current track or another user's", Options: discord.CommandOptions{ discord.NewStringOption("user", "user to display track from", false), + discord.NewBooleanOption("canvas", "display as an image", false), }, } var options struct { - User *string `discord:"user"` + User *string `discord:"user"` + Canvas *bool `discord:"canvas"` } func handler(c *commands.CommandContext) error { @@ -43,6 +45,11 @@ func handler(c *commands.CommandContext) error { var text *components.TextDisplay lastTrack := res.Tracks[0] + + if options.Canvas != nil && *options.Canvas { + return renderCanvas(edit, &lastTrack) + } + if lastTrack.NowPlaying == "true" { text = components.NewTextDisplayf("-# *Current track for %s*", res.User) } else { diff --git a/internal/bot/commands/profile/canvas.go b/internal/bot/commands/profile/canvas.go index 6ee5fa5..078dadb 100644 --- a/internal/bot/commands/profile/canvas.go +++ b/internal/bot/commands/profile/canvas.go @@ -9,7 +9,6 @@ import ( "github.com/nxtgo/arikawa/v3/utils/sendpart" "go.fm/internal/bot/discord/reply" - "go.fm/internal/bot/image/blur" "go.fm/internal/bot/image/font" "go.fm/internal/bot/image/imgio" "go.fm/internal/bot/image/mask" @@ -21,23 +20,30 @@ var ( profileWidth = 740 profileHeight = 260 - avatarX = 23 - avatarY = 45 - avatarWidth = 120 - avatarHeight = 120 + avatarX = 43 + avatarY = 21 + avatarWidth = 130 + avatarHeight = 130 - containerX = 23 - containerY = 187 - containerW = 120 - containerH = 21 + containerX = 45 + containerY = 169 + containerW = 125 + containerH = 40 + + realNameX = 200 + realNameY = 21 ) func renderCanvas(edit *reply.EditBuilder, user *lastfm.User) error { - inter := font.LoadFont("assets/font/Inter_24pt-Bold.ttf") - face := inter.Face(14, 72) + interBold := font.LoadFont("assets/font/Inter_24pt-Bold.ttf") + //interRegular := font.LoadFont("assets/font/Inter_24pt-Regular.ttf") + + scrobblesFace := interBold.Face(20, 72) + realNameFace := interBold.Face(24, 72) + // usernameFace := interRegular.Face(15, 72) canvas := image.NewRGBA(image.Rect(0, 0, profileWidth, profileHeight)) - layout, err := imgio.Open("assets/img/profile_layout.png") + layout, err := imgio.Open("assets/img/layouts/profile.png") if err != nil { return err } @@ -46,11 +52,6 @@ func renderCanvas(edit *reply.EditBuilder, user *lastfm.User) error { return err } - // background - background := transform.Resize(avatar, profileWidth, profileHeight, transform.NearestNeighbor) - background = blur.Gaussian(background, 30) - backgroundMask := mask.Rounded(profileWidth, profileHeight, 30) - // avatar avatar = transform.Resize(avatar, avatarWidth, avatarHeight, transform.NearestNeighbor) avatarMask := mask.Rounded(avatarWidth, avatarHeight, 15) @@ -62,23 +63,30 @@ func renderCanvas(edit *reply.EditBuilder, user *lastfm.User) error { ) // draw stuff onto the canvas - draw.DrawMask(canvas, image.Rect(0, 0, profileWidth, profileHeight), background, image.Point{0, 0}, backgroundMask, image.Point{0, 0}, draw.Over) draw.Draw(canvas, image.Rect(0, 0, profileWidth, profileHeight), layout, image.Point{0, 0}, draw.Over) draw.DrawMask(canvas, avatarRect, avatar, image.Point{0, 0}, avatarMask, image.Point{0, 0}, draw.Over) - // text + // scrobbles text scrobbles := fmt.Sprintf("%d", user.GetPlayCount()) - faceAscent := face.Metrics().Ascent.Ceil() - faceDescent := face.Metrics().Descent.Ceil() + faceAscent := scrobblesFace.Metrics().Ascent.Ceil() + faceDescent := scrobblesFace.Metrics().Descent.Ceil() - textWidth := font.Measure(face, scrobbles) + textWidth := font.Measure(scrobblesFace, scrobbles) textHeight := faceAscent + faceDescent textX := containerX + (containerW-textWidth)/2 textY := containerY + (containerH-textHeight)/2 + faceAscent - // draw the text onto the canvas - font.DrawText(canvas, textX, textY, scrobbles, color.White, face) + font.DrawText(canvas, textX, textY, scrobbles, color.White, scrobblesFace) + + // real name text + realNameAscent := realNameFace.Metrics().Ascent.Ceil() + realName := user.RealName + if realName == "" { + realName = user.Name + } + + font.DrawText(canvas, realNameX, realNameY+realNameAscent, realName, color.White, realNameFace) result, err := imgio.Encode(canvas, imgio.PNGEncoder()) if err != nil { diff --git a/internal/bot/image/mask/mask.go b/internal/bot/image/mask/mask.go index 67af198..60f4a39 100644 --- a/internal/bot/image/mask/mask.go +++ b/internal/bot/image/mask/mask.go @@ -50,3 +50,23 @@ func Rounded(width, height, radius int) *image.Alpha { return mask } + +func GradientHorizontal(width, height int, reverse bool) *image.Alpha { + mask := image.NewAlpha(image.Rect(0, 0, width, height)) + + parallel.Line(height, func(start, end int) { + for y := start; y < end; y++ { + for x := range width { + var alpha uint8 + if reverse { + alpha = uint8((x * 255) / width) + } else { + alpha = uint8(255 - (x * 255 / width)) + } + mask.SetAlpha(x, y, color.Alpha{A: alpha}) + } + } + }) + + return mask +} From eec993115899dc88f1b46a9fcc98a49a6a9474cd Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Sat, 27 Sep 2025 18:50:24 +0200 Subject: [PATCH 25/29] idk --- assets/img/layouts/border.png | Bin 0 -> 644 bytes internal/bot/commands/profile/canvas.go | 88 +++++++----------------- internal/bot/image/mask/mask.go | 39 ++++++++--- internal/bot/image/shapes/shapes.go | 31 +++++++++ 4 files changed, 84 insertions(+), 74 deletions(-) create mode 100644 assets/img/layouts/border.png create mode 100644 internal/bot/image/shapes/shapes.go diff --git a/assets/img/layouts/border.png b/assets/img/layouts/border.png new file mode 100644 index 0000000000000000000000000000000000000000..9e712ef733ecde80ec748527328436bc775abfe3 GIT binary patch literal 644 zcmV-~0(N224w?Apc{0Aj=%^Vfe|`_dsm;O0122RBxfH#$#N={5AWSS zCy*Hm#Cz{(d!xnslGZ}5o%~DOF+=8v*oxLlcK&;j`uXe(Ai*q-qr0ZHK`okH$i@H? zUeUHi5S<+1d#E;mM8`<)FraAlaI|S1{Rlu4V+vPgz!btGllA}~M%Wj^_?m<{CV+%5 zXzl6pgbBqnqi28*z`04DH(7;!Q3=}qW_KpPJ6ewSpuca z{3cp6K%(zZIIS6AA^J>X2FRhu!2oR~u!j+@N}%+)e@RmYn2A2qWIzQ&oEbpr-}`rW zxpA2RYZ&9K2~r09!qV^YP|E_&R%N{(FG6!%v-<0Vbo*L<1@q zB^t1TQDP4;H~%AZA6`l@DW2gHFe{#61I$hUh7E8q3>&b7VO~7|F9U2FFyl9;V3 en$m=M1O5O}od8$uL6D#T0000 0 && dy > 0 && dx*dx+dy*dy > float64(radius*radius) { - alpha = 0 + if dx > 0 && dy > 0 { + dist := math.Hypot(dx, dy) + if dist > float64(radius) { + alpha = 0 + } else if dist > float64(radius)-1 { + alpha = 255 * (float64(radius) - dist) + } } // top-right corner dx = float64(x - (width - radius - 1)) dy = float64(radius - y) - if dx > 0 && dy > 0 && dx*dx+dy*dy > float64(radius*radius) { - alpha = 0 + if dx > 0 && dy > 0 { + dist := math.Hypot(dx, dy) + if dist > float64(radius) { + alpha = 0 + } else if dist > float64(radius)-1 { + alpha = math.Min(alpha, 255*(float64(radius)-dist)) + } } // bottom-left corner dx = float64(radius - x) dy = float64(y - (height - radius - 1)) - if dx > 0 && dy > 0 && dx*dx+dy*dy > float64(radius*radius) { - alpha = 0 + if dx > 0 && dy > 0 { + dist := math.Hypot(dx, dy) + if dist > float64(radius) { + alpha = 0 + } else if dist > float64(radius)-1 { + alpha = math.Min(alpha, 255*(float64(radius)-dist)) + } } // bottom-right corner dx = float64(x - (width - radius - 1)) dy = float64(y - (height - radius - 1)) - if dx > 0 && dy > 0 && dx*dx+dy*dy > float64(radius*radius) { - alpha = 0 + if dx > 0 && dy > 0 { + dist := math.Hypot(dx, dy) + if dist > float64(radius) { + alpha = 0 + } else if dist > float64(radius)-1 { + alpha = math.Min(alpha, 255*(float64(radius)-dist)) + } } mask.SetAlpha(x, y, color.Alpha{A: uint8(alpha)}) diff --git a/internal/bot/image/shapes/shapes.go b/internal/bot/image/shapes/shapes.go new file mode 100644 index 0000000..c2c1a16 --- /dev/null +++ b/internal/bot/image/shapes/shapes.go @@ -0,0 +1,31 @@ +package shapes + +import ( + "image" + "image/color" + "image/draw" + + "go.fm/internal/bot/image/mask" +) + +// DrawCircle draws a filled circle at (cx, cy) with radius r +func DrawCircle(img *image.RGBA, cx, cy, r int, col color.Color) { + for y := cy - r; y <= cy+r; y++ { + for x := cx - r; x <= cx+r; x++ { + if (x-cx)*(x-cx)+(y-cy)*(y-cy) <= r*r { + img.Set(x, y, col) + } + } + } +} + +// DrawRectangle draws a filled rectangle +func DrawRectangle(img *image.RGBA, x, y, w, h int, col color.Color) { + draw.Draw(img, image.Rect(x, y, x+w, y+h), &image.Uniform{col}, image.Point{}, draw.Src) +} + +// DrawRoundedRectangle draws a rectangle with rounded corners +func DrawRoundedRectangle(img *image.RGBA, x, y, w, h, radius int, col color.Color) { + maskImg := mask.Rounded(w, h, radius) + draw.DrawMask(img, image.Rect(x, y, x+w, y+h), &image.Uniform{col}, image.Point{}, maskImg, image.Point{}, draw.Over) +} From cccd0ede60473ac7bd17ac74e043ed7c63a5bc50 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Mon, 29 Sep 2025 00:07:05 +0200 Subject: [PATCH 26/29] base --- README.md | 4 +- assets/font/Inter_24pt-Bold.ttf | Bin 344032 -> 0 bytes assets/font/Inter_24pt-Regular.ttf | Bin 342732 -> 0 bytes assets/img/backgrounds/profile.png | Bin 58088 -> 0 bytes assets/img/broken.png | Bin 19714 -> 0 bytes assets/img/chart_gradient.png | Bin 51893 -> 0 bytes assets/img/layouts/border.png | Bin 644 -> 0 bytes assets/img/layouts/profile.png | Bin 271908 -> 0 bytes assets/img/profile_layout.png | Bin 6881 -> 0 bytes cmd/bot/commands.go | 10 - cmd/bot/main.go | 27 +- cmd/bot/register.go | 5 + go.mod | 16 +- go.sum | 36 +- internal/bot/bot.go | 67 +++ internal/bot/bot/bot.go | 98 ---- internal/bot/bot/events/events.go | 62 --- internal/bot/commands.go | 63 +++ internal/bot/commands/chart/canvas.go | 48 -- internal/bot/commands/chart/chart.go | 238 --------- internal/bot/commands/commands.go | 70 --- internal/bot/commands/fm/canvas.go | 112 ---- internal/bot/commands/fm/fm.go | 89 ---- internal/bot/commands/profile/canvas.go | 56 -- internal/bot/commands/profile/command.go | 68 --- internal/bot/commands/setuser/command.go | 66 --- internal/bot/commands/stats/command.go | 53 -- internal/bot/commands/types.go | 58 --- internal/bot/commands/update/update.go | 107 ---- internal/bot/discord/components/components.go | 180 ------- internal/bot/discord/emojis/emojis.go | 40 -- internal/bot/discord/reply/defer.go | 16 - internal/bot/discord/reply/edit.go | 76 --- internal/bot/discord/reply/helpers.go | 48 -- internal/bot/discord/reply/reply.go | 151 ------ internal/bot/events.go | 14 + internal/bot/image/LICENSE | 21 - internal/bot/image/README.md | 10 - internal/bot/image/blend/blend.go | 380 -------------- internal/bot/image/blur/blur.go | 52 -- internal/bot/image/clone/clone.go | 156 ------ internal/bot/image/colors/colors.go | 150 ------ internal/bot/image/convolution/convolution.go | 133 ----- internal/bot/image/convolution/kernel.go | 103 ---- internal/bot/image/fcolor/fcolor.go | 22 - internal/bot/image/font/font.go | 60 --- internal/bot/image/imgio/imgio.go | 137 ----- internal/bot/image/mask/mask.go | 93 ---- internal/bot/image/math/f64/f64.go | 13 - internal/bot/image/parallel/parallel.go | 36 -- internal/bot/image/shapes/shapes.go | 31 -- internal/bot/image/transform/filters.go | 142 ------ internal/bot/image/transform/resize.go | 180 ------- internal/bot/lastfm/cache.go | 86 ---- internal/bot/lastfm/client.go | 127 ----- internal/bot/lastfm/services.go | 16 - internal/bot/lastfm/user.go | 174 ------- internal/bot/lastfm/user_types.go | 262 ---------- internal/bot/logging/logging.go | 284 ----------- internal/bot/persistence/sql/queries.sql | 18 - internal/bot/persistence/sql/schema.sql | 8 - internal/bot/persistence/sqlc/db.go | 118 ----- internal/bot/persistence/sqlc/models.go | 15 - internal/bot/persistence/sqlc/queries.sql.go | 62 --- internal/bot/persistence/sqlc/start.go | 38 -- internal/commands/stats/stats.go | 23 + internal/lastfm/README.md | 2 + internal/lastfm/album.go | 179 +++++++ internal/lastfm/api/album.go | 72 +++ internal/lastfm/api/api.go | 205 ++++++++ internal/lastfm/api/artist.go | 119 +++++ internal/lastfm/api/chart.go | 47 ++ internal/lastfm/api/client.go | 25 + internal/lastfm/api/method.go | 75 +++ internal/lastfm/api/response.go | 128 +++++ internal/lastfm/api/track.go | 88 ++++ internal/lastfm/api/user.go | 151 ++++++ internal/lastfm/artist.go | 281 ++++++++++ internal/lastfm/chart.go | 75 +++ internal/lastfm/lastfm.go | 189 +++++++ internal/lastfm/track.go | 426 ++++++++++++++++ internal/lastfm/user.go | 481 ++++++++++++++++++ internal/lastfm/util.go | 257 ++++++++++ sqlc.yaml | 6 +- 84 files changed, 3016 insertions(+), 4618 deletions(-) delete mode 100644 assets/font/Inter_24pt-Bold.ttf delete mode 100644 assets/font/Inter_24pt-Regular.ttf delete mode 100644 assets/img/backgrounds/profile.png delete mode 100644 assets/img/broken.png delete mode 100644 assets/img/chart_gradient.png delete mode 100644 assets/img/layouts/border.png delete mode 100644 assets/img/layouts/profile.png delete mode 100644 assets/img/profile_layout.png delete mode 100644 cmd/bot/commands.go create mode 100644 cmd/bot/register.go create mode 100644 internal/bot/bot.go delete mode 100644 internal/bot/bot/bot.go delete mode 100644 internal/bot/bot/events/events.go create mode 100644 internal/bot/commands.go delete mode 100644 internal/bot/commands/chart/canvas.go delete mode 100644 internal/bot/commands/chart/chart.go delete mode 100644 internal/bot/commands/commands.go delete mode 100644 internal/bot/commands/fm/canvas.go delete mode 100644 internal/bot/commands/fm/fm.go delete mode 100644 internal/bot/commands/profile/canvas.go delete mode 100644 internal/bot/commands/profile/command.go delete mode 100644 internal/bot/commands/setuser/command.go delete mode 100644 internal/bot/commands/stats/command.go delete mode 100644 internal/bot/commands/types.go delete mode 100644 internal/bot/commands/update/update.go delete mode 100644 internal/bot/discord/components/components.go delete mode 100644 internal/bot/discord/emojis/emojis.go delete mode 100644 internal/bot/discord/reply/defer.go delete mode 100644 internal/bot/discord/reply/edit.go delete mode 100644 internal/bot/discord/reply/helpers.go delete mode 100644 internal/bot/discord/reply/reply.go create mode 100644 internal/bot/events.go delete mode 100644 internal/bot/image/LICENSE delete mode 100644 internal/bot/image/README.md delete mode 100644 internal/bot/image/blend/blend.go delete mode 100644 internal/bot/image/blur/blur.go delete mode 100644 internal/bot/image/clone/clone.go delete mode 100644 internal/bot/image/colors/colors.go delete mode 100644 internal/bot/image/convolution/convolution.go delete mode 100644 internal/bot/image/convolution/kernel.go delete mode 100644 internal/bot/image/fcolor/fcolor.go delete mode 100644 internal/bot/image/font/font.go delete mode 100644 internal/bot/image/imgio/imgio.go delete mode 100644 internal/bot/image/mask/mask.go delete mode 100644 internal/bot/image/math/f64/f64.go delete mode 100644 internal/bot/image/parallel/parallel.go delete mode 100644 internal/bot/image/shapes/shapes.go delete mode 100644 internal/bot/image/transform/filters.go delete mode 100644 internal/bot/image/transform/resize.go delete mode 100644 internal/bot/lastfm/cache.go delete mode 100644 internal/bot/lastfm/client.go delete mode 100644 internal/bot/lastfm/services.go delete mode 100644 internal/bot/lastfm/user.go delete mode 100644 internal/bot/lastfm/user_types.go delete mode 100644 internal/bot/logging/logging.go delete mode 100644 internal/bot/persistence/sql/queries.sql delete mode 100644 internal/bot/persistence/sql/schema.sql delete mode 100644 internal/bot/persistence/sqlc/db.go delete mode 100644 internal/bot/persistence/sqlc/models.go delete mode 100644 internal/bot/persistence/sqlc/queries.sql.go delete mode 100644 internal/bot/persistence/sqlc/start.go create mode 100644 internal/commands/stats/stats.go create mode 100644 internal/lastfm/README.md create mode 100644 internal/lastfm/album.go create mode 100644 internal/lastfm/api/album.go create mode 100644 internal/lastfm/api/api.go create mode 100644 internal/lastfm/api/artist.go create mode 100644 internal/lastfm/api/chart.go create mode 100644 internal/lastfm/api/client.go create mode 100644 internal/lastfm/api/method.go create mode 100644 internal/lastfm/api/response.go create mode 100644 internal/lastfm/api/track.go create mode 100644 internal/lastfm/api/user.go create mode 100644 internal/lastfm/artist.go create mode 100644 internal/lastfm/chart.go create mode 100644 internal/lastfm/lastfm.go create mode 100644 internal/lastfm/track.go create mode 100644 internal/lastfm/user.go create mode 100644 internal/lastfm/util.go diff --git a/README.md b/README.md index b1b2e57..6b101e6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# go.fm +# first.fm your last.fm stats within Discord, isn't it great? @@ -7,7 +7,7 @@ your last.fm stats within Discord, isn't it great? ### clone repo (via http or ssh) ```sh -$ git clone https://github.com/nxtgo/go.fm +$ git clone https://github.com/nxtgo/first.fm ``` ### create a .env diff --git a/assets/font/Inter_24pt-Bold.ttf b/assets/font/Inter_24pt-Bold.ttf deleted file mode 100644 index e974d96fc818cdefd0a3cd06f02e13508dcb3b66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344032 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 diff --git a/assets/font/Inter_24pt-Regular.ttf b/assets/font/Inter_24pt-Regular.ttf deleted file mode 100644 index 6b088a71193dc27290d27f910bc5d73214f3bbc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342732 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 Duw-^W diff --git a/assets/img/backgrounds/profile.png b/assets/img/backgrounds/profile.png deleted file mode 100644 index 279be4a1a01ce66c32502197215a2aa25e585f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58088 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 Y|J#0Q;`odirvLx|07*qoM6N<$g3(>=V*mgE diff --git a/assets/img/broken.png b/assets/img/broken.png deleted file mode 100644 index 338dac7d7646900a8cb1089ed23fdbc2062aa17d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19714 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 XUM>?n@;@1PWEq2}tDnm{r-UW|`W-&9 diff --git a/assets/img/chart_gradient.png b/assets/img/chart_gradient.png deleted file mode 100644 index 79d81a30a4233c228bdec81415016904e3ccbbc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51893 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 r(9;_ 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 wuVrdEf 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 m?AMR1-}v$iW={F@Z2uX;MB}~{Ccgv#0000M diff --git a/assets/img/profile_layout.png b/assets/img/profile_layout.png deleted file mode 100644 index dc40d6ec8a95f21fc87169d9f1ff386afcead36c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6881 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 JhSRwl`al2828#dy diff --git a/cmd/bot/commands.go b/cmd/bot/commands.go deleted file mode 100644 index 880ad66..0000000 --- a/cmd/bot/commands.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import ( - _ "go.fm/internal/bot/commands/chart" - _ "go.fm/internal/bot/commands/fm" - _ "go.fm/internal/bot/commands/profile" - _ "go.fm/internal/bot/commands/setuser" - _ "go.fm/internal/bot/commands/stats" - _ "go.fm/internal/bot/commands/update" -) diff --git a/cmd/bot/main.go b/cmd/bot/main.go index 0c6a0c3..c78710b 100644 --- a/cmd/bot/main.go +++ b/cmd/bot/main.go @@ -6,35 +6,26 @@ import ( "os/signal" "syscall" - "go.fm/internal/bot/bot" - "go.fm/internal/bot/logging" + "first.fm/internal/bot" ) -func getEnv(key, fallback string) string { - if v := os.Getenv(key); v != "" { - return v - } - return fallback -} - func main() { token := os.Getenv("DISCORD_TOKEN") lastfmKey := os.Getenv("LASTFM_API_KEY") - dbPath := getEnv("DATABASE_PATH", "file:database.db?_foreign_keys=on") if token == "" || lastfmKey == "" { - logging.Fatal("DISCORD_TOKEN and LASTFM_API_KEY must be set") + panic("DISCORD_TOKEN and LASTFM_API_KEY must be set") } - ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) - defer cancel() - - b, err := bot.NewBot(ctx, token, dbPath, lastfmKey) + bot, err := bot.New(token, lastfmKey) if err != nil { - logging.Fatalf("failed to create bot: %v", err) + panic(err) } - if err := b.Run(ctx); err != nil { - logging.Fatalf("bot stopped with error: %v", err) + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) + defer cancel() + + if err = bot.Run(ctx); err != nil { + panic(err) } } diff --git a/cmd/bot/register.go b/cmd/bot/register.go new file mode 100644 index 0000000..e0c9c3b --- /dev/null +++ b/cmd/bot/register.go @@ -0,0 +1,5 @@ +package main + +import ( + _ "first.fm/internal/commands/stats" +) diff --git a/go.mod b/go.mod index b09772e..d118109 100644 --- a/go.mod +++ b/go.mod @@ -1,17 +1,17 @@ -module go.fm +module first.fm go 1.25.0 require ( - github.com/mattn/go-sqlite3 v1.14.32 - github.com/nxtgo/arikawa/v3 v3.0.0-20250921013437-308638597d52 - github.com/nxtgo/gce v0.0.0-20250910001932-ff8e22b0e630 - golang.org/x/image v0.31.0 + github.com/disgoorg/disgo v0.19.0-rc.6.0.20250924005456-3274c76733fc + github.com/disgoorg/snowflake/v2 v2.0.3 ) require ( - github.com/gorilla/schema v1.4.1 // indirect + github.com/disgoorg/json/v2 v2.0.0 // indirect + github.com/disgoorg/omit v1.0.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect - golang.org/x/text v0.29.0 // indirect - golang.org/x/time v0.10.0 // indirect + github.com/sasha-s/go-csync v0.0.0-20240107134140-fcbab37b09ad // indirect + golang.org/x/crypto v0.39.0 // indirect + golang.org/x/sys v0.33.0 // indirect ) diff --git a/go.sum b/go.sum index 9f2f06c..62b8ffa 100644 --- a/go.sum +++ b/go.sum @@ -1,16 +1,24 @@ -github.com/gorilla/schema v1.4.1 h1:jUg5hUjCSDZpNGLuXQOgIWGdlgrIdYvgQ0wZtdK1M3E= -github.com/gorilla/schema v1.4.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/disgoorg/disgo v0.19.0-rc.6.0.20250924005456-3274c76733fc h1:UJ4/mwtk9XLuVzmEnt905lbz8/wuAXOPd12X4gZF7OE= +github.com/disgoorg/disgo v0.19.0-rc.6.0.20250924005456-3274c76733fc/go.mod h1:Gc5o9M0pNcdPd4YhQszhdKMRJwmVVIv3IVlHsvtAwpQ= +github.com/disgoorg/json/v2 v2.0.0 h1:U16yy/ARK7/aEpzjjqK1b/KaqqGHozUdeVw/DViEzQI= +github.com/disgoorg/json/v2 v2.0.0/go.mod h1:jZTBC0nIE1WeetSEI3/Dka8g+qglb4FPVmp5I5HpEfI= +github.com/disgoorg/omit v1.0.0 h1:y0LkVUOyUHT8ZlnhIAeOZEA22UYykeysK8bLJ0SfT78= +github.com/disgoorg/omit v1.0.0/go.mod h1:RTmSARkf6PWT/UckwI0bV8XgWkWQoPppaT01rYKLcFQ= +github.com/disgoorg/snowflake/v2 v2.0.3 h1:3B+PpFjr7j4ad7oeJu4RlQ+nYOTadsKapJIzgvSI2Ro= +github.com/disgoorg/snowflake/v2 v2.0.3/go.mod h1:W6r7NUA7DwfZLwr00km6G4UnZ0zcoLBRufhkFWgAc4c= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= -github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/nxtgo/arikawa/v3 v3.0.0-20250921013437-308638597d52 h1:xzaKaxK3MrnBsSkGTvhXLFPKPOhRYkar6KB1AyX7GPo= -github.com/nxtgo/arikawa/v3 v3.0.0-20250921013437-308638597d52/go.mod h1:BxHFNaM4Y5w9DIiogWgvq1T7MQ3d7AbkT7ZmcJOFM98= -github.com/nxtgo/gce v0.0.0-20250910001932-ff8e22b0e630 h1:q6YDsr4P1r0iViA9p04SmBNVK2+wP6m6dLZsKXhPhDs= -github.com/nxtgo/gce v0.0.0-20250910001932-ff8e22b0e630/go.mod h1:Lo1Rn6XM9r74u2JPtznKRojJuvZLd5e8V6dqUOP/yJo= -golang.org/x/image v0.31.0 h1:mLChjE2MV6g1S7oqbXC0/UcKijjm5fnJLUYKIYrLESA= -golang.org/x/image v0.31.0/go.mod h1:R9ec5Lcp96v9FTF+ajwaH3uGxPH4fKfHHAVbUILxghA= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= -golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= -golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sasha-s/go-csync v0.0.0-20240107134140-fcbab37b09ad h1:qIQkSlF5vAUHxEmTbaqt1hkJ/t6skqEGYiMag343ucI= +github.com/sasha-s/go-csync v0.0.0-20240107134140-fcbab37b09ad/go.mod h1:/pA7k3zsXKdjjAiUhB5CjuKib9KJGCaLvZwtxGC8U0s= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= +golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/bot/bot.go b/internal/bot/bot.go new file mode 100644 index 0000000..8923c21 --- /dev/null +++ b/internal/bot/bot.go @@ -0,0 +1,67 @@ +package bot + +import ( + "context" + "log/slog" + "os" + "os/signal" + "syscall" + + "first.fm/internal/lastfm/api" + "github.com/disgoorg/disgo" + "github.com/disgoorg/disgo/bot" + "github.com/disgoorg/disgo/gateway" + "github.com/disgoorg/snowflake/v2" +) + +type Bot struct { + Client *bot.Client + LastFM *api.Client +} + +func New(token, key string) (*Bot, error) { + client, err := disgo.New( + token, + bot.WithGatewayConfigOpts( + gateway.WithCompress(true), + gateway.WithAutoReconnect(true), + gateway.WithIntents( + gateway.IntentGuildMembers, + gateway.IntentGuilds, + ), + ), + bot.WithEventListenerFunc(onReady), + bot.WithEventListenerFunc(Dispatcher()), + ) + if err != nil { + return nil, err + } + + lastfmClient := api.NewClient(key) + return &Bot{ + Client: client, + LastFM: lastfmClient, + }, nil +} + +func (b *Bot) Run(ctx context.Context) error { + if err := b.Client.OpenGateway(ctx); err != nil { + return err + } + defer b.Client.Close(ctx) + + if _, err := b.Client.Rest.SetGuildCommands(b.Client.ApplicationID, snowflake.GetEnv("GUILD_ID"), Commands()); err != nil { + return err + } + slog.Info("registered discord commands") + + stop := make(chan os.Signal, 1) + signal.Notify(stop, os.Interrupt, syscall.SIGTERM) + + select { + case <-ctx.Done(): + case <-stop: + } + + return nil +} diff --git a/internal/bot/bot/bot.go b/internal/bot/bot/bot.go deleted file mode 100644 index 2eb7002..0000000 --- a/internal/bot/bot/bot.go +++ /dev/null @@ -1,98 +0,0 @@ -package bot - -import ( - "context" - "database/sql" - "os" - "os/signal" - "syscall" - - "github.com/nxtgo/arikawa/v3/api/cmdroute" - "github.com/nxtgo/arikawa/v3/gateway" - "github.com/nxtgo/arikawa/v3/state" - "go.fm/internal/bot/bot/events" - "go.fm/internal/bot/commands" - "go.fm/internal/bot/lastfm" - "go.fm/internal/bot/logging" - "go.fm/internal/bot/persistence/sqlc" -) - -// package for bot stuff idk. -// functions that open connections should also return -// a function to close that connection :pray: - -type Bot struct { - State *state.State - Query *sqlc.Queries - Database *sql.DB - LastFM *lastfm.Services - Cache *lastfm.Cache - Registry *events.Registry -} - -func NewBot(ctx context.Context, token, dbPath, lastfmKey string) (*Bot, error) { - logging.Info("starting bot...") - - // database - q, db, err := sqlc.Start(ctx, dbPath) - if err != nil { - return nil, err - } - - // lastfm - cache := lastfm.NewCache() - lastfm := lastfm.NewServices(lastfmKey, cache) - - // bot state - st := state.New("Bot " + token) - st.AddIntents(gateway.IntentGuilds) - st.AddIntents(gateway.IntentGuildMessages) - - // events - reg := events.NewRegistry() - events.RegisterDefaultEvents(reg) - - // commands - r := cmdroute.NewRouter() - commands.RegisterCommands(r, st, q, cache) - if err := commands.Sync(st); err != nil { - logging.Fatalf("failed syncing commands: %v", err) - } - st.AddInteractionHandler(r) - - return &Bot{ - State: st, - Query: q, - Database: db, - LastFM: lastfm, - Cache: cache, - Registry: reg, - }, nil -} - -func (b *Bot) Run(ctx context.Context) error { - // automatize ts pls - b.State.AddHandler(func(e *gateway.ReadyEvent) { - b.Registry.Dispatch(events.TypeName(e), e) - }) - - if err := b.State.Open(ctx); err != nil { - return err - } - defer b.State.Close() - defer b.Database.Close() - defer b.Cache.Close() - - logging.Info("bot is running") - - stop := make(chan os.Signal, 1) - signal.Notify(stop, os.Interrupt, syscall.SIGTERM) - - select { - case <-ctx.Done(): - case <-stop: - } - - logging.Info("shutting down") - return nil -} diff --git a/internal/bot/bot/events/events.go b/internal/bot/bot/events/events.go deleted file mode 100644 index 786a1d6..0000000 --- a/internal/bot/bot/events/events.go +++ /dev/null @@ -1,62 +0,0 @@ -package events - -import ( - "reflect" - - "github.com/nxtgo/arikawa/v3/gateway" - "go.fm/internal/bot/logging" -) - -func TypeName(evt any) string { - return reflect.TypeOf(evt).String() -} - -// Handler is a generic event handler signature. -type Handler func(evt any) - -// Registry holds all event handlers by event type. -type Registry struct { - Handlers map[string][]Handler - logger func(name string) *logging.Logger -} - -// NewRegistry creates a new event registry. -func NewRegistry() *Registry { - return &Registry{ - Handlers: make(map[string][]Handler), - logger: func(name string) *logging.Logger { - return logging.WithFields(logging.F{"event_name": name}) - }, - } -} - -// On registers a handler for a given event type. -func (r *Registry) On(eventName string, h Handler) { - r.Handlers[eventName] = append(r.Handlers[eventName], h) -} - -// Dispatch executes all handlers for a given event. -func (r *Registry) Dispatch(eventName string, evt any) { - log := r.logger(eventName) - for _, h := range r.Handlers[eventName] { - func() { - defer func() { - if rec := recover(); rec != nil { - log.Errorw("panic in event handler", logging.F{"recover": rec}) - } - }() - h(evt) - }() - } -} - -func RegisterDefaultEvents(r *Registry) { - r.On(TypeName(&gateway.ReadyEvent{}), func(evt any) { - if c, ok := evt.(*gateway.ReadyEvent); ok { - r.logger("ready").Infow("client ready", logging.F{ - "tag": c.User.Tag(), - "guilds": len(c.Guilds), - }) - } - }) -} diff --git a/internal/bot/commands.go b/internal/bot/commands.go new file mode 100644 index 0000000..646b487 --- /dev/null +++ b/internal/bot/commands.go @@ -0,0 +1,63 @@ +package bot + +import ( + "context" + "log/slog" + "time" + + "github.com/disgoorg/disgo/discord" + "github.com/disgoorg/disgo/events" +) + +type CommandContext struct { + Context context.Context + Event *events.ApplicationCommandInteractionCreate + Bot *Bot +} + +type CommandHandler func(*CommandContext) error + +var ( + allCommands []discord.ApplicationCommandCreate + registry = map[string]CommandHandler{} +) + +func Register(meta discord.ApplicationCommandCreate, handler CommandHandler) { + slog.Info("registered command", "name", meta.CommandName()) + allCommands = append(allCommands, meta) + registry[meta.CommandName()] = handler +} + +func Commands() []discord.ApplicationCommandCreate { + return allCommands +} + +func Dispatcher() func(*events.ApplicationCommandInteractionCreate) { + return func(event *events.ApplicationCommandInteractionCreate) { + data := event.SlashCommandInteractionData() + handler, ok := registry[data.CommandName()] + if !ok { + _ = event.CreateMessage(discord.NewMessageCreateBuilder(). + SetContent("unknown command"). + SetEphemeral(true). + Build()) + return + } + + start := time.Now() + ctx := &CommandContext{ + Context: context.Background(), + Event: event, + } + + if err := handler(ctx); err != nil { + slog.Error("command failed", "name", data.CommandName(), "err", err) + _ = event.CreateMessage(discord.NewMessageCreateBuilder(). + SetContent("error: " + err.Error()). + SetEphemeral(true). + Build()) + } + + slog.Info("executed command", "name", data.CommandName(), "time", time.Since(start)) + } +} diff --git a/internal/bot/commands/chart/canvas.go b/internal/bot/commands/chart/canvas.go deleted file mode 100644 index 34a37fa..0000000 --- a/internal/bot/commands/chart/canvas.go +++ /dev/null @@ -1,48 +0,0 @@ -package chart - -import ( - "image" - "image/color" - "image/draw" - - "go.fm/internal/bot/image/font" - "go.fm/internal/bot/image/imgio" -) - -func renderChart(entries []Entry, grid int) ([]byte, error) { - interRegular := font.LoadFont("assets/font/Inter_24pt-Regular.ttf") - interBold := font.LoadFont("assets/font/Inter_24pt-Bold.ttf") - - labelSize, subSize := 20.0, 16.0 - if grid >= 10 { - labelSize, subSize = 12, 10 - } - - labelFace := interBold.Face(labelSize, 72) - subFace := interRegular.Face(subSize, 72) - labelAscent, subAscent := labelFace.Metrics().Ascent.Ceil(), subFace.Metrics().Ascent.Ceil() - - cell := entries[0].Image.Bounds() - canvas := image.NewRGBA(image.Rect(0, 0, cell.Dx()*grid, cell.Dy()*grid)) - - gradient, err := imgio.Open("assets/img/chart_gradient.png") - if err != nil { - return nil, err - } - - for i, entry := range entries { - x, y := (i%grid)*cell.Dx(), (i/grid)*cell.Dy() - rect := image.Rect(x, y, x+cell.Dx(), y+cell.Dy()) - - draw.Draw(canvas, rect, entry.Image, image.Point{}, draw.Over) - draw.Draw(canvas, rect, gradient, image.Point{}, draw.Over) - - font.DrawText(canvas, x+8, y+labelAscent+8, entry.Name, color.White, labelFace) - if entry.Artist != "" { - font.DrawText(canvas, x+8, y+labelAscent+subAscent+12, - entry.Artist, color.RGBA{170, 170, 170, 255}, subFace) - } - } - - return imgio.Encode(canvas, imgio.PNGEncoder()) -} diff --git a/internal/bot/commands/chart/chart.go b/internal/bot/commands/chart/chart.go deleted file mode 100644 index 09c1241..0000000 --- a/internal/bot/commands/chart/chart.go +++ /dev/null @@ -1,238 +0,0 @@ -package chart - -import ( - "bytes" - "errors" - "fmt" - "image" - "net/http" - "sync" - "time" - - "github.com/nxtgo/arikawa/v3/api" - "github.com/nxtgo/arikawa/v3/discord" - "github.com/nxtgo/arikawa/v3/utils/sendpart" - "go.fm/internal/bot/commands" - "go.fm/internal/bot/discord/components" - "go.fm/internal/bot/discord/reply" - "go.fm/internal/bot/image/imgio" - "go.fm/internal/bot/image/transform" - "go.fm/internal/bot/lastfm" -) - -var ( - maxGridSize = 10 - minGridSize = 3 - defaultPeriod = "overall" - maxConcurrent = 8 - - httpClient = &http.Client{ - Transport: &http.Transport{ - MaxIdleConns: 100, - MaxIdleConnsPerHost: 10, - IdleConnTimeout: 90 * time.Second, - }, - Timeout: 10 * time.Second, - } -) - -type Entry struct { - Image image.Image - Name string - Artist string -} - -var data = api.CreateCommandData{ - Name: "chart", - Description: "Your top artists/tracks/albums but with images", - Options: discord.CommandOptions{ - &discord.StringOption{ - OptionName: "type", - Description: "artist, track or album", - Choices: []discord.StringChoice{ - {Name: "artist", Value: "artist"}, - {Name: "track", Value: "track"}, - {Name: "album", Value: "album"}, - }, - Required: true, - }, - discord.NewIntegerOption("grid-size", - fmt.Sprintf("grid size (NxN) (min: %d, max: %d, default: min)", minGridSize, maxGridSize), false), - &discord.StringOption{ - OptionName: "period", - Description: fmt.Sprintf("overall, 7day, 1month, 3month, 6month or 12month (default: %s)", defaultPeriod), - Choices: []discord.StringChoice{ - {Name: "overall", Value: "overall"}, - {Name: "7day", Value: "7day"}, - {Name: "1month", Value: "1month"}, - {Name: "3month", Value: "3month"}, - {Name: "6month", Value: "6month"}, - {Name: "12month", Value: "12month"}, - }, - }, - discord.NewStringOption("user", "user to fetch chart for", false), - }, -} - -var options struct { - User *string `discord:"user"` - Type string `discord:"type"` - GridSize *int `discord:"grid-size"` - Period *string `discord:"period"` -} - -func handler(c *commands.CommandContext) error { - return c.Reply.AutoDefer(func(edit *reply.EditBuilder) error { - if err := c.Data.Options.Unmarshal(&options); err != nil { - return err - } - - grid := minGridSize - if options.GridSize != nil { - grid = *options.GridSize - } - - period := defaultPeriod - if options.Period != nil { - period = *options.Period - } - - user, err := c.GetUserOrFallback() - if err != nil { - return err - } - - entries, err := fetchChartEntries(c, options.Type, user, grid, period) - if err != nil { - return err - } - if len(entries) == 0 { - return errors.New("no entries found") - } - - img, err := renderChart(entries, grid) - if err != nil { - return err - } - - component := components.NewContainer(0, - components.NewTextDisplayf("# %s %s chart for %s", period, options.Type, user), - components.NewMediaGallery( - components.NewMediaGalleryItem("attachment://chart.png"), - ), - ) - - _, err = edit. - ComponentsV2(component). - File(sendpart.File{Name: "chart.png", Reader: bytes.NewReader(img)}). - Send() - return err - }) -} - -func fetchChartEntries(c *commands.CommandContext, kind, user string, grid int, period string) ([]Entry, error) { - limit := grid * grid - - var urls, names, artists []string - switch kind { - case "artist": - res, err := c.Last.User.GetTopArtists(lastfm.P{"user": user, "limit": limit, "period": period}) - if err != nil { - return nil, err - } - urls, names = make([]string, len(res.Artists)), make([]string, len(res.Artists)) - for i, a := range res.Artists { - if u, _ := a.GetDeezerImage(); u != "" { - urls[i] = u - } - names[i] = a.Name - } - case "track": - res, err := c.Last.User.GetTopTracks(lastfm.P{"user": user, "limit": limit, "period": period}) - if err != nil { - return nil, err - } - urls, names, artists = make([]string, len(res.Tracks)), make([]string, len(res.Tracks)), make([]string, len(res.Tracks)) - for i, t := range res.Tracks { - if len(t.Images) > 0 { - urls[i] = t.Images[len(t.Images)-1].URL - } - names[i], artists[i] = t.Name, t.Artist.Name - } - case "album": - res, err := c.Last.User.GetTopAlbums(lastfm.P{"user": user, "limit": limit, "period": period}) - if err != nil { - return nil, err - } - urls, names, artists = make([]string, len(res.Albums)), make([]string, len(res.Albums)), make([]string, len(res.Albums)) - for i, a := range res.Albums { - if len(a.Images) > 0 { - urls[i] = a.Images[len(a.Images)-1].URL - } - names[i], artists[i] = a.Name, a.Artist.Name - } - } - - cellSize := 300 - if grid >= 10 { - cellSize = 100 - } - - broken, _ := imgio.Open("assets/img/broken.png") - broken = transform.Resize(broken, cellSize, cellSize, transform.NearestNeighbor) - - fetched := fetchEntries(urls) - entries := make([]Entry, len(fetched)) - for i, e := range fetched { - if e.Image == nil { - e.Image = broken - } - e.Image = transform.Resize(e.Image, cellSize, cellSize, transform.NearestNeighbor) - e.Name = names[i] - if artists != nil { - e.Artist = artists[i] - } - entries[i] = e - } - return entries, nil -} - -func fetchEntries(urls []string) []Entry { - entries := make([]Entry, len(urls)) - var wg sync.WaitGroup - sem := make(chan struct{}, maxConcurrent) - - for i, url := range urls { - i, url := i, url - wg.Go(func() { - sem <- struct{}{} - defer func() { <-sem }() - - entries[i].Image = fetchImage(url) - }) - } - - wg.Wait() - return entries -} - -func fetchImage(url string) image.Image { - if url == "" { - return nil - } - resp, err := httpClient.Get(url) - if err != nil { - return nil - } - defer resp.Body.Close() - - img, _, err := image.Decode(resp.Body) - if err != nil { - return nil - } - return img -} - -func init() { - commands.Register(data, handler) -} diff --git a/internal/bot/commands/commands.go b/internal/bot/commands/commands.go deleted file mode 100644 index 3fe0575..0000000 --- a/internal/bot/commands/commands.go +++ /dev/null @@ -1,70 +0,0 @@ -package commands - -import ( - "context" - "os" - "time" - - "github.com/nxtgo/arikawa/v3/api" - "github.com/nxtgo/arikawa/v3/api/cmdroute" - "github.com/nxtgo/arikawa/v3/state" - "go.fm/internal/bot/discord/reply" - "go.fm/internal/bot/lastfm" - "go.fm/internal/bot/logging" - "go.fm/internal/bot/persistence/sqlc" -) - -var allCommands = []api.CreateCommandData{} -var registry = map[string]CommandHandler{} - -func Register(meta api.CreateCommandData, handler CommandHandler) { - logging.Debugf("registered command %s", meta.Name) - - allCommands = append(allCommands, meta) - registry[meta.Name] = handler -} - -func RegisterCommands(r *cmdroute.Router, st *state.State, q *sqlc.Queries, c *lastfm.Cache) { - lastFMApiKey := os.Getenv("LASTFM_API_KEY") - if lastFMApiKey == "" { - logging.Fatal("missing LASTFM_API_KEY env") - } - - for name, handler := range registry { - h := handler - r.AddFunc(name, func(ctx context.Context, data cmdroute.CommandData) *api.InteractionResponseData { - commandContext := &CommandContext{ - // command mandatory stuff - Context: ctx, - Data: data, - State: st, - - // reply helper - Reply: reply.New(st, data.Event), - - // database - Query: q, - - // last.fm stuff - Last: lastfm.NewServices(lastFMApiKey, c), - Cache: c, - } - - // debugging purposes - start := time.Now() - err := h(commandContext) - logging.Debugw("executed command %s", logging.F{"time": time.Since(start)}, name) - - if err != nil { - commandContext.Reply.QuickEmbed(reply.ErrorEmbed(err.Error())) - } - - return nil - }) - } -} - -func Sync(st *state.State) error { - defer logging.Infow("synced commands", logging.F{"count": len(allCommands)}) - return cmdroute.OverwriteCommands(st, allCommands) -} diff --git a/internal/bot/commands/fm/canvas.go b/internal/bot/commands/fm/canvas.go deleted file mode 100644 index 9cdfefb..0000000 --- a/internal/bot/commands/fm/canvas.go +++ /dev/null @@ -1,112 +0,0 @@ -package fm - -import ( - "bytes" - "image" - "image/color" - "image/draw" - - "github.com/nxtgo/arikawa/v3/utils/sendpart" - "go.fm/internal/bot/discord/reply" - "go.fm/internal/bot/image/blur" - "go.fm/internal/bot/image/font" - "go.fm/internal/bot/image/imgio" - "go.fm/internal/bot/image/mask" - "go.fm/internal/bot/image/transform" - "go.fm/internal/bot/lastfm" -) - -var ( - fmWidth = 555 - fmHeight = 147 - - titleX = 20 - titleY = 26 - artistX = 20 - artistY = 84 - - coverY = 0 - coverWidth = 313 - coverHeight = 147 - textSampleW = 400 - titleSampleH = 50 - artistSampleH = 30 -) - -func renderCanvas(edit *reply.EditBuilder, track *lastfm.RecentTrack) error { - interBold := font.LoadFont("assets/font/Inter_24pt-Bold.ttf") - titleFace := interBold.Face(48, 72) - artistFace := interBold.Face(24, 72) - - canvas := image.NewNRGBA(image.Rect(0, 0, fmWidth, fmHeight)) - - coverImage, err := imgio.FromUrl(track.GetLargestImage().URL) - if err != nil { - return err - } - - // blur background - blurredCover := transform.Resize(coverImage, fmWidth, fmHeight, transform.Gaussian) - blurredCover = blur.Gaussian(blurredCover, 30) - draw.Draw(canvas, canvas.Bounds(), blurredCover, image.Point{}, draw.Over) - - // mask - sharpCover := transform.Resize(coverImage, coverWidth, coverHeight, transform.Gaussian) - gradientMask := mask.GradientHorizontal(coverWidth, coverHeight, true) - coverEndX := fmWidth - coverWidth - draw.DrawMask(canvas, - image.Rect(coverEndX, coverY, coverEndX+coverWidth, coverY+coverHeight), - sharpCover, - image.Point{}, - gradientMask, - image.Point{}, - draw.Over, - ) - - // text - titleColor := getContrastColor(canvas, titleX, titleY, textSampleW, titleSampleH) - artistColor := getContrastColor(canvas, artistX, artistY, textSampleW, artistSampleH) - - titleAscent := titleFace.Metrics().Ascent.Ceil() - font.DrawText(canvas, titleX, titleY+titleAscent, track.Name, titleColor, titleFace) - - artistAscent := artistFace.Metrics().Ascent.Ceil() - font.DrawText(canvas, artistX, artistY+artistAscent, track.Artist.Name, artistColor, artistFace) - - // rounded corners - roundedMask := mask.Rounded(fmWidth, fmHeight, 20) - final := image.NewNRGBA(canvas.Bounds()) - draw.DrawMask(final, final.Bounds(), canvas, image.Point{}, roundedMask, image.Point{}, draw.Over) - - result, err := imgio.Encode(final, imgio.PNGEncoder()) - if err != nil { - return err - } - _, err = edit.File(sendpart.File{Name: "profile.png", Reader: bytes.NewReader(result)}).Send() - return err -} - -func getContrastColor(img image.Image, x, y, w, h int) color.Color { - var total float64 - count := 0 - - bounds := img.Bounds() - for iy := y; iy < y+h && iy < bounds.Max.Y; iy++ { - for ix := x; ix < x+w && ix < bounds.Max.X; ix++ { - r, g, b, _ := img.At(ix, iy).RGBA() - lum := 0.299*float64(r>>8) + 0.587*float64(g>>8) + 0.114*float64(b>>8) - total += lum - count++ - } - } - - if count == 0 { - return color.White - } - - avgLum := total / float64(count) - if avgLum > 128 { - return color.Black - } - return color.White -} diff --git a/internal/bot/commands/fm/fm.go b/internal/bot/commands/fm/fm.go deleted file mode 100644 index 4356866..0000000 --- a/internal/bot/commands/fm/fm.go +++ /dev/null @@ -1,89 +0,0 @@ -package fm - -import ( - "time" - - "github.com/nxtgo/arikawa/v3/api" - "github.com/nxtgo/arikawa/v3/discord" - "go.fm/internal/bot/commands" - "go.fm/internal/bot/discord/components" - "go.fm/internal/bot/discord/reply" - "go.fm/internal/bot/image/colors" - "go.fm/internal/bot/lastfm" -) - -var data = api.CreateCommandData{ - Name: "fm", - Description: "display your current track or another user's", - Options: discord.CommandOptions{ - discord.NewStringOption("user", "user to display track from", false), - discord.NewBooleanOption("canvas", "display as an image", false), - }, -} - -var options struct { - User *string `discord:"user"` - Canvas *bool `discord:"canvas"` -} - -func handler(c *commands.CommandContext) error { - return c.Reply.AutoDefer(func(edit *reply.EditBuilder) error { - if err := c.Data.Options.Unmarshal(&options); err != nil { - return err - } - - username, err := c.GetUserOrFallback() - if err != nil { - return err - } - - res, err := c.Last.User.GetRecentTracks(lastfm.P{"user": username, "limit": 1}) - if err != nil { - return err - } - - var text *components.TextDisplay - - lastTrack := res.Tracks[0] - - if options.Canvas != nil && *options.Canvas { - return renderCanvas(edit, &lastTrack) - } - - if lastTrack.NowPlaying == "true" { - text = components.NewTextDisplayf("-# *Current track for %s*", res.User) - } else { - playtime, err := lastTrack.GetPlayTime() - if err != nil { - playtime = time.Now() - } - - text = components.NewTextDisplayf("-# *Last track for %s, scrobbled at %s*", res.User, playtime.Format(time.Kitchen)) - } - - largeThumbnail := lastTrack.GetLargestImage().URL - smallThumbnail := lastTrack.GetImageBySize("small").URL - color := 0x703487 - if dominantColor, err := colors.Dominant(smallThumbnail); err == nil { - color = dominantColor - } - - container := components.NewContainer(color, - components.NewSection( - components.NewTextDisplayf("# %s", lastTrack.Name), - components.NewTextDisplayf("**%s** **ยท** %s", lastTrack.Artist.Name, lastTrack.Album.Name), - text, - ).WithAccessory(components.NewThumbnail(largeThumbnail)), - components.NewActionRow( - components.NewButton(components.ButtonStyleLink, "Last.fm", nil).WithEmoji("1418269025959546943").WithURL(lastTrack.URL), - ), - ) - - _, err = edit.ComponentsV2(container).Send() - return err - }) -} - -func init() { - commands.Register(data, handler) -} diff --git a/internal/bot/commands/profile/canvas.go b/internal/bot/commands/profile/canvas.go deleted file mode 100644 index 006f09e..0000000 --- a/internal/bot/commands/profile/canvas.go +++ /dev/null @@ -1,56 +0,0 @@ -package profile - -import ( - "bytes" - "image" - "image/color" - - "github.com/nxtgo/arikawa/v3/utils/sendpart" - "go.fm/internal/bot/discord/reply" - "go.fm/internal/bot/image/imgio" - "go.fm/internal/bot/image/shapes" - "go.fm/internal/bot/lastfm" -) - -var ( - canvasWidth = 760 - canvasHeight = 260 - - bgColor = color.RGBA{211, 211, 211, 255} // #D3D3D3 - whiteColor = color.RGBA{255, 255, 255, 255} // #FFFFFF -) - -func renderCanvas(edit *reply.EditBuilder, user *lastfm.User) error { - canvas := image.NewRGBA(image.Rect(0, 0, canvasWidth, canvasHeight)) - - // Background - shapes.DrawRoundedRectangle(canvas, 0, 0, canvasWidth, canvasHeight, 30, bgColor) - - // Avatar panel - shapes.DrawRectangle(canvas, 28, 0, 165, 260, whiteColor) - shapes.DrawRoundedRectangle(canvas, 45, 20, 131, 131, 20, bgColor) - - // Reputation - shapes.DrawRoundedRectangle(canvas, 45, 168, 131, 41, 11, bgColor) - - // User flag - shapes.DrawRoundedRectangle(canvas, 208, 38, 50, 32, 11, whiteColor) - - // Server icon - shapes.DrawCircle(canvas, 234, 126, 17, bgColor) - - // Progress bar - shapes.DrawRoundedRectangle(canvas, 290, 110, 463, 33, 11, bgColor) - - // Badge panel - shapes.DrawRoundedRectangle(canvas, 278, 191, 463, 51, 11, bgColor) - - // Encode and send - result, err := imgio.Encode(canvas, imgio.PNGEncoder()) - if err != nil { - return err - } - - _, err = edit.File(sendpart.File{Name: "profile.png", Reader: bytes.NewReader(result)}).Send() - return err -} diff --git a/internal/bot/commands/profile/command.go b/internal/bot/commands/profile/command.go deleted file mode 100644 index d952b11..0000000 --- a/internal/bot/commands/profile/command.go +++ /dev/null @@ -1,68 +0,0 @@ -package profile - -import ( - "github.com/nxtgo/arikawa/v3/api" - "github.com/nxtgo/arikawa/v3/discord" - "go.fm/internal/bot/commands" - "go.fm/internal/bot/discord/components" - "go.fm/internal/bot/discord/reply" - "go.fm/internal/bot/lastfm" -) - -var data = api.CreateCommandData{ - Name: "profile", - Description: "display your last.fm profile or another user's", - Options: discord.CommandOptions{ - discord.NewStringOption("user", "user to display profile from", false), - discord.NewBooleanOption("canvas", "display as an image", false), - }, -} - -var options struct { - User *string `discord:"user"` - Canvas *bool `discord:"canvas"` -} - -func handler(c *commands.CommandContext) error { - return c.Reply.AutoDefer(func(edit *reply.EditBuilder) error { - if err := c.Data.Options.Unmarshal(&options); err != nil { - return err - } - - username, err := c.GetUserOrFallback() - if err != nil { - return err - } - - user, err := c.Last.User.GetInfo(lastfm.P{"user": username}) - if err != nil { - return err - } - - if options.Canvas != nil && *options.Canvas { - return renderCanvas(edit, user) - } - - topAlbumsRes, err := c.Last.User.GetTopAlbums(lastfm.P{"user": username}) - if err != nil { - return err - } - - container := components.NewContainer(703487, - components.NewSection( - components.NewTextDisplayf("# %s's profile", user.Name), - ).WithAccessory( - components.NewThumbnail(user.GetLargestImage().URL), - ), - components.NewTextDisplayf("you have %d top albums", topAlbumsRes.Total), - components.NewDivider(), - ) - - _, err = edit.ComponentsV2(container).Send() - return err - }) -} - -func init() { - commands.Register(data, handler) -} diff --git a/internal/bot/commands/setuser/command.go b/internal/bot/commands/setuser/command.go deleted file mode 100644 index b91af35..0000000 --- a/internal/bot/commands/setuser/command.go +++ /dev/null @@ -1,66 +0,0 @@ -package setuser - -import ( - "database/sql" - "errors" - "fmt" - - "github.com/nxtgo/arikawa/v3/api" - "github.com/nxtgo/arikawa/v3/discord" - "go.fm/internal/bot/commands" - "go.fm/internal/bot/discord/reply" - "go.fm/internal/bot/lastfm" - "go.fm/internal/bot/persistence/sqlc" -) - -var data = api.CreateCommandData{ - Name: "set-user", - Description: "set your last.fm username for go.fm", - Options: discord.CommandOptions{ - discord.NewStringOption("username", "your last.fm username", true), - }, -} - -var options struct { - Username string `discord:"username"` -} - -func handler(c *commands.CommandContext) error { - return c.Reply.AutoDefer(func(edit *reply.EditBuilder) error { - if err := c.Data.Options.Unmarshal(&options); err != nil { - return err - } - - if _, err := c.Last.User.GetInfo(lastfm.P{"user": options.Username}); err != nil { - return fmt.Errorf("user **%s** doesn't exist in last.fm", options.Username) - } - - userID := c.Data.Event.Member.User.ID - - user, err := c.Query.GetUserByLastFM(c.Context, options.Username) - if err != nil && !errors.Is(err, sql.ErrNoRows) { - return fmt.Errorf("failed to check username: %w", err) - } - if err == nil && user.UserID != userID.String() { - return fmt.Errorf("the username **%s** is already linked to another discord user", options.Username) - } - if err == nil && user.UserID == userID.String() { - return fmt.Errorf("your username is already set to **%s**", options.Username) - } - - err = c.Query.UpsertUser(c.Context, sqlc.UpsertUserParams{ - UserID: userID.String(), - LastfmUsername: options.Username, - }) - if err != nil { - return fmt.Errorf("failed to update username: %w", err) - } - - _, err = edit.Embed(reply.SuccessEmbed(fmt.Sprintf("updated your username to **%s**", options.Username))).Send() - return err - }) -} - -func init() { - commands.Register(data, handler) -} diff --git a/internal/bot/commands/stats/command.go b/internal/bot/commands/stats/command.go deleted file mode 100644 index 004a555..0000000 --- a/internal/bot/commands/stats/command.go +++ /dev/null @@ -1,53 +0,0 @@ -package stats - -import ( - "fmt" - "runtime" - "time" - - "github.com/nxtgo/arikawa/v3/api" - "go.fm/internal/bot/commands" - "go.fm/internal/bot/discord/components" -) - -var startTime = time.Now() - -var data = api.CreateCommandData{ - Name: "stats", - Description: "display bot's stats", -} - -func handler(c *commands.CommandContext) error { - var m runtime.MemStats - runtime.ReadMemStats(&m) - - uptime := time.Since(startTime).Round(time.Second) - - stats := fmt.Sprintf( - "**uptime:** %s\n"+ - "**goroutines:** %d\n"+ - "**memory:** %.2f mb\n"+ - "**heap:** %.2f mb\n"+ - "**gc runs:** %d\n"+ - "**go version:** %s\n"+ - "**platform:** %s/%s", - uptime, - runtime.NumGoroutine(), - float64(m.Alloc)/(1024*1024), - float64(m.HeapAlloc)/(1024*1024), - m.NumGC, - runtime.Version(), - runtime.GOOS, - runtime.GOARCH, - ) - - container := components.NewContainer(703487, - components.NewTextDisplay(stats), - ) - - return c.Reply.Reply().ComponentsV2(container).Send() -} - -func init() { - commands.Register(data, handler) -} diff --git a/internal/bot/commands/types.go b/internal/bot/commands/types.go deleted file mode 100644 index 19e0a23..0000000 --- a/internal/bot/commands/types.go +++ /dev/null @@ -1,58 +0,0 @@ -package commands - -import ( - "context" - "strings" - - "github.com/nxtgo/arikawa/v3/api/cmdroute" - "github.com/nxtgo/arikawa/v3/discord" - "github.com/nxtgo/arikawa/v3/state" - "go.fm/internal/bot/discord/reply" - "go.fm/internal/bot/lastfm" - "go.fm/internal/bot/persistence/sqlc" -) - -type CommandContext struct { - Context context.Context - Data cmdroute.CommandData - State *state.State - Reply *reply.ResponseManager - Query *sqlc.Queries - Last *lastfm.Services - Cache *lastfm.Cache -} - -type CommandHandler func(c *CommandContext) error - -func (ctx *CommandContext) GetUserOrFallback() (string, error) { - optionData := ctx.Data.Options.Find("user") - option := optionData.String() - - if option == "" { - user, err := ctx.Query.GetUserByID(ctx.Context, ctx.Data.Event.Member.User.ID.String()) - if err != nil { - return "", err - } - return user.LastfmUsername, nil - } - - userOption := normalizeUserInput(option) - - if _, err := discord.ParseSnowflake(userOption); err == nil { - user, err := ctx.Query.GetUserByID(ctx.Context, userOption) - if err != nil { - return "", err - } - return user.LastfmUsername, nil - } - - return userOption, nil -} - -func normalizeUserInput(input string) string { - if strings.HasPrefix(input, "<@") && strings.HasSuffix(input, ">") { - trimmed := strings.TrimSuffix(strings.TrimPrefix(input, "<@"), ">") - return strings.TrimPrefix(trimmed, "!") - } - return input -} diff --git a/internal/bot/commands/update/update.go b/internal/bot/commands/update/update.go deleted file mode 100644 index d9a16fb..0000000 --- a/internal/bot/commands/update/update.go +++ /dev/null @@ -1,107 +0,0 @@ -package update - -import ( - "fmt" - "slices" - "strings" - - "github.com/nxtgo/arikawa/v3/api" - "github.com/nxtgo/arikawa/v3/discord" - "go.fm/internal/bot/commands" - "go.fm/internal/bot/discord/reply" - "go.fm/internal/bot/lastfm" -) - -var validDataTypes = []string{ - "profile", "getinfo", - "topalbums", - "topartists", - "toptracks", - "all", -} - -var data = api.CreateCommandData{ - Name: "update", - Description: "Update your Last.fm data or another user's", - Options: discord.CommandOptions{ - discord.NewStringOption("data", - "comma-separated list of data to update", - true, - ), - discord.NewStringOption("user", "user to update data for", false), - }, -} - -var options struct { - User *string `discord:"user"` - Data string `discord:"data"` -} - -func handler(c *commands.CommandContext) error { - return c.Reply.AutoDefer(func(edit *reply.EditBuilder) error { - if err := c.Data.Options.Unmarshal(&options); err != nil { - return err - } - - username, err := c.GetUserOrFallback() - if err != nil { - return err - } - - dataTypes := strings.Split(options.Data, ",") - for i := range dataTypes { - dataTypes[i] = strings.TrimSpace(strings.ToLower(dataTypes[i])) - } - - for _, t := range dataTypes { - if !slices.Contains(validDataTypes, t) { - return fmt.Errorf("`%s` is not a valid data type. valid options: %s", t, strings.Join(validDataTypes, ", ")) - } - } - - userParams := lastfm.P{"user": username} - updated := make([]string, 0, len(dataTypes)) - - for _, t := range dataTypes { - switch t { - case "profile", "getinfo": - update(c, "user.getinfo", c.Last.User.GetInfo, userParams) - updated = append(updated, "profile") - - case "topalbums": - update(c, "user.gettopalbums", c.Last.User.GetTopAlbums, userParams) - updated = append(updated, "topalbums") - - case "topartists": - update(c, "user.gettopartists", c.Last.User.GetTopArtists, userParams) - updated = append(updated, "topartists") - - case "toptracks": - update(c, "user.gettoptracks", c.Last.User.GetTopTracks, userParams) - updated = append(updated, "toptracks") - - case "all": - update(c, "user.getinfo", c.Last.User.GetInfo, userParams) - update(c, "user.gettopalbums", c.Last.User.GetTopAlbums, userParams) - update(c, "user.gettopartists", c.Last.User.GetTopArtists, userParams) - update(c, "user.gettoptracks", c.Last.User.GetTopTracks, userParams) - updated = append(updated, "all") - } - } - - embed := reply.SuccessEmbed(fmt.Sprintf("updated the following data for `%s`:\n\\- %s", - username, - strings.Join(updated, "\n\\- "))) - _, err = edit.Embed(embed).Send() - return err - }) -} - -func update[T any](c *commands.CommandContext, key string, fn func(lastfm.P) (*T, error), params lastfm.P) { - c.Cache.User.Delete(lastfm.GenerateCacheKey(key, params)) - go fn(params) -} - -func init() { - commands.Register(data, handler) -} diff --git a/internal/bot/discord/components/components.go b/internal/bot/discord/components/components.go deleted file mode 100644 index 9736c1b..0000000 --- a/internal/bot/discord/components/components.go +++ /dev/null @@ -1,180 +0,0 @@ -package components - -import "fmt" - -type ComponentType int -type ButtonStyle int - -const ( - TypeActionRow ComponentType = 1 - TypeButton ComponentType = 2 - TypeSection ComponentType = 9 - TypeTextDisplay ComponentType = 10 - TypeThumbnail ComponentType = 11 - TypeMediaGallery ComponentType = 12 - TypeDivider ComponentType = 14 - TypeContainer ComponentType = 17 -) - -const ( - ButtonStylePrimary ButtonStyle = iota + 1 - ButtonStyleSecondary - ButtonStyleSuccess - ButtonStyleDanger - ButtonStyleLink -) - -type Component interface { - componentType() ComponentType -} - -type ContainerComponent interface { - Component - isContainer() -} - -type Container struct { - Type ComponentType `json:"type"` - AccentColor int `json:"accent_color,omitempty"` - Components []Component `json:"components"` -} - -func (c *Container) componentType() ComponentType { return TypeContainer } -func (c *Container) isContainer() {} - -type Section struct { - Type ComponentType `json:"type"` - Components []Component `json:"components"` - Accessory Component `json:"accessory,omitempty"` -} - -func (s *Section) componentType() ComponentType { return TypeSection } -func (s *Section) isContainer() {} - -type TextDisplay struct { - Type ComponentType `json:"type"` - Content string `json:"content"` -} - -func (t *TextDisplay) componentType() ComponentType { return TypeTextDisplay } - -type Thumbnail struct { - Type ComponentType `json:"type"` - Media Media `json:"media"` -} - -func (t *Thumbnail) componentType() ComponentType { return TypeThumbnail } - -type Media struct { - URL string `json:"url"` -} - -type Divider struct { - Type ComponentType `json:"type"` - Divider bool `json:"divider"` -} - -func (d *Divider) componentType() ComponentType { return TypeDivider } - -type ActionRow struct { - Type ComponentType `json:"type"` - Components []Component `json:"components"` -} - -func (a *ActionRow) componentType() ComponentType { return TypeActionRow } - -type Button struct { - Type ComponentType `json:"type"` - Style ButtonStyle `json:"style"` - Label string `json:"label"` - CustomID *string `json:"custom_id,omitempty"` - Emoji *Emoji `json:"emoji,omitempty"` - URL *string `json:"url,omitempty"` -} - -func (b *Button) componentType() ComponentType { return TypeButton } - -type Emoji struct { - Name *string `json:"name,omitempty"` - ID string `json:"id"` - Animated bool `json:"animated"` -} - -type MediaGallery struct { - Type ComponentType `json:"type"` - ID *int `json:"id,omitempty"` - Items []MediaGalleryItem `json:"items"` -} - -func (m *MediaGallery) componentType() ComponentType { return TypeMediaGallery } - -type MediaGalleryItem struct { - Media Media `json:"media"` - Description string `json:"description,omitempty"` - Spoiler bool `json:"spoiler,omitempty"` -} - -func NewContainer(accent int, children ...Component) *Container { - return &Container{Type: TypeContainer, AccentColor: accent, Components: children} -} - -func NewSection(children ...Component) *Section { - return &Section{Type: TypeSection, Components: children} -} - -func (s *Section) WithAccessory(accessory Component) *Section { - s.Accessory = accessory - return s -} - -func NewTextDisplay(content string) *TextDisplay { - return &TextDisplay{Type: TypeTextDisplay, Content: content} -} - -func NewTextDisplayf(content string, args ...any) *TextDisplay { - return &TextDisplay{Type: TypeTextDisplay, Content: fmt.Sprintf(content, args...)} -} - -func NewThumbnail(url string) *Thumbnail { - return &Thumbnail{Type: TypeThumbnail, Media: Media{URL: url}} -} - -func NewDivider() *Divider { - return &Divider{Type: TypeDivider, Divider: true} -} - -func NewActionRow(children ...Component) *ActionRow { - return &ActionRow{Type: TypeActionRow, Components: children} -} - -func NewButton(style ButtonStyle, label string, customID *string) *Button { - return &Button{Type: TypeButton, Style: style, Label: label, CustomID: customID} -} - -func (b *Button) WithURL(url string) *Button { - b.URL = &url - return b -} - -func (b *Button) WithEmoji(id string) *Button { - b.Emoji = &Emoji{ID: id} - return b -} - -func NewMediaGallery(items ...MediaGalleryItem) *MediaGallery { - return &MediaGallery{Type: TypeMediaGallery, Items: items} -} - -func NewMediaGalleryItem(url string) MediaGalleryItem { - return MediaGalleryItem{Media: Media{URL: url}} -} - -func (m MediaGalleryItem) WithDescription(desc string) MediaGalleryItem { - m.Description = desc - return m -} - -func (m MediaGalleryItem) WithSpoiler() MediaGalleryItem { - m.Spoiler = true - return m -} diff --git a/internal/bot/discord/emojis/emojis.go b/internal/bot/discord/emojis/emojis.go deleted file mode 100644 index 3578d58..0000000 --- a/internal/bot/discord/emojis/emojis.go +++ /dev/null @@ -1,40 +0,0 @@ -package emojis - -type Emoji struct { - ID string - Name string - Animated bool -} - -func (e Emoji) String() string { - if e.Animated { - return "" - } - return "<:" + e.Name + ":" + e.ID + ">" -} - -var ( - EmojiCrown = Emoji{ID: "1418014546462773348", Name: "crown", Animated: true} - EmojiQuestionMark = Emoji{ID: "1418015866695581708", Name: "question", Animated: true} - EmojiChat = Emoji{ID: "1418013205992575116", Name: "chat", Animated: true} - EmojiNote = Emoji{ID: "1418015996651765770", Name: "note", Animated: true} - EmojiTop = Emoji{ID: "1418012513584283709", Name: "top", Animated: true} - EmojiStar = Emoji{ID: "1418011800724705310", Name: "star", Animated: true} - EmojiFire = Emoji{ID: "1418017773354881156", Name: "fire", Animated: true} - EmojiMic = Emoji{ID: "1418021307089551471", Name: "mic", Animated: true} - EmojiMic2 = Emoji{ID: "1418021315708981258", Name: "mic2", Animated: true} - EmojiPlay = Emoji{ID: "1418021326228295692", Name: "play", Animated: true} - EmojiAlbum = Emoji{ID: "1418021336110075944", Name: "album", Animated: true} - EmojiCalendar = Emoji{ID: "1418022075527860244", Name: "calendar", Animated: true} - - // status - EmojiCross = Emoji{ID: "1418016016642080848", Name: "cross", Animated: true} - EmojiCheck = Emoji{ID: "1418016005732565002", Name: "check", Animated: true} - EmojiUpdate = Emoji{ID: "1418014272415469578", Name: "update", Animated: true} - EmojiWarning = Emoji{ID: "1418013632293507204", Name: "warning", Animated: true} - - // rank - EmojiRankOne = Emoji{ID: "1418015934312087582", Name: "rank1", Animated: true} - EmojiRankTwo = Emoji{ID: "1418015960862036139", Name: "rank2", Animated: true} - EmojiRankThree = Emoji{ID: "1418015987562709022", Name: "rank3", Animated: true} -) diff --git a/internal/bot/discord/reply/defer.go b/internal/bot/discord/reply/defer.go deleted file mode 100644 index 14c1afa..0000000 --- a/internal/bot/discord/reply/defer.go +++ /dev/null @@ -1,16 +0,0 @@ -package reply - -import "github.com/nxtgo/arikawa/v3/api" - -type DeferredResponse struct { - manager *ResponseManager - err error -} - -func (dr *DeferredResponse) Error() error { - return dr.err -} - -func (dr *DeferredResponse) Edit() *EditBuilder { - return &EditBuilder{manager: dr.manager, data: api.EditInteractionResponseData{}} -} diff --git a/internal/bot/discord/reply/edit.go b/internal/bot/discord/reply/edit.go deleted file mode 100644 index e716fed..0000000 --- a/internal/bot/discord/reply/edit.go +++ /dev/null @@ -1,76 +0,0 @@ -package reply - -import ( - "fmt" - - "github.com/nxtgo/arikawa/v3/api" - "github.com/nxtgo/arikawa/v3/discord" - "github.com/nxtgo/arikawa/v3/utils/json" - "github.com/nxtgo/arikawa/v3/utils/json/option" - "github.com/nxtgo/arikawa/v3/utils/sendpart" -) - -type EditBuilder struct { - manager *ResponseManager - data api.EditInteractionResponseData -} - -func (eb *EditBuilder) Content(content string) *EditBuilder { - eb.data.Content = option.NewNullableString(content) - return eb -} - -func (eb *EditBuilder) Contentf(content string, args ...any) *EditBuilder { - eb.data.Content = option.NewNullableString(fmt.Sprintf(content, args...)) - return eb -} - -func (eb *EditBuilder) File(file sendpart.File) *EditBuilder { - eb.data.Files = append(eb.data.Files, file) - return eb -} - -func (eb *EditBuilder) Embed(embed discord.Embed) *EditBuilder { - eb.data.Embeds = &[]discord.Embed{embed} - return eb -} - -func (eb *EditBuilder) ComponentsV2(components any) *EditBuilder { - eb.Clear() - eb.Flags(1 << 15) - raw, _ := json.Marshal(components) - - comp, err := discord.ParseComponent(raw) - if err != nil { - panic(err) - } - - cc := discord.ContainerComponents{comp.(discord.ContainerComponent)} - eb.data.Components = &cc - - return eb -} - -func (eb *EditBuilder) Components(components discord.ContainerComponents) *EditBuilder { - eb.data.Components = &components - return eb -} - -func (eb *EditBuilder) Flags(flags ...discord.MessageFlags) *EditBuilder { - for _, flag := range flags { - eb.data.Flags |= flag - } - return eb -} - -func (eb *EditBuilder) Clear() *EditBuilder { - eb.data.Content = nil - eb.data.Embeds = nil - eb.data.Components = nil - - return eb -} - -func (eb *EditBuilder) Send() (*discord.Message, error) { - return eb.manager.state.EditInteractionResponse(eb.manager.appID, eb.manager.token, eb.data) -} diff --git a/internal/bot/discord/reply/helpers.go b/internal/bot/discord/reply/helpers.go deleted file mode 100644 index d16430d..0000000 --- a/internal/bot/discord/reply/helpers.go +++ /dev/null @@ -1,48 +0,0 @@ -package reply - -import ( - "context" - "fmt" - "time" - - "github.com/nxtgo/arikawa/v3/discord" - "go.fm/internal/bot/discord/emojis" -) - -func ErrorEmbed(description string) discord.Embed { - return discord.Embed{ - Description: fmt.Sprintf("%s %s", emojis.EmojiCross, description), - Color: 0xFF0000, - } -} - -func SuccessEmbed(description string) discord.Embed { - return discord.Embed{ - Description: fmt.Sprintf("%s %s", emojis.EmojiCheck, description), - Color: 0x00FF00, - } -} - -func InfoEmbed(description string) discord.Embed { - return discord.Embed{ - Description: fmt.Sprintf("%s %s", emojis.EmojiChat, description), - Color: 0x0099FF, - } -} - -func WithTimeout(ctx context.Context, timeout time.Duration, fn func() error) error { - ctx, cancel := context.WithTimeout(ctx, timeout) - defer cancel() - - done := make(chan error, 1) - go func() { - done <- fn() - }() - - select { - case err := <-done: - return err - case <-ctx.Done(): - return ctx.Err() - } -} diff --git a/internal/bot/discord/reply/reply.go b/internal/bot/discord/reply/reply.go deleted file mode 100644 index 0933ed4..0000000 --- a/internal/bot/discord/reply/reply.go +++ /dev/null @@ -1,151 +0,0 @@ -package reply - -import ( - "encoding/json" - "fmt" - - "github.com/nxtgo/arikawa/v3/api" - "github.com/nxtgo/arikawa/v3/discord" - "github.com/nxtgo/arikawa/v3/state" - "github.com/nxtgo/arikawa/v3/utils/json/option" -) - -type ResponseManager struct { - state *state.State - interaction *discord.InteractionEvent - token string - appID discord.AppID - deferred bool - responded bool -} - -type ResponseBuilder struct { - manager *ResponseManager - data api.InteractionResponseData -} - -func New(s *state.State, i *discord.InteractionEvent) *ResponseManager { - return &ResponseManager{ - state: s, - interaction: i, - token: i.Token, - appID: i.AppID, - } -} - -func (rm *ResponseManager) Reply() *ResponseBuilder { - return &ResponseBuilder{ - manager: rm, - data: api.InteractionResponseData{}, - } -} - -func (rm *ResponseManager) Defer(flags ...discord.MessageFlags) *DeferredResponse { - if rm.responded { - return &DeferredResponse{manager: rm, err: fmt.Errorf("already responded")} - } - - var combinedFlags discord.MessageFlags - for _, flag := range flags { - combinedFlags |= flag - } - - response := api.InteractionResponse{ - Type: api.DeferredMessageInteractionWithSource, - Data: &api.InteractionResponseData{Flags: combinedFlags}, - } - - err := rm.state.RespondInteraction(rm.interaction.ID, rm.token, response) - rm.deferred = true - rm.responded = true - - return &DeferredResponse{manager: rm, err: err} -} - -func (rm *ResponseManager) Quick(content string, flags ...discord.MessageFlags) error { - builder := rm.Reply().Content(content) - if len(flags) > 0 { - builder = builder.Flags(flags...) - } - return builder.Send() -} - -func (rm *ResponseManager) QuickEmbed(embed discord.Embed, flags ...discord.MessageFlags) error { - builder := rm.Reply().Embed(embed) - if len(flags) > 0 { - builder = builder.Flags(flags...) - } - return builder.Send() -} - -func (rm *ResponseManager) AutoDefer(fn func(edit *EditBuilder) error, flags ...discord.MessageFlags) error { - deferred := rm.Defer(flags...) - if deferred.Error() != nil { - return deferred.Error() - } - - editBuilder := deferred.Edit().Flags(flags...) - err := fn(editBuilder) - - if err != nil { - _, err := editBuilder.Clear().Embed(ErrorEmbed(err.Error())).Send() - return err - } - - return nil -} - -func (rb *ResponseBuilder) Content(content string) *ResponseBuilder { - rb.data.Content = option.NewNullableString(content) - return rb -} - -func (rb *ResponseBuilder) Embed(embed discord.Embed) *ResponseBuilder { - rb.data.Embeds = &[]discord.Embed{embed} - return rb -} - -func (rb *ResponseBuilder) ComponentsV2(components any) *ResponseBuilder { - rb.Flags(1 << 15) - raw, _ := json.Marshal(components) - - comp, err := discord.ParseComponent(raw) - if err != nil { - panic(err) - } - - cc := discord.ContainerComponents{comp.(discord.ContainerComponent)} - rb.data.Components = &cc - - return rb -} - -func (rb *ResponseBuilder) Components(components discord.ContainerComponents) *ResponseBuilder { - rb.data.Components = &components - return rb -} - -func (rb *ResponseBuilder) Flags(flags ...discord.MessageFlags) *ResponseBuilder { - for _, flag := range flags { - rb.data.Flags |= flag - } - return rb -} - -func (rb *ResponseBuilder) Send() error { - if rb.manager.responded { - return fmt.Errorf("already responded") - } - - err := rb.manager.state.RespondInteraction( - rb.manager.interaction.ID, - rb.manager.token, - api.InteractionResponse{ - Type: api.MessageInteractionWithSource, - Data: &rb.data, - }, - ) - - rb.manager.responded = true - return err -} diff --git a/internal/bot/events.go b/internal/bot/events.go new file mode 100644 index 0000000..1d0162b --- /dev/null +++ b/internal/bot/events.go @@ -0,0 +1,14 @@ +package bot + +import ( + "context" + "log/slog" + + "github.com/disgoorg/disgo/events" + "github.com/disgoorg/disgo/gateway" +) + +func onReady(event *events.Ready) { + slog.Info("started client") + event.Client().SetPresence(context.Background(), gateway.WithCustomActivity("gwa gwa")) +} diff --git a/internal/bot/image/LICENSE b/internal/bot/image/LICENSE deleted file mode 100644 index ad22cb9..0000000 --- a/internal/bot/image/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016-2024 Anthony Simon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/internal/bot/image/README.md b/internal/bot/image/README.md deleted file mode 100644 index f54e823..0000000 --- a/internal/bot/image/README.md +++ /dev/null @@ -1,10 +0,0 @@ -this directory contains code adapted from [anthonynsimon/bild](https://github.com/anthonynsimon/bild), -which is licensed under the mit license. - -we use parts of the original codebase and, in some cases, -modify or simplify it to better fit our needs. -any changes from the upstream project are made with clarity -and maintainability in mind. - -selective changes have been made (naming, structure, and behavior) -to align with our project requirements. diff --git a/internal/bot/image/blend/blend.go b/internal/bot/image/blend/blend.go deleted file mode 100644 index 50c65ba..0000000 --- a/internal/bot/image/blend/blend.go +++ /dev/null @@ -1,380 +0,0 @@ -package blend - -import ( - "image" - "math" - - "go.fm/internal/bot/image/clone" - "go.fm/internal/bot/image/fcolor" - "go.fm/internal/bot/image/math/f64" - "go.fm/internal/bot/image/parallel" -) - -// Normal combines the foreground and background images by placing the foreground over the -// background using alpha compositing. The resulting image is then returned. -func Normal(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - return alphaComp(c0, c1) - }) - - return dst -} - -// Add combines the foreground and background images by adding their values and -// returns the resulting image. -func Add(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := c0.R + c1.R - g := c0.G + c1.G - b := c0.B + c1.B - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Multiply combines the foreground and background images by multiplying their -// normalized values and returns the resulting image. -func Multiply(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := c0.R * c1.R - g := c0.G * c1.G - b := c0.B * c1.B - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Overlay combines the foreground and background images by using Multiply when channel values < 0.5 -// or using Screen otherwise and returns the resulting image. -func Overlay(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - var r, g, b float64 - if c0.R > 0.5 { - r = 1 - (1-2*(c0.R-0.5))*(1-c1.R) - } else { - r = 2 * c0.R * c1.R - } - if c0.G > 0.5 { - g = 1 - (1-2*(c0.G-0.5))*(1-c1.G) - } else { - g = 2 * c0.G * c1.G - } - if c0.B > 0.5 { - b = 1 - (1-2*(c0.B-0.5))*(1-c1.B) - } else { - b = 2 * c0.B * c1.B - } - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// SoftLight combines the foreground and background images by using Pegtop's Soft Light formula and -// returns the resulting image. -func SoftLight(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := (1-2*c1.R)*c0.R*c0.R + 2*c0.R*c1.R - g := (1-2*c1.G)*c0.G*c0.G + 2*c0.G*c1.G - b := (1-2*c1.B)*c0.B*c0.B + 2*c0.B*c1.B - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - return dst -} - -// Screen combines the foreground and background images by inverting, multiplying and inverting the output. -// The result is a brighter image which is then returned. -func Screen(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := 1 - (1-c0.R)*(1-c1.R) - g := 1 - (1-c0.G)*(1-c1.G) - b := 1 - (1-c0.B)*(1-c1.B) - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Difference calculates the absolute difference between the foreground and background images and -// returns the resulting image. -func Difference(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := math.Abs(c0.R - c1.R) - g := math.Abs(c0.G - c1.G) - b := math.Abs(c0.B - c1.B) - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Divide combines the foreground and background images by diving the values from the background -// by the foreground and returns the resulting image. -func Divide(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - var r, g, b float64 - if c1.R == 0 { - r = 1 - } else { - r = c0.R / c1.R - } - if c1.G == 0 { - g = 1 - } else { - g = c0.G / c1.G - } - if c1.B == 0 { - b = 1 - } else { - b = c0.B / c1.B - } - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// ColorBurn combines the foreground and background images by dividing the inverted -// background by the foreground image and then inverting the result which is then returned. -func ColorBurn(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - var r, g, b float64 - if c1.R == 0 { - r = 0 - } else { - r = 1 - (1-c0.R)/c1.R - } - if c1.G == 0 { - g = 0 - } else { - g = 1 - (1-c0.G)/c1.G - } - if c1.B == 0 { - b = 0 - } else { - b = 1 - (1-c0.B)/c1.B - } - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Exclusion combines the foreground and background images applying the Exclusion blend mode and -// returns the resulting image. -func Exclusion(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := 0.5 - 2*(c0.R-0.5)*(c1.R-0.5) - g := 0.5 - 2*(c0.G-0.5)*(c1.G-0.5) - b := 0.5 - 2*(c0.B-0.5)*(c1.B-0.5) - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst - -} - -// ColorDodge combines the foreground and background images by dividing background by the -// inverted foreground image and returns the result. -func ColorDodge(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - var r, g, b float64 - if c1.R == 1 { - r = 1 - } else { - r = c0.R / (1 - c1.R) - } - if c1.G == 1 { - g = 1 - } else { - g = c0.G / (1 - c1.G) - } - if c1.B == 1 { - b = 1 - } else { - b = c0.B / (1 - c1.B) - } - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// LinearBurn combines the foreground and background images by adding them and -// then subtracting 255 (1.0 in normalized scale). The resulting image is then returned. -func LinearBurn(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := c0.R + c1.R - 1 - g := c0.G + c1.G - 1 - b := c0.B + c1.B - 1 - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// LinearLight combines the foreground and background images by a mix of a Linear Dodge and -// Linear Burn operation. The resulting image is then returned. -func LinearLight(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - var r, g, b float64 - if c1.R > 0.5 { - r = c0.R + 2*c1.R - 0.5 - } else { - r = c0.R + 2*c1.R - 1 - } - if c1.G > 0.5 { - g = c0.G + 2*c1.G - 0.5 - } else { - g = c0.G + 2*c1.G - 1 - } - if c1.B > 0.5 { - b = c0.B + 2*c1.B - 0.5 - } else { - b = c0.B + 2*c1.B - 1 - } - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Subtract combines the foreground and background images by Subtracting the background from the -// foreground. The result is then returned. -func Subtract(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := c1.R - c0.R - g := c1.G - c0.G - b := c1.B - c0.B - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Opacity returns an image which blends the two input images by the percentage provided. -// Percent must be of range 0 <= percent <= 1.0 -func Opacity(bg image.Image, fg image.Image, percent float64) *image.RGBA { - percent = f64.Clamp(percent, 0, 1.0) - - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := c1.R*percent + (1-percent)*c0.R - g := c1.G*percent + (1-percent)*c0.G - b := c1.B*percent + (1-percent)*c0.B - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Darken combines the foreground and background images by picking the darkest value per channel -// for each pixel. The result is then returned. -func Darken(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := math.Min(c0.R, c1.R) - g := math.Min(c0.G, c1.G) - b := math.Min(c0.B, c1.B) - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Lighten combines the foreground and background images by picking the brightest value per channel -// for each pixel. The result is then returned. -func Lighten(bg image.Image, fg image.Image) *image.RGBA { - dst := Blend(bg, fg, func(c0, c1 fcolor.RGBAF64) fcolor.RGBAF64 { - r := math.Max(c0.R, c1.R) - g := math.Max(c0.G, c1.G) - b := math.Max(c0.B, c1.B) - - c2 := fcolor.RGBAF64{R: r, G: g, B: b, A: c1.A} - return alphaComp(c0, c2) - }) - - return dst -} - -// Blend two images together by applying the provided function for each pixel. -// If images differ in size, the minimum width and height will be picked from each one -// when creating the resulting image. -func Blend(bg image.Image, fg image.Image, fn func(fcolor.RGBAF64, fcolor.RGBAF64) fcolor.RGBAF64) *image.RGBA { - bgBounds := bg.Bounds() - fgBounds := fg.Bounds() - - var w, h int - w = min(bgBounds.Dx(), fgBounds.Dx()) - h = min(bgBounds.Dy(), fgBounds.Dy()) - - bgSrc := clone.AsShallowRGBA(bg) - fgSrc := clone.AsShallowRGBA(fg) - dst := image.NewRGBA(image.Rect(0, 0, w, h)) - - parallel.Line(h, func(start, end int) { - for y := start; y < end; y++ { - for x := 0; x < w; x++ { - bgPos := y*bgSrc.Stride + x*4 - fgPos := y*fgSrc.Stride + x*4 - result := fn( - fcolor.NewRGBAF64(bgSrc.Pix[bgPos+0], bgSrc.Pix[bgPos+1], bgSrc.Pix[bgPos+2], bgSrc.Pix[bgPos+3]), - fcolor.NewRGBAF64(fgSrc.Pix[fgPos+0], fgSrc.Pix[fgPos+1], fgSrc.Pix[fgPos+2], fgSrc.Pix[fgPos+3])) - - result.Clamp() - dstPos := y*dst.Stride + x*4 - dst.Pix[dstPos+0] = uint8(result.R * 255) - dst.Pix[dstPos+1] = uint8(result.G * 255) - dst.Pix[dstPos+2] = uint8(result.B * 255) - dst.Pix[dstPos+3] = uint8(result.A * 255) - } - - } - }) - - return dst -} - -// alphaComp returns a new color after compositing the two colors -// based on the foreground's alpha channel. -func alphaComp(bg, fg fcolor.RGBAF64) fcolor.RGBAF64 { - fg.Clamp() - fga := fg.A - - r := (fg.R * fga / 1) + ((1 - fga) * bg.R / 1) - g := (fg.G * fga / 1) + ((1 - fga) * bg.G / 1) - b := (fg.B * fga / 1) + ((1 - fga) * bg.B / 1) - a := bg.A + fga - - return fcolor.RGBAF64{R: r, G: g, B: b, A: a} -} diff --git a/internal/bot/image/blur/blur.go b/internal/bot/image/blur/blur.go deleted file mode 100644 index 36ece62..0000000 --- a/internal/bot/image/blur/blur.go +++ /dev/null @@ -1,52 +0,0 @@ -/*Package blur provides image blurring functions.*/ -package blur - -import ( - "image" - "math" - - "go.fm/internal/bot/image/clone" - "go.fm/internal/bot/image/convolution" -) - -// Box returns a blurred (average) version of the image. -// Radius must be larger than 0. -func Box(src image.Image, radius float64) *image.RGBA { - if radius <= 0 { - return clone.AsRGBA(src) - } - - length := int(math.Ceil(2*radius + 1)) - k := convolution.NewKernel(length, length) - - for x := range length { - for y := range length { - k.Matrix[y*length+x] = 1 - } - } - - return convolution.Convolve(src, k.Normalized(), &convolution.Options{Bias: 0, Wrap: false, KeepAlpha: false}) -} - -// Gaussian returns a smoothly blurred version of the image using -// a Gaussian function. Radius must be larger than 0. -func Gaussian(src image.Image, radius float64) *image.RGBA { - if radius <= 0 { - return clone.AsRGBA(src) - } - - // Create the 1-d gaussian kernel - length := int(math.Ceil(2*radius + 1)) - k := convolution.NewKernel(length, 1) - for i, x := 0, -radius; i < length; i, x = i+1, x+1 { - k.Matrix[i] = math.Exp(-(x * x / 4 / radius)) - } - normK := k.Normalized() - - // Perform separable convolution - options := convolution.Options{Bias: 0, Wrap: false, KeepAlpha: false} - result := convolution.Convolve(src, normK, &options) - result = convolution.Convolve(result, normK.Transposed(), &options) - - return result -} diff --git a/internal/bot/image/clone/clone.go b/internal/bot/image/clone/clone.go deleted file mode 100644 index 04e1bd6..0000000 --- a/internal/bot/image/clone/clone.go +++ /dev/null @@ -1,156 +0,0 @@ -package clone - -import ( - "image" - "image/draw" - - "go.fm/internal/bot/image/parallel" -) - -// PadMethod is the method used to fill padded pixels. -type PadMethod uint8 - -const ( - // NoFill leaves the padded pixels empty. - NoFill = iota - // EdgeExtend extends the closest edge pixel. - EdgeExtend - // EdgeWrap wraps around the pixels of an image. - EdgeWrap -) - -// AsRGBA returns an RGBA copy of the supplied image. -func AsRGBA(src image.Image) *image.RGBA { - bounds := src.Bounds() - img := image.NewRGBA(bounds) - draw.Draw(img, bounds, src, bounds.Min, draw.Src) - return img -} - -// AsShallowRGBA tries to cast to image.RGBA to get reference. Otherwise makes a copy -func AsShallowRGBA(src image.Image) *image.RGBA { - if rgba, ok := src.(*image.RGBA); ok { - return rgba - } - return AsRGBA(src) -} - -// Pad returns an RGBA copy of the src image parameter with its edges padded -// using the supplied PadMethod. -// Parameter padX and padY correspond to the amount of padding to be applied -// on each side. -// Parameter m is the PadMethod to fill the new pixels. -// -// Usage example: -// -// result := Pad(img, 5,5, EdgeExtend) -func Pad(src image.Image, padX, padY int, m PadMethod) *image.RGBA { - var result *image.RGBA - - switch m { - case EdgeExtend: - result = extend(src, padX, padY) - case NoFill: - result = noFill(src, padX, padY) - case EdgeWrap: - result = wrap(src, padX, padY) - default: - result = extend(src, padX, padY) - } - - return result -} - -func noFill(img image.Image, padX, padY int) *image.RGBA { - srcBounds := img.Bounds() - paddedW, paddedH := srcBounds.Dx()+2*padX, srcBounds.Dy()+2*padY - newBounds := image.Rect(0, 0, paddedW, paddedH) - fillBounds := image.Rect(padX, padY, padX+srcBounds.Dx(), padY+srcBounds.Dy()) - - dst := image.NewRGBA(newBounds) - draw.Draw(dst, fillBounds, img, srcBounds.Min, draw.Src) - - return dst -} - -func extend(img image.Image, padX, padY int) *image.RGBA { - dst := noFill(img, padX, padY) - paddedW, paddedH := dst.Bounds().Dx(), dst.Bounds().Dy() - - parallel.Line(paddedH, func(start, end int) { - for y := start; y < end; y++ { - iy := y - if iy < padY { - iy = padY - } else if iy >= paddedH-padY { - iy = paddedH - padY - 1 - } - - for x := 0; x < paddedW; x++ { - ix := x - if ix < padX { - ix = padX - } else if x >= paddedW-padX { - ix = paddedW - padX - 1 - } else if iy == y { - // This only enters if we are not in a y-padded area or - // x-padded area, so nothing to extend here. - // So simply jump to the next padded-x index. - x = paddedW - padX - 1 - continue - } - - dstPos := y*dst.Stride + x*4 - edgePos := iy*dst.Stride + ix*4 - - dst.Pix[dstPos+0] = dst.Pix[edgePos+0] - dst.Pix[dstPos+1] = dst.Pix[edgePos+1] - dst.Pix[dstPos+2] = dst.Pix[edgePos+2] - dst.Pix[dstPos+3] = dst.Pix[edgePos+3] - } - } - }) - - return dst -} - -func wrap(img image.Image, padX, padY int) *image.RGBA { - dst := noFill(img, padX, padY) - paddedW, paddedH := dst.Bounds().Dx(), dst.Bounds().Dy() - - parallel.Line(paddedH, func(start, end int) { - for y := start; y < end; y++ { - iy := y - if iy < padY { - iy = (paddedH - padY) - ((padY - y) % (paddedH - padY*2)) - } else if iy >= paddedH-padY { - iy = padY - ((padY - y) % (paddedH - padY*2)) - } - - for x := 0; x < paddedW; x++ { - ix := x - if ix < padX { - ix = (paddedW - padX) - ((padX - x) % (paddedW - padX*2)) - } else if ix >= paddedW-padX { - ix = padX - ((padX - x) % (paddedW - padX*2)) - } else if iy == y { - // This only enters if we are not in a y-padded area or - // x-padded area, so nothing to extend here. - // So simply jump to the next padded-x index. - x = paddedW - padX - 1 - continue - } - - dstPos := y*dst.Stride + x*4 - edgePos := iy*dst.Stride + ix*4 - - dst.Pix[dstPos+0] = dst.Pix[edgePos+0] - dst.Pix[dstPos+1] = dst.Pix[edgePos+1] - dst.Pix[dstPos+2] = dst.Pix[edgePos+2] - dst.Pix[dstPos+3] = dst.Pix[edgePos+3] - } - } - }) - - return dst -} diff --git a/internal/bot/image/colors/colors.go b/internal/bot/image/colors/colors.go deleted file mode 100644 index 704dc87..0000000 --- a/internal/bot/image/colors/colors.go +++ /dev/null @@ -1,150 +0,0 @@ -package colors - -import ( - "fmt" - "image" - _ "image/gif" - _ "image/jpeg" - _ "image/png" - "io" - "math" - "net/http" - "sync/atomic" - "time" - - "go.fm/internal/bot/image/parallel" -) - -func rgbToHsl(r, g, b float64) (h, s, l float64) { - r /= 255 - g /= 255 - b /= 255 - - max := math.Max(r, math.Max(g, b)) - min := math.Min(r, math.Min(g, b)) - l = (max + min) / 2 - - if max == min { - h, s = 0, 0 - } else { - d := max - min - if l > 0.5 { - s = d / (2 - max - min) - } else { - s = d / (max + min) - } - - switch max { - case r: - h = (g - b) / d - if g < b { - h += 6 - } - case g: - h = (b-r)/d + 2 - case b: - h = (r-g)/d + 4 - } - h /= 6 - } - return -} - -func hslToRgb(h, s, l float64) (r, g, b int) { - var rF, gF, bF float64 - - if s == 0 { - rF, gF, bF = l, l, l - } else { - var hue2rgb = func(p, q, t float64) float64 { - if t < 0 { - t += 1 - } - if t > 1 { - t -= 1 - } - if t < 1.0/6 { - return p + (q-p)*6*t - } - if t < 1.0/2 { - return q - } - if t < 2.0/3 { - return p + (q-p)*(2.0/3-t)*6 - } - return p - } - - var q float64 - if l < 0.5 { - q = l * (1 + s) - } else { - q = l + s - l*s - } - p := 2*l - q - rF = hue2rgb(p, q, h+1.0/3) - gF = hue2rgb(p, q, h) - bF = hue2rgb(p, q, h-1.0/3) - } - - return int(rF * 255), int(gF * 255), int(bF * 255) -} - -func Dominant(url string) (int, error) { - client := &http.Client{ - Timeout: 10 * time.Second, - } - resp, err := client.Get(url) - if err != nil { - return 0, err - } - defer resp.Body.Close() - - limitedReader := &io.LimitedReader{R: resp.Body, N: 10 << 20} - - img, _, err := image.Decode(limitedReader) - if err != nil { - return 0, err - } - - bounds := img.Bounds() - if bounds.Dx() > 4000 || bounds.Dy() > 4000 { - return 0x00ADD8, nil - } - height := bounds.Dy() - - var rTotal, gTotal, bTotal, count uint64 - - parallel.Line(height, func(start, end int) { - var rLocal, gLocal, bLocal, cLocal uint64 - for y := start; y < end; y++ { - for x := bounds.Min.X; x < bounds.Max.X; x++ { - r, g, b, _ := img.At(x, y).RGBA() - rLocal += uint64(r >> 8) - gLocal += uint64(g >> 8) - bLocal += uint64(b >> 8) - cLocal++ - } - } - atomic.AddUint64(&rTotal, rLocal) - atomic.AddUint64(&gTotal, gLocal) - atomic.AddUint64(&bTotal, bLocal) - atomic.AddUint64(&count, cLocal) - }) - - if count == 0 { - return 0, fmt.Errorf("image has no pixels") - } - - rAvg := float64(rTotal / count) - gAvg := float64(gTotal / count) - bAvg := float64(bTotal / count) - - h, s, l := rgbToHsl(rAvg, gAvg, bAvg) - s = math.Min(1.0, s*1.5) - - rBoost, gBoost, bBoost := hslToRgb(h, s, l) - - colorInt := (rBoost << 16) | (gBoost << 8) | bBoost - return colorInt, nil -} diff --git a/internal/bot/image/convolution/convolution.go b/internal/bot/image/convolution/convolution.go deleted file mode 100644 index c2f1eed..0000000 --- a/internal/bot/image/convolution/convolution.go +++ /dev/null @@ -1,133 +0,0 @@ -package convolution - -import ( - "image" - "math" - - "go.fm/internal/bot/image/clone" - "go.fm/internal/bot/image/parallel" -) - -// Options are the Convolve function parameters. -// Bias is added to each RGB channel after convoluting. Range is -255 to 255. -// Wrap sets if indices outside of image dimensions should be taken from the opposite side. -// KeepAlpha sets if alpha should be convolved or kept from the source image. -type Options struct { - Bias float64 - Wrap bool - KeepAlpha bool -} - -// Convolve applies a convolution matrix (kernel) to an image with the supplied options. -// -// Usage example: -// -// result := Convolve(img, kernel, &Options{Bias: 0, Wrap: false}) -func Convolve(img image.Image, k Matrix, o *Options) *image.RGBA { - // Config the convolution - bias := 0.0 - wrap := false - keepAlpha := false - if o != nil { - wrap = o.Wrap - bias = o.Bias - keepAlpha = o.KeepAlpha - } - - return execute(img, k, bias, wrap, keepAlpha) -} - -func execute(img image.Image, k Matrix, bias float64, wrap, keepAlpha bool) *image.RGBA { - // Kernel attributes - lenX := k.MaxX() - lenY := k.MaxY() - radiusX := lenX / 2 - radiusY := lenY / 2 - - // Pad the source image, basically pre-computing the pixels outside of image bounds - var src *image.RGBA - if wrap { - src = clone.Pad(img, radiusX, radiusY, clone.EdgeWrap) - } else { - src = clone.Pad(img, radiusX, radiusY, clone.EdgeExtend) - } - - // src bounds now includes padded pixels - srcBounds := src.Bounds() - srcW, srcH := srcBounds.Dx(), srcBounds.Dy() - dst := image.NewRGBA(img.Bounds()) - - // To keep alpha we simply don't convolve it - if keepAlpha { - // Notice we can't use lenY since it will be larger than the actual padding pixels - // as it includes the identity element - parallel.Line(srcH-(radiusY*2), func(start, end int) { - // Correct range so we don't iterate over the padded pixels on the main loop - for y := start + radiusY; y < end+radiusY; y++ { - for x := radiusX; x < srcW-radiusX; x++ { - - var r, g, b float64 - // Kernel has access to the padded pixels - for ky := range lenY { - iy := y - radiusY + ky - - for kx := range lenX { - ix := x - radiusX + kx - - kvalue := k.At(kx, ky) - ipos := iy*src.Stride + ix*4 - r += float64(src.Pix[ipos+0]) * kvalue - g += float64(src.Pix[ipos+1]) * kvalue - b += float64(src.Pix[ipos+2]) * kvalue - } - } - - // Map x and y indices to non-padded range - pos := (y-radiusY)*dst.Stride + (x-radiusX)*4 - - dst.Pix[pos+0] = uint8(math.Max(math.Min(r+bias, 255), 0)) - dst.Pix[pos+1] = uint8(math.Max(math.Min(g+bias, 255), 0)) - dst.Pix[pos+2] = uint8(math.Max(math.Min(b+bias, 255), 0)) - dst.Pix[pos+3] = src.Pix[y*src.Stride+x*4+3] - } - } - }) - } else { - // Notice we can't use lenY since it will be larger than the actual padding pixels - // as it includes the identity element - parallel.Line(srcH-(radiusY*2), func(start, end int) { - // Correct range so we don't iterate over the padded pixels on the main loop - for y := start + radiusY; y < end+radiusY; y++ { - for x := radiusX; x < srcW-radiusX; x++ { - - var r, g, b, a float64 - // Kernel has access to the padded pixels - for ky := range lenY { - iy := y - radiusY + ky - - for kx := range lenX { - ix := x - radiusX + kx - - kvalue := k.At(kx, ky) - ipos := iy*src.Stride + ix*4 - r += float64(src.Pix[ipos+0]) * kvalue - g += float64(src.Pix[ipos+1]) * kvalue - b += float64(src.Pix[ipos+2]) * kvalue - a += float64(src.Pix[ipos+3]) * kvalue - } - } - - // Map x and y indices to non-padded range - pos := (y-radiusY)*dst.Stride + (x-radiusX)*4 - - dst.Pix[pos+0] = uint8(math.Max(math.Min(r+bias, 255), 0)) - dst.Pix[pos+1] = uint8(math.Max(math.Min(g+bias, 255), 0)) - dst.Pix[pos+2] = uint8(math.Max(math.Min(b+bias, 255), 0)) - dst.Pix[pos+3] = uint8(math.Max(math.Min(a, 255), 0)) - } - } - }) - } - - return dst -} diff --git a/internal/bot/image/convolution/kernel.go b/internal/bot/image/convolution/kernel.go deleted file mode 100644 index e91e723..0000000 --- a/internal/bot/image/convolution/kernel.go +++ /dev/null @@ -1,103 +0,0 @@ -package convolution - -import ( - "fmt" - "math" -) - -// Matrix interface. -// At returns the matrix value at position x, y. -// Normalized returns a new matrix with normalized values. -// MaxX returns the horizontal length. -// MaxY returns the vertical length. -type Matrix interface { - At(x, y int) float64 - Normalized() Matrix - MaxX() int - MaxY() int - Transposed() Matrix -} - -// NewKernel returns a kernel of the provided length. -func NewKernel(width, height int) *Kernel { - return &Kernel{make([]float64, width*height), width, height} -} - -// Kernel to be used as a convolution matrix. -type Kernel struct { - Matrix []float64 - Width int - Height int -} - -// Normalized returns a new Kernel with normalized values. -func (k *Kernel) Normalized() Matrix { - sum := k.Absum() - w := k.Width - h := k.Height - nk := NewKernel(w, h) - - // avoid division by 0 - if sum == 0 { - sum = 1 - } - - for i := 0; i < w*h; i++ { - nk.Matrix[i] = k.Matrix[i] / sum - } - - return nk -} - -// MaxX returns the horizontal length. -func (k *Kernel) MaxX() int { - return k.Width -} - -// MaxY returns the vertical length. -func (k *Kernel) MaxY() int { - return k.Height -} - -// At returns the matrix value at position x, y. -func (k *Kernel) At(x, y int) float64 { - return k.Matrix[y*k.Width+x] -} - -// Transposed returns a new Kernel that has the columns as rows and vice versa -func (k *Kernel) Transposed() Matrix { - w := k.Width - h := k.Height - nk := NewKernel(h, w) - - for x := range w { - for y := range h { - nk.Matrix[x*h+y] = k.Matrix[y*w+x] - } - } - - return nk -} - -// String returns the string representation of the matrix. -func (k *Kernel) String() string { - result := "" - stride := k.MaxX() - height := k.MaxY() - for y := range height { - result += "\n" - for x := range stride { - result += fmt.Sprintf("%-8.4f", k.At(x, y)) - } - } - return result -} - -// Absum returns the absolute cumulative value of the kernel. -func (k *Kernel) Absum() float64 { - var sum float64 - for _, v := range k.Matrix { - sum += math.Abs(v) - } - return sum -} diff --git a/internal/bot/image/fcolor/fcolor.go b/internal/bot/image/fcolor/fcolor.go deleted file mode 100644 index 7e26023..0000000 --- a/internal/bot/image/fcolor/fcolor.go +++ /dev/null @@ -1,22 +0,0 @@ -package fcolor - -import "go.fm/internal/bot/image/math/f64" - -// RGBAF64 represents an RGBA color using the range 0.0 to 1.0 with a float64 for each channel. -type RGBAF64 struct { - R, G, B, A float64 -} - -// NewRGBAF64 returns a new RGBAF64 color based on the provided uint8 values. -// uint8 value 0 maps to 0, 128 to 0.5 and 255 to 1.0. -func NewRGBAF64(r, g, b, a uint8) RGBAF64 { - return RGBAF64{float64(r) / 255, float64(g) / 255, float64(b) / 255, float64(a) / 255} -} - -// Clamp limits the channel values of the RGBAF64 color to the range 0.0 to 1.0. -func (c *RGBAF64) Clamp() { - c.R = f64.Clamp(c.R, 0, 1) - c.G = f64.Clamp(c.G, 0, 1) - c.B = f64.Clamp(c.B, 0, 1) - c.A = f64.Clamp(c.A, 0, 1) -} diff --git a/internal/bot/image/font/font.go b/internal/bot/image/font/font.go deleted file mode 100644 index 8086d5d..0000000 --- a/internal/bot/image/font/font.go +++ /dev/null @@ -1,60 +0,0 @@ -package font - -import ( - "image" - "image/color" - "image/draw" - "log" - "os" - - "golang.org/x/image/font" - "golang.org/x/image/font/opentype" - "golang.org/x/image/math/fixed" -) - -// Font holds a loaded TTF font and can create faces of different sizes. -type Font struct { - ttf *opentype.Font -} - -// LoadFont loads a TTF font from a file path. -func LoadFont(path string) *Font { - data, err := os.ReadFile(path) - if err != nil { - log.Fatalf("failed to read font file: %v", err) - } - ttf, err := opentype.Parse(data) - if err != nil { - log.Fatalf("failed to parse font: %v", err) - } - return &Font{ttf: ttf} -} - -// Face returns a font.Face of the specified size (in points) and DPI. -func (f *Font) Face(size float64, dpi float64) font.Face { - face, err := opentype.NewFace(f.ttf, &opentype.FaceOptions{ - Size: size, - DPI: dpi, - Hinting: font.HintingFull, - }) - if err != nil { - log.Fatalf("failed to create font face: %v", err) - } - return face -} - -// DrawText draws text onto an image at a given position with color and font.Face. -func DrawText(canvas draw.Image, x, y int, text string, col color.Color, face font.Face) { - d := &font.Drawer{ - Dst: canvas, - Src: image.NewUniform(col), - Face: face, - Dot: fixed.Point26_6{X: fixed.I(x), Y: fixed.I(y)}, - } - d.DrawString(text) -} - -func Measure(f font.Face, s string) int { - d := &font.Drawer{Face: f} - return d.MeasureString(s).Ceil() -} diff --git a/internal/bot/image/imgio/imgio.go b/internal/bot/image/imgio/imgio.go deleted file mode 100644 index ffc79f0..0000000 --- a/internal/bot/image/imgio/imgio.go +++ /dev/null @@ -1,137 +0,0 @@ -/*Package imgio provides basic image file input/output.*/ -package imgio - -import ( - "bytes" - "fmt" - "image" - "image/jpeg" - "image/png" - "io" - "net/http" - "os" -) - -// Encoder encodes the provided image and writes it -type Encoder func(io.Writer, image.Image) error - -// Open loads and decodes an image from a file and returns it. -// -// Usage example: -// -// // Decodes an image from a file with the given filename -// // returns an error if something went wrong -// img, err := Open("exampleName") -func Open(filename string) (image.Image, error) { - f, err := os.Open(filename) - if err != nil { - return nil, err - } - defer f.Close() - - img, _, err := image.Decode(f) - if err != nil { - return nil, err - } - - return img, nil -} - -// Fetch retrieves the raw image bytes from the given URL. -// -// Usage example: -// -// data, err := Fetch("https://example.com/image.png") -// if err != nil { -// // handle error -// } -func Fetch(url string) ([]byte, error) { - resp, err := http.Get(url) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("failed to fetch image: %s", resp.Status) - } - - data, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - - return data, nil -} - -// FromUrl retrieves an image from the given URL and decodes it. -func FromUrl(url string) (image.Image, error) { - resp, err := http.Get(url) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("failed to fetch image: %s", resp.Status) - } - - data, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - - img, _, err := image.Decode(bytes.NewReader(data)) - if err != nil { - return nil, err - } - - return img, nil -} - -// DecodeImage loads and decodes an image from a byte slice and returns it. -// -// Usage example: -// -// img, err := Decode(data) -// if err != nil { -// // handle error -// } -func Decode(data []byte) (image.Image, error) { - reader := bytes.NewReader(data) - img, _, err := image.Decode(reader) - if err != nil { - return nil, err - } - return img, nil -} - -// JPEGEncoder returns an encoder to JPEG given the argument 'quality' -func JPEGEncoder(quality int) Encoder { - return func(w io.Writer, img image.Image) error { - return jpeg.Encode(w, img, &jpeg.Options{Quality: quality}) - } -} - -// PNGEncoder returns an encoder to PNG -func PNGEncoder() Encoder { - return func(w io.Writer, img image.Image) error { - return png.Encode(w, img) - } -} - -// Encode encodes an image into a byte slice using the provided encoder. -// -// Usage example: -// -// data, err := Encode(img, imgio.JPEGEncoder(90)) -// if err != nil { -// // handle error -// } -func Encode(img image.Image, encoder Encoder) ([]byte, error) { - buf := new(bytes.Buffer) - if err := encoder(buf, img); err != nil { - return nil, err - } - return buf.Bytes(), nil -} diff --git a/internal/bot/image/mask/mask.go b/internal/bot/image/mask/mask.go deleted file mode 100644 index 29ec4d2..0000000 --- a/internal/bot/image/mask/mask.go +++ /dev/null @@ -1,93 +0,0 @@ -package mask - -import ( - "image" - "image/color" - "math" - - "go.fm/internal/bot/image/parallel" -) - -func Rounded(width, height, radius int) *image.Alpha { - mask := image.NewAlpha(image.Rect(0, 0, width, height)) - - parallel.Line(height, func(start, end int) { - for y := start; y < end; y++ { - for x := range width { - alpha := 255.0 - - // top-left corner - dx := float64(radius - x) - dy := float64(radius - y) - if dx > 0 && dy > 0 { - dist := math.Hypot(dx, dy) - if dist > float64(radius) { - alpha = 0 - } else if dist > float64(radius)-1 { - alpha = 255 * (float64(radius) - dist) - } - } - - // top-right corner - dx = float64(x - (width - radius - 1)) - dy = float64(radius - y) - if dx > 0 && dy > 0 { - dist := math.Hypot(dx, dy) - if dist > float64(radius) { - alpha = 0 - } else if dist > float64(radius)-1 { - alpha = math.Min(alpha, 255*(float64(radius)-dist)) - } - } - - // bottom-left corner - dx = float64(radius - x) - dy = float64(y - (height - radius - 1)) - if dx > 0 && dy > 0 { - dist := math.Hypot(dx, dy) - if dist > float64(radius) { - alpha = 0 - } else if dist > float64(radius)-1 { - alpha = math.Min(alpha, 255*(float64(radius)-dist)) - } - } - - // bottom-right corner - dx = float64(x - (width - radius - 1)) - dy = float64(y - (height - radius - 1)) - if dx > 0 && dy > 0 { - dist := math.Hypot(dx, dy) - if dist > float64(radius) { - alpha = 0 - } else if dist > float64(radius)-1 { - alpha = math.Min(alpha, 255*(float64(radius)-dist)) - } - } - - mask.SetAlpha(x, y, color.Alpha{A: uint8(alpha)}) - } - } - }) - - return mask -} - -func GradientHorizontal(width, height int, reverse bool) *image.Alpha { - mask := image.NewAlpha(image.Rect(0, 0, width, height)) - - parallel.Line(height, func(start, end int) { - for y := start; y < end; y++ { - for x := range width { - var alpha uint8 - if reverse { - alpha = uint8((x * 255) / width) - } else { - alpha = uint8(255 - (x * 255 / width)) - } - mask.SetAlpha(x, y, color.Alpha{A: alpha}) - } - } - }) - - return mask -} diff --git a/internal/bot/image/math/f64/f64.go b/internal/bot/image/math/f64/f64.go deleted file mode 100644 index cc85ec3..0000000 --- a/internal/bot/image/math/f64/f64.go +++ /dev/null @@ -1,13 +0,0 @@ -package f64 - -// Clamp returns the value if it fits within the parameters min and max. -// Otherwise returns the closest boundary parameter value. -func Clamp(value, min, max float64) float64 { - if value > max { - return max - } - if value < min { - return min - } - return value -} diff --git a/internal/bot/image/parallel/parallel.go b/internal/bot/image/parallel/parallel.go deleted file mode 100644 index 3336327..0000000 --- a/internal/bot/image/parallel/parallel.go +++ /dev/null @@ -1,36 +0,0 @@ -package parallel - -import ( - "runtime" - "sync" -) - -func init() { - runtime.GOMAXPROCS(runtime.NumCPU()) -} - -// Line dispatches a parameter fn into multiple goroutines by splitting the parameter length -// by the number of available CPUs and assigning the length parts into each fn. -func Line(length int, fn func(start, end int)) { - procs := runtime.GOMAXPROCS(0) - counter := length - partSize := length / procs - if procs <= 1 || partSize <= procs { - fn(0, length) - } else { - var wg sync.WaitGroup - for counter > 0 { - start := counter - partSize - end := counter - if start < 0 { - start = 0 - } - counter -= partSize - wg.Go(func() { - fn(start, end) - }) - } - - wg.Wait() - } -} diff --git a/internal/bot/image/shapes/shapes.go b/internal/bot/image/shapes/shapes.go deleted file mode 100644 index c2c1a16..0000000 --- a/internal/bot/image/shapes/shapes.go +++ /dev/null @@ -1,31 +0,0 @@ -package shapes - -import ( - "image" - "image/color" - "image/draw" - - "go.fm/internal/bot/image/mask" -) - -// DrawCircle draws a filled circle at (cx, cy) with radius r -func DrawCircle(img *image.RGBA, cx, cy, r int, col color.Color) { - for y := cy - r; y <= cy+r; y++ { - for x := cx - r; x <= cx+r; x++ { - if (x-cx)*(x-cx)+(y-cy)*(y-cy) <= r*r { - img.Set(x, y, col) - } - } - } -} - -// DrawRectangle draws a filled rectangle -func DrawRectangle(img *image.RGBA, x, y, w, h int, col color.Color) { - draw.Draw(img, image.Rect(x, y, x+w, y+h), &image.Uniform{col}, image.Point{}, draw.Src) -} - -// DrawRoundedRectangle draws a rectangle with rounded corners -func DrawRoundedRectangle(img *image.RGBA, x, y, w, h, radius int, col color.Color) { - maskImg := mask.Rounded(w, h, radius) - draw.DrawMask(img, image.Rect(x, y, x+w, y+h), &image.Uniform{col}, image.Point{}, maskImg, image.Point{}, draw.Over) -} diff --git a/internal/bot/image/transform/filters.go b/internal/bot/image/transform/filters.go deleted file mode 100644 index 85b512d..0000000 --- a/internal/bot/image/transform/filters.go +++ /dev/null @@ -1,142 +0,0 @@ -/* -Package transform provides basic image transformation functions, such as resizing, rotation and flipping. -It includes a variety of resampling filters to handle interpolation in case that upsampling or downsampling is required. -*/ -package transform - -import "math" - -// ResampleFilter is used to evaluate sample points and interpolate between them. -// Support is the number of points required by the filter per 'side'. -// For example, a support of 1.0 means that the filter will get pixels on -// positions -1 and +1 away from it. -// Fn is the resample filter function to evaluate the samples. -type ResampleFilter struct { - Support float64 - Fn func(x float64) float64 -} - -// NearestNeighbor resampling filter assigns to each point the sample point nearest to it. -var NearestNeighbor ResampleFilter - -// Box resampling filter, only let pass values in the x < 0.5 range from sample. -// It produces similar results to the Nearest Neighbor method. -var Box ResampleFilter - -// Linear resampling filter interpolates linearly between the two nearest samples per dimension. -var Linear ResampleFilter - -// Gaussian resampling filter interpolates using a Gaussian function between the two nearest -// samples per dimension. -var Gaussian ResampleFilter - -// MitchellNetravali resampling filter interpolates between the four nearest samples per dimension. -var MitchellNetravali ResampleFilter - -// CatmullRom resampling filter interpolates between the four nearest samples per dimension. -var CatmullRom ResampleFilter - -// Lanczos resampling filter interpolates between the six nearest samples per dimension. -var Lanczos ResampleFilter - -func init() { - NearestNeighbor = ResampleFilter{ - Support: 0, - Fn: nil, - } - Box = ResampleFilter{ - Support: 0.5, - Fn: func(x float64) float64 { - if math.Abs(x) < 0.5 { - return 1 - } - return 0 - }, - } - Linear = ResampleFilter{ - Support: 1.0, - Fn: func(x float64) float64 { - x = math.Abs(x) - if x < 1.0 { - return 1.0 - x - } - return 0 - }, - } - Gaussian = ResampleFilter{ - Support: 1.0, - Fn: func(x float64) float64 { - x = math.Abs(x) - if x < 1.0 { - exp := 2.0 - x *= 2.0 - y := math.Pow(0.5, math.Pow(x, exp)) - base := math.Pow(0.5, math.Pow(2, exp)) - return (y - base) / (1 - base) - } - return 0 - }, - } - MitchellNetravali = ResampleFilter{ - Support: 2.0, - Fn: func(x float64) float64 { - b := 1.0 / 3 - c := 1.0 / 3 - var w [4]float64 - x = math.Abs(x) - - if x < 1.0 { - w[0] = 0 - w[1] = 6 - 2*b - w[2] = (-18 + 12*b + 6*c) * x * x - w[3] = (12 - 9*b - 6*c) * x * x * x - } else if x <= 2.0 { - w[0] = 8*b + 24*c - w[1] = (-12*b - 48*c) * x - w[2] = (6*b + 30*c) * x * x - w[3] = (-b - 6*c) * x * x * x - } else { - return 0 - } - - return (w[0] + w[1] + w[2] + w[3]) / 6 - }, - } - CatmullRom = ResampleFilter{ - Support: 2.0, - Fn: func(x float64) float64 { - b := 0.0 - c := 0.5 - var w [4]float64 - x = math.Abs(x) - - if x < 1.0 { - w[0] = 0 - w[1] = 6 - 2*b - w[2] = (-18 + 12*b + 6*c) * x * x - w[3] = (12 - 9*b - 6*c) * x * x * x - } else if x <= 2.0 { - w[0] = 8*b + 24*c - w[1] = (-12*b - 48*c) * x - w[2] = (6*b + 30*c) * x * x - w[3] = (-b - 6*c) * x * x * x - } else { - return 0 - } - - return (w[0] + w[1] + w[2] + w[3]) / 6 - }, - } - Lanczos = ResampleFilter{ - Support: 3.0, - Fn: func(x float64) float64 { - x = math.Abs(x) - if x == 0 { - return 1.0 - } else if x < 3.0 { - return (3.0 * math.Sin(math.Pi*x) * math.Sin(math.Pi*(x/3.0))) / (math.Pi * math.Pi * x * x) - } - return 0.0 - }, - } -} diff --git a/internal/bot/image/transform/resize.go b/internal/bot/image/transform/resize.go deleted file mode 100644 index 6c47e65..0000000 --- a/internal/bot/image/transform/resize.go +++ /dev/null @@ -1,180 +0,0 @@ -package transform - -import ( - "image" - "math" - - "go.fm/internal/bot/image/clone" - "go.fm/internal/bot/image/math/f64" - "go.fm/internal/bot/image/parallel" -) - -// Resize returns a new image with its size adjusted to the new width and height. The filter -// param corresponds to the Resampling Filter to be used when interpolating between the sample points. -// -// Usage example: -// -// result := transform.Resize(img, 800, 600, transform.Linear) -func Resize(img image.Image, width, height int, filter ResampleFilter) *image.RGBA { - if width <= 0 || height <= 0 || img.Bounds().Empty() { - return image.NewRGBA(image.Rect(0, 0, 0, 0)) - } - - src := clone.AsShallowRGBA(img) - var dst *image.RGBA - - // NearestNeighbor is a special case, it's faster to compute without convolution matrix. - if filter.Support <= 0 { - dst = nearestNeighbor(src, width, height) - } else { - dst = resampleHorizontal(src, width, filter) - dst = resampleVertical(dst, height, filter) - } - - return dst -} - -// Crop returns a new image which contains the intersection between the rect and the image provided as params. -// Only the intersection is returned. If a rect larger than the image is provided, no fill is done to -// the 'empty' area. -// -// Usage example: -// -// result := transform.Crop(img, image.Rect(0, 0, 512, 256)) -func Crop(img image.Image, rect image.Rectangle) *image.RGBA { - src := clone.AsShallowRGBA(img) - return clone.AsRGBA(src.SubImage(rect)) -} - -func resampleHorizontal(src *image.RGBA, width int, filter ResampleFilter) *image.RGBA { - srcWidth, srcHeight := src.Bounds().Dx(), src.Bounds().Dy() - srcStride := src.Stride - - delta := float64(srcWidth) / float64(width) - // Scale must be at least 1. Special case for image size reduction filter radius. - scale := math.Max(delta, 1.0) - - dst := image.NewRGBA(image.Rect(0, 0, width, srcHeight)) - dstStride := dst.Stride - - filterRadius := math.Ceil(scale * filter.Support) - - parallel.Line(srcHeight, func(start, end int) { - for y := start; y < end; y++ { - for x := range width { - // value of x from src - ix := (float64(x)+0.5)*delta - 0.5 - istart, iend := int(ix-filterRadius+0.5), int(ix+filterRadius) - - if istart < 0 { - istart = 0 - } - if iend >= srcWidth { - iend = srcWidth - 1 - } - - var r, g, b, a float64 - var sum float64 - for kx := istart; kx <= iend; kx++ { - - srcPos := y*srcStride + kx*4 - // normalize the sample position to be evaluated by the filter - normPos := (float64(kx) - ix) / scale - fValue := filter.Fn(normPos) - - r += float64(src.Pix[srcPos+0]) * fValue - g += float64(src.Pix[srcPos+1]) * fValue - b += float64(src.Pix[srcPos+2]) * fValue - a += float64(src.Pix[srcPos+3]) * fValue - sum += fValue - } - - dstPos := y*dstStride + x*4 - dst.Pix[dstPos+0] = uint8(f64.Clamp((r/sum)+0.5, 0, 255)) - dst.Pix[dstPos+1] = uint8(f64.Clamp((g/sum)+0.5, 0, 255)) - dst.Pix[dstPos+2] = uint8(f64.Clamp((b/sum)+0.5, 0, 255)) - dst.Pix[dstPos+3] = uint8(f64.Clamp((a/sum)+0.5, 0, 255)) - } - } - }) - - return dst -} - -func resampleVertical(src *image.RGBA, height int, filter ResampleFilter) *image.RGBA { - srcWidth, srcHeight := src.Bounds().Dx(), src.Bounds().Dy() - srcStride := src.Stride - - delta := float64(srcHeight) / float64(height) - scale := math.Max(delta, 1.0) - - dst := image.NewRGBA(image.Rect(0, 0, srcWidth, height)) - dstStride := dst.Stride - - filterRadius := math.Ceil(scale * filter.Support) - - parallel.Line(height, func(start, end int) { - for y := start; y < end; y++ { - iy := (float64(y)+0.5)*delta - 0.5 - - istart, iend := int(iy-filterRadius+0.5), int(iy+filterRadius) - - if istart < 0 { - istart = 0 - } - if iend >= srcHeight { - iend = srcHeight - 1 - } - - for x := range srcWidth { - var r, g, b, a float64 - var sum float64 - for ky := istart; ky <= iend; ky++ { - - srcPos := ky*srcStride + x*4 - normPos := (float64(ky) - iy) / scale - fValue := filter.Fn(normPos) - - r += float64(src.Pix[srcPos+0]) * fValue - g += float64(src.Pix[srcPos+1]) * fValue - b += float64(src.Pix[srcPos+2]) * fValue - a += float64(src.Pix[srcPos+3]) * fValue - sum += fValue - } - - dstPos := y*dstStride + x*4 - dst.Pix[dstPos+0] = uint8(f64.Clamp((r/sum)+0.5, 0, 255)) - dst.Pix[dstPos+1] = uint8(f64.Clamp((g/sum)+0.5, 0, 255)) - dst.Pix[dstPos+2] = uint8(f64.Clamp((b/sum)+0.5, 0, 255)) - dst.Pix[dstPos+3] = uint8(f64.Clamp((a/sum)+0.5, 0, 255)) - } - } - }) - - return dst -} - -func nearestNeighbor(src *image.RGBA, width, height int) *image.RGBA { - srcW, srcH := src.Bounds().Dx(), src.Bounds().Dy() - srcStride := src.Stride - - dst := image.NewRGBA(image.Rect(0, 0, width, height)) - dstStride := dst.Stride - - dx := float64(srcW) / float64(width) - dy := float64(srcH) / float64(height) - - for y := range height { - for x := range width { - pos := y*dstStride + x*4 - ipos := int((float64(y)+0.5)*dy)*srcStride + int((float64(x)+0.5)*dx)*4 - - dst.Pix[pos+0] = src.Pix[ipos+0] - dst.Pix[pos+1] = src.Pix[ipos+1] - dst.Pix[pos+2] = src.Pix[ipos+2] - dst.Pix[pos+3] = src.Pix[ipos+3] - } - } - - return dst -} diff --git a/internal/bot/lastfm/cache.go b/internal/bot/lastfm/cache.go deleted file mode 100644 index 631b1d5..0000000 --- a/internal/bot/lastfm/cache.go +++ /dev/null @@ -1,86 +0,0 @@ -package lastfm - -import ( - "crypto/sha256" - "fmt" - "sort" - "strings" - "time" - - "github.com/nxtgo/gce" -) - -type Cache struct { - User *gce.Cache[string, User] - UserTopAlbums *gce.Cache[string, TopAlbums] - UserTopArtists *gce.Cache[string, TopArtists] - UserTopTracks *gce.Cache[string, TopTracks] - // todo: more cache -} - -func NewCache() *Cache { - return &Cache{ - User: gce.New[string, User]( - gce.WithDefaultTTL(time.Minute*30), - gce.WithMaxEntries(10_000), - ), - UserTopAlbums: gce.New[string, TopAlbums]( - gce.WithDefaultTTL(time.Hour*6), - gce.WithMaxEntries(10_000), - ), - UserTopArtists: gce.New[string, TopArtists]( - gce.WithDefaultTTL(time.Hour*6), - gce.WithMaxEntries(10_000), - ), - UserTopTracks: gce.New[string, TopTracks]( - gce.WithDefaultTTL(time.Hour*6), - gce.WithMaxEntries(10_000), - ), - } -} - -type CacheStats struct { - Name string - Stats gce.Stats -} - -func (c *Cache) Stats() []CacheStats { - return []CacheStats{ - {"User", c.User.Stats()}, - {"UserTopAlbums", c.UserTopAlbums.Stats()}, - {"UserTopArtists", c.UserTopArtists.Stats()}, - {"UserTopTracks", c.UserTopTracks.Stats()}, - } -} - -func (c *Cache) Close() { - c.User.Close() - c.UserTopAlbums.Close() - c.UserTopArtists.Close() - c.UserTopTracks.Close() -} - -func GenerateCacheKey(method string, args P) string { - if len(args) == 0 { - return method - } - - keys := make([]string, 0, len(args)) - for k := range args { - keys = append(keys, k) - } - sort.Strings(keys) - - var sb strings.Builder - sb.WriteString(method) - for _, k := range keys { - sb.WriteByte('|') - sb.WriteString(k) - sb.WriteByte(':') - fmt.Fprint(&sb, args[k]) - } - - hash := sha256.Sum256([]byte(sb.String())) - - return fmt.Sprintf("%s|%x", method, hash[:16]) -} diff --git a/internal/bot/lastfm/client.go b/internal/bot/lastfm/client.go deleted file mode 100644 index 71333a1..0000000 --- a/internal/bot/lastfm/client.go +++ /dev/null @@ -1,127 +0,0 @@ -package lastfm - -import ( - "encoding/xml" - "fmt" - "io" - "net/http" - "net/url" - "time" -) - -const ( - BaseURL = "https://ws.audioscrobbler.com/2.0/" -) - -// Params....... -type P map[string]any - -// Client represents the Last.fm API client -type Client struct { - APIKey string - HTTPClient *http.Client - BaseURL string - Cache *Cache -} - -// ClientOption represents a configuration option for the client -type ClientOption func(*Client) - -// NewClient creates a new Last.fm API client -func NewClient(apiKey string, options ...ClientOption) *Client { - client := &Client{ - APIKey: apiKey, - BaseURL: BaseURL, - HTTPClient: &http.Client{ - Timeout: 30 * time.Second, - }, - Cache: nil, - } - - for _, option := range options { - option(client) - } - - return client -} - -// WithCache sets a custom cache client -func WithCache(cache *Cache) ClientOption { - return func(c *Client) { - c.Cache = cache - } -} - -// WithHTTPClient sets a custom HTTP client -func WithHTTPClient(httpClient *http.Client) ClientOption { - return func(c *Client) { - c.HTTPClient = httpClient - } -} - -// WithTimeout sets a custom timeout for HTTP requests -func WithTimeout(timeout time.Duration) ClientOption { - return func(c *Client) { - c.HTTPClient.Timeout = timeout - } -} - -// WithBaseURL sets a custom base URL (useful for testing) -func WithBaseURL(baseURL string) ClientOption { - return func(c *Client) { - c.BaseURL = baseURL - } -} - -// buildURL constructs the API URL with parameters -func (c *Client) buildURL(method string, params P) string { - u, _ := url.Parse(c.BaseURL) - q := u.Query() - - q.Set("method", method) - q.Set("api_key", c.APIKey) - - for key, value := range params { - if value != "" { - q.Set(key, fmt.Sprintf("%v", value)) - } - } - - u.RawQuery = q.Encode() - return u.String() -} - -// makeRequest performs an HTTP GET request to the Last.fm API -func (c *Client) makeRequest(method string, params P) ([]byte, error) { - url := c.buildURL(method, params) - - resp, err := c.HTTPClient.Get(url) - if err != nil { - return nil, fmt.Errorf("failed to make request: %w", err) - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("API request failed with status %d", resp.StatusCode) - } - - body, err := io.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("failed to read response body: %w", err) - } - - var errorResp struct { - XMLName xml.Name `xml:"lfm"` - Status string `xml:"status,attr"` - Error struct { - Code int `xml:"code,attr"` - Text string `xml:",chardata"` - } `xml:"error"` - } - - if err := xml.Unmarshal(body, &errorResp); err == nil && errorResp.Status == "failed" { - return nil, fmt.Errorf("last.fm error %d: %s", errorResp.Error.Code, errorResp.Error.Text) - } - - return body, nil -} diff --git a/internal/bot/lastfm/services.go b/internal/bot/lastfm/services.go deleted file mode 100644 index 33a7339..0000000 --- a/internal/bot/lastfm/services.go +++ /dev/null @@ -1,16 +0,0 @@ -package lastfm - -import "time" - -// Services groups all Last.fm API services -type Services struct { - User *UserService -} - -// NewServices creates a new services group with all available services -func NewServices(k string, c *Cache) *Services { - client := NewClient(k, WithTimeout(time.Second*10), WithCache(c)) - return &Services{ - User: NewUserService(client), - } -} diff --git a/internal/bot/lastfm/user.go b/internal/bot/lastfm/user.go deleted file mode 100644 index 9d37458..0000000 --- a/internal/bot/lastfm/user.go +++ /dev/null @@ -1,174 +0,0 @@ -package lastfm - -import ( - "encoding/xml" - "fmt" -) - -type UserService struct { - client *Client -} - -func NewUserService(client *Client) *UserService { - return &UserService{ - client: client, - } -} - -type userInfoResponse struct { - XMLName xml.Name `xml:"lfm"` - Status string `xml:"status,attr"` - User User `xml:"user"` -} - -type recentTracksResponse struct { - XMLName xml.Name `xml:"lfm"` - Status string `xml:"status,attr"` - RecentTracks RecentTracks `xml:"recenttracks"` -} - -type topAlbumsResponse struct { - XMLName xml.Name `xml:"lfm"` - Status string `xml:"status,attr"` - TopAlbums TopAlbums `xml:"topalbums"` -} - -type topArtistsResponse struct { - XMLName xml.Name `xml:"lfm"` - Status string `xml:"status,attr"` - TopArtists TopArtists `xml:"topartists"` -} - -type topTracksResponse struct { - XMLName xml.Name `xml:"lfm"` - Status string `xml:"status,attr"` - TopTracks TopTracks `xml:"toptracks"` -} - -/// user-based methods - -func (s *UserService) GetInfo(params P) (*User, error) { - if params["user"] == "" { - return nil, fmt.Errorf("user parameter is required") - } - - key := GenerateCacheKey("user.getinfo", params) - - if user, cached := s.client.Cache.User.Get(key); cached { - return &user, nil - } - - body, err := s.client.makeRequest("user.getinfo", params) - if err != nil { - return nil, fmt.Errorf("failed to get user info: %w", err) - } - - var response userInfoResponse - if err := xml.Unmarshal(body, &response); err != nil { - return nil, fmt.Errorf("failed to unmarshal response: %w", err) - } - - s.client.Cache.User.Set(key, response.User, 0) - - return &response.User, nil -} - -/// user tracks - -func (s *UserService) GetRecentTracks(params P) (*RecentTracks, error) { - if params["user"] == "" { - return nil, fmt.Errorf("user parameter is required") - } - - body, err := s.client.makeRequest("user.getrecenttracks", params) - if err != nil { - return nil, fmt.Errorf("failed to get recent tracks: %w", err) - } - - var response recentTracksResponse - if err := xml.Unmarshal(body, &response); err != nil { - return nil, fmt.Errorf("failed to unmarshal response: %w", err) - } - - return &response.RecentTracks, nil -} - -/// user tops - -func (s *UserService) GetTopAlbums(params P) (*TopAlbums, error) { - if params["user"] == "" { - return nil, fmt.Errorf("user parameter is required") - } - - key := GenerateCacheKey("user.gettopalbums", params) - - if topAlbums, cached := s.client.Cache.UserTopAlbums.Get(key); cached { - return &topAlbums, nil - } - - body, err := s.client.makeRequest("user.gettopalbums", params) - if err != nil { - return nil, fmt.Errorf("failed to get top albums: %w", err) - } - - var response topAlbumsResponse - if err := xml.Unmarshal(body, &response); err != nil { - return nil, fmt.Errorf("failed to unmarshal response: %w", err) - } - - s.client.Cache.UserTopAlbums.Set(key, response.TopAlbums, 0) - - return &response.TopAlbums, nil -} - -func (s *UserService) GetTopArtists(params P) (*TopArtists, error) { - if params["user"] == "" { - return nil, fmt.Errorf("user parameter is required") - } - - key := GenerateCacheKey("user.gettopartists", params) - - if topArtists, cached := s.client.Cache.UserTopArtists.Get(key); cached { - return &topArtists, nil - } - - body, err := s.client.makeRequest("user.gettopartists", params) - if err != nil { - return nil, fmt.Errorf("failed to get top artists: %w", err) - } - - var response topArtistsResponse - if err := xml.Unmarshal(body, &response); err != nil { - return nil, fmt.Errorf("failed to unmarshal response: %w", err) - } - - s.client.Cache.UserTopArtists.Set(key, response.TopArtists, 0) - - return &response.TopArtists, nil -} - -func (s *UserService) GetTopTracks(params P) (*TopTracks, error) { - if params["user"] == "" { - return nil, fmt.Errorf("user parameter is required") - } - - key := GenerateCacheKey("user.gettoptracks", params) - - if topTracks, cached := s.client.Cache.UserTopTracks.Get(key); cached { - return &topTracks, nil - } - - body, err := s.client.makeRequest("user.gettoptracks", params) - if err != nil { - return nil, fmt.Errorf("failed to get top tracks: %w", err) - } - - var response topTracksResponse - if err := xml.Unmarshal(body, &response); err != nil { - return nil, fmt.Errorf("failed to unmarshal response: %w", err) - } - - s.client.Cache.UserTopTracks.Set(key, response.TopTracks, 0) - - return &response.TopTracks, nil -} diff --git a/internal/bot/lastfm/user_types.go b/internal/bot/lastfm/user_types.go deleted file mode 100644 index df77ea8..0000000 --- a/internal/bot/lastfm/user_types.go +++ /dev/null @@ -1,262 +0,0 @@ -package lastfm - -import ( - "encoding/json" - "fmt" - "net/http" - "net/url" - "strconv" - "strings" - "time" -) - -// User represents a Last.fm user -type User struct { - Name string `xml:"name"` - RealName string `xml:"realname"` - URL string `xml:"url"` - Country string `xml:"country"` - Age string `xml:"age"` - Gender string `xml:"gender"` - Subscriber string `xml:"subscriber"` - PlayCount int64 `xml:"playcount"` - Registered Timestamp `xml:"registered"` - Images []Image `xml:"image"` -} - -// Image represents a Last.fm image -type Image struct { - Size string `xml:"size,attr"` - URL string `xml:",chardata"` -} - -// Timestamp represents a Last.fm timestamp -type Timestamp struct { - UnixTime string `xml:"unixtime,attr"` - Text string `xml:",chardata"` -} - -// TopAlbums wraps the list of albums and pagination info -type TopAlbums struct { - User string `xml:"user,attr"` - Page int `xml:"page,attr"` - PerPage int `xml:"perPage,attr"` - TotalPages int `xml:"totalPages,attr"` - Total int `xml:"total,attr"` - Albums []TopAlbum `xml:"album"` -} - -// TopAlbum represents a single album -type TopAlbum struct { - Rank int `xml:"rank,attr"` - Name string `xml:"name"` - Playcount int `xml:"playcount"` - MBID string `xml:"mbid"` - URL string `xml:"url"` - Artist MinifiedArtist `xml:"artist"` - Images []Image `xml:"image"` -} - -// TopArtists wraps the list of artists and pagination info -type TopArtists struct { - User string `xml:"user,attr"` - Page int `xml:"page,attr"` - PerPage int `xml:"perPage,attr"` - TotalPages int `xml:"totalPages,attr"` - Total int `xml:"total,attr"` - Artists []TopArtist `xml:"artist"` -} - -// TopArtist represents a single artist -type TopArtist struct { - Rank int `xml:"rank,attr"` - Name string `xml:"name"` - Playcount int `xml:"playcount"` - MBID string `xml:"mbid"` - URL string `xml:"url"` - Streamable bool `xml:"streamable"` - Images []Image `xml:"image"` -} - -// TopTracks wraps the list of tracks and pagination info -type TopTracks struct { - User string `xml:"user,attr"` - Page int `xml:"page,attr"` - PerPage int `xml:"perPage,attr"` - TotalPages int `xml:"totalPages,attr"` - Total int `xml:"total,attr"` - Tracks []TopTrack `xml:"track"` -} - -// TopTrack represents a single track -type TopTrack struct { - Rank int `xml:"rank,attr"` - Name string `xml:"name"` - Duration int `xml:"duration"` - Playcount int `xml:"playcount"` - MBID string `xml:"mbid"` - URL string `xml:"url"` - Streamable bool `xml:"streamable"` // Can be "0" or "1" in XML - Artist MinifiedArtist `xml:"artist"` - Images []Image `xml:"image"` -} - -// RecentTrack represents a Last.fm track -type RecentTrack struct { - Artist RecentTrackArtist `xml:"artist"` - Name string `xml:"name"` - Streamable string `xml:"streamable"` - MBID string `xml:"mbid"` - Album RecentTrackAlbum `xml:"album"` - URL string `xml:"url"` - Images []Image `xml:"image"` - Date *RecentTrackDate `xml:"date"` - NowPlaying string `xml:"nowplaying,attr"` -} - -// RecentTracks represents the recent tracks response -type RecentTracks struct { - User string `xml:"user,attr"` - Page int `xml:"page,attr"` - PerPage int `xml:"perPage,attr"` - TotalPages int `xml:"totalPages,attr"` - Total int `xml:"total,attr"` - Tracks []RecentTrack `xml:"track"` -} - -// RecentTrackArtist represents an artist in a track -type RecentTrackArtist struct { - MBID string `xml:"mbid,attr"` - Name string `xml:",chardata"` -} - -// RecentTrackAlbum represents an album in a track -type RecentTrackAlbum struct { - MBID string `xml:"mbid,attr"` - Name string `xml:",chardata"` -} - -// RecentTrackDate represents a track's play date -type RecentTrackDate struct { - UTS string `xml:"uts,attr"` - Text string `xml:",chardata"` -} - -// MinifiedArtist represents the artist with less data idk -type MinifiedArtist struct { - Name string `xml:"name"` - MBID string `xml:"mbid"` - URL string `xml:"url"` -} - -// IsNowPlaying returns true if the track is currently playing -func (t *RecentTrack) IsNowPlaying() bool { - return t.NowPlaying == "true" -} - -// GetPlayTime returns the track's play time as a Go time.Time -func (t *RecentTrack) GetPlayTime() (time.Time, error) { - if t.Date == nil || t.Date.UTS == "" { - return time.Time{}, nil - } - - unixTime, err := strconv.ParseInt(t.Date.UTS, 10, 64) - if err != nil { - return time.Time{}, err - } - - return time.Unix(unixTime, 0), nil -} - -// GetLargestImage returns the largest available image for the track -func (t *RecentTrack) GetLargestImage() *Image { - sizes := []string{"mega", "extralarge", "large", "medium", "small"} - for _, size := range sizes { - for _, img := range t.Images { - if img.Size == size && img.URL != "" { - return &img - } - } - } - return nil -} - -// GetImageBySize returns an image of the specified size for the track -func (t *RecentTrack) GetImageBySize(size string) *Image { - for _, img := range t.Images { - if img.Size == size && img.URL != "" { - return &img - } - } - return nil -} - -func (t Timestamp) Time() (time.Time, error) { - if t.UnixTime == "" { - return time.Time{}, nil - } - - unixTime, err := strconv.ParseInt(t.UnixTime, 10, 64) - if err != nil { - return time.Time{}, err - } - - return time.Unix(unixTime, 0), nil -} - -func (u *User) GetImageBySize(size string) *Image { - for _, img := range u.Images { - if img.Size == size { - return &img - } - } - return nil -} - -func (u *User) GetLargestImage() Image { - sizes := []string{"mega", "extralarge", "large", "medium", "small"} - for _, size := range sizes { - if img := u.GetImageBySize(size); img != nil && img.URL != "" { - return *img - } - } - return Image{Size: "none", URL: ""} -} - -func (u *User) GetPlayCount() int64 { - return u.PlayCount -} - -type deezerSearchResponse struct { - Data []deezerArtist `json:"data"` -} - -type deezerArtist struct { - ID int `json:"id"` - Name string `json:"name"` - Picture string `json:"picture_big"` -} - -// GetDeezerImage fetches the artist image from Deezer matching the exact name -func (a *TopArtist) GetDeezerImage() (string, error) { - baseURL := "https://api.deezer.com/search/artist" - query := url.QueryEscape(a.Name) - resp, err := http.Get(fmt.Sprintf("%s?q=%s", baseURL, query)) - if err != nil { - return "", err - } - defer resp.Body.Close() - - var result deezerSearchResponse - if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { - return "", err - } - - for _, artist := range result.Data { - if strings.EqualFold(artist.Name, a.Name) { - return artist.Picture, nil - } - } - - return "", fmt.Errorf("artist %q not found on Deezer", a.Name) -} diff --git a/internal/bot/logging/logging.go b/internal/bot/logging/logging.go deleted file mode 100644 index f4de429..0000000 --- a/internal/bot/logging/logging.go +++ /dev/null @@ -1,284 +0,0 @@ -package logging - -// modified version of https://github.com/nxtgo/zlog, released under -// public domain. - -import ( - "encoding/json" - "fmt" - "io" - "maps" - "os" - "runtime" - "sort" - "strings" - "sync" - "time" -) - -type Level int - -const ( - LevelDebug Level = iota - LevelInfo - LevelWarn - LevelError - LevelFatal -) - -func (l Level) String() string { - return [...]string{" DBG ", " INF ", " WRN ", " ERR ", " !!! "}[l] -} - -type F map[string]any - -var ( - ansiReset = "\u001b[0m" - ansiBlack = "\u001b[30m" - - defaultLevelColor = map[Level]string{ - LevelDebug: "\u001b[35m", - LevelInfo: "\u001b[36m", - LevelWarn: "\u001b[33m", - LevelError: "\u001b[31m", - LevelFatal: "\u001b[35;1m", - } - defaultLevelColorBg = map[Level]string{ - LevelDebug: "\u001b[45m", - LevelInfo: "\u001b[46m", - LevelWarn: "\u001b[43m", - LevelError: "\u001b[41m", - LevelFatal: "\u001b[45;1m", - } -) - -type Logger struct { - mu sync.Mutex - out io.Writer - level Level - timeStamp bool - timeFormat string - json bool - colors bool - caller bool - fields F - levelColor map[Level]string - levelColorBg map[Level]string -} - -var Log = new() - -func new() *Logger { - return &Logger{ - out: os.Stderr, - level: LevelDebug, - timeStamp: true, - timeFormat: time.RFC3339, - colors: isTerminal(os.Stderr), - caller: true, - fields: make(F), - levelColor: maps.Clone(defaultLevelColor), - levelColorBg: maps.Clone(defaultLevelColorBg), - } -} - -func (l *Logger) SetLevelColor(level Level, fg string) { - l.mu.Lock() - l.levelColor[level] = fg - l.mu.Unlock() -} -func (l *Logger) SetLevelBgColor(level Level, bg string) { - l.mu.Lock() - l.levelColorBg[level] = bg - l.mu.Unlock() -} - -func (l *Logger) SetOutput(w io.Writer) { - l.mu.Lock() - defer l.mu.Unlock() - l.out = w - if f, ok := w.(*os.File); ok { - l.colors = isTerminal(f) - } -} -func (l *Logger) SetLevel(level Level) { l.mu.Lock(); l.level = level; l.mu.Unlock() } -func (l *Logger) EnableTimestamps(on bool) { l.mu.Lock(); l.timeStamp = on; l.mu.Unlock() } -func (l *Logger) SetTimeFormat(tf string) { l.mu.Lock(); l.timeFormat = tf; l.mu.Unlock() } -func (l *Logger) SetJSON(on bool) { l.mu.Lock(); l.json = on; l.mu.Unlock() } -func (l *Logger) EnableColors(on bool) { l.mu.Lock(); l.colors = on; l.mu.Unlock() } -func (l *Logger) ShowCaller(on bool) { l.mu.Lock(); l.caller = on; l.mu.Unlock() } - -func (l *Logger) WithFields(f F) *Logger { - l.mu.Lock() - defer l.mu.Unlock() - newFields := make(F, len(l.fields)+len(f)) - maps.Copy(newFields, l.fields) - maps.Copy(newFields, f) - return &Logger{ - out: l.out, level: l.level, - timeStamp: l.timeStamp, timeFormat: l.timeFormat, - json: l.json, colors: l.colors, caller: l.caller, - fields: newFields, - levelColor: maps.Clone(l.levelColor), - levelColorBg: maps.Clone(l.levelColorBg), - } -} - -func isTerminal(f *os.File) bool { - fi, err := f.Stat() - return err == nil && fi.Mode()&os.ModeCharDevice != 0 -} - -func (l *Logger) Log(level Level, msg string, extra F) { - l.mu.Lock() - out, jsonMode, colors, timeStamp, tf, callerOn := l.out, l.json, l.colors, l.timeStamp, l.timeFormat, l.caller - base := make(F, len(l.fields)) - maps.Copy(base, l.fields) - l.mu.Unlock() - - if level < l.level { - return - } - maps.Copy(base, extra) - - var callerStr string - if callerOn { - if _, file, line, ok := runtime.Caller(3); ok { - callerStr = fmt.Sprintf("%s:%d", shortFile(file), line) - } - } - - if jsonMode { - entry := make(map[string]any, len(base)+4) - entry["level"], entry["msg"] = level.String(), msg - if timeStamp { - entry["time"] = time.Now().Format(tf) - } - if callerStr != "" { - entry["caller"] = callerStr - } - maps.Copy(entry, base) - if b, err := json.Marshal(entry); err != nil { - fmt.Fprintf(out, "json marshal error: %v\n", err) - return - } else { - fmt.Fprintln(out, string(b)) - } - if level == LevelFatal { - os.Exit(1) - } - return - } - - var b strings.Builder - if colors { - if c, ok := l.levelColor[level]; ok { - b.WriteString(c) - } - } - if timeStamp { - b.WriteString(time.Now().Format(tf) + " ") - } - if colors { - if c, ok := l.levelColorBg[level]; ok { - b.WriteString(c + ansiBlack) - } - } - - b.WriteString(level.String()) - if colors { - if c, ok := l.levelColor[level]; ok { - b.WriteString(ansiReset + c) - } - } - b.WriteString(" " + msg) - - if len(base) > 0 { - b.WriteString(" ") - keys := make([]string, 0, len(base)) - for k := range base { - keys = append(keys, k) - } - sort.Strings(keys) - for i, k := range keys { - if i > 0 { - b.WriteString(" ") - } - if colors { - if c, ok := l.levelColorBg[level]; ok { - b.WriteString(c + ansiBlack) - } - } - fmt.Fprintf(&b, "%s=%v", k, base[k]) - if colors { - if c, ok := l.levelColor[level]; ok { - b.WriteString(ansiReset + c) - } - } - } - } - if callerStr != "" { - fmt.Fprintf(&b, " (%s)", callerStr) - } - if colors { - b.WriteString(ansiReset) - } - - fmt.Fprintln(out, b.String()) - if level == LevelFatal { - os.Exit(1) - } -} - -func shortFile(path string) string { - parts := strings.Split(path, "/") - if n := len(parts); n >= 2 { - return strings.Join(parts[n-2:], "/") - } - return path -} - -func (l *Logger) Debug(msg string) { l.Log(LevelDebug, msg, nil) } -func (l *Logger) Info(msg string) { l.Log(LevelInfo, msg, nil) } -func (l *Logger) Warn(msg string) { l.Log(LevelWarn, msg, nil) } -func (l *Logger) Error(msg string) { l.Log(LevelError, msg, nil) } -func (l *Logger) Fatal(msg string) { l.Log(LevelFatal, msg, nil) } - -func (l *Logger) Debugf(f string, a ...any) { l.Log(LevelDebug, fmt.Sprintf(f, a...), nil) } -func (l *Logger) Infof(f string, a ...any) { l.Log(LevelInfo, fmt.Sprintf(f, a...), nil) } -func (l *Logger) Warnf(f string, a ...any) { l.Log(LevelWarn, fmt.Sprintf(f, a...), nil) } -func (l *Logger) Errorf(f string, a ...any) { l.Log(LevelError, fmt.Sprintf(f, a...), nil) } -func (l *Logger) Fatalf(f string, a ...any) { l.Log(LevelFatal, fmt.Sprintf(f, a...), nil) } - -func (l *Logger) Debugw(msg string, f F, a ...any) { l.Log(LevelDebug, fmt.Sprintf(msg, a...), f) } -func (l *Logger) Infow(msg string, f F, a ...any) { l.Log(LevelInfo, fmt.Sprintf(msg, a...), f) } -func (l *Logger) Warnw(msg string, f F, a ...any) { l.Log(LevelWarn, fmt.Sprintf(msg, a...), f) } -func (l *Logger) Errorw(msg string, f F, a ...any) { l.Log(LevelError, fmt.Sprintf(msg, a...), f) } -func (l *Logger) Fatalw(msg string, f F, a ...any) { l.Log(LevelFatal, fmt.Sprintf(msg, a...), f) } - -func Debug(msg string) { Log.Debug(msg) } -func Info(msg string) { Log.Info(msg) } -func Warn(msg string) { Log.Warn(msg) } -func Error(msg string) { Log.Error(msg) } -func Fatal(msg string) { Log.Fatal(msg) } - -func Debugf(f string, a ...any) { Log.Debugf(f, a...) } -func Infof(f string, a ...any) { Log.Infof(f, a...) } -func Warnf(f string, a ...any) { Log.Warnf(f, a...) } -func Errorf(f string, a ...any) { Log.Errorf(f, a...) } -func Fatalf(f string, a ...any) { Log.Fatalf(f, a...) } - -func Debugw(msg string, f F, a ...any) { Log.Debugw(msg, f, a...) } -func Infow(msg string, f F, a ...any) { Log.Infow(msg, f, a...) } -func Warnw(msg string, f F, a ...any) { Log.Warnw(msg, f, a...) } -func Errorw(msg string, f F, a ...any) { Log.Errorw(msg, f, a...) } -func Fatalw(msg string, f F, a ...any) { Log.Fatalw(msg, f, a...) } - -func SetOutput(w io.Writer) { Log.SetOutput(w) } -func SetLevel(l Level) { Log.SetLevel(l) } -func EnableTimestamps(on bool) { Log.EnableTimestamps(on) } -func SetTimeFormat(tf string) { Log.SetTimeFormat(tf) } -func SetJSON(on bool) { Log.SetJSON(on) } -func EnableColors(on bool) { Log.EnableColors(on) } -func ShowCaller(on bool) { Log.ShowCaller(on) } -func WithFields(f F) *Logger { return Log.WithFields(f) } diff --git a/internal/bot/persistence/sql/queries.sql b/internal/bot/persistence/sql/queries.sql deleted file mode 100644 index 9a6c299..0000000 --- a/internal/bot/persistence/sql/queries.sql +++ /dev/null @@ -1,18 +0,0 @@ --- name: UpsertUser :exec -INSERT INTO users (user_id, lastfm_username) -VALUES (:user_id, :lastfm_username) -ON CONFLICT(user_id) DO UPDATE SET lastfm_username = excluded.lastfm_username; - --- name: GetUserByID :one -SELECT user_id, lastfm_username, created_at -FROM users -WHERE user_id = :user_id; - --- name: GetUserByLastFM :one -SELECT user_id, lastfm_username, created_at -FROM users -WHERE lastfm_username = :lastfm_username; - --- name: DeleteUser :exec -DELETE FROM users -WHERE user_id = :user_id; diff --git a/internal/bot/persistence/sql/schema.sql b/internal/bot/persistence/sql/schema.sql deleted file mode 100644 index 0e11f0b..0000000 --- a/internal/bot/persistence/sql/schema.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE IF NOT EXISTS users ( - user_id TEXT PRIMARY KEY, - lastfm_username TEXT NOT NULL, - created_at DATETIME DEFAULT CURRENT_TIMESTAMP -); - -CREATE UNIQUE INDEX IF NOT EXISTS idx_users_lastfm_username -ON users(lastfm_username); diff --git a/internal/bot/persistence/sqlc/db.go b/internal/bot/persistence/sqlc/db.go deleted file mode 100644 index 4354f55..0000000 --- a/internal/bot/persistence/sqlc/db.go +++ /dev/null @@ -1,118 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.30.0 - -package sqlc - -import ( - "context" - "database/sql" - "fmt" -) - -type DBTX interface { - ExecContext(context.Context, string, ...interface{}) (sql.Result, error) - PrepareContext(context.Context, string) (*sql.Stmt, error) - QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) - QueryRowContext(context.Context, string, ...interface{}) *sql.Row -} - -func New(db DBTX) *Queries { - return &Queries{db: db} -} - -func Prepare(ctx context.Context, db DBTX) (*Queries, error) { - q := Queries{db: db} - var err error - if q.deleteUserStmt, err = db.PrepareContext(ctx, deleteUser); err != nil { - return nil, fmt.Errorf("error preparing query DeleteUser: %w", err) - } - if q.getUserByIDStmt, err = db.PrepareContext(ctx, getUserByID); err != nil { - return nil, fmt.Errorf("error preparing query GetUserByID: %w", err) - } - if q.getUserByLastFMStmt, err = db.PrepareContext(ctx, getUserByLastFM); err != nil { - return nil, fmt.Errorf("error preparing query GetUserByLastFM: %w", err) - } - if q.upsertUserStmt, err = db.PrepareContext(ctx, upsertUser); err != nil { - return nil, fmt.Errorf("error preparing query UpsertUser: %w", err) - } - return &q, nil -} - -func (q *Queries) Close() error { - var err error - if q.deleteUserStmt != nil { - if cerr := q.deleteUserStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing deleteUserStmt: %w", cerr) - } - } - if q.getUserByIDStmt != nil { - if cerr := q.getUserByIDStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing getUserByIDStmt: %w", cerr) - } - } - if q.getUserByLastFMStmt != nil { - if cerr := q.getUserByLastFMStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing getUserByLastFMStmt: %w", cerr) - } - } - if q.upsertUserStmt != nil { - if cerr := q.upsertUserStmt.Close(); cerr != nil { - err = fmt.Errorf("error closing upsertUserStmt: %w", cerr) - } - } - return err -} - -func (q *Queries) exec(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (sql.Result, error) { - switch { - case stmt != nil && q.tx != nil: - return q.tx.StmtContext(ctx, stmt).ExecContext(ctx, args...) - case stmt != nil: - return stmt.ExecContext(ctx, args...) - default: - return q.db.ExecContext(ctx, query, args...) - } -} - -func (q *Queries) query(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (*sql.Rows, error) { - switch { - case stmt != nil && q.tx != nil: - return q.tx.StmtContext(ctx, stmt).QueryContext(ctx, args...) - case stmt != nil: - return stmt.QueryContext(ctx, args...) - default: - return q.db.QueryContext(ctx, query, args...) - } -} - -func (q *Queries) queryRow(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) *sql.Row { - switch { - case stmt != nil && q.tx != nil: - return q.tx.StmtContext(ctx, stmt).QueryRowContext(ctx, args...) - case stmt != nil: - return stmt.QueryRowContext(ctx, args...) - default: - return q.db.QueryRowContext(ctx, query, args...) - } -} - -type Queries struct { - db DBTX - tx *sql.Tx - deleteUserStmt *sql.Stmt - getUserByIDStmt *sql.Stmt - getUserByLastFMStmt *sql.Stmt - upsertUserStmt *sql.Stmt -} - -func (q *Queries) WithTx(tx *sql.Tx) *Queries { - return &Queries{ - db: tx, - tx: tx, - deleteUserStmt: q.deleteUserStmt, - getUserByIDStmt: q.getUserByIDStmt, - getUserByLastFMStmt: q.getUserByLastFMStmt, - upsertUserStmt: q.upsertUserStmt, - } -} diff --git a/internal/bot/persistence/sqlc/models.go b/internal/bot/persistence/sqlc/models.go deleted file mode 100644 index f441911..0000000 --- a/internal/bot/persistence/sqlc/models.go +++ /dev/null @@ -1,15 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.30.0 - -package sqlc - -import ( - "database/sql" -) - -type User struct { - UserID string - LastfmUsername string - CreatedAt sql.NullTime -} diff --git a/internal/bot/persistence/sqlc/queries.sql.go b/internal/bot/persistence/sqlc/queries.sql.go deleted file mode 100644 index 148f827..0000000 --- a/internal/bot/persistence/sqlc/queries.sql.go +++ /dev/null @@ -1,62 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.30.0 -// source: queries.sql - -package sqlc - -import ( - "context" -) - -const deleteUser = `-- name: DeleteUser :exec -DELETE FROM users -WHERE user_id = ?1 -` - -func (q *Queries) DeleteUser(ctx context.Context, userID string) error { - _, err := q.exec(ctx, q.deleteUserStmt, deleteUser, userID) - return err -} - -const getUserByID = `-- name: GetUserByID :one -SELECT user_id, lastfm_username, created_at -FROM users -WHERE user_id = ?1 -` - -func (q *Queries) GetUserByID(ctx context.Context, userID string) (User, error) { - row := q.queryRow(ctx, q.getUserByIDStmt, getUserByID, userID) - var i User - err := row.Scan(&i.UserID, &i.LastfmUsername, &i.CreatedAt) - return i, err -} - -const getUserByLastFM = `-- name: GetUserByLastFM :one -SELECT user_id, lastfm_username, created_at -FROM users -WHERE lastfm_username = ?1 -` - -func (q *Queries) GetUserByLastFM(ctx context.Context, lastfmUsername string) (User, error) { - row := q.queryRow(ctx, q.getUserByLastFMStmt, getUserByLastFM, lastfmUsername) - var i User - err := row.Scan(&i.UserID, &i.LastfmUsername, &i.CreatedAt) - return i, err -} - -const upsertUser = `-- name: UpsertUser :exec -INSERT INTO users (user_id, lastfm_username) -VALUES (?1, ?2) -ON CONFLICT(user_id) DO UPDATE SET lastfm_username = excluded.lastfm_username -` - -type UpsertUserParams struct { - UserID string - LastfmUsername string -} - -func (q *Queries) UpsertUser(ctx context.Context, arg UpsertUserParams) error { - _, err := q.exec(ctx, q.upsertUserStmt, upsertUser, arg.UserID, arg.LastfmUsername) - return err -} diff --git a/internal/bot/persistence/sqlc/start.go b/internal/bot/persistence/sqlc/start.go deleted file mode 100644 index 7ad73ed..0000000 --- a/internal/bot/persistence/sqlc/start.go +++ /dev/null @@ -1,38 +0,0 @@ -package sqlc - -import ( - "context" - "database/sql" - "embed" - "fmt" - "time" - - _ "github.com/mattn/go-sqlite3" -) - -var schemaLocation = "../sql/schema.sql" -var schema embed.FS - -func Start(ctx context.Context, path string) (*Queries, *sql.DB, error) { - sqlDB, err := sql.Open("sqlite3", path) - if err != nil { - return nil, nil, fmt.Errorf("failed to open database: %w", err) - } - - sqlDB.SetMaxOpenConns(1) - sqlDB.SetConnMaxLifetime(time.Minute) - - schema, _ := schema.ReadFile(schemaLocation) - - if _, err := sqlDB.ExecContext(ctx, string(schema)); err != nil { - sqlDB.Close() - return nil, nil, fmt.Errorf("failed to create schema: %w", err) - } - - queries, err := Prepare(ctx, sqlDB) - if err != nil { - return nil, nil, fmt.Errorf("failed to prepare queries: %w", err) - } - - return queries, sqlDB, nil -} diff --git a/internal/commands/stats/stats.go b/internal/commands/stats/stats.go new file mode 100644 index 0000000..c6602ea --- /dev/null +++ b/internal/commands/stats/stats.go @@ -0,0 +1,23 @@ +package stats + +import ( + "first.fm/internal/bot" + "github.com/disgoorg/disgo/discord" +) + +func init() { + bot.Register(data, handle) +} + +var data = discord.SlashCommandCreate{ + Name: "stats", + Description: "display first.fm stats", + IntegrationTypes: []discord.ApplicationIntegrationType{ + discord.ApplicationIntegrationTypeGuildInstall, + discord.ApplicationIntegrationTypeUserInstall, + }, +} + +func handle(ctx *bot.CommandContext) error { + return ctx.Event.CreateMessage(discord.NewMessageCreateBuilder().SetContent("stats").Build()) +} diff --git a/internal/lastfm/README.md b/internal/lastfm/README.md new file mode 100644 index 0000000..2e98e71 --- /dev/null +++ b/internal/lastfm/README.md @@ -0,0 +1,2 @@ +code adapted from https://github.com/twoscott/gobble-fm, licensed under +MIT license. diff --git a/internal/lastfm/album.go b/internal/lastfm/album.go new file mode 100644 index 0000000..191339b --- /dev/null +++ b/internal/lastfm/album.go @@ -0,0 +1,179 @@ +package lastfm + +// https://www.last.fm/api/show/album.addTags +type AlbumAddTagsParams struct { + Artist string `url:"artist"` + Album string `url:"album"` + Tags []string `url:"tags,comma"` +} + +// https://www.last.fm/api/show/album.getInfo +type AlbumInfoParams struct { + Artist string `url:"artist"` + Album string `url:"album"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` + // The language to return the biography in, as an ISO 639 alpha-2 code. + Language string `url:"lang,omitempty"` +} + +// https://www.last.fm/api/show/album.getInfo +type AlbumInfoMBIDParams struct { + MBID string `url:"mbid"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` + // The language to return the biography in, as an ISO 639 alpha-2 code. + Language string `url:"lang,omitempty"` +} + +// https://www.last.fm/api/show/album.getInfo +type AlbumUserInfoParams struct { + Artist string `url:"artist"` + Album string `url:"album"` + User string `url:"username"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` + // The language to return the biography in, as an ISO 639 alpha-2 code. + Language string `url:"lang,omitempty"` +} + +// https://www.last.fm/api/show/album.getInfo +type AlbumUserInfoMBIDParams struct { + MBID string `url:"mbid"` + User string `url:"username"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` + // The language to return the biography in, as an ISO 639 alpha-2 code. + Language string `url:"lang,omitempty"` +} + +// https://www.last.fm/api/show/album.getInfo#attributes +type AlbumInfo struct { + Title string `xml:"name"` + Artist string `xml:"artist"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Listeners int `xml:"listeners"` + Playcount int `xml:"playcount"` + Image Image `xml:"image"` + Tracks []struct { + Title string `xml:"name"` + Number int `xml:"rank,attr"` + URL string `xml:"url"` + Duration Duration `xml:"duration"` + Streamable struct { + Preview IntBool `xml:",chardata"` + FullTrack IntBool `xml:"fulltrack,attr"` + } `xml:"streamable"` + Artist struct { + Name string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + } `xml:"artist"` + } `xml:"tracks>track"` + Tags []struct { + Name string `xml:"name"` + URL string `xml:"url"` + } `xml:"tags>tag"` + Wiki struct { + Summary string `xml:"summary"` + Content string `xml:"content"` + PublishedAt DateTime `xml:"published"` + } `xml:"wiki"` +} + +type AlbumUserInfo struct { + AlbumInfo + UserPlaycount int `xml:"userplaycount"` +} + +// https://www.last.fm/api/show/album.getTags +type AlbumTagsParams struct { + Artist string `url:"artist"` + Album string `url:"album"` + User string `url:"username"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/album.getTags +type AlbumTagsMBIDParams struct { + MBID string `url:"mbid"` + User string `url:"username"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/album.getTags +type AlbumSelfTagsParams struct { + Artist string `url:"artist"` + Album string `url:"album"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/album.getTags +type AlbumSelfTagsMBIDParams struct { + MBID string `url:"mbid"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +type AlbumTags struct { + Artist string `xml:"artist,attr"` + Album string `xml:"album,attr"` + Tags []struct { + Name string `xml:"name"` + URL string `xml:"url"` + } `xml:"tag"` +} + +// https://www.last.fm/api/show/album.getTopTags +type AlbumTopTagsParams struct { + Artist string `url:"artist"` + Album string `url:"album"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/album.getTopTags +type AlbumTopTagsMBIDParams struct { + MBID string `url:"mbid"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/album.getTopTags#attributes +type AlbumTopTags struct { + Artist string `xml:"artist,attr"` + Album string `xml:"album,attr"` + Tags []struct { + Name string `xml:"name"` + URL string `xml:"url"` + Count int `xml:"count"` + } `xml:"tag"` +} + +// https://www.last.fm/api/show/album.removeTag +type AlbumRemoveTagParams struct { + Artist string `url:"artist"` + Album string `url:"album"` + Tag string `url:"tag"` +} + +// https://www.last.fm/api/show/album.search +type AlbumSearchParams struct { + Album string `url:"album"` + Limit uint `url:"limit,omitempty"` + Page uint `url:"page,omitempty"` +} + +type AlbumSearchResult struct { + For string `xml:"for,attr"` + Query struct { + Role string `xml:"role,attr"` + SearchTerms string `xml:"searchTerms,attr"` + StartPage int `xml:"startPage,attr"` + } `xml:"Query"` + TotalResults int `xml:"totalResults"` + StartIndex int `xml:"startIndex"` + PerPage int `xml:"itemsPerPage"` + Albums []struct { + Title string `xml:"name"` + Artist string `xml:"artist"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Streamable IntBool `xml:"streamable"` + Image Image `xml:"image"` + } `xml:"albummatches>album"` +} diff --git a/internal/lastfm/api/album.go b/internal/lastfm/api/album.go new file mode 100644 index 0000000..822a159 --- /dev/null +++ b/internal/lastfm/api/album.go @@ -0,0 +1,72 @@ +package api + +import "first.fm/internal/lastfm" + +type Album struct { + api *API +} + +// NewAlbum creates and returns a new Album API route. +func NewAlbum(api *API) *Album { + return &Album{api: api} +} + +// Info returns the information of an album by artist and album name. +func (a Album) Info(params lastfm.AlbumInfoParams) (*lastfm.AlbumInfo, error) { + var res lastfm.AlbumInfo + return &res, a.api.Get(&res, AlbumGetInfoMethod, params) +} + +// InfoByMBID returns the information of an album by MBID. +func (a Album) InfoByMBID(params lastfm.AlbumInfoMBIDParams) (*lastfm.AlbumInfo, error) { + var res lastfm.AlbumInfo + return &res, a.api.Get(&res, AlbumGetInfoMethod, params) +} + +// UserInfo returns the information of an album for user by artist and album +// name. +func (a Album) UserInfo(params lastfm.AlbumUserInfoParams) (*lastfm.AlbumUserInfo, error) { + var res lastfm.AlbumUserInfo + return &res, a.api.Get(&res, AlbumGetInfoMethod, params) +} + +// UserInfoByMBID returns the information of an album for user by MBID. +func (a Album) UserInfoByMBID( + params lastfm.AlbumUserInfoMBIDParams) (*lastfm.AlbumUserInfo, error) { + + var res lastfm.AlbumUserInfo + return &res, a.api.Get(&res, AlbumGetInfoMethod, params) +} + +// UserTags returns the tags of an album for user by artist and album name. +func (a Album) UserTags(params lastfm.AlbumTagsParams) (*lastfm.AlbumTags, error) { + var res lastfm.AlbumTags + return &res, a.api.Get(&res, AlbumGetTagsMethod, params) +} + +// UserTagsByMBID returns the tags of an album for user by MBID. +func (a Album) UserTagsByMBID(params lastfm.AlbumTagsMBIDParams) (*lastfm.AlbumTags, error) { + var res lastfm.AlbumTags + return &res, a.api.Get(&res, AlbumGetTagsMethod, params) +} + +// TopTags returns the top tags of an album by artist and album name. +func (a Album) TopTags(params lastfm.AlbumTopTagsParams) (*lastfm.AlbumTopTags, error) { + var res lastfm.AlbumTopTags + return &res, a.api.Get(&res, AlbumGetTopTagsMethod, params) +} + +// TopTagsByMBID returns the top tags of an album by MBID. +// +// Deprecated: Fetching top tags by MBID doesn't seem to work. Use TopTags +// instead. +func (a Album) TopTagsByMBID(params lastfm.AlbumTopTagsMBIDParams) (*lastfm.AlbumTopTags, error) { + var res lastfm.AlbumTopTags + return &res, a.api.Get(&res, AlbumGetTopTagsMethod, params) +} + +// Search returns the results of an album search. +func (a Album) Search(params lastfm.AlbumSearchParams) (*lastfm.AlbumSearchResult, error) { + var res lastfm.AlbumSearchResult + return &res, a.api.Get(&res, AlbumSearchMethod, params) +} diff --git a/internal/lastfm/api/api.go b/internal/lastfm/api/api.go new file mode 100644 index 0000000..c7e4cbd --- /dev/null +++ b/internal/lastfm/api/api.go @@ -0,0 +1,205 @@ +package api + +import ( + "encoding/xml" + "errors" + "fmt" + "io" + "net/http" + "net/url" + "strings" + "time" + + "first.fm/internal/lastfm" +) + +var ( + BaseEndpoint = "https://ws.audioscrobbler.com" + Version = "2.0" + Endpoint = BaseEndpoint + "/" + Version + "/" +) + +const ( + DefaultUserAgent = "first.fm/0.0.1 (discord bot; https://github.com/nxtgo/first.fm; contact: yehorovye@disroot.org)" + DefaultRetries uint = 5 + DefaultTimeout = 30 +) + +type RequestLevel int + +const ( + RequestLevelNone RequestLevel = iota + RequestLevelAPIKey +) + +type HTTPClient interface { + Do(req *http.Request) (*http.Response, error) +} + +type API struct { + APIKey string + UserAgent string + Retries uint + Client HTTPClient +} + +func New(apiKey string) *API { + return NewWithTimeout(apiKey, DefaultTimeout) +} + +func NewWithTimeout(apiKey string, timeout int) *API { + t := time.Duration(timeout) * time.Second + return &API{ + APIKey: apiKey, + UserAgent: DefaultUserAgent, + Retries: DefaultRetries, + Client: &http.Client{Timeout: t}, + } +} + +func (a *API) SetUserAgent(userAgent string) { a.UserAgent = userAgent } +func (a *API) SetRetries(retries uint) { a.Retries = retries } + +func (a API) CheckCredentials(level RequestLevel) error { + if level == RequestLevelAPIKey && a.APIKey == "" { + return NewLastFMError(ErrAPIKeyMissing, APIKeyMissingMessage) + } + if a.Client == nil { + return errors.New("client uninitalized") + } + return nil +} + +func (a API) Get(dest any, method APIMethod, params any) error { + return a.Request(dest, http.MethodGet, method, params) +} + +func (a API) Post(dest any, method APIMethod, params any) error { + return a.Request(dest, http.MethodPost, method, params) +} + +func (a API) Request(dest any, httpMethod string, method APIMethod, params any) error { + if err := a.CheckCredentials(RequestLevelAPIKey); err != nil { + return err + } + + p, err := lastfm.EncodeToValues(params) + if err != nil { + return err + } + + p.Set("api_key", a.APIKey) + p.Set("method", string(method)) + + switch httpMethod { + case http.MethodGet: + return a.GetURL(dest, BuildAPIURL(p)) + case http.MethodPost: + return a.PostBody(dest, Endpoint, p.Encode()) + default: + return errors.New("unsupported http method") + } +} + +func (a API) GetURL(dest any, url string) error { + return a.tryRequest(dest, http.MethodGet, url, "") +} + +func (a API) PostBody(dest any, url, body string) error { + return a.tryRequest(dest, http.MethodPost, url, body) +} + +func (a API) tryRequest(dest any, method, url, body string) error { + var ( + res *http.Response + lfm LFMWrapper + lferr *LastFMError + err error + ) + + for i := uint(0); i <= a.Retries; i++ { + var req *http.Request + switch method { + case http.MethodGet: + req, err = a.createGetRequest(url) + case http.MethodPost: + req, err = a.createPostRequest(url, body) + default: + req, err = a.createRequest(method, url, body) + } + if err != nil { + return err + } + + res, err = a.Client.Do(req) + if err != nil { + return err + } + + err = xml.NewDecoder(res.Body).Decode(&lfm) + res.Body.Close() + if err == nil { + lferr, _ = lfm.UnwrapError() + } + + if res.StatusCode >= 500 || res.StatusCode == http.StatusTooManyRequests { + continue + } + if lferr != nil && lferr.ShouldRetry() { + continue + } + break + } + + if lferr != nil { + return lferr.WrapResponse(res) + } + if res.StatusCode < http.StatusOK || res.StatusCode > http.StatusIMUsed { + return NewHTTPError(res) + } + if errors.Is(err, io.EOF) { + return fmt.Errorf("invalid xml response: %w", err) + } + if err != nil { + return err + } + + if dest == nil { + return nil + } + if err = lfm.UnmarshalInnerXML(dest); err != nil { + return fmt.Errorf("failed to unmarshal response: %w", err) + } + return nil +} + +func (a API) createGetRequest(url string) (*http.Request, error) { + return a.createRequest(http.MethodGet, url, "") +} + +func (a API) createPostRequest(url, body string) (*http.Request, error) { + req, err := a.createRequest(http.MethodPost, url, body) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + return req, nil +} + +func (a API) createRequest(method, url, body string) (*http.Request, error) { + var r io.Reader + if body != "" { + r = strings.NewReader(body) + } + req, err := http.NewRequest(method, url, r) + if err != nil { + return nil, err + } + req.Header.Set("User-Agent", a.UserAgent) + req.Header.Set("Accept", "application/xml") + return req, nil +} + +func BuildAPIURL(params url.Values) string { + return Endpoint + "?" + params.Encode() +} diff --git a/internal/lastfm/api/artist.go b/internal/lastfm/api/artist.go new file mode 100644 index 0000000..088afde --- /dev/null +++ b/internal/lastfm/api/artist.go @@ -0,0 +1,119 @@ +package api + +import "first.fm/internal/lastfm" + +type Artist struct { + api *API +} + +// NewArtist creates and returns a new Artist API route. +func NewArtist(api *API) *Artist { + return &Artist{api: api} +} + +// Correction returns the artist name corrections of an artist. +func (a Artist) Correction(artist string) (*lastfm.ArtistCorrection, error) { + var res lastfm.ArtistCorrection + p := lastfm.ArtistCorrectionParams{Artist: artist} + return &res, a.api.Get(&res, ArtistGetCorrectionMethod, p) +} + +// Info returns the information of an artist by artist name. +func (a Artist) Info(params lastfm.ArtistInfoParams) (*lastfm.ArtistInfo, error) { + var res lastfm.ArtistInfo + return &res, a.api.Get(&res, ArtistGetInfoMethod, params) +} + +// InfoByMBID returns the information of an artist by MBID. +func (a Artist) InfoByMBID(params lastfm.ArtistInfoMBIDParams) (*lastfm.ArtistInfo, error) { + var res lastfm.ArtistInfo + return &res, a.api.Get(&res, ArtistGetInfoMethod, params) +} + +// UserInfo returns the information of an artist for user by artist name. +func (a Artist) UserInfo(params lastfm.ArtistUserInfoParams) (*lastfm.ArtistUserInfo, error) { + var res lastfm.ArtistUserInfo + return &res, a.api.Get(&res, ArtistGetInfoMethod, params) +} + +// UserInfoByMBID returns the information of an artist for user by MBID. +func (a Artist) UserInfoByMBID( + params lastfm.ArtistUserInfoMBIDParams) (*lastfm.ArtistUserInfo, error) { + + var res lastfm.ArtistUserInfo + return &res, a.api.Get(&res, ArtistGetInfoMethod, params) +} + +// Similar returns the similar artists of an artist by artist name. +func (a Artist) Similar(params lastfm.ArtistSimilarParams) (*lastfm.SimilarArtists, error) { + var res lastfm.SimilarArtists + return &res, a.api.Get(&res, ArtistGetSimilarMethod, params) +} + +// SimilarByMBID returns the similar artists of an artist by MBID. +func (a Artist) SimilarByMBID( + params lastfm.ArtistSimilarMBIDParams) (*lastfm.SimilarArtists, error) { + + var res lastfm.SimilarArtists + return &res, a.api.Get(&res, ArtistGetSimilarMethod, params) +} + +// UserTags returns the tags of an artist for user by artist name. +func (a Artist) UserTags(params lastfm.ArtistTagsParams) (*lastfm.ArtistTags, error) { + var res lastfm.ArtistTags + return &res, a.api.Get(&res, ArtistGetTagsMethod, params) +} + +// UserTagsByMBID returns the tags of an artist for user by MBID. +func (a Artist) UserTagsByMBID(params lastfm.ArtistTagsMBIDParams) (*lastfm.ArtistTags, error) { + var res lastfm.ArtistTags + return &res, a.api.Get(&res, ArtistGetTagsMethod, params) +} + +// TopAlbums returns the top albums of an artist by artist name. +func (a Artist) TopAlbums(params lastfm.ArtistTopAlbumsParams) (*lastfm.ArtistTopAlbums, error) { + var res lastfm.ArtistTopAlbums + return &res, a.api.Get(&res, ArtistGetTopAlbumsMethod, params) +} + +// TopAlbumsByMBID returns the top albums of an artist by MBID. +func (a Artist) TopAlbumsByMBID( + params lastfm.ArtistTopAlbumsMBIDParams) (*lastfm.ArtistTopAlbums, error) { + + var res lastfm.ArtistTopAlbums + return &res, a.api.Get(&res, ArtistGetTopAlbumsMethod, params) +} + +// TopTracks returns the top tracks of an artist by artist name. +func (a Artist) TopTags(params lastfm.ArtistTopTagsParams) (*lastfm.ArtistTopTags, error) { + var res lastfm.ArtistTopTags + return &res, a.api.Get(&res, ArtistGetTopTagsMethod, params) +} + +// TopTagsByMBID returns the top tracks of an artist by MBID. +func (a Artist) TopTagsByMBID( + params lastfm.ArtistTopTagsMBIDParams) (*lastfm.ArtistTopTags, error) { + + var res lastfm.ArtistTopTags + return &res, a.api.Get(&res, ArtistGetTopTagsMethod, params) +} + +// TopTracks returns the top tracks of an artist by artist name. +func (a Artist) TopTracks(params lastfm.ArtistTopTracksParams) (*lastfm.ArtistTopTracks, error) { + var res lastfm.ArtistTopTracks + return &res, a.api.Get(&res, ArtistGetTopTracksMethod, params) +} + +// TopTracksByMBID returns the top tracks of an artist by MBID. +func (a Artist) TopTracksByMBID( + params lastfm.ArtistTopTracksMBIDParams) (*lastfm.ArtistTopTracks, error) { + + var res lastfm.ArtistTopTracks + return &res, a.api.Get(&res, ArtistGetTopTracksMethod, params) +} + +// Search returns the results of an album search. +func (a Artist) Search(params lastfm.ArtistSearchParams) (*lastfm.ArtistSearchResult, error) { + var res lastfm.ArtistSearchResult + return &res, a.api.Get(&res, ArtistSearchMethod, params) +} diff --git a/internal/lastfm/api/chart.go b/internal/lastfm/api/chart.go new file mode 100644 index 0000000..d425331 --- /dev/null +++ b/internal/lastfm/api/chart.go @@ -0,0 +1,47 @@ +package api + +import "first.fm/internal/lastfm" + +type Chart struct { + api *API +} + +// NewChart creates and returns a new Chart API route. +func NewChart(api *API) *Chart { + return &Chart{api: api} +} + +// TopArtistsLimit returns the top artists of the chart. +func (c Chart) TopArtistsLimit(params *lastfm.ChartTopArtistsParams) (*lastfm.ChartTopArtists, error) { + var res lastfm.ChartTopArtists + return &res, c.api.Get(&res, ChartGetTopArtistsMethod, params) +} + +// TopArtists returns all the top artists of the chart. Same as +// TopArtistsLimit(nil). +func (c Chart) TopArtists() (*lastfm.ChartTopArtists, error) { + return c.TopArtistsLimit(nil) +} + +// TopTagsLimit returns the top tags of the chart. +func (c Chart) TopTagsLimit(params *lastfm.ChartTopTagsParams) (*lastfm.ChartTopTags, error) { + var res lastfm.ChartTopTags + return &res, c.api.Get(&res, ChartGetTopTagsMethod, params) +} + +// TopTags returns the top tags of the chart. Same as TopTagsLimit(nil). +func (c Chart) TopTags() (*lastfm.ChartTopTags, error) { + return c.TopTagsLimit(nil) +} + +// TopTracksLimit returns the top tracks of the chart. +func (c Chart) TopTracksLimit(params *lastfm.ChartTopTracksParams) (*lastfm.ChartTopTracks, error) { + var res lastfm.ChartTopTracks + return &res, c.api.Get(&res, ChartGetTopTracksMethod, params) +} + +// TopTracks returns all the top tracks of the chart. Same as +// TopTracksLimit(nil). +func (c Chart) TopTracks() (*lastfm.ChartTopTracks, error) { + return c.TopTracksLimit(nil) +} diff --git a/internal/lastfm/api/client.go b/internal/lastfm/api/client.go new file mode 100644 index 0000000..ed77c89 --- /dev/null +++ b/internal/lastfm/api/client.go @@ -0,0 +1,25 @@ +package api + +type Client struct { + *API + Album *Album + Artist *Artist + Chart *Chart + Track *Track + User *User +} + +func NewClient(apiKey string) *Client { + return newClient(New(apiKey)) +} + +func newClient(a *API) *Client { + return &Client{ + API: a, + Album: NewAlbum(a), + Artist: NewArtist(a), + Chart: NewChart(a), + Track: NewTrack(a), + User: NewUser(a), + } +} diff --git a/internal/lastfm/api/method.go b/internal/lastfm/api/method.go new file mode 100644 index 0000000..cbe5458 --- /dev/null +++ b/internal/lastfm/api/method.go @@ -0,0 +1,75 @@ +package api + +type APIMethod string + +func (m APIMethod) String() string { + return string(m) +} + +const ( + AlbumAddTagsMethod APIMethod = "album.addTags" + AlbumGetInfoMethod APIMethod = "album.getInfo" + AlbumGetTagsMethod APIMethod = "album.getTags" + AlbumGetTopTagsMethod APIMethod = "album.getTopTags" + AlbumRemoveTagMethod APIMethod = "album.removeTag" + AlbumSearchMethod APIMethod = "album.search" + + ArtistAddTagsMethod APIMethod = "artist.addTags" + ArtistGetCorrectionMethod APIMethod = "artist.getCorrection" + ArtistGetInfoMethod APIMethod = "artist.getInfo" + ArtistGetSimilarMethod APIMethod = "artist.getSimilar" + ArtistGetTagsMethod APIMethod = "artist.getTags" + ArtistGetTopAlbumsMethod APIMethod = "artist.getTopAlbums" + ArtistGetTopTagsMethod APIMethod = "artist.getTopTags" + ArtistGetTopTracksMethod APIMethod = "artist.getTopTracks" + ArtistRemoveTagMethod APIMethod = "artist.removeTag" + ArtistSearchMethod APIMethod = "artist.search" + + AuthGetMobileSessionMethod APIMethod = "auth.getMobileSession" + AuthGetSessionMethod APIMethod = "auth.getSession" + AuthGetTokenMethod APIMethod = "auth.getToken" + + ChartGetTopArtistsMethod APIMethod = "chart.getTopArtists" + ChartGetTopTagsMethod APIMethod = "chart.getTopTags" + ChartGetTopTracksMethod APIMethod = "chart.getTopTracks" + + GeoGetTopArtistsMethod APIMethod = "geo.getTopArtists" + GeoGetTopTracksMethod APIMethod = "geo.getTopTracks" + + LibraryGetArtistsMethod APIMethod = "library.getArtists" + + TagGetInfoMethod APIMethod = "tag.getInfo" + TagGetSimilarMethod APIMethod = "tag.getSimilar" + TagGetTopAlbumsMethod APIMethod = "tag.getTopAlbums" + TagGetTopArtistsMethod APIMethod = "tag.getTopArtists" + TagGetTopTagsMethod APIMethod = "tag.getTopTags" + TagGetTopTracksMethod APIMethod = "tag.getTopTracks" + TagGetWeeklyChartListMethod APIMethod = "tag.getWeeklyChartList" + + TrackAddTagsMethod APIMethod = "track.addTags" + TrackGetCorrectionMethod APIMethod = "track.getCorrection" + TrackGetInfoMethod APIMethod = "track.getInfo" + TrackGetSimilarMethod APIMethod = "track.getSimilar" + TrackGetTagsMethod APIMethod = "track.getTags" + TrackGetTopTagsMethod APIMethod = "track.getTopTags" + TrackLoveMethod APIMethod = "track.love" + TrackRemoveTagMethod APIMethod = "track.removeTag" + TrackScrobbleMethod APIMethod = "track.scrobble" + TrackSearchMethod APIMethod = "track.search" + TrackUnloveMethod APIMethod = "track.unlove" + TrackUpdateNowPlayingMethod APIMethod = "track.updateNowPlaying" + + UserGetFriendsMethod APIMethod = "user.getFriends" + UserGetInfoMethod APIMethod = "user.getInfo" + UserGetLovedTracksMethod APIMethod = "user.getLovedTracks" + UserGetPersonalTagsMethod APIMethod = "user.getPersonalTags" + UserGetRecentTracksMethod APIMethod = "user.getRecentTracks" + UserGetTopAlbumsMethod APIMethod = "user.getTopAlbums" + UserGetTopArtistsMethod APIMethod = "user.getTopArtists" + UserGetTopTagsMethod APIMethod = "user.getTopTags" + UserGetTopTracksMethod APIMethod = "user.getTopTracks" + UserGetWeeklyAlbumChartMethod APIMethod = "user.getWeeklyAlbumChart" + UserGetWeeklyArtistChartMethod APIMethod = "user.getWeeklyArtistChart" + UserGetWeeklyChartListMethod APIMethod = "user.getWeeklyChartList" + UserGetWeeklyTrackChartMethod APIMethod = "user.getWeeklyTrackChart" +) diff --git a/internal/lastfm/api/response.go b/internal/lastfm/api/response.go new file mode 100644 index 0000000..cd48a94 --- /dev/null +++ b/internal/lastfm/api/response.go @@ -0,0 +1,128 @@ +package api + +import ( + "encoding/xml" + "errors" + "fmt" + "net/http" +) + +type ErrorCode int + +const ( + NoError ErrorCode = iota + _ + ErrInvalidService + ErrInvalidMethod + ErrAuthenticationFailed + ErrInvalidFormat + ErrInvalidParameters + ErrInvalidResource + ErrOperationFailed + ErrInvalidSessionKey + ErrInvalidAPIKey + ErrServiceOffline + ErrSubscribersOnly + ErrInvalidMethodSignature + ErrUnauthorizedToken + ErrItemNotStreamable + ErrServiceUnavailable + ErrUserNotLoggedIn + ErrTrialExpired + _ + ErrNotEnoughContent + ErrNotEnoughMembers + ErrNotEnoughFans + ErrNotEnoughNeighbours + ErrNoPeakRadio + ErrRadioNotFound + ErrAPIKeySuspended + ErrDeprecated + _ + ErrRateLimitExceeded +) + +const ( + ErrAPIKeyMissing ErrorCode = iota + 100 + ErrSecretRequired + ErrSessionRequired +) + +const ( + APIKeyMissingMessage = "API Key is missing" + SecretRequiredMessage = "Method requires API secret" + SessionRequiredMessage = "Method requires user authentication (session key)" +) + +type LFMWrapper struct { + XMLName xml.Name `xml:"lfm"` + Status string `xml:"status,attr"` + InnerXML []byte `xml:",innerxml"` +} + +func (lf *LFMWrapper) Empty() bool { return len(lf.InnerXML) == 0 } +func (lf *LFMWrapper) StatusOK() bool { return lf.Status == "ok" } +func (lf *LFMWrapper) StatusFailed() bool { return lf.Status == "failed" } +func (lf *LFMWrapper) UnmarshalInnerXML(dest any) error { return xml.Unmarshal(lf.InnerXML, dest) } +func (lf *LFMWrapper) UnwrapError() (*LastFMError, error) { + if lf.StatusOK() { + return nil, nil + } + var lferr LastFMError + if err := lf.UnmarshalInnerXML(&lferr); err != nil { + return nil, err + } + if lferr.HasErrorCode() { + return &lferr, nil + } + return nil, errors.New("no error code in response") +} + +type LastFMError struct { + Code ErrorCode `xml:"code,attr"` + Message string `xml:",chardata"` + httpError *HTTPError +} + +func NewLastFMError(code ErrorCode, message string) *LastFMError { + return &LastFMError{Code: code, Message: message} +} +func (e *LastFMError) Error() string { return fmt.Sprintf("Last.fm Error: %d - %s", e.Code, e.Message) } +func (e *LastFMError) Is(target error) bool { + if t, ok := target.(*LastFMError); ok { + return e.IsCode(t.Code) + } + return false +} +func (e *LastFMError) Unwrap() error { return e.httpError } +func (e *LastFMError) WrapHTTPError(httpError *HTTPError) *LastFMError { + e.httpError = httpError + return e +} +func (e *LastFMError) WrapResponse(res *http.Response) *LastFMError { + return e.WrapHTTPError(NewHTTPError(res)) +} +func (e LastFMError) IsCode(code ErrorCode) bool { return e.Code == code } +func (e LastFMError) HasErrorCode() bool { return e.Code != NoError } +func (e LastFMError) ShouldRetry() bool { + return e.Code == ErrOperationFailed || e.Code == ErrServiceUnavailable || e.Code == ErrRateLimitExceeded +} + +type HTTPError struct { + StatusCode int + Message string +} + +func NewHTTPError(res *http.Response) *HTTPError { + if res == nil { + return &HTTPError{StatusCode: http.StatusInternalServerError, Message: "nil response"} + } + return &HTTPError{StatusCode: res.StatusCode, Message: http.StatusText(res.StatusCode)} +} +func (e *HTTPError) Error() string { return fmt.Sprintf("HTTP %d: %s", e.StatusCode, e.Message) } +func (e *HTTPError) Is(target error) bool { + if t, ok := target.(*HTTPError); ok { + return e.StatusCode == t.StatusCode + } + return false +} diff --git a/internal/lastfm/api/track.go b/internal/lastfm/api/track.go new file mode 100644 index 0000000..dd72707 --- /dev/null +++ b/internal/lastfm/api/track.go @@ -0,0 +1,88 @@ +package api + +import "first.fm/internal/lastfm" + +type Track struct { + api *API +} + +// NewTrack creates and returns a new Track API route. +func NewTrack(api *API) *Track { + return &Track{api: api} +} + +// Correction returns the track and artist name corrections of a track. +func (t Track) Correction(artist, track string) (*lastfm.TrackCorrection, error) { + var res lastfm.TrackCorrection + p := lastfm.TrackCorrectionParams{Artist: artist, Track: track} + return &res, t.api.Get(&res, TrackGetCorrectionMethod, p) +} + +// Info returns the information of a track by artist and track name. +func (t Track) Info(params lastfm.TrackInfoParams) (*lastfm.TrackInfo, error) { + var res lastfm.TrackInfo + return &res, t.api.Get(&res, TrackGetInfoMethod, params) +} + +// InfoByMBID returns the information of a track by MBID. +func (t Track) InfoByMBID(params lastfm.TrackInfoMBIDParams) (*lastfm.TrackInfo, error) { + var res lastfm.TrackInfo + return &res, t.api.Get(&res, TrackGetInfoMethod, params) +} + +// UserInfo returns the information of a track for user by artist and track +// name. +func (t Track) UserInfo(params lastfm.TrackUserInfoParams) (*lastfm.TrackUserInfo, error) { + var res lastfm.TrackUserInfo + return &res, t.api.Get(&res, TrackGetInfoMethod, params) +} + +// UserInfoByMBID returns the information of a track for user by MBID. +func (t Track) UserInfoByMBID( + params lastfm.TrackUserInfoMBIDParams) (*lastfm.TrackUserInfo, error) { + + var res lastfm.TrackUserInfo + return &res, t.api.Get(&res, TrackGetInfoMethod, params) +} + +// Similar returns the similar tracks of a track by artist and track name. +func (t Track) Similar(params lastfm.TrackSimilarParams) (*lastfm.SimilarTracks, error) { + var res lastfm.SimilarTracks + return &res, t.api.Get(&res, TrackGetSimilarMethod, params) +} + +// SimilarByMBID returns the similar tracks of a track by MBID. +func (t Track) SimilarByMBID(params lastfm.TrackSimilarMBIDParams) (*lastfm.SimilarTracks, error) { + var res lastfm.SimilarTracks + return &res, t.api.Get(&res, TrackGetSimilarMethod, params) +} + +// Tags returns the tags of a track by artist and track name. +func (t Track) Tags(params lastfm.TrackTagsParams) (*lastfm.TrackTags, error) { + var res lastfm.TrackTags + return &res, t.api.Get(&res, TrackGetTagsMethod, params) +} + +// TagsByMBID returns the tags of a track by MBID. +func (t Track) TagsByMBID(params lastfm.TrackTagsMBIDParams) (*lastfm.TrackTags, error) { + var res lastfm.TrackTags + return &res, t.api.Get(&res, TrackGetTagsMethod, params) +} + +// TopTags returns the top tags of a track by artist and track name. +func (t Track) TopTags(params lastfm.TrackTopTagsParams) (*lastfm.TrackTopTags, error) { + var res lastfm.TrackTopTags + return &res, t.api.Get(&res, TrackGetTopTagsMethod, params) +} + +// TopTagsByMBID returns the top tags of a track by MBID. +func (t Track) TopTagsByMBID(params lastfm.TrackTopTagsMBIDParams) (*lastfm.TrackTopTags, error) { + var res lastfm.TrackTopTags + return &res, t.api.Get(&res, TrackGetTopTagsMethod, params) +} + +// Search searches for tracks by track name, and optionally artist name. +func (t Track) Search(params lastfm.TrackSearchParams) (*lastfm.TrackSearchResult, error) { + var res lastfm.TrackSearchResult + return &res, t.api.Get(&res, TrackSearchMethod, params) +} diff --git a/internal/lastfm/api/user.go b/internal/lastfm/api/user.go new file mode 100644 index 0000000..b7535fc --- /dev/null +++ b/internal/lastfm/api/user.go @@ -0,0 +1,151 @@ +package api + +import "first.fm/internal/lastfm" + +type recentTracksExtendedParams struct { + lastfm.RecentTracksParams + Extended bool `url:"extended,int,omitempty"` +} + +type userTagsExtendedParams struct { + lastfm.UserTagsParams + Type lastfm.TagType `url:"taggingtype"` +} + +type User struct { + api *API +} + +// NewUser creates and returns a new User API route. +func NewUser(api *API) *User { + return &User{api: api} +} + +// Friends returns the friends of a user. +func (u User) Friends(params lastfm.FriendsParams) (*lastfm.Friends, error) { + var res lastfm.Friends + return &res, u.api.Get(&res, UserGetFriendsMethod, params) +} + +// Info returns the information of a user. +func (u User) Info(user string) (*lastfm.UserInfo, error) { + var res lastfm.UserInfo + p := lastfm.UserInfoParams{User: user} + return &res, u.api.Get(&res, UserGetInfoMethod, p) +} + +// LovedTracks returns the loved tracks of a user. +func (u User) LovedTracks(params lastfm.LovedTracksParams) (*lastfm.LovedTracks, error) { + var res lastfm.LovedTracks + return &res, u.api.Get(&res, UserGetLovedTracksMethod, params) +} + +// RecentTrack returns the most recent track of a user. This is a convenience +// method that calls RecentTracks with limit=1. +func (u User) RecentTrack(user string) (*lastfm.RecentTrack, error) { + var res lastfm.RecentTrack + p := lastfm.RecentTracksParams{User: user, Limit: 1} + return &res, u.api.Get(&res, UserGetRecentTracksMethod, p) +} + +// RecentTracks returns the recent tracks of a user. +func (u User) RecentTracks(params lastfm.RecentTracksParams) (*lastfm.RecentTracks, error) { + var res lastfm.RecentTracks + return &res, u.api.Get(&res, UserGetRecentTracksMethod, params) +} + +// RecentTrackExtended returns the most recent track of a user with extended +// information. This is a convenience method that calls RecentTracksExtended +// with limit=1. +func (u User) RecentTrackExtended(user string) (*lastfm.RecentTrackExtended, error) { + var res lastfm.RecentTrackExtended + p := lastfm.RecentTracksParams{User: user, Limit: 1} + exp := recentTracksExtendedParams{RecentTracksParams: p, Extended: true} + return &res, u.api.Get(&res, UserGetRecentTracksMethod, exp) +} + +// RecentTracksExtended returns the recent tracks of a user with extended +// information. +func (u User) RecentTracksExtended( + params lastfm.RecentTracksParams) (*lastfm.RecentTracksExtended, error) { + + var res lastfm.RecentTracksExtended + exp := recentTracksExtendedParams{RecentTracksParams: params, Extended: true} + return &res, u.api.Get(&res, UserGetRecentTracksMethod, exp) +} + +// TaggedAlbums returns the albums tagged by a user with the given tag. +func (u User) TaggedAlbums(params lastfm.UserTagsParams) (*lastfm.UserAlbumTags, error) { + var res lastfm.UserAlbumTags + p := userTagsExtendedParams{UserTagsParams: params, Type: lastfm.TagTypeAlbum} + return &res, u.api.Get(&res, UserGetPersonalTagsMethod, p) +} + +// TaggedArtists returns the artists tagged by a user with the given tag. +func (u User) TaggedArtists(params lastfm.UserTagsParams) (*lastfm.UserArtistTags, error) { + var res lastfm.UserArtistTags + p := userTagsExtendedParams{UserTagsParams: params, Type: lastfm.TagTypeArtist} + return &res, u.api.Get(&res, UserGetPersonalTagsMethod, p) +} + +// TaggedTracks returns the tracks tagged by a user with the given tag. +func (u User) TaggedTracks(params lastfm.UserTagsParams) (*lastfm.UserTrackTags, error) { + var res lastfm.UserTrackTags + p := userTagsExtendedParams{UserTagsParams: params, Type: lastfm.TagTypeTrack} + return &res, u.api.Get(&res, UserGetPersonalTagsMethod, p) +} + +// TopAlbums returns the top albums of a user. +func (u User) TopAlbums(params lastfm.UserTopAlbumsParams) (*lastfm.UserTopAlbums, error) { + var res lastfm.UserTopAlbums + return &res, u.api.Get(&res, UserGetTopAlbumsMethod, params) +} + +// TopArtists returns the top artists of a user. +func (u User) TopArtists(params lastfm.UserTopArtistsParams) (*lastfm.UserTopArtists, error) { + var res lastfm.UserTopArtists + return &res, u.api.Get(&res, UserGetTopArtistsMethod, params) +} + +// TopTags returns the top tags of a user. +func (u User) TopTags(params lastfm.UserTopTagsParams) (*lastfm.UserTopTags, error) { + var res lastfm.UserTopTags + return &res, u.api.Get(&res, UserGetTopTagsMethod, params) +} + +// TopTracks returns the top tracks of a user. +func (u User) TopTracks(params lastfm.UserTopTracksParams) (*lastfm.UserTopTracks, error) { + var res lastfm.UserTopTracks + return &res, u.api.Get(&res, UserGetTopTracksMethod, params) +} + +// WeeklyAlbumChart returns the weekly album chart of a user. +func (u User) WeeklyAlbumChart( + params lastfm.WeeklyAlbumChartParams) (*lastfm.WeeklyAlbumChart, error) { + + var res lastfm.WeeklyAlbumChart + return &res, u.api.Get(&res, UserGetWeeklyAlbumChartMethod, params) +} + +// WeeklyArtistChart returns the weekly artist chart of a user. +func (u User) WeeklyArtistChart( + params lastfm.WeeklyArtistChartParams) (*lastfm.WeeklyArtistChart, error) { + + var res lastfm.WeeklyArtistChart + return &res, u.api.Get(&res, UserGetWeeklyArtistChartMethod, params) +} + +// WeeklyChartList returns the weekly chart list of a user. +func (u User) WeeklyChartList(user string) (*lastfm.WeeklyChartList, error) { + var res lastfm.WeeklyChartList + p := lastfm.WeeklyChartListParams{User: user} + return &res, u.api.Get(&res, UserGetWeeklyChartListMethod, p) +} + +// WeeklyTrackChart returns the weekly track chart of a user. +func (u User) WeeklyTrackChart( + params lastfm.WeeklyTrackChartParams) (*lastfm.WeeklyTrackChart, error) { + + var res lastfm.WeeklyTrackChart + return &res, u.api.Get(&res, UserGetWeeklyTrackChartMethod, params) +} diff --git a/internal/lastfm/artist.go b/internal/lastfm/artist.go new file mode 100644 index 0000000..80c7a7c --- /dev/null +++ b/internal/lastfm/artist.go @@ -0,0 +1,281 @@ +package lastfm + +// https://www.last.fm/api/show/artist.addTags +type ArtistAddTagsParams struct { + Artist string `url:"artist"` + Tags []string `url:"tags,comma"` +} + +// https://www.last.fm/api/show/artist.getCorrection +type ArtistCorrectionParams struct { + Artist string `url:"artist"` +} + +type ArtistCorrection struct { + Corrections []struct { + Index int `xml:"index,attr"` + Artist struct { + Name string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + } `xml:"artist"` + } `xml:"correction"` +} + +// https://www.last.fm/api/show/artist.getInfo +type ArtistInfoParams struct { + Artist string `url:"artist"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` + // The language to return the biography in, as an ISO 639 alpha-2 code. + Language string `url:"lang,omitempty"` +} + +// https://www.last.fm/api/show/artist.getInfo +type ArtistInfoMBIDParams struct { + MBID string `url:"mbid"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` + // The language to return the biography in, as an ISO 639 alpha-2 code. + Language string `url:"lang,omitempty"` +} + +// https://www.last.fm/api/show/artist.getInfo +type ArtistUserInfoParams struct { + Artist string `url:"artist"` + User string `url:"username"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` + // The language to return the biography in, as an ISO 639 alpha-2 code. + Language string `url:"lang,omitempty"` +} + +// https://www.last.fm/api/show/artist.getInfo +type ArtistUserInfoMBIDParams struct { + MBID string `url:"mbid"` + User string `url:"username"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` + // The language to return the biography in, as an ISO 639 alpha-2 code. + Language string `url:"lang,omitempty"` +} + +type ArtistInfo struct { + Name string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Image Image `xml:"image"` + Listeners int `xml:"stats>listeners"` + Playcount int `xml:"stats>playcount"` + Streamable IntBool `xml:"streamable"` + OnTour IntBool `xml:"ontour"` + SimilarArtists []struct { + Name string `xml:"name"` + URL string `xml:"url"` + Image Image `xml:"image"` + } `xml:"similar>artist"` + Tags []struct { + Name string `xml:"name"` + URL string `xml:"url"` + } `xml:"tags>tag"` + Bio struct { + Links []struct { + URL string `xml:"href,attr"` + Relation string `xml:"rel,attr"` + } `xml:"links>link"` + Summary string `xml:"summary"` + Content string `xml:"content"` + PublishedAt DateTime `xml:"published"` + } `xml:"bio"` +} + +type ArtistUserInfo struct { + ArtistInfo + UserPlaycount int `xml:"stats>userplaycount"` +} + +// https://www.last.fm/api/show/artist.getSimilar +type ArtistSimilarParams struct { + Artist string `url:"artist"` + Limit uint `url:"limit,omitempty"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/artist.getSimilar +type ArtistSimilarMBIDParams struct { + MBID string `url:"mbid"` + Limit uint `url:"limit,omitempty"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/artist.getSimilar#attributes +type SimilarArtists struct { + Artist string `xml:"artist,attr"` + Artists []struct { + Name string `xml:"name"` + Match float64 `xml:"match"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Streamable IntBool `xml:"streamable"` + Image Image `xml:"image"` + } `xml:"artist"` +} + +// https://www.last.fm/api/show/artist.getTags +type ArtistTagsParams struct { + Artist string `url:"artist"` + User string `url:"username"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/artist.getTags +type ArtistTagsMBIDParams struct { + MBID string `url:"mbid"` + User string `url:"username"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/artist.getTags +type ArtistSelfTagsParams struct { + Artist string `url:"artist"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/artist.getTags +type ArtistSelfTagsMBIDParams struct { + MBID string `url:"mbid"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +type ArtistTags struct { + Artist string `xml:"artist,attr"` + Tags []struct { + Name string `xml:"name"` + URL string `xml:"url"` + } `xml:"tag"` +} + +// https://www.last.fm/api/show/artist.getTopAlbums +type ArtistTopAlbumsParams struct { + Artist string `url:"artist"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` + Limit uint `url:"limit,omitempty"` + Page uint `url:"page,omitempty"` +} + +// https://www.last.fm/api/show/artist.getTopAlbums +type ArtistTopAlbumsMBIDParams struct { + MBID string `url:"mbid"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` + Limit uint `url:"limit,omitempty"` + Page uint `url:"page,omitempty"` +} + +type ArtistTopAlbums struct { + Artist string `xml:"artist,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Albums []struct { + Title string `xml:"name"` + Playcount int `xml:"playcount"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Artist struct { + Name string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + } `xml:"artist"` + Cover Image `xml:"image"` + } `xml:"album"` +} + +// https://www.last.fm/api/show/artist.getTopTags +type ArtistTopTagsParams struct { + Artist string `url:"artist"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/artist.getTopTags +type ArtistTopTagsMBIDParams struct { + MBID string `url:"mbid"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +type ArtistTopTags struct { + Artist string `xml:"artist,attr"` + Tags []struct { + Name string `xml:"name"` + Count int `xml:"count"` + URL string `xml:"url"` + } `xml:"tag"` +} + +// https://www.last.fm/api/show/artist.getTopTracks +type ArtistTopTracksParams struct { + Artist string `url:"artist"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` + Limit uint `url:"limit,omitempty"` + Page uint `url:"page,omitempty"` +} + +// https://www.last.fm/api/show/artist.getTopTracks +type ArtistTopTracksMBIDParams struct { + MBID string `url:"mbid"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` + Limit uint `url:"limit,omitempty"` + Page uint `url:"page,omitempty"` +} + +type ArtistTopTracks struct { + Artist string `xml:"artist,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Tracks []struct { + Title string `xml:"name"` + Rank int `xml:"rank,attr"` + Playcount int `xml:"playcount"` + Listeners int `xml:"listeners"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Streamable IntBool `xml:"streamable"` + Artist struct { + Name string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + } `xml:"artist"` + Image Image `xml:"image"` + } `xml:"track"` +} + +// https://www.last.fm/api/show/artist.removeTag +type ArtistRemoveTagParams struct { + Artist string `url:"artist"` + Tag string `url:"tag"` +} + +// https://www.last.fm/api/show/artist.search +type ArtistSearchParams struct { + Artist string `url:"artist"` + Limit uint `url:"limit,omitempty"` + Page uint `url:"page,omitempty"` +} + +type ArtistSearchResult struct { + For string `xml:"for,attr"` + Query struct { + Role string `xml:"role,attr"` + SearchTerms string `xml:"searchTerms,attr"` + StartPage int `xml:"startPage,attr"` + } `xml:"Query"` + TotalResults int `xml:"totalResults"` + StartIndex int `xml:"startIndex"` + PerPage int `xml:"itemsPerPage"` + Artists []struct { + Name string `xml:"name"` + Listeners int `xml:"listeners"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Streamable IntBool `xml:"streamable"` + Image Image `xml:"image"` + } `xml:"artistmatches>artist"` +} diff --git a/internal/lastfm/chart.go b/internal/lastfm/chart.go new file mode 100644 index 0000000..85b56a6 --- /dev/null +++ b/internal/lastfm/chart.go @@ -0,0 +1,75 @@ +package lastfm + +// https://www.last.fm/api/show/chart.getTopArtists +type ChartTopArtistsParams struct { + Limit uint `url:"limit,omitempty"` + Page uint `url:"page,omitempty"` +} + +type ChartTopArtists struct { + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Artists []struct { + Name string `xml:"name"` + Playcount int `xml:"playcount"` + Listeners int `xml:"listeners"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Streamable IntBool `xml:"streamable"` + Image Image `xml:"image"` + } `xml:"artist"` +} + +// https://www.last.fm/api/show/chart.getTopTags +type ChartTopTagsParams struct { + Limit uint `url:"limit,omitempty"` + Page uint `url:"page,omitempty"` +} + +type ChartTopTags struct { + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Tags []struct { + Name string `xml:"name"` + URL string `xml:"url"` + Reach int `xml:"reach"` + Count int `xml:"taggings"` + Streamable IntBool `xml:"streamable"` + Wiki string `xml:"wiki"` + } `xml:"tag"` +} + +// https://www.last.fm/api/show/chart.getTopTracks +type ChartTopTracksParams struct { + Limit uint `url:"limit,omitempty"` + Page uint `url:"page,omitempty"` +} + +type ChartTopTracks struct { + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Tracks []struct { + Title string `xml:"name"` + Duration Duration `xml:"duration"` + Playcount int `xml:"playcount"` + Listeners int `xml:"listeners"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Streamable struct { + Preview IntBool `xml:",chardata"` + Fulltrack IntBool `xml:"fulltrack,attr"` + } `xml:"streamable"` + Artist struct { + Name string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + } `xml:"artist"` + Image Image `xml:"image"` + } `xml:"track"` +} diff --git a/internal/lastfm/lastfm.go b/internal/lastfm/lastfm.go new file mode 100644 index 0000000..d67d165 --- /dev/null +++ b/internal/lastfm/lastfm.go @@ -0,0 +1,189 @@ +// Package lastfm provides a set of types and constants for working with the +// Last.fm API. +package lastfm + +import ( + "encoding/xml" + "regexp" +) + +const ( + BaseURL = "https://www.last.fm" + APIURL = BaseURL + "/api" + + ImageHost = "https://lastfm.freetls.fastly.net" + BaseImageURL = ImageHost + "/i/u/" + + // NoArtistHash is the image hash for an artist with no image. + NoArtistHash = "2a96cbd8b46e442fc41c2b86b821562f" + // NoAlbumHash is the image hash for an album with no image. + NoAlbumHash = "c6f59c1e5e7240a4c0d427abd71f3dbb" + // NoTrackHash is the image hash for a track with no image. + NoTrackHash = "4128a6eb29f94943c9d206c08e625904" + // NoAvatarHash is the image hash for a user with no avatar. + NoAvatarHash = "818148bf682d429dc215c1705eb27b98" + + // NoArtistImageURL is the image URL for an artist with no image. + NoArtistImageURL ImageURL = BaseImageURL + NoArtistHash + ".png" + // NoAlbumImageURL is the image URL for an album with no image. + NoAlbumImageURL ImageURL = BaseImageURL + NoAlbumHash + ".png" + // NoTrackImageURL is the image URL for a track with no image. + NoTrackImageURL ImageURL = BaseImageURL + NoTrackHash + ".png" + // NoAvatarImageURL is the image URL for a user with no avatar. + NoAvatarImageURL ImageURL = BaseImageURL + NoAvatarHash + ".png" +) + +// ImageURLSizeRegex is a regex to match the image URL size. +// Common sizes: +// - i/u/34s/ +// - i/u/64s/ +// - i/u/174s/ +// - i/u/300x300/ +// - i/u/ar0/ +// - i/u/ +var ImageURLSizeRegex = regexp.MustCompile(`i/u/(.+?\/)?`) + +// BuildImageURL builds the image URL for the given size and hash. +func BuildImageURL(size ImgSize, hash string) ImageURL { + return ImageURL(BaseImageURL + size.PathSize() + hash + ".png") +} + +type ImgSize string + +const ( + // Used when an API response returns an image without a size attribute. + ImgSizeUndefined ImgSize = "undefined" + // 34x34 + ImgSizeSmall ImgSize = "small" + // 64x64 + ImgSizeMedium ImgSize = "medium" + // 174x174 + ImgSizeLarge ImgSize = "large" + // 300x300 + ImgSizeExtraLarge ImgSize = "extralarge" + // 300x300? + ImgSizeMega ImgSize = "mega" + // Original upload size + ImgSizeOriginal ImgSize = "original" +) + +// PathSize returns the path size string for the given ImgSize. +func (s ImgSize) PathSize() string { + switch s { + case ImgSizeSmall: + return "34s/" + case ImgSizeMedium: + return "64s/" + case ImgSizeLarge: + return "174s/" + case ImgSizeExtraLarge, ImgSizeMega: + return "300x300/" + case ImgSizeOriginal: + return "" + default: + return ImgSizeExtraLarge.PathSize() + } +} + +type ImageURL string + +// String returns the string representation of the ImageURL. +func (i ImageURL) String() string { + return string(i) +} + +// Resize returns the resized image URL with the specified size. +func (i ImageURL) Resize(size ImgSize) string { + if i == "" { + return "" + } + + return ImageURLSizeRegex.ReplaceAllString(i.String(), "i/u/"+size.PathSize()) +} + +type Image map[ImgSize]ImageURL + +// UnmarshalXML implements the xml.Unmarshaler interface for Image. +func (i *Image) UnmarshalXML(dc *xml.Decoder, start xml.StartElement) error { + if *i == nil { + *i = make(Image) + } + + var size ImgSize + for _, attr := range start.Attr { + if attr.Name.Local == "size" { + size = ImgSize(attr.Value) + break + } + } + + var url ImageURL + if err := dc.DecodeElement(&url, &start); err != nil { + return err + } + + if url != "" { + if size == "" { + size = ImgSizeUndefined + } + (*i)[size] = url + } + + return nil +} + +// String returns the string representation of the Image URL. +func (i Image) String() string { + return i.URL() +} + +// URL returns the URL of the image in its extra large size (300x300). +// This is the same as calling SizedURL(ImgSizeExtralarge). +func (i Image) URL() string { + return i.SizedURL(ImgSizeExtraLarge) +} + +// OriginalURL returns the URL of the image in original size. +func (i Image) OriginalURL() string { + return i.url().Resize(ImgSizeOriginal) +} + +// SizedURL returns the URL of the image with the specified size. +func (i Image) SizedURL(size ImgSize) string { + if url, ok := i[size]; ok { + return url.String() + } + + return i.url().Resize(size) +} + +func (i Image) url() ImageURL { + if url, ok := i[ImgSizeExtraLarge]; ok { + return url + } + + for _, url := range i { + return url + } + + return "" +} + +type Period string + +const ( + PeriodOverall Period = "overall" + PeriodWeek Period = "7day" + PeriodMonth Period = "1month" + Period3Months Period = "3month" + Period6Months Period = "6month" + PeriodYear Period = "12month" +) + +type TagType string + +const ( + TagTypeArtist TagType = "artist" + TagTypeAlbum TagType = "album" + TagTypeTrack TagType = "track" +) diff --git a/internal/lastfm/track.go b/internal/lastfm/track.go new file mode 100644 index 0000000..ef4bca2 --- /dev/null +++ b/internal/lastfm/track.go @@ -0,0 +1,426 @@ +package lastfm + +import ( + "fmt" + "net/url" + "time" +) + +// https://www.last.fm/api/show/track.addTags +type TrackAddTagsParams struct { + Artist string `url:"artist"` + Track string `url:"track"` + Tags []string `url:"tags,comma"` +} + +// https://www.last.fm/api/show/track.getCorrection +type TrackCorrectionParams struct { + Artist string `url:"artist"` + Track string `url:"track"` +} + +type TrackCorrection struct { + Corrections []struct { + Index int `xml:"index,attr"` + ArtistCorrected IntBool `xml:"artistcorrected,attr"` + TrackCorrected IntBool `xml:"trackcorrected,attr"` + Track struct { + Title string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Artist struct { + Name string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + } `xml:"artist"` + } `xml:"track"` + } `xml:"correction"` +} + +// https://www.last.fm/api/show/track.getInfo +type TrackInfoParams struct { + Artist string `url:"artist"` + Track string `url:"track"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/track.getInfo +type TrackInfoMBIDParams struct { + MBID string `url:"mbid"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/track.getInfo +type TrackUserInfoParams struct { + Artist string `url:"artist"` + Track string `url:"track"` + User string `url:"username"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/track.getInfo +type TrackUserInfoMBIDParams struct { + MBID string `url:"mbid"` + User string `url:"username"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/track.getInfo#attributes +type TrackInfo struct { + Title string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Duration DurationMilli `xml:"duration"` + Listeners int `xml:"listeners"` + Playcount int `xml:"playcount"` + Streamable struct { + Preview IntBool `xml:",chardata"` + FullTrack IntBool `xml:"fulltrack,attr"` + } `xml:"streamable"` + Artist struct { + Name string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + } `xml:"artist"` + Album struct { + Artist string `xml:"artist"` + Title string `xml:"title"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Position int `xml:"position,attr"` + Image Image `xml:"image"` + } `xml:"album"` + TopTags []struct { + Name string `xml:"name"` + URL string `xml:"url"` + } `xml:"toptags>tag"` + Wiki struct { + Summary string `xml:"summary"` + Content string `xml:"content"` + Published DateTime `xml:"published"` + } `xml:"wiki"` +} + +type TrackUserInfo struct { + TrackInfo + UserPlaycount int `xml:"userplaycount"` + UserLoved IntBool `xml:"userloved"` +} + +// https://www.last.fm/api/show/track.getSimilar +type TrackSimilarParams struct { + Artist string `url:"artist"` + Track string `url:"track"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` + Limit uint `url:"limit,omitempty"` +} + +// https://www.last.fm/api/show/track.getSimilar +type TrackSimilarMBIDParams struct { + MBID string `url:"mbid"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` + Limit uint `url:"limit,omitempty"` +} + +type SimilarTracks struct { + Artist string `xml:"artist,attr"` + Tracks []struct { + Title string `xml:"name"` + Playcount int `xml:"playcount"` + Match float64 `xml:"match"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Duration Duration `xml:"duration"` + Streamable struct { + Preview IntBool `xml:",chardata"` + FullTrack IntBool `xml:"fulltrack,attr"` + } `xml:"streamable"` + Artist struct { + Name string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + } `xml:"artist"` + Image Image `xml:"image"` + } `xml:"track"` +} + +// https://www.last.fm/api/show/track.getTags +type TrackTagsParams struct { + Artist string `url:"artist"` + Track string `url:"track"` + User string `url:"username"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/track.getTags +type TrackTagsMBIDParams struct { + MBID string `url:"mbid"` + User string `url:"username"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/track.getTags +type TrackSelfTagsParams struct { + Artist string `url:"artist"` + Track string `url:"track"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/track.getTags +type TrackSelfTagsMBIDParams struct { + MBID string `url:"mbid"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +type TrackTags struct { + Artist string `xml:"artist,attr"` + Track string `xml:"track,attr"` + Tags []struct { + Name string `xml:"name"` + URL string `xml:"url"` + } `xml:"tag"` +} + +// https://www.last.fm/api/show/track.getTopTags +type TrackTopTagsParams struct { + Artist string `url:"artist"` + Track string `url:"track"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +// https://www.last.fm/api/show/track.getTopTags +type TrackTopTagsMBIDParams struct { + MBID string `url:"mbid"` + AutoCorrect *bool `url:"autocorrect,int,omitempty"` +} + +type TrackTopTags struct { + Artist string `xml:"artist,attr"` + Track string `xml:"track,attr"` + Tags []struct { + Name string `xml:"name"` + URL string `xml:"url"` + Count int `xml:"count"` + } `xml:"tag"` +} + +// https://www.last.fm/api/show/track.love +type TrackLoveParams struct { + Artist string `url:"artist"` + Track string `url:"track"` +} + +// https://www.last.fm/api/show/track.removeTag +type TrackRemoveTagParams struct { + Artist string `url:"artist"` + Track string `url:"track"` + Tag string `url:"tag"` +} + +// https://www.last.fm/api/show/track.scrobble +type ScrobbleParams struct { + Artist string `url:"artist"` + Track string `url:"track"` + Time time.Time `url:"timestamp,unix"` + + Album string `url:"album,omitempty"` + AlbumArtist string `url:"albumArtist,omitempty"` + TrackNumber int `url:"trackNumber,omitempty"` + Duration Duration `url:"duration,omitempty"` + MBID string `url:"mbid,omitempty"` + + Chosen *bool `url:"chosenByUser,int,omitempty"` + Context string `url:"context,omitempty"` + StreamID string `url:"streamId,omitempty"` +} + +// EncodeIndexValues sets the indexed "key[index]" values in v from the fields +// of p. It returns an error if p cannot be encoded. +func (p ScrobbleParams) EncodeIndexValues(index int, v *url.Values) error { + values, err := EncodeToValues(p) + if err != nil { + return err + } + + // Set indexed `key[index]` values + for key, vals := range values { + indexedKey := fmt.Sprintf("%s[%d]", key, index) + for _, val := range vals { + v.Set(indexedKey, val) + } + } + + return nil +} + +// https://www.last.fm/api/show/track.scrobble +type ScrobbleMultiParams []ScrobbleParams + +// EncodeValues implements the url.ValuesEncoder interface. +func (p ScrobbleMultiParams) EncodeValues(key string, v *url.Values) error { + for i, params := range p { + if err := params.EncodeIndexValues(i, v); err != nil { + return err + } + } + + return nil +} + +// https://www.last.fm/api/show/track.scrobble#attributes +type ScrobbleIgnoredCode int + +const ( + ScrobbleNotIgnored ScrobbleIgnoredCode = iota // 0 + + ArtistIgnored // 1 + TrackIgnored // 2 + TimestampTooOld // 3 + TimestampTooNew // 4 + DailyScrobbledLimitExceeded // 5 +) + +// Message returns the message for the ignored scrobble code. +func (c ScrobbleIgnoredCode) Message() string { + switch c { + case ScrobbleNotIgnored: + return "Not ignored" + case ArtistIgnored: + return "Artist was ignored" + case TrackIgnored: + return "Track was ignored" + case TimestampTooOld: + return "Timestamp was too old" + case TimestampTooNew: + return "Timestamp was too new" + case DailyScrobbledLimitExceeded: + return "Daily scrobbled limit exceeded" + default: + return "Scrobble ignored" + } +} + +type ScrobbleIgnored struct { + RawMessage string `xml:",chardata"` + Code ScrobbleIgnoredCode `xml:"code,attr"` +} + +// Message returns the message for the ignored scrobble. If RawMessage is set, +// it will be returned, other the message will be determined by the code. +// +// The Last.fm API seems to return code 1 (ArtistIgnored) regardless of the +// reason for ignoring the scrobble. +func (s ScrobbleIgnored) Message() string { + if s.RawMessage != "" { + return s.RawMessage + } + + return s.Code.Message() +} + +// https://www.last.fm/api/show/track.scrobble#attributes +type ScrobbleResult struct { + Accepted IntBool `xml:"accepted,attr"` + Ignored IntBool `xml:"ignored,attr"` + Scrobble Scrobble `xml:"scrobble"` +} + +// https://www.last.fm/api/show/track.scrobble#attributes +type ScrobbleMultiResult struct { + Accepted int `xml:"accepted,attr"` + Ignored int `xml:"ignored,attr"` + Scrobbles []Scrobble `xml:"scrobble"` +} + +type Scrobble struct { + Track struct { + Title string `xml:",chardata"` + Corrected IntBool `xml:"corrected,attr"` + } `xml:"track"` + Artist struct { + Name string `xml:",chardata"` + Corrected IntBool `xml:"corrected,attr"` + } `xml:"artist"` + Album struct { + Title string `xml:",chardata"` + Corrected IntBool `xml:"corrected,attr"` + } `xml:"album"` + AlbumArtist struct { + Name string `xml:",chardata"` + Corrected IntBool `xml:"corrected,attr"` + } `xml:"albumArtist"` + Timestamp DateTime `xml:"timestamp"` + Ignored ScrobbleIgnored `xml:"ignoredMessage"` +} + +// https://www.last.fm/api/show/track.search +type TrackSearchParams struct { + Track string `url:"track"` + Artist string `url:"artist,omitempty"` + Limit uint `url:"limit,omitempty"` + Page uint `url:"page,omitempty"` +} + +type TrackSearchResult struct { + Query struct { + Role string `xml:"role,attr"` + StartPage int `xml:"startPage,attr"` + } `xml:"Query"` + TotalResults int `xml:"totalResults"` + StartIndex int `xml:"startIndex"` + PerPage int `xml:"itemsPerPage"` + Tracks []struct { + Title string `xml:"name"` + Artist string `xml:"artist"` + // All values returned from the Last.fm API are "FIXME". API issue? + Streamable string `xml:"streamable"` + Listeners int `xml:"listeners"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Image Image `xml:"image"` + } `xml:"trackmatches>track"` +} + +// https://www.last.fm/api/show/track.unlove +type TrackUnloveParams struct { + Track string `url:"track"` + Artist string `url:"artist"` +} + +// https://www.last.fm/api/show/track.updateNowPlaying +type UpdateNowPlayingParams struct { + Artist string `url:"artist"` + Track string `url:"track"` + + Album string `url:"album,omitempty"` + AlbumArtist string `url:"albumArtist,omitempty"` + TrackNumber int `url:"trackNumber,omitempty"` + Duration Duration `url:"duration,omitempty"` + MBID string `url:"mbid,omitempty"` + + Context string `url:"context,omitempty"` +} + +// https://www.last.fm/api/show/track.updateNowPlaying#attributes +type NowPlayingUpdate struct { + Track struct { + Title string `xml:",chardata"` + Corrected IntBool `xml:"corrected,attr"` + } `xml:"track"` + Artist struct { + Name string `xml:",chardata"` + Corrected IntBool `xml:"corrected,attr"` + } `xml:"artist"` + Album struct { + Title string `xml:",chardata"` + Corrected IntBool `xml:"corrected,attr"` + } `xml:"album"` + AlbumArtist struct { + Name string `xml:",chardata"` + Corrected IntBool `xml:"corrected,attr"` + } `xml:"albumArtist"` + Ignored struct { + Message string `xml:",chardata"` + Code ScrobbleIgnoredCode `xml:"code,attr"` + } `xml:"ignoredMessage"` +} diff --git a/internal/lastfm/user.go b/internal/lastfm/user.go new file mode 100644 index 0000000..7f6d847 --- /dev/null +++ b/internal/lastfm/user.go @@ -0,0 +1,481 @@ +package lastfm + +import ( + "encoding/xml" + "time" +) + +// https://www.last.fm/api/show/user.getFriends +type FriendsParams struct { + User string `url:"user"` + Limit uint `url:"limit,omitempty"` + Page uint `url:"page,omitempty"` +} + +type Friends struct { + User string `xml:"user,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Users []struct { + Name string `xml:"name"` + RealName string `xml:"realname"` + URL string `xml:"url"` + Country string `xml:"country"` + Subscriber IntBool `xml:"subscriber"` + Playcount int `xml:"playcount"` + Playlists int `xml:"playlists"` + Bootstrap int `xml:"bootstrap"` + Avatar Image `xml:"image"` + RegisteredAt DateTime `xml:"registered"` + Type string `xml:"type"` + } `xml:"user"` +} + +// https://www.last.fm/api/show/user.getInfo +type UserInfoParams struct { + User string `url:"user"` +} + +type UserInfo struct { + Name string `xml:"name"` + RealName string `xml:"realname"` + URL string `xml:"url"` + Country string `xml:"country"` + Age int `xml:"age"` + Gender string `xml:"gender"` + Subscriber IntBool `xml:"subscriber"` + Playcount int `xml:"playcount"` + Playlists int `xml:"playlists"` + Bootstrap int `xml:"bootstrap"` + Avatar Image `xml:"image"` + RegisteredAt DateTime `xml:"registered"` + Type string `xml:"type"` + ArtistCount int `xml:"artist_count"` + AlbumCount int `xml:"album_count"` + TrackCount int `xml:"track_count"` +} + +// https://www.last.fm/api/show/user.getLovedTracks +type LovedTracksParams struct { + User string `url:"user"` + Limit uint `url:"limit,omitempty"` + Page uint `url:"page,omitempty"` +} + +type LovedTracks struct { + User string `xml:"user,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Tracks []struct { + Title string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Artist struct { + Name string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + } `xml:"artist"` + Image Image `xml:"image"` + Streamable struct { + Preview IntBool `xml:",chardata"` + FullTrack IntBool `xml:"fulltrack,attr"` + } `xml:"streamable"` + LovedAt DateTime `xml:"date"` + } `xml:"track"` +} + +// https://www.last.fm/api/show/user.getPersonalTags +type UserTagsParams struct { + User string `url:"user"` + Tag string `url:"tag"` + Limit uint `url:"limit,omitempty"` + Page uint `url:"page,omitempty"` +} + +type UserAlbumTags struct { + User string `xml:"user,attr"` + Tag string `xml:"tag,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Albums []struct { + Title string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Artist struct { + Name string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + } `xml:"artist"` + Cover Image `xml:"image"` + } `xml:"albums>album"` +} + +type UserArtistTags struct { + User string `xml:"user,attr"` + Tag string `xml:"tag,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Artists []struct { + Name string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Streamable IntBool `xml:"streamable"` + Image Image `xml:"image"` + } `xml:"artists>artist"` +} + +type UserTrackTags struct { + User string `xml:"user,attr"` + Tag string `xml:"tag,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Tracks []struct { + Title string `xml:"name"` + // All values returned from the Last.fm API are "FIXME". API issue? + Duration string `xml:"duration"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Streamable struct { + Preview IntBool `xml:",chardata"` + FullTrack IntBool `xml:"fulltrack,attr"` + } `xml:"streamable"` + Artist struct { + Name string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + } `xml:"artist"` + Image Image `xml:"image"` + } `xml:"tracks>track"` +} + +// https://www.last.fm/api/show/user.getRecentTracks +type RecentTracksParams struct { + User string `url:"user"` + Limit uint `url:"limit,omitempty"` + From time.Time `url:"from,unix,omitempty"` + To time.Time `url:"to,unix,omitempty"` + Page uint `url:"page,omitempty"` +} + +type RecentTrack struct { + User string `xml:"user,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Track *Track `xml:"track"` +} + +// UnmarshalXML implements the xml.Unmarshaler interface for RecentTrack. +// If user is currently scrobbling a track, user.recentTracks typically returns +// limit + 1 tracks, so this corrects for that. +func (t *RecentTrack) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + r := &RecentTracks{} + if err := d.DecodeElement(r, &start); err != nil { + return err + } + + *t = RecentTrack{ + User: r.User, + Page: r.Page, + PerPage: r.PerPage, + TotalPages: r.TotalPages, + Total: r.Total, + } + + if len(r.Tracks) > 0 { + t.Track = &r.Tracks[0] + } + + return nil +} + +type RecentTracks struct { + User string `xml:"user,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Tracks []Track `xml:"track"` +} + +type Track struct { + Title string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + NowPlaying bool `xml:"nowplaying,attr"` + Streamable IntBool `xml:"streamable"` + Artist struct { + Name string `xml:",chardata"` + MBID string `xml:"mbid,attr"` + } `xml:"artist"` + Album struct { + Title string `xml:",chardata"` + MBID string `xml:"mbid,attr"` + } `xml:"album"` + Image Image `xml:"image"` + ScrobbledAt DateTime `xml:"date"` +} + +// RecentTrackExtended is used when extended=1 in the API call. +type RecentTrackExtended struct { + User string `xml:"user,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Track *TrackExtended `xml:"track"` +} + +// UnmarshalXML implements the xml.Unmarshaler interface for RecentTrack. +// If user is currently scrobbling a track, user.recentTracks typically returns +// limit + 1 tracks, so this corrects for that. +func (t *RecentTrackExtended) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + r := &RecentTracksExtended{} + if err := d.DecodeElement(r, &start); err != nil { + return err + } + + *t = RecentTrackExtended{ + User: r.User, + Page: r.Page, + PerPage: r.PerPage, + TotalPages: r.TotalPages, + Total: r.Total, + } + + if len(r.Tracks) > 0 { + t.Track = &r.Tracks[0] + } + + return nil +} + +// RecentTracksExtended is used when extended=1 in the API call. +type RecentTracksExtended struct { + User string `xml:"user,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Tracks []TrackExtended `xml:"track"` +} + +type TrackExtended struct { + Title string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + NowPlaying bool `xml:"nowplaying,attr"` + Loved IntBool `xml:"loved"` + Streamable IntBool `xml:"streamable"` + Artist struct { + Name string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Image Image `xml:"image"` + } `xml:"artist"` + Album struct { + Title string `xml:",chardata"` + MBID string `xml:"mbid,attr"` + } `xml:"album"` + Image Image `xml:"image"` + ScrobbledAt DateTime `xml:"date"` +} + +// https://www.last.fm/api/show/user.getTopAlbums +type UserTopAlbumsParams struct { + User string `url:"user"` + Period Period `url:"period,omitempty"` + Limit uint `url:"limit,omitempty"` + Page uint `url:"page,omitempty"` +} + +type UserTopAlbums struct { + User string `xml:"user,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Albums []struct { + Title string `xml:"name"` + Rank int `xml:"rank,attr"` + Playcount int `xml:"playcount"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Artist struct { + Name string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + } `xml:"artist"` + Cover Image `xml:"image"` + } `xml:"album"` +} + +// https://www.last.fm/api/show/user.getTopArtists +type UserTopArtistsParams struct { + User string `url:"user"` + Period Period `url:"period,omitempty"` + Limit uint `url:"limit,omitempty"` + Page uint `url:"page,omitempty"` +} + +type UserTopArtists struct { + User string `xml:"user,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Artists []struct { + Name string `xml:"name"` + Rank int `xml:"rank,attr"` + Playcount int `xml:"playcount"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Streamable IntBool `xml:"streamable"` + Image Image `xml:"image"` + } `xml:"artist"` +} + +// https://www.last.fm/api/show/user.getTopTags +type UserTopTagsParams struct { + User string `url:"user"` + Limit uint `url:"limit,omitempty"` +} + +type UserTopTags struct { + User string `xml:"user,attr"` + Tags []struct { + Name string `xml:"name"` + Count int `xml:"count"` + URL string `xml:"url"` + } `xml:"tag"` +} + +// https://www.last.fm/api/show/user.getTopTracks +type UserTopTracksParams struct { + User string `url:"user"` + Period Period `url:"period,omitempty"` + Limit uint `url:"limit,omitempty"` + Page uint `url:"page,omitempty"` +} + +type UserTopTracks struct { + User string `xml:"user,attr"` + Page int `xml:"page,attr"` + PerPage int `xml:"perPage,attr"` + TotalPages int `xml:"totalPages,attr"` + Total int `xml:"total,attr"` + Tracks []struct { + Title string `xml:"name"` + Rank int `xml:"rank,attr"` + Playcount int `xml:"playcount"` + Duration Duration `xml:"duration"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Streamable struct { + Preview IntBool `xml:",chardata"` + FullTrack IntBool `xml:"fulltrack,attr"` + } `xml:"streamable"` + Artist struct { + Name string `xml:"name"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + } `xml:"artist"` + Image Image `xml:"image"` + } `xml:"track"` +} + +// https://www.last.fm/api/show/user.getWeeklyAlbumChart +type WeeklyAlbumChartParams struct { + User string `url:"user"` + Limit uint `url:"limit,omitempty"` + From time.Time `url:"from,unix,omitempty"` + To time.Time `url:"to,unix,omitempty"` +} + +type WeeklyAlbumChart struct { + User string `xml:"user,attr"` + From DateTime `xml:"from,attr"` + To DateTime `xml:"to,attr"` + Albums []struct { + Title string `xml:"name"` + Rank int `xml:"rank,attr"` + Playcount int `xml:"playcount"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Artist struct { + Name string `xml:",chardata"` + MBID string `xml:"mbid,attr"` + } `xml:"artist"` + } `xml:"album"` +} + +// https://www.last.fm/api/show/user.getWeeklyArtistChart +type WeeklyArtistChartParams struct { + User string `url:"user"` + Limit uint `url:"limit,omitempty"` + From time.Time `url:"from,unix,omitempty"` + To time.Time `url:"to,unix,omitempty"` +} + +type WeeklyArtistChart struct { + User string `xml:"user,attr"` + From DateTime `xml:"from,attr"` + To DateTime `xml:"to,attr"` + Artists []struct { + Name string `xml:"name"` + Rank int `xml:"rank,attr"` + Playcount int `xml:"playcount"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + } `xml:"artist"` +} + +// https://www.last.fm/api/show/user.getWeeklyChartList +type WeeklyChartListParams struct { + User string `url:"user"` +} + +type WeeklyChartList struct { + User string `xml:"user,attr"` + Charts []struct { + From string `xml:"from,attr"` + To string `xml:"to,attr"` + } `xml:"chart"` +} + +// https://www.last.fm/api/show/user.getWeeklyTrackChart +type WeeklyTrackChartParams struct { + User string `url:"user"` + Limit uint `url:"limit,omitempty"` + From time.Time `url:"from,unix,omitempty"` + To time.Time `url:"to,unix,omitempty"` +} + +type WeeklyTrackChart struct { + User string `xml:"user,attr"` + From DateTime `xml:"from,attr"` + To DateTime `xml:"to,attr"` + Tracks []struct { + Title string `xml:"name"` + Rank int `xml:"rank,attr"` + Playcount int `xml:"playcount"` + URL string `xml:"url"` + MBID string `xml:"mbid"` + Artist struct { + Name string `xml:",chardata"` + MBID string `xml:"mbid,attr"` + } `xml:"artist"` + Image Image `xml:"image"` + } `xml:"track"` +} diff --git a/internal/lastfm/util.go b/internal/lastfm/util.go new file mode 100644 index 0000000..893bb44 --- /dev/null +++ b/internal/lastfm/util.go @@ -0,0 +1,257 @@ +package lastfm + +import ( + "encoding/xml" + "errors" + "fmt" + "net/url" + "reflect" + "strconv" + "strings" + "time" +) + +func EncodeToValues(v any) (url.Values, error) { + values := url.Values{} + rv := reflect.ValueOf(v) + if rv.Kind() == reflect.Ptr { + rv = rv.Elem() + } + if rv.Kind() != reflect.Struct { + return nil, errors.New("encodeToValues: expected struct") + } + + rt := rv.Type() + for i := 0; i < rt.NumField(); i++ { + field := rt.Field(i) + tag := field.Tag.Get("url") + if tag == "" || tag == "-" { + continue + } + + parts := strings.Split(tag, ",") + key := parts[0] + omitEmpty := len(parts) > 1 && parts[1] == "omitempty" + intFormat := len(parts) > 2 && parts[2] == "int" + + val := rv.Field(i) + if !val.IsValid() || (omitEmpty && val.IsZero()) { + continue + } + + var str string + switch val.Kind() { + case reflect.String: + str = val.String() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + if intFormat { + str = strconv.FormatInt(val.Int(), 10) + } else { + str = strconv.FormatInt(val.Int(), 10) + } + case reflect.Bool: + if intFormat { + if val.Bool() { + str = "1" + } else { + str = "0" + } + } else { + str = strconv.FormatBool(val.Bool()) + } + default: + continue + } + + values.Set(key, str) + } + + return values, nil +} + +// The string format Last.fm uses to represent dates and times. +const TimeFormat = "02 Jan 2006, 15:04" + +// IntBool wraps a boolean and represents a Last.fm integer boolean. +type IntBool bool + +func (b IntBool) Bool() bool { + return bool(b) +} + +// UnmarshalXML implements the xml.Unmarshaler interface for IntBool. Unmarshals +// an integer value into a boolean. 1 is true, 0 is false. +func (b *IntBool) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + var val int + if err := d.DecodeElement(&val, &start); err != nil { + return err + } + + switch val { + case 1: + *b = true + case 0: + *b = false + default: + return fmt.Errorf("invalid IntBool value: %d", val) + } + + return nil +} + +// DateTime wraps time.Time and represents a Last.fm DateTime. +type DateTime time.Time + +// Unix returns the Unix timestamp of the DateTime. +func (dt DateTime) Unix() int64 { + return dt.Time().Unix() +} + +// Time returns the time.Time representation of the DateTime. +func (dt DateTime) Time() time.Time { + return time.Time(dt) +} + +// String returns the string representation of the DateTime in DateTime format. +func (dt DateTime) String() string { + return dt.Format(time.DateTime) +} + +// Format returns the string representation of the DateTime in the +// specified format. +func (dt DateTime) Format(format string) string { + return dt.Time().Format(format) +} + +// UnmarshalXML implements the xml.Unmarshaler interface for DateTime. +func (dt *DateTime) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + var content string + if err := d.DecodeElement(&content, &start); err != nil { + return err + } + + var uts string + for _, attr := range start.Attr { + if attr.Name.Local == "uts" || attr.Name.Local == "unixtime" { + uts = attr.Value + break + } + } + + if uts != "" { + sec, err := strconv.ParseInt(uts, 10, 64) + if err == nil { + *dt = DateTime(time.Unix(sec, 0)) + return nil + } + } + + if content != "" { + sec, err := strconv.ParseInt(content, 10, 64) + if err == nil { + *dt = DateTime(time.Unix(sec, 0)) + return nil + } + + t, err := time.ParseInLocation(TimeFormat, content, time.UTC) + if err == nil { + *dt = DateTime(t) + return nil + } + } + + return nil +} + +// UnmarshalXMLAttr implements the xml.UnmarshalerAttr interface for DateTime. +func (dt *DateTime) UnmarshalXMLAttr(attr xml.Attr) error { + sec, err := strconv.ParseInt(attr.Value, 10, 64) + if err != nil { + return nil + } + *dt = DateTime(time.Unix(sec, 0)) + return nil +} + +// Duration wraps a time.Duration in seconds. +type Duration time.Duration + +const ( + DurationHour = Duration(time.Hour) + DurationMinute = Duration(time.Minute) + DurationSecond = Duration(time.Second) +) + +// DurationMinSec returns a Duration from minutes and seconds. +func DurationMinSec(minutes, sec int) Duration { + return (Duration(minutes) * DurationMinute) + (Duration(sec) * DurationSecond) +} + +// DurationSeconds returns a Duration from seconds. +func DurationSeconds(seconds int) Duration { + return Duration(seconds) * DurationSecond +} + +// EncodeValues implements the url.ValuesEncoder interface for Duration. +func (d Duration) EncodeValues(key string, v *url.Values) error { + sec := strconv.FormatFloat(time.Duration(d).Seconds(), 'f', 0, 64) + v.Set(key, sec) + return nil +} + +// Unwrap returns the duration as a time.Duration. +func (d Duration) Unwrap() time.Duration { + return time.Duration(d) +} + +// String returns the duration as a string. +func (d Duration) String() string { + return time.Duration(d).String() +} + +// UnmarshalXML implements the xml.Unmarshaler interface for Duration. +func (d *Duration) UnmarshalXML(dc *xml.Decoder, start xml.StartElement) error { + var s string + if err := dc.DecodeElement(&s, &start); err != nil { + return err + } + + sec, err := strconv.ParseInt(s, 10, 64) + if err != nil { + // sometimes field isn't a number (e.g., "userdata: NULL") + return nil + } + + *d = Duration(time.Duration(sec) * time.Second) + return nil +} + +// DurationMilli wraps a time.Duration in milliseconds. +type DurationMilli time.Duration + +// Unwrap returns the duration as a time.Duration. +func (d DurationMilli) Unwrap() time.Duration { + return Duration(d).Unwrap() +} + +// String returns the duration as a string. +func (d DurationMilli) String() string { + return Duration(d).String() +} + +// UnmarshalXML implements the xml.Unmarshaler interface for Duration. +func (d *DurationMilli) UnmarshalXML(dc *xml.Decoder, start xml.StartElement) error { + var s string + if err := dc.DecodeElement(&s, &start); err != nil { + return err + } + + mil, err := strconv.ParseInt(s, 10, 64) + if err != nil { + // sometimes field isn't a number (e.g., "userdata: NULL") + return nil + } + + *d = DurationMilli(time.Duration(mil) * time.Millisecond) + return nil +} diff --git a/sqlc.yaml b/sqlc.yaml index a92aafc..6777c7c 100644 --- a/sqlc.yaml +++ b/sqlc.yaml @@ -2,13 +2,13 @@ version: "2" sql: - engine: "sqlite" - schema: "internal/bot/persistence/sql/schema.sql" - queries: "internal/bot/persistence/sql/queries.sql" + schema: "internal/persistence/sql/schema.sql" + queries: "internal/persistence/sql/queries.sql" database: uri: "file:database.db?_foreign_keys=on" gen: go: package: "sqlc" - out: "internal/bot/persistence/sqlc" + out: "internal/persistence/sqlc" emit_prepared_queries: true emit_interface: false From d4b1451b8005fddea10e4f87f410e6179f601513 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Tue, 30 Sep 2025 00:31:21 +0200 Subject: [PATCH 27/29] i mean it's alright --- .gitattributes | 2 + README.md | 2 + cmd/bot/main.go | 2 +- cmd/bot/register.go | 1 + internal/bot/bot.go | 10 +- internal/bot/commands.go | 48 ++++- internal/bot/events.go | 4 +- internal/cache/cache.go | 145 +++++++++++++ internal/commands/profile/profile.go | 50 +++++ internal/commands/stats/stats.go | 70 ++++++- internal/lastfm/api/user.go | 85 ++++---- internal/logger/logger.go | 292 +++++++++++++++++++++++++++ internal/logger/slog.go | 87 ++++++++ 13 files changed, 736 insertions(+), 62 deletions(-) create mode 100644 .gitattributes create mode 100644 internal/cache/cache.go create mode 100644 internal/commands/profile/profile.go create mode 100644 internal/logger/logger.go create mode 100644 internal/logger/slog.go diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..da303ad --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.nix linguist-detectable=false +Makefile linguist-detectable=false diff --git a/README.md b/README.md index 6b101e6..3048a9b 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ your last.fm stats within Discord, isn't it great? +the code is work in progress so if u see a war crime just ignore it, thanks. ~elisiei + ## installation ### clone repo (via http or ssh) diff --git a/cmd/bot/main.go b/cmd/bot/main.go index c78710b..121356c 100644 --- a/cmd/bot/main.go +++ b/cmd/bot/main.go @@ -26,6 +26,6 @@ func main() { defer cancel() if err = bot.Run(ctx); err != nil { - panic(err) + bot.Logger.Fatalf("%v", err) } } diff --git a/cmd/bot/register.go b/cmd/bot/register.go index e0c9c3b..dd869d2 100644 --- a/cmd/bot/register.go +++ b/cmd/bot/register.go @@ -1,5 +1,6 @@ package main import ( + _ "first.fm/internal/commands/profile" _ "first.fm/internal/commands/stats" ) diff --git a/internal/bot/bot.go b/internal/bot/bot.go index 8923c21..7773df3 100644 --- a/internal/bot/bot.go +++ b/internal/bot/bot.go @@ -8,6 +8,7 @@ import ( "syscall" "first.fm/internal/lastfm/api" + "first.fm/internal/logger" "github.com/disgoorg/disgo" "github.com/disgoorg/disgo/bot" "github.com/disgoorg/disgo/gateway" @@ -17,11 +18,14 @@ import ( type Bot struct { Client *bot.Client LastFM *api.Client + Logger *logger.Logger } func New(token, key string) (*Bot, error) { + log := logger.New() client, err := disgo.New( token, + bot.WithLogger(slog.New(logger.NewSlogHandler(log))), bot.WithGatewayConfigOpts( gateway.WithCompress(true), gateway.WithAutoReconnect(true), @@ -31,7 +35,6 @@ func New(token, key string) (*Bot, error) { ), ), bot.WithEventListenerFunc(onReady), - bot.WithEventListenerFunc(Dispatcher()), ) if err != nil { return nil, err @@ -41,6 +44,7 @@ func New(token, key string) (*Bot, error) { return &Bot{ Client: client, LastFM: lastfmClient, + Logger: log, }, nil } @@ -50,10 +54,12 @@ func (b *Bot) Run(ctx context.Context) error { } defer b.Client.Close(ctx) + b.Client.AddEventListeners(bot.NewListenerFunc(Dispatcher(b))) + if _, err := b.Client.Rest.SetGuildCommands(b.Client.ApplicationID, snowflake.GetEnv("GUILD_ID"), Commands()); err != nil { return err } - slog.Info("registered discord commands") + logger.Info("registered discord commands") stop := make(chan os.Signal, 1) signal.Notify(stop, os.Interrupt, syscall.SIGTERM) diff --git a/internal/bot/commands.go b/internal/bot/commands.go index 646b487..8e4242a 100644 --- a/internal/bot/commands.go +++ b/internal/bot/commands.go @@ -2,17 +2,20 @@ package bot import ( "context" - "log/slog" + "errors" + "strings" "time" + "first.fm/internal/lastfm" + "first.fm/internal/logger" "github.com/disgoorg/disgo/discord" "github.com/disgoorg/disgo/events" + disgohandler "github.com/disgoorg/disgo/handler" ) type CommandContext struct { - Context context.Context - Event *events.ApplicationCommandInteractionCreate - Bot *Bot + *disgohandler.CommandEvent + *Bot } type CommandHandler func(*CommandContext) error @@ -23,7 +26,7 @@ var ( ) func Register(meta discord.ApplicationCommandCreate, handler CommandHandler) { - slog.Info("registered command", "name", meta.CommandName()) + logger.Infow("registered command", logger.F{"name": meta.CommandName()}) allCommands = append(allCommands, meta) registry[meta.CommandName()] = handler } @@ -32,7 +35,7 @@ func Commands() []discord.ApplicationCommandCreate { return allCommands } -func Dispatcher() func(*events.ApplicationCommandInteractionCreate) { +func Dispatcher(bot *Bot) func(*events.ApplicationCommandInteractionCreate) { return func(event *events.ApplicationCommandInteractionCreate) { data := event.SlashCommandInteractionData() handler, ok := registry[data.CommandName()] @@ -45,19 +48,44 @@ func Dispatcher() func(*events.ApplicationCommandInteractionCreate) { } start := time.Now() + bgCtx := context.Background() ctx := &CommandContext{ - Context: context.Background(), - Event: event, + Bot: bot, + CommandEvent: &disgohandler.CommandEvent{ + ApplicationCommandInteractionCreate: event, + Ctx: bgCtx, + }, } if err := handler(ctx); err != nil { - slog.Error("command failed", "name", data.CommandName(), "err", err) + logger.Errorw("command failed", logger.F{"name": data.CommandName(), "err": err.Error()}) _ = event.CreateMessage(discord.NewMessageCreateBuilder(). SetContent("error: " + err.Error()). SetEphemeral(true). Build()) } - slog.Info("executed command", "name", data.CommandName(), "time", time.Since(start)) + logger.Infow("executed command", logger.F{"name": data.CommandName(), "time": time.Since(start)}) } } + +func (ctx *CommandContext) GetLastFMUser(name string) (*lastfm.UserInfo, error) { + if name == "" { + name = "user" + } + + if rawUser, defined := ctx.SlashCommandInteractionData().OptString(name); defined { + user, err := ctx.LastFM.User.Info(rawUser) + return user, err + } + + return nil, errors.New("automatic user detection is being worked on") +} + +func normalizeUserInput(input string) string { + if strings.HasPrefix(input, "<@") && strings.HasSuffix(input, ">") { + trimmed := strings.TrimSuffix(strings.TrimPrefix(input, "<@"), ">") + return strings.TrimPrefix(trimmed, "!") + } + return input +} diff --git a/internal/bot/events.go b/internal/bot/events.go index 1d0162b..25edf5e 100644 --- a/internal/bot/events.go +++ b/internal/bot/events.go @@ -2,13 +2,13 @@ package bot import ( "context" - "log/slog" + "first.fm/internal/logger" "github.com/disgoorg/disgo/events" "github.com/disgoorg/disgo/gateway" ) func onReady(event *events.Ready) { - slog.Info("started client") + logger.Info("started client") event.Client().SetPresence(context.Background(), gateway.WithCustomActivity("gwa gwa")) } diff --git a/internal/cache/cache.go b/internal/cache/cache.go new file mode 100644 index 0000000..22a0d05 --- /dev/null +++ b/internal/cache/cache.go @@ -0,0 +1,145 @@ +package cache + +import ( + "sync" + "time" +) + +type Cache[K comparable, V any] struct { + mu sync.RWMutex + items map[K]*Item[V] + defaultTTL time.Duration + maxSize int + + hits uint64 + misses uint64 +} + +type Item[V any] struct { + Value V + ExpiresAt time.Time + LastAccess time.Time +} + +func New[K comparable, V any](defaultTTL time.Duration, maxSize int) *Cache[K, V] { + c := &Cache[K, V]{ + items: make(map[K]*Item[V]), + defaultTTL: defaultTTL, + maxSize: maxSize, + } + + if defaultTTL > 0 { + go c.cleanupLoop() + } + + return c +} + +func (c *Cache[K, V]) Get(key K) (V, bool) { + c.mu.RLock() + defer c.mu.RUnlock() + + item, exists := c.items[key] + if !exists { + c.misses++ + var zero V + return zero, false + } + + if !item.ExpiresAt.IsZero() && time.Now().After(item.ExpiresAt) { + c.misses++ + var zero V + return zero, false + } + + item.LastAccess = time.Now() + c.hits++ + return item.Value, true +} + +func (c *Cache[K, V]) Set(key K, value V) { + c.SetWithTTL(key, value, c.defaultTTL) +} + +func (c *Cache[K, V]) SetWithTTL(key K, value V, ttl time.Duration) { + c.mu.Lock() + defer c.mu.Unlock() + + if c.maxSize > 0 && len(c.items) >= c.maxSize { + c.evictOldest() + } + + expiresAt := time.Time{} + if ttl > 0 { + expiresAt = time.Now().Add(ttl) + } + + c.items[key] = &Item[V]{ + Value: value, + ExpiresAt: expiresAt, + LastAccess: time.Now(), + } +} + +func (c *Cache[K, V]) Delete(key K) { + c.mu.Lock() + defer c.mu.Unlock() + delete(c.items, key) +} + +func (c *Cache[K, V]) Clear() { + c.mu.Lock() + defer c.mu.Unlock() + c.items = make(map[K]*Item[V]) +} + +func (c *Cache[K, V]) Size() int { + c.mu.RLock() + defer c.mu.RUnlock() + return len(c.items) +} + +func (c *Cache[K, V]) Stats() (hits, misses uint64, size int) { + c.mu.RLock() + defer c.mu.RUnlock() + return c.hits, c.misses, len(c.items) +} + +func (c *Cache[K, V]) evictOldest() { + var oldestKey K + var oldestTime time.Time + first := true + + for key, item := range c.items { + if first || item.LastAccess.Before(oldestTime) { + oldestKey = key + oldestTime = item.LastAccess + first = false + } + } + + if !first { + delete(c.items, oldestKey) + } +} + +func (c *Cache[K, V]) cleanupLoop() { + ticker := time.NewTicker(time.Minute) + defer ticker.Stop() + + for range ticker.C { + c.cleanup() + } +} + +func (c *Cache[K, V]) cleanup() { + c.mu.Lock() + defer c.mu.Unlock() + + now := time.Now() + for key, item := range c.items { + if !item.ExpiresAt.IsZero() && now.After(item.ExpiresAt) { + delete(c.items, key) + } + } +} diff --git a/internal/commands/profile/profile.go b/internal/commands/profile/profile.go new file mode 100644 index 0000000..4acc6df --- /dev/null +++ b/internal/commands/profile/profile.go @@ -0,0 +1,50 @@ +package profile + +import ( + "first.fm/internal/bot" + "github.com/disgoorg/disgo/discord" +) + +func init() { + bot.Register(data, handle) +} + +var data = discord.SlashCommandCreate{ + Name: "profile", + Description: "display someone's profile", + IntegrationTypes: []discord.ApplicationIntegrationType{ + discord.ApplicationIntegrationTypeGuildInstall, + discord.ApplicationIntegrationTypeUserInstall, + }, + Options: []discord.ApplicationCommandOption{ + discord.ApplicationCommandOptionString{ + Name: "user", + Description: "user to get profile from", + Required: false, + }, + }, +} + +func handle(ctx *bot.CommandContext) error { + err := ctx.DeferCreateMessage(false) + if err != nil { + return err + } + + user, err := ctx.GetLastFMUser("") + if err != nil { + return err + } + + component := discord.NewContainer( + discord.NewSection( + discord.NewTextDisplayf("# [%s](%s)", user.Name, user.URL), + ).WithAccessory(discord.NewThumbnail(user.Avatar.OriginalURL())), + ).WithAccentColor(0x00ADD8) + + _, err = ctx.UpdateInteractionResponse(discord.NewMessageUpdateBuilder(). + SetIsComponentsV2(true). + SetComponents(component). + Build()) + return err +} diff --git a/internal/commands/stats/stats.go b/internal/commands/stats/stats.go index c6602ea..779151c 100644 --- a/internal/commands/stats/stats.go +++ b/internal/commands/stats/stats.go @@ -1,10 +1,16 @@ package stats import ( + "fmt" + "runtime" + "time" + "first.fm/internal/bot" "github.com/disgoorg/disgo/discord" ) +var startTime = time.Now() + func init() { bot.Register(data, handle) } @@ -19,5 +25,67 @@ var data = discord.SlashCommandCreate{ } func handle(ctx *bot.CommandContext) error { - return ctx.Event.CreateMessage(discord.NewMessageCreateBuilder().SetContent("stats").Build()) + var m runtime.MemStats + runtime.ReadMemStats(&m) + + statsText := fmt.Sprintf( + "uptime: %s\n"+ + "goroutines: %d\n"+ + "os threads: %d\n"+ + "memory allocated: %s\n"+ + "total allocated: %s\n"+ + "system memory: %s\n"+ + "gc runs: %d\n"+ + "last gc pause: %.2fms\n"+ + "go version: %s\n", + formatUptime(time.Since(startTime)), + runtime.NumGoroutine(), + runtime.NumCPU(), + formatBytes(m.Alloc), + formatBytes(m.TotalAlloc), + formatBytes(m.Sys), + m.NumGC, + float64(m.PauseNs[(m.NumGC+255)%256])/1e6, + runtime.Version(), + ) + + component := discord.NewContainer( + discord.NewTextDisplay(statsText), + ).WithAccentColor(0x00ADD8) + + return ctx.CreateMessage( + discord.NewMessageCreateBuilder(). + SetIsComponentsV2(true). + SetComponents(component). + Build(), + ) +} + +func formatBytes(b uint64) string { + const unit = 1024 + if b < unit { + return fmt.Sprintf("%d B", b) + } + div, exp := uint64(unit), 0 + for n := b / unit; n >= unit; n /= unit { + div *= unit + exp++ + } + return fmt.Sprintf("%.2f %cB", float64(b)/float64(div), "KMGTPE"[exp]) +} + +func formatUptime(d time.Duration) string { + days := int(d.Hours() / 24) + hours := int(d.Hours()) % 24 + minutes := int(d.Minutes()) % 60 + seconds := int(d.Seconds()) % 60 + + if days > 0 { + return fmt.Sprintf("%dd %dh %dm %ds", days, hours, minutes, seconds) + } else if hours > 0 { + return fmt.Sprintf("%dh %dm %ds", hours, minutes, seconds) + } else if minutes > 0 { + return fmt.Sprintf("%dm %ds", minutes, seconds) + } + return fmt.Sprintf("%ds", seconds) } diff --git a/internal/lastfm/api/user.go b/internal/lastfm/api/user.go index b7535fc..58762f6 100644 --- a/internal/lastfm/api/user.go +++ b/internal/lastfm/api/user.go @@ -1,55 +1,69 @@ package api -import "first.fm/internal/lastfm" +import ( + "time" + + "first.fm/internal/cache" + "first.fm/internal/lastfm" +) type recentTracksExtendedParams struct { lastfm.RecentTracksParams Extended bool `url:"extended,int,omitempty"` } -type userTagsExtendedParams struct { - lastfm.UserTagsParams - Type lastfm.TagType `url:"taggingtype"` -} - type User struct { - api *API + api *API + InfoCache *cache.Cache[string, *lastfm.UserInfo] } // NewUser creates and returns a new User API route. func NewUser(api *API) *User { - return &User{api: api} + return &User{ + api: api, + InfoCache: cache.New[string, *lastfm.UserInfo](time.Minute*10, 1000), + } } // Friends returns the friends of a user. -func (u User) Friends(params lastfm.FriendsParams) (*lastfm.Friends, error) { +func (u *User) Friends(params lastfm.FriendsParams) (*lastfm.Friends, error) { var res lastfm.Friends return &res, u.api.Get(&res, UserGetFriendsMethod, params) } -// Info returns the information of a user. -func (u User) Info(user string) (*lastfm.UserInfo, error) { +// Info returns the information of a user with caching. +func (u *User) Info(user string) (*lastfm.UserInfo, error) { + if cached, ok := u.InfoCache.Get(user); ok { + return cached, nil + } + var res lastfm.UserInfo p := lastfm.UserInfoParams{User: user} - return &res, u.api.Get(&res, UserGetInfoMethod, p) + err := u.api.Get(&res, UserGetInfoMethod, p) + if err != nil { + return nil, err + } + + u.InfoCache.Set(user, &res) + return &res, nil } // LovedTracks returns the loved tracks of a user. -func (u User) LovedTracks(params lastfm.LovedTracksParams) (*lastfm.LovedTracks, error) { +func (u *User) LovedTracks(params lastfm.LovedTracksParams) (*lastfm.LovedTracks, error) { var res lastfm.LovedTracks return &res, u.api.Get(&res, UserGetLovedTracksMethod, params) } // RecentTrack returns the most recent track of a user. This is a convenience // method that calls RecentTracks with limit=1. -func (u User) RecentTrack(user string) (*lastfm.RecentTrack, error) { +func (u *User) RecentTrack(user string) (*lastfm.RecentTrack, error) { var res lastfm.RecentTrack p := lastfm.RecentTracksParams{User: user, Limit: 1} return &res, u.api.Get(&res, UserGetRecentTracksMethod, p) } // RecentTracks returns the recent tracks of a user. -func (u User) RecentTracks(params lastfm.RecentTracksParams) (*lastfm.RecentTracks, error) { +func (u *User) RecentTracks(params lastfm.RecentTracksParams) (*lastfm.RecentTracks, error) { var res lastfm.RecentTracks return &res, u.api.Get(&res, UserGetRecentTracksMethod, params) } @@ -57,7 +71,7 @@ func (u User) RecentTracks(params lastfm.RecentTracksParams) (*lastfm.RecentTrac // RecentTrackExtended returns the most recent track of a user with extended // information. This is a convenience method that calls RecentTracksExtended // with limit=1. -func (u User) RecentTrackExtended(user string) (*lastfm.RecentTrackExtended, error) { +func (u *User) RecentTrackExtended(user string) (*lastfm.RecentTrackExtended, error) { var res lastfm.RecentTrackExtended p := lastfm.RecentTracksParams{User: user, Limit: 1} exp := recentTracksExtendedParams{RecentTracksParams: p, Extended: true} @@ -66,7 +80,7 @@ func (u User) RecentTrackExtended(user string) (*lastfm.RecentTrackExtended, err // RecentTracksExtended returns the recent tracks of a user with extended // information. -func (u User) RecentTracksExtended( +func (u *User) RecentTracksExtended( params lastfm.RecentTracksParams) (*lastfm.RecentTracksExtended, error) { var res lastfm.RecentTracksExtended @@ -74,53 +88,32 @@ func (u User) RecentTracksExtended( return &res, u.api.Get(&res, UserGetRecentTracksMethod, exp) } -// TaggedAlbums returns the albums tagged by a user with the given tag. -func (u User) TaggedAlbums(params lastfm.UserTagsParams) (*lastfm.UserAlbumTags, error) { - var res lastfm.UserAlbumTags - p := userTagsExtendedParams{UserTagsParams: params, Type: lastfm.TagTypeAlbum} - return &res, u.api.Get(&res, UserGetPersonalTagsMethod, p) -} - -// TaggedArtists returns the artists tagged by a user with the given tag. -func (u User) TaggedArtists(params lastfm.UserTagsParams) (*lastfm.UserArtistTags, error) { - var res lastfm.UserArtistTags - p := userTagsExtendedParams{UserTagsParams: params, Type: lastfm.TagTypeArtist} - return &res, u.api.Get(&res, UserGetPersonalTagsMethod, p) -} - -// TaggedTracks returns the tracks tagged by a user with the given tag. -func (u User) TaggedTracks(params lastfm.UserTagsParams) (*lastfm.UserTrackTags, error) { - var res lastfm.UserTrackTags - p := userTagsExtendedParams{UserTagsParams: params, Type: lastfm.TagTypeTrack} - return &res, u.api.Get(&res, UserGetPersonalTagsMethod, p) -} - // TopAlbums returns the top albums of a user. -func (u User) TopAlbums(params lastfm.UserTopAlbumsParams) (*lastfm.UserTopAlbums, error) { +func (u *User) TopAlbums(params lastfm.UserTopAlbumsParams) (*lastfm.UserTopAlbums, error) { var res lastfm.UserTopAlbums return &res, u.api.Get(&res, UserGetTopAlbumsMethod, params) } // TopArtists returns the top artists of a user. -func (u User) TopArtists(params lastfm.UserTopArtistsParams) (*lastfm.UserTopArtists, error) { +func (u *User) TopArtists(params lastfm.UserTopArtistsParams) (*lastfm.UserTopArtists, error) { var res lastfm.UserTopArtists return &res, u.api.Get(&res, UserGetTopArtistsMethod, params) } // TopTags returns the top tags of a user. -func (u User) TopTags(params lastfm.UserTopTagsParams) (*lastfm.UserTopTags, error) { +func (u *User) TopTags(params lastfm.UserTopTagsParams) (*lastfm.UserTopTags, error) { var res lastfm.UserTopTags return &res, u.api.Get(&res, UserGetTopTagsMethod, params) } // TopTracks returns the top tracks of a user. -func (u User) TopTracks(params lastfm.UserTopTracksParams) (*lastfm.UserTopTracks, error) { +func (u *User) TopTracks(params lastfm.UserTopTracksParams) (*lastfm.UserTopTracks, error) { var res lastfm.UserTopTracks return &res, u.api.Get(&res, UserGetTopTracksMethod, params) } // WeeklyAlbumChart returns the weekly album chart of a user. -func (u User) WeeklyAlbumChart( +func (u *User) WeeklyAlbumChart( params lastfm.WeeklyAlbumChartParams) (*lastfm.WeeklyAlbumChart, error) { var res lastfm.WeeklyAlbumChart @@ -128,7 +121,7 @@ func (u User) WeeklyAlbumChart( } // WeeklyArtistChart returns the weekly artist chart of a user. -func (u User) WeeklyArtistChart( +func (u *User) WeeklyArtistChart( params lastfm.WeeklyArtistChartParams) (*lastfm.WeeklyArtistChart, error) { var res lastfm.WeeklyArtistChart @@ -136,14 +129,14 @@ func (u User) WeeklyArtistChart( } // WeeklyChartList returns the weekly chart list of a user. -func (u User) WeeklyChartList(user string) (*lastfm.WeeklyChartList, error) { +func (u *User) WeeklyChartList(user string) (*lastfm.WeeklyChartList, error) { var res lastfm.WeeklyChartList p := lastfm.WeeklyChartListParams{User: user} return &res, u.api.Get(&res, UserGetWeeklyChartListMethod, p) } // WeeklyTrackChart returns the weekly track chart of a user. -func (u User) WeeklyTrackChart( +func (u *User) WeeklyTrackChart( params lastfm.WeeklyTrackChartParams) (*lastfm.WeeklyTrackChart, error) { var res lastfm.WeeklyTrackChart diff --git a/internal/logger/logger.go b/internal/logger/logger.go new file mode 100644 index 0000000..92f0676 --- /dev/null +++ b/internal/logger/logger.go @@ -0,0 +1,292 @@ +package logger + +import ( + "encoding/json" + "fmt" + "io" + "maps" + "os" + "runtime" + "sort" + "strings" + "sync" + "time" +) + +type Level int + +const ( + LevelDebug Level = iota + LevelInfo + LevelWarn + LevelError + LevelFatal +) + +func (l Level) String() string { + return [...]string{"DEBUG", "INFO", "WARN", "ERROR", "FATAL"}[l] +} + +type F map[string]any + +var ( + ansiReset = "\u001b[0m" + ansiBlack = "\u001b[30m" + + defaultLevelColor = map[Level]string{ + LevelDebug: "\u001b[37m", + LevelInfo: "\u001b[34m", + LevelWarn: "\u001b[33m", + LevelError: "\u001b[31m", + LevelFatal: "\u001b[35;1m", + } + defaultLevelColorBg = map[Level]string{ + LevelDebug: "\u001b[47m", + LevelInfo: "\u001b[44m", + LevelWarn: "\u001b[43m", + LevelError: "\u001b[41m", + LevelFatal: "\u001b[45;1m", + } +) + +type Logger struct { + mu sync.Mutex + out io.Writer + level Level + timeStamp bool + timeFormat string + json bool + colors bool + caller bool + fields F + levelColor map[Level]string + levelColorBg map[Level]string +} + +var std = New() + +func New() *Logger { + return &Logger{ + out: os.Stderr, + level: LevelInfo, + timeStamp: true, + timeFormat: time.RFC3339, + colors: isTerminal(os.Stderr), + caller: true, + fields: make(F), + levelColor: maps.Clone(defaultLevelColor), + levelColorBg: maps.Clone(defaultLevelColorBg), + } +} + +// Custom colors +func (l *Logger) SetLevelColor(level Level, fg string) { + l.mu.Lock() + l.levelColor[level] = fg + l.mu.Unlock() +} +func (l *Logger) SetLevelBgColor(level Level, bg string) { + l.mu.Lock() + l.levelColorBg[level] = bg + l.mu.Unlock() +} + +// Config +func (l *Logger) SetOutput(w io.Writer) { + l.mu.Lock() + defer l.mu.Unlock() + l.out = w + if f, ok := w.(*os.File); ok { + l.colors = isTerminal(f) + } +} +func (l *Logger) SetLevel(level Level) { l.mu.Lock(); l.level = level; l.mu.Unlock() } +func (l *Logger) EnableTimestamps(on bool) { l.mu.Lock(); l.timeStamp = on; l.mu.Unlock() } +func (l *Logger) SetTimeFormat(tf string) { l.mu.Lock(); l.timeFormat = tf; l.mu.Unlock() } +func (l *Logger) SetJSON(on bool) { l.mu.Lock(); l.json = on; l.mu.Unlock() } +func (l *Logger) EnableColors(on bool) { l.mu.Lock(); l.colors = on; l.mu.Unlock() } +func (l *Logger) ShowCaller(on bool) { l.mu.Lock(); l.caller = on; l.mu.Unlock() } + +func (l *Logger) WithFields(f F) *Logger { + l.mu.Lock() + defer l.mu.Unlock() + newFields := make(F, len(l.fields)+len(f)) + maps.Copy(newFields, l.fields) + maps.Copy(newFields, f) + return &Logger{ + out: l.out, level: l.level, + timeStamp: l.timeStamp, timeFormat: l.timeFormat, + json: l.json, colors: l.colors, caller: l.caller, + fields: newFields, + levelColor: maps.Clone(l.levelColor), + levelColorBg: maps.Clone(l.levelColorBg), + } +} + +func isTerminal(f *os.File) bool { + fi, err := f.Stat() + return err == nil && fi.Mode()&os.ModeCharDevice != 0 +} + +func (l *Logger) Log(level Level, msg string, extra F) { + l.mu.Lock() + out, jsonMode, colors, timeStamp, tf, callerOn := l.out, l.json, l.colors, l.timeStamp, l.timeFormat, l.caller + base := make(F, len(l.fields)) + maps.Copy(base, l.fields) + l.mu.Unlock() + + if level < l.level { + return + } + maps.Copy(base, extra) + + var callerStr string + if callerOn { + if _, file, line, ok := runtime.Caller(3); ok { + callerStr = fmt.Sprintf("%s:%d", shortFile(file), line) + } + } + + if jsonMode { + entry := make(map[string]any, len(base)+4) + entry["level"], entry["msg"] = level.String(), msg + if timeStamp { + entry["time"] = time.Now().Format(tf) + } + if callerStr != "" { + entry["caller"] = callerStr + } + maps.Copy(entry, base) + if b, err := json.Marshal(entry); err != nil { + fmt.Fprintf(out, "json marshal error: %v\n", err) + return + } else { + fmt.Fprintln(out, string(b)) + } + if level == LevelFatal { + os.Exit(1) + } + return + } + + var b strings.Builder + if colors { + if c, ok := l.levelColor[level]; ok { + b.WriteString(c) + } + } + if timeStamp { + b.WriteString(time.Now().Format(tf) + " ") + } + if colors { + if c, ok := l.levelColorBg[level]; ok { + b.WriteString(c + ansiBlack) + } + } + + b.WriteString(" " + level.String() + " ") + if colors { + if c, ok := l.levelColor[level]; ok { + b.WriteString(ansiReset + c) + } + } + b.WriteString(" " + msg) + + if len(base) > 0 { + b.WriteString(" ") + keys := make([]string, 0, len(base)) + for k := range base { + keys = append(keys, k) + } + sort.Strings(keys) + for i, k := range keys { + if i > 0 { + b.WriteString(" ") + } + fmt.Fprintf(&b, "%s=%v", k, base[k]) + } + } + if callerStr != "" { + fmt.Fprintf(&b, " (%s)", callerStr) + } + if colors { + b.WriteString(ansiReset) + } + + fmt.Fprintln(out, b.String()) + if level == LevelFatal { + os.Exit(1) + } +} + +func shortFile(path string) string { + parts := strings.Split(path, "/") + if n := len(parts); n >= 2 { + return strings.Join(parts[n-2:], "/") + } + return path +} + +// Convenience methods +func (l *Logger) Debug(msg string) { l.Log(LevelDebug, msg, nil) } +func (l *Logger) Info(msg string) { l.Log(LevelInfo, msg, nil) } +func (l *Logger) Warn(msg string) { l.Log(LevelWarn, msg, nil) } +func (l *Logger) Error(msg string) { l.Log(LevelError, msg, nil) } +func (l *Logger) Fatal(msg string) { l.Log(LevelFatal, msg, nil) } + +func (l *Logger) Debugf(f string, a ...any) { l.Log(LevelDebug, fmt.Sprintf(f, a...), nil) } +func (l *Logger) Infof(f string, a ...any) { l.Log(LevelInfo, fmt.Sprintf(f, a...), nil) } +func (l *Logger) Warnf(f string, a ...any) { l.Log(LevelWarn, fmt.Sprintf(f, a...), nil) } +func (l *Logger) Errorf(f string, a ...any) { l.Log(LevelError, fmt.Sprintf(f, a...), nil) } +func (l *Logger) Fatalf(f string, a ...any) { l.Log(LevelFatal, fmt.Sprintf(f, a...), nil) } + +func (l *Logger) Debugw(msg string, f F, a ...any) { l.Log(LevelDebug, fmt.Sprintf(msg, a...), f) } +func (l *Logger) Infow(msg string, f F, a ...any) { l.Log(LevelInfo, fmt.Sprintf(msg, a...), f) } +func (l *Logger) Warnw(msg string, f F, a ...any) { l.Log(LevelWarn, fmt.Sprintf(msg, a...), f) } +func (l *Logger) Errorw(msg string, f F, a ...any) { l.Log(LevelError, fmt.Sprintf(msg, a...), f) } +func (l *Logger) Fatalw(msg string, f F, a ...any) { l.Log(LevelFatal, fmt.Sprintf(msg, a...), f) } + +// Std shortcuts +func SetOutput(w io.Writer) { std.SetOutput(w) } +func SetLevel(l Level) { std.SetLevel(l) } +func EnableTimestamps(on bool) { std.EnableTimestamps(on) } +func SetTimeFormat(tf string) { std.SetTimeFormat(tf) } +func SetJSON(on bool) { std.SetJSON(on) } +func EnableColors(on bool) { std.EnableColors(on) } +func ShowCaller(on bool) { std.ShowCaller(on) } +func WithFields(f F) *Logger { return std.WithFields(f) } + +func Debug(msg string) { std.Debug(msg) } +func Info(msg string) { std.Info(msg) } +func Warn(msg string) { std.Warn(msg) } +func Error(msg string) { std.Error(msg) } +func Fatal(msg string) { std.Fatal(msg) } + +func Debugf(f string, a ...any) { std.Debugf(f, a...) } +func Infof(f string, a ...any) { std.Infof(f, a...) } +func Warnf(f string, a ...any) { std.Warnf(f, a...) } +func Errorf(f string, a ...any) { std.Errorf(f, a...) } +func Fatalf(f string, a ...any) { std.Fatalf(f, a...) } + +func Debugw(msg string, f F, a ...any) { std.Debugw(msg, f, a...) } +func Infow(msg string, f F, a ...any) { std.Infow(msg, f, a...) } +func Warnw(msg string, f F, a ...any) { std.Warnw(msg, f, a...) } +func Errorw(msg string, f F, a ...any) { std.Errorw(msg, f, a...) } +func Fatalw(msg string, f F, a ...any) { std.Fatalw(msg, f, a...) } + +func ParseLevel(s string) (Level, error) { + switch strings.ToLower(strings.TrimSpace(s)) { + case "debug": + return LevelDebug, nil + case "info": + return LevelInfo, nil + case "warn", "warning": + return LevelWarn, nil + case "error", "err": + return LevelError, nil + case "fatal": + return LevelFatal, nil + default: + return LevelInfo, fmt.Errorf("unknown level: %s", s) + } +} diff --git a/internal/logger/slog.go b/internal/logger/slog.go new file mode 100644 index 0000000..de7d52f --- /dev/null +++ b/internal/logger/slog.go @@ -0,0 +1,87 @@ +package logger + +import ( + "context" + "log/slog" +) + +type slogHandler struct { + l *Logger +} + +func NewSlogHandler(l *Logger) slog.Handler { + return &slogHandler{l: l} +} + +func (h *slogHandler) Enabled(_ context.Context, level slog.Level) bool { + return h.toZlog(level) >= h.l.level +} + +func (h *slogHandler) Handle(_ context.Context, r slog.Record) error { + fields := F{} + r.Attrs(func(a slog.Attr) bool { + fields[a.Key] = a.Value.Any() + return true + }) + + h.l.Log(h.toZlog(r.Level), r.Message, fields) + return nil +} + +func (h *slogHandler) WithAttrs(attrs []slog.Attr) slog.Handler { + f := F{} + for _, a := range attrs { + f[a.Key] = a.Value.Any() + } + return &slogHandler{l: h.l.WithFields(f)} +} + +func (h *slogHandler) WithGroup(name string) slog.Handler { + return &groupHandler{parent: h, prefix: name} +} + +type groupHandler struct { + parent *slogHandler + prefix string +} + +func (g *groupHandler) Enabled(ctx context.Context, level slog.Level) bool { + return g.parent.Enabled(ctx, level) +} + +func (g *groupHandler) Handle(ctx context.Context, r slog.Record) error { + fields := F{} + r.Attrs(func(a slog.Attr) bool { + fields[g.prefix+"."+a.Key] = a.Value.Any() + return true + }) + g.parent.l.Log(g.parent.toZlog(r.Level), r.Message, fields) + return nil +} + +func (g *groupHandler) WithAttrs(attrs []slog.Attr) slog.Handler { + f := F{} + for _, a := range attrs { + f[g.prefix+"."+a.Key] = a.Value.Any() + } + return &slogHandler{l: g.parent.l.WithFields(f)} +} + +func (g *groupHandler) WithGroup(name string) slog.Handler { + return &groupHandler{parent: g.parent, prefix: g.prefix + "." + name} +} + +func (h *slogHandler) toZlog(level slog.Level) Level { + switch { + case level <= slog.LevelDebug: + return LevelDebug + case level < slog.LevelWarn: + return LevelInfo + case level < slog.LevelError: + return LevelWarn + case level < slog.LevelError+2: + return LevelError + default: + return LevelFatal + } +} From a8b008ad2334dd64ab69636a2bf10f84153e023f Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Tue, 30 Sep 2025 01:26:12 +0200 Subject: [PATCH 28/29] emojis --- internal/bot/bot.go | 4 +-- internal/commands/profile/profile.go | 30 ++++++++++++---- internal/emojis/emojis.go | 51 ++++++++++++++++++++++++++++ internal/lastfm/api/user.go | 2 +- 4 files changed, 78 insertions(+), 9 deletions(-) create mode 100644 internal/emojis/emojis.go diff --git a/internal/bot/bot.go b/internal/bot/bot.go index 7773df3..df55427 100644 --- a/internal/bot/bot.go +++ b/internal/bot/bot.go @@ -49,13 +49,13 @@ func New(token, key string) (*Bot, error) { } func (b *Bot) Run(ctx context.Context) error { + b.Client.AddEventListeners(bot.NewListenerFunc(Dispatcher(b))) + if err := b.Client.OpenGateway(ctx); err != nil { return err } defer b.Client.Close(ctx) - b.Client.AddEventListeners(bot.NewListenerFunc(Dispatcher(b))) - if _, err := b.Client.Rest.SetGuildCommands(b.Client.ApplicationID, snowflake.GetEnv("GUILD_ID"), Commands()); err != nil { return err } diff --git a/internal/commands/profile/profile.go b/internal/commands/profile/profile.go index 4acc6df..43dbe5d 100644 --- a/internal/commands/profile/profile.go +++ b/internal/commands/profile/profile.go @@ -2,6 +2,7 @@ package profile import ( "first.fm/internal/bot" + "first.fm/internal/emojis" "github.com/disgoorg/disgo/discord" ) @@ -36,15 +37,32 @@ func handle(ctx *bot.CommandContext) error { return err } - component := discord.NewContainer( - discord.NewSection( - discord.NewTextDisplayf("# [%s](%s)", user.Name, user.URL), - ).WithAccessory(discord.NewThumbnail(user.Avatar.OriginalURL())), - ).WithAccentColor(0x00ADD8) + component := []discord.LayoutComponent{ + discord.NewContainer( + discord.NewSection( + discord.NewTextDisplayf("## [%s](%s)", user.Name, user.URL), + discord.NewTextDisplayf("Since %s", user.RegisteredAt.Time().Unix(), emojis.EmojiCalendar), + discord.NewTextDisplayf("**%d** total scrobbles %s", user.Playcount, emojis.EmojiPlay), + ).WithAccessory(discord.NewThumbnail(user.Avatar.OriginalURL())), + discord.NewSmallSeparator(), + discord.NewTextDisplayf( + "%s **%d** albums\n%s **%d** artists\n%s **%d** unique tracks", + emojis.EmojiAlbum, + user.ArtistCount, + emojis.EmojiMic2, + user.AlbumCount, + emojis.EmojiNote, + user.TrackCount, + ), + ).WithAccentColor(0x00ADD8), + discord.NewActionRow( + discord.NewLinkButton("Last.fm", user.URL).WithEmoji(discord.NewCustomComponentEmoji(emojis.EmojiLastFMRed.Snowflake())), + ), + } _, err = ctx.UpdateInteractionResponse(discord.NewMessageUpdateBuilder(). SetIsComponentsV2(true). - SetComponents(component). + SetComponents(component...). Build()) return err } diff --git a/internal/emojis/emojis.go b/internal/emojis/emojis.go new file mode 100644 index 0000000..ef750b2 --- /dev/null +++ b/internal/emojis/emojis.go @@ -0,0 +1,51 @@ +package emojis + +import "github.com/disgoorg/snowflake/v2" + +type Emoji struct { + ID string + Name string + Animated bool +} + +func (e Emoji) String() string { + if e.Animated { + return "" + } + return "<:" + e.Name + ":" + e.ID + ">" +} + +func (e Emoji) Snowflake() snowflake.ID { + return snowflake.MustParse(e.ID) +} + +var ( + // misc + EmojiCrown = Emoji{ID: "1418014546462773348", Name: "crown", Animated: true} + EmojiQuestionMark = Emoji{ID: "1418015866695581708", Name: "question", Animated: true} + EmojiChat = Emoji{ID: "1418013205992575116", Name: "chat", Animated: true} + EmojiNote = Emoji{ID: "1418015996651765770", Name: "note", Animated: true} + EmojiTop = Emoji{ID: "1418012513584283709", Name: "top", Animated: true} + EmojiStar = Emoji{ID: "1418011800724705310", Name: "star", Animated: true} + EmojiFire = Emoji{ID: "1418017773354881156", Name: "fire", Animated: true} + EmojiMic = Emoji{ID: "1418021307089551471", Name: "mic", Animated: true} + EmojiMic2 = Emoji{ID: "1418021315708981258", Name: "mic2", Animated: true} + EmojiPlay = Emoji{ID: "1418021326228295692", Name: "play", Animated: true} + EmojiAlbum = Emoji{ID: "1418021336110075944", Name: "album", Animated: true} + EmojiCalendar = Emoji{ID: "1418022075527860244", Name: "calendar", Animated: true} + + // last.fm + EmojiLastFMRed = Emoji{ID: "1418268922448187492", Name: "lastfm", Animated: false} + EmojiLastFMWhite = Emoji{ID: "1418269025959546943", Name: "lastfm_white", Animated: false} + + // status + EmojiCross = Emoji{ID: "1418016016642080848", Name: "cross", Animated: true} + EmojiCheck = Emoji{ID: "1418016005732565002", Name: "check", Animated: true} + EmojiUpdate = Emoji{ID: "1418014272415469578", Name: "update", Animated: true} + EmojiWarning = Emoji{ID: "1418013632293507204", Name: "warning", Animated: true} + + // rank + EmojiRankOne = Emoji{ID: "1418015934312087582", Name: "rank1", Animated: true} + EmojiRankTwo = Emoji{ID: "1418015960862036139", Name: "rank2", Animated: true} + EmojiRankThree = Emoji{ID: "1418015987562709022", Name: "rank3", Animated: true} +) diff --git a/internal/lastfm/api/user.go b/internal/lastfm/api/user.go index 58762f6..d856f9e 100644 --- a/internal/lastfm/api/user.go +++ b/internal/lastfm/api/user.go @@ -21,7 +21,7 @@ type User struct { func NewUser(api *API) *User { return &User{ api: api, - InfoCache: cache.New[string, *lastfm.UserInfo](time.Minute*10, 1000), + InfoCache: cache.New[string, *lastfm.UserInfo](time.Hour, 1000), } } From 8727c93a8e434f5738067c228e598063bf2a6a78 Mon Sep 17 00:00:00 2001 From: Elisiei Yehorov Date: Wed, 1 Oct 2025 00:08:13 +0200 Subject: [PATCH 29/29] idk --- cmd/bot/main.go | 14 ++- cmd/bot/register.go | 1 + go.mod | 1 + go.sum | 2 + internal/bot/bot.go | 17 +-- internal/bot/commands.go | 35 +++++-- internal/commands/fm/fm.go | 68 ++++++++++++ internal/persistence/shared/shared.go | 5 + internal/persistence/sql/queries.sql | 22 ++++ internal/persistence/sql/schema.sql | 8 ++ internal/persistence/sqlc/db.go | 128 +++++++++++++++++++++++ internal/persistence/sqlc/models.go | 17 +++ internal/persistence/sqlc/queries.sql.go | 92 ++++++++++++++++ internal/persistence/sqlc/start.go | 38 +++++++ sqlc.yaml | 5 + 15 files changed, 434 insertions(+), 19 deletions(-) create mode 100644 internal/commands/fm/fm.go create mode 100644 internal/persistence/shared/shared.go create mode 100644 internal/persistence/sql/queries.sql create mode 100644 internal/persistence/sql/schema.sql create mode 100644 internal/persistence/sqlc/db.go create mode 100644 internal/persistence/sqlc/models.go create mode 100644 internal/persistence/sqlc/queries.sql.go create mode 100644 internal/persistence/sqlc/start.go diff --git a/cmd/bot/main.go b/cmd/bot/main.go index 121356c..ad6ea9f 100644 --- a/cmd/bot/main.go +++ b/cmd/bot/main.go @@ -7,6 +7,8 @@ import ( "syscall" "first.fm/internal/bot" + "first.fm/internal/logger" + "first.fm/internal/persistence/sqlc" ) func main() { @@ -17,15 +19,21 @@ func main() { panic("DISCORD_TOKEN and LASTFM_API_KEY must be set") } - bot, err := bot.New(token, lastfmKey) + q, db, err := sqlc.Start(context.Background(), "database.db") if err != nil { - panic(err) + logger.Fatalf("%v", err) + } + defer db.Close() + + bot, err := bot.New(token, lastfmKey, q) + if err != nil { + logger.Fatalf("%v", err) } ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer cancel() if err = bot.Run(ctx); err != nil { - bot.Logger.Fatalf("%v", err) + logger.Fatalf("%v", err) } } diff --git a/cmd/bot/register.go b/cmd/bot/register.go index dd869d2..1b13432 100644 --- a/cmd/bot/register.go +++ b/cmd/bot/register.go @@ -1,6 +1,7 @@ package main import ( + _ "first.fm/internal/commands/fm" _ "first.fm/internal/commands/profile" _ "first.fm/internal/commands/stats" ) diff --git a/go.mod b/go.mod index d118109..a78f27d 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/disgoorg/json/v2 v2.0.0 // indirect github.com/disgoorg/omit v1.0.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect + github.com/mattn/go-sqlite3 v1.14.32 // indirect github.com/sasha-s/go-csync v0.0.0-20240107134140-fcbab37b09ad // indirect golang.org/x/crypto v0.39.0 // indirect golang.org/x/sys v0.33.0 // indirect diff --git a/go.sum b/go.sum index 62b8ffa..6de9bea 100644 --- a/go.sum +++ b/go.sum @@ -10,6 +10,8 @@ github.com/disgoorg/snowflake/v2 v2.0.3 h1:3B+PpFjr7j4ad7oeJu4RlQ+nYOTadsKapJIzg github.com/disgoorg/snowflake/v2 v2.0.3/go.mod h1:W6r7NUA7DwfZLwr00km6G4UnZ0zcoLBRufhkFWgAc4c= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= +github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sasha-s/go-csync v0.0.0-20240107134140-fcbab37b09ad h1:qIQkSlF5vAUHxEmTbaqt1hkJ/t6skqEGYiMag343ucI= diff --git a/internal/bot/bot.go b/internal/bot/bot.go index df55427..c01566d 100644 --- a/internal/bot/bot.go +++ b/internal/bot/bot.go @@ -9,6 +9,7 @@ import ( "first.fm/internal/lastfm/api" "first.fm/internal/logger" + "first.fm/internal/persistence/sqlc" "github.com/disgoorg/disgo" "github.com/disgoorg/disgo/bot" "github.com/disgoorg/disgo/gateway" @@ -16,12 +17,13 @@ import ( ) type Bot struct { - Client *bot.Client - LastFM *api.Client - Logger *logger.Logger + Client *bot.Client + LastFM *api.Client + Logger *logger.Logger + Queries *sqlc.Queries } -func New(token, key string) (*Bot, error) { +func New(token, key string, q *sqlc.Queries) (*Bot, error) { log := logger.New() client, err := disgo.New( token, @@ -42,9 +44,10 @@ func New(token, key string) (*Bot, error) { lastfmClient := api.NewClient(key) return &Bot{ - Client: client, - LastFM: lastfmClient, - Logger: log, + Client: client, + LastFM: lastfmClient, + Logger: log, + Queries: q, }, nil } diff --git a/internal/bot/commands.go b/internal/bot/commands.go index 8e4242a..53854dc 100644 --- a/internal/bot/commands.go +++ b/internal/bot/commands.go @@ -2,7 +2,6 @@ package bot import ( "context" - "errors" "strings" "time" @@ -11,6 +10,7 @@ import ( "github.com/disgoorg/disgo/discord" "github.com/disgoorg/disgo/events" disgohandler "github.com/disgoorg/disgo/handler" + "github.com/disgoorg/snowflake/v2" ) type CommandContext struct { @@ -69,20 +69,37 @@ func Dispatcher(bot *Bot) func(*events.ApplicationCommandInteractionCreate) { } } -func (ctx *CommandContext) GetLastFMUser(name string) (*lastfm.UserInfo, error) { - if name == "" { - name = "user" +// now ima explain why this fucking function fetches the user everytime +// so first of all, it is cached so dont fucking worry ok. +// also this helps to cache the user for future requests do you get me +// so stfu ik this fucking function fetches the entire user instead of only returning +// a fucking username. ~elisiei +// edit: however, i should do an alternative function to get only the username anyways :kekw:. ~elisiei +func (ctx *CommandContext) GetLastFMUser(optionName string) (*lastfm.UserInfo, error) { + if optionName == "" { + optionName = "user" } - if rawUser, defined := ctx.SlashCommandInteractionData().OptString(name); defined { - user, err := ctx.LastFM.User.Info(rawUser) - return user, err + rawUser, defined := ctx.SlashCommandInteractionData().OptString(optionName) + if defined && rawUser != "" { + if id, err := snowflake.Parse(normalizeUserMention(rawUser)); err == nil { + if dbUser, err := ctx.Queries.GetUserByID(ctx.Ctx, id); err == nil { + rawUser = dbUser.LastfmUsername + } + } + + return ctx.LastFM.User.Info(rawUser) } - return nil, errors.New("automatic user detection is being worked on") + user, err := ctx.Queries.GetUserByID(ctx.Ctx, ctx.User().ID) + if err != nil { + return nil, err + } + return ctx.LastFM.User.Info(user.LastfmUsername) } -func normalizeUserInput(input string) string { +func normalizeUserMention(input string) string { + input = strings.TrimSpace(input) if strings.HasPrefix(input, "<@") && strings.HasSuffix(input, ">") { trimmed := strings.TrimSuffix(strings.TrimPrefix(input, "<@"), ">") return strings.TrimPrefix(trimmed, "!") diff --git a/internal/commands/fm/fm.go b/internal/commands/fm/fm.go new file mode 100644 index 0000000..dc47a09 --- /dev/null +++ b/internal/commands/fm/fm.go @@ -0,0 +1,68 @@ +package fm + +import ( + "errors" + "time" + + "first.fm/internal/bot" + "github.com/disgoorg/disgo/discord" +) + +func init() { + bot.Register(data, handle) +} + +var data = discord.SlashCommandCreate{ + Name: "fm", + Description: "display an user's current track", + IntegrationTypes: []discord.ApplicationIntegrationType{ + discord.ApplicationIntegrationTypeGuildInstall, + discord.ApplicationIntegrationTypeUserInstall, + }, + Options: []discord.ApplicationCommandOption{ + discord.ApplicationCommandOptionString{ + Name: "user", + Description: "user to get fm from", + Required: false, + }, + }, +} + +func handle(ctx *bot.CommandContext) error { + err := ctx.DeferCreateMessage(false) + if err != nil { + return err + } + + user, err := ctx.GetLastFMUser("") + if err != nil { + return err + } + + recentTrack, err := ctx.LastFM.User.RecentTrack(user.Name) + if err != nil { + return errors.New("failed to get recent track") + } + + var text discord.TextDisplayComponent + + if recentTrack.Track.NowPlaying { + text = discord.NewTextDisplayf("-# *Current track for **%s***", recentTrack.User) + } else { + text = discord.NewTextDisplayf("-# *Last track for **%s**, scrobbled at %s*", recentTrack.User, recentTrack.Track.ScrobbledAt.Format(time.Kitchen)) + } + + component := discord.NewContainer( + discord.NewSection( + discord.NewTextDisplayf("# %s", recentTrack.Track.Title), + discord.NewTextDisplayf("**%s** **ยท** *%s*", recentTrack.Track.Artist.Name, recentTrack.Track.Album.Title), + text, + ).WithAccessory(discord.NewThumbnail(recentTrack.Track.Image.OriginalURL())), + ) + + _, err = ctx.UpdateInteractionResponse(discord.NewMessageUpdateBuilder(). + SetIsComponentsV2(true). + SetComponents(component). + Build()) + return err +} diff --git a/internal/persistence/shared/shared.go b/internal/persistence/shared/shared.go new file mode 100644 index 0000000..e11d0a1 --- /dev/null +++ b/internal/persistence/shared/shared.go @@ -0,0 +1,5 @@ +package shared + +import "github.com/disgoorg/snowflake/v2" + +type ID = snowflake.ID diff --git a/internal/persistence/sql/queries.sql b/internal/persistence/sql/queries.sql new file mode 100644 index 0000000..79615ab --- /dev/null +++ b/internal/persistence/sql/queries.sql @@ -0,0 +1,22 @@ +-- name: UpsertUser :exec +INSERT INTO users (user_id, lastfm_username) +VALUES (:user_id, :lastfm_username) +ON CONFLICT(user_id) DO UPDATE SET lastfm_username = excluded.lastfm_username; + +-- name: GetUserByID :one +SELECT user_id, lastfm_username, created_at +FROM users +WHERE user_id = :user_id; + +-- name: GetUserByLastFM :one +SELECT user_id, lastfm_username, created_at +FROM users +WHERE lastfm_username = :lastfm_username; + +-- name: DeleteUser :exec +DELETE FROM users +WHERE user_id = :user_id; + +-- name: GetAllUsers :many +SELECT user_id, lastfm_username, created_at +FROM users; diff --git a/internal/persistence/sql/schema.sql b/internal/persistence/sql/schema.sql new file mode 100644 index 0000000..0e11f0b --- /dev/null +++ b/internal/persistence/sql/schema.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS users ( + user_id TEXT PRIMARY KEY, + lastfm_username TEXT NOT NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP +); + +CREATE UNIQUE INDEX IF NOT EXISTS idx_users_lastfm_username +ON users(lastfm_username); diff --git a/internal/persistence/sqlc/db.go b/internal/persistence/sqlc/db.go new file mode 100644 index 0000000..98fac9e --- /dev/null +++ b/internal/persistence/sqlc/db.go @@ -0,0 +1,128 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.30.0 + +package sqlc + +import ( + "context" + "database/sql" + "fmt" +) + +type DBTX interface { + ExecContext(context.Context, string, ...interface{}) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...interface{}) *sql.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +func Prepare(ctx context.Context, db DBTX) (*Queries, error) { + q := Queries{db: db} + var err error + if q.deleteUserStmt, err = db.PrepareContext(ctx, deleteUser); err != nil { + return nil, fmt.Errorf("error preparing query DeleteUser: %w", err) + } + if q.getAllUsersStmt, err = db.PrepareContext(ctx, getAllUsers); err != nil { + return nil, fmt.Errorf("error preparing query GetAllUsers: %w", err) + } + if q.getUserByIDStmt, err = db.PrepareContext(ctx, getUserByID); err != nil { + return nil, fmt.Errorf("error preparing query GetUserByID: %w", err) + } + if q.getUserByLastFMStmt, err = db.PrepareContext(ctx, getUserByLastFM); err != nil { + return nil, fmt.Errorf("error preparing query GetUserByLastFM: %w", err) + } + if q.upsertUserStmt, err = db.PrepareContext(ctx, upsertUser); err != nil { + return nil, fmt.Errorf("error preparing query UpsertUser: %w", err) + } + return &q, nil +} + +func (q *Queries) Close() error { + var err error + if q.deleteUserStmt != nil { + if cerr := q.deleteUserStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing deleteUserStmt: %w", cerr) + } + } + if q.getAllUsersStmt != nil { + if cerr := q.getAllUsersStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing getAllUsersStmt: %w", cerr) + } + } + if q.getUserByIDStmt != nil { + if cerr := q.getUserByIDStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing getUserByIDStmt: %w", cerr) + } + } + if q.getUserByLastFMStmt != nil { + if cerr := q.getUserByLastFMStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing getUserByLastFMStmt: %w", cerr) + } + } + if q.upsertUserStmt != nil { + if cerr := q.upsertUserStmt.Close(); cerr != nil { + err = fmt.Errorf("error closing upsertUserStmt: %w", cerr) + } + } + return err +} + +func (q *Queries) exec(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (sql.Result, error) { + switch { + case stmt != nil && q.tx != nil: + return q.tx.StmtContext(ctx, stmt).ExecContext(ctx, args...) + case stmt != nil: + return stmt.ExecContext(ctx, args...) + default: + return q.db.ExecContext(ctx, query, args...) + } +} + +func (q *Queries) query(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) (*sql.Rows, error) { + switch { + case stmt != nil && q.tx != nil: + return q.tx.StmtContext(ctx, stmt).QueryContext(ctx, args...) + case stmt != nil: + return stmt.QueryContext(ctx, args...) + default: + return q.db.QueryContext(ctx, query, args...) + } +} + +func (q *Queries) queryRow(ctx context.Context, stmt *sql.Stmt, query string, args ...interface{}) *sql.Row { + switch { + case stmt != nil && q.tx != nil: + return q.tx.StmtContext(ctx, stmt).QueryRowContext(ctx, args...) + case stmt != nil: + return stmt.QueryRowContext(ctx, args...) + default: + return q.db.QueryRowContext(ctx, query, args...) + } +} + +type Queries struct { + db DBTX + tx *sql.Tx + deleteUserStmt *sql.Stmt + getAllUsersStmt *sql.Stmt + getUserByIDStmt *sql.Stmt + getUserByLastFMStmt *sql.Stmt + upsertUserStmt *sql.Stmt +} + +func (q *Queries) WithTx(tx *sql.Tx) *Queries { + return &Queries{ + db: tx, + tx: tx, + deleteUserStmt: q.deleteUserStmt, + getAllUsersStmt: q.getAllUsersStmt, + getUserByIDStmt: q.getUserByIDStmt, + getUserByLastFMStmt: q.getUserByLastFMStmt, + upsertUserStmt: q.upsertUserStmt, + } +} diff --git a/internal/persistence/sqlc/models.go b/internal/persistence/sqlc/models.go new file mode 100644 index 0000000..81eb3f1 --- /dev/null +++ b/internal/persistence/sqlc/models.go @@ -0,0 +1,17 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.30.0 + +package sqlc + +import ( + "time" + + "first.fm/internal/persistence/shared" +) + +type User struct { + UserID shared.ID + LastfmUsername string + CreatedAt time.Time +} diff --git a/internal/persistence/sqlc/queries.sql.go b/internal/persistence/sqlc/queries.sql.go new file mode 100644 index 0000000..3dc8392 --- /dev/null +++ b/internal/persistence/sqlc/queries.sql.go @@ -0,0 +1,92 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.30.0 +// source: queries.sql + +package sqlc + +import ( + "context" + + "first.fm/internal/persistence/shared" +) + +const deleteUser = `-- name: DeleteUser :exec +DELETE FROM users +WHERE user_id = ?1 +` + +func (q *Queries) DeleteUser(ctx context.Context, userID shared.ID) error { + _, err := q.exec(ctx, q.deleteUserStmt, deleteUser, userID) + return err +} + +const getAllUsers = `-- name: GetAllUsers :many +SELECT user_id, lastfm_username, created_at +FROM users +` + +func (q *Queries) GetAllUsers(ctx context.Context) ([]User, error) { + rows, err := q.query(ctx, q.getAllUsersStmt, getAllUsers) + if err != nil { + return nil, err + } + defer rows.Close() + var items []User + for rows.Next() { + var i User + if err := rows.Scan(&i.UserID, &i.LastfmUsername, &i.CreatedAt); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getUserByID = `-- name: GetUserByID :one +SELECT user_id, lastfm_username, created_at +FROM users +WHERE user_id = ?1 +` + +func (q *Queries) GetUserByID(ctx context.Context, userID shared.ID) (User, error) { + row := q.queryRow(ctx, q.getUserByIDStmt, getUserByID, userID) + var i User + err := row.Scan(&i.UserID, &i.LastfmUsername, &i.CreatedAt) + return i, err +} + +const getUserByLastFM = `-- name: GetUserByLastFM :one +SELECT user_id, lastfm_username, created_at +FROM users +WHERE lastfm_username = ?1 +` + +func (q *Queries) GetUserByLastFM(ctx context.Context, lastfmUsername string) (User, error) { + row := q.queryRow(ctx, q.getUserByLastFMStmt, getUserByLastFM, lastfmUsername) + var i User + err := row.Scan(&i.UserID, &i.LastfmUsername, &i.CreatedAt) + return i, err +} + +const upsertUser = `-- name: UpsertUser :exec +INSERT INTO users (user_id, lastfm_username) +VALUES (?1, ?2) +ON CONFLICT(user_id) DO UPDATE SET lastfm_username = excluded.lastfm_username +` + +type UpsertUserParams struct { + UserID shared.ID + LastfmUsername string +} + +func (q *Queries) UpsertUser(ctx context.Context, arg UpsertUserParams) error { + _, err := q.exec(ctx, q.upsertUserStmt, upsertUser, arg.UserID, arg.LastfmUsername) + return err +} diff --git a/internal/persistence/sqlc/start.go b/internal/persistence/sqlc/start.go new file mode 100644 index 0000000..7ad73ed --- /dev/null +++ b/internal/persistence/sqlc/start.go @@ -0,0 +1,38 @@ +package sqlc + +import ( + "context" + "database/sql" + "embed" + "fmt" + "time" + + _ "github.com/mattn/go-sqlite3" +) + +var schemaLocation = "../sql/schema.sql" +var schema embed.FS + +func Start(ctx context.Context, path string) (*Queries, *sql.DB, error) { + sqlDB, err := sql.Open("sqlite3", path) + if err != nil { + return nil, nil, fmt.Errorf("failed to open database: %w", err) + } + + sqlDB.SetMaxOpenConns(1) + sqlDB.SetConnMaxLifetime(time.Minute) + + schema, _ := schema.ReadFile(schemaLocation) + + if _, err := sqlDB.ExecContext(ctx, string(schema)); err != nil { + sqlDB.Close() + return nil, nil, fmt.Errorf("failed to create schema: %w", err) + } + + queries, err := Prepare(ctx, sqlDB) + if err != nil { + return nil, nil, fmt.Errorf("failed to prepare queries: %w", err) + } + + return queries, sqlDB, nil +} diff --git a/sqlc.yaml b/sqlc.yaml index 6777c7c..e14de7d 100644 --- a/sqlc.yaml +++ b/sqlc.yaml @@ -12,3 +12,8 @@ sql: out: "internal/persistence/sqlc" emit_prepared_queries: true emit_interface: false + overrides: + - column: "users.user_id" + go_type: "first.fm/internal/persistence/shared.ID" + - column: "users.created_at" + go_type: "time.Time"