From 1bd8e970703ad2010d03f1947f94f614484ab57e Mon Sep 17 00:00:00 2001 From: Manuel Raimo Date: Mon, 23 Oct 2023 19:19:08 +0200 Subject: [PATCH] feat: long-lived access tokens You can now scare the shit out of your user by auto playing something at a certain time. --- api/api.go | 18 +++++++++++++++++- api/structures.go | 7 ++++--- example_config.yml | 13 ++++++++++++- main.go | 17 ++++++++++++++++- structures.go | 26 +++++++++++++++++--------- 5 files changed, 66 insertions(+), 15 deletions(-) diff --git a/api/api.go b/api/api.go index 607a85e..a22d343 100644 --- a/api/api.go +++ b/api/api.go @@ -32,7 +32,10 @@ func NewApi(servers map[string]*manager.Server, address, owner string, clients * func (a *Api) AddUser(user *discordgo.User, userInfo UserInfo) string { if u, ok := a.userInfo[user.ID]; ok { delete(a.tokensToUsers, u.token) - delete(a.userInfo, user.ID) + + if a.userInfo[user.ID].LongLivedToken == "" { + delete(a.userInfo, user.ID) + } } // Generate a new token until it is unique @@ -45,9 +48,22 @@ func (a *Api) AddUser(user *discordgo.User, userInfo UserInfo) string { } a.tokensToUsers[token] = user + + if a.userInfo[user.ID] != nil { + userInfo.LongLivedToken = a.userInfo[user.ID].LongLivedToken + } userInfo.token = token a.userInfo[user.ID] = &userInfo return token } + +func (a *Api) AddLongLivedToken(user *discordgo.User, userInfo UserInfo) { + a.tokensToUsers[userInfo.LongLivedToken] = user + + if a.userInfo[user.ID] != nil { + userInfo.token = a.userInfo[user.ID].token + } + a.userInfo[user.ID] = &userInfo +} diff --git a/api/structures.go b/api/structures.go index ef52123..2e7715b 100644 --- a/api/structures.go +++ b/api/structures.go @@ -19,7 +19,8 @@ type Api struct { } type UserInfo struct { - token string - Guild string - TextChannel string + token string + LongLivedToken string + Guild string + TextChannel string } diff --git a/example_config.yml b/example_config.yml index 60fea4e..1063985 100644 --- a/example_config.yml +++ b/example_config.yml @@ -43,4 +43,15 @@ drivername: sqlite loglevel: informational # Web server address, to access the web interface -address: :8080 \ No newline at end of file +address: :8080 + +# Long-lived API tokens, to access the API without having to log in every time. +#apitokens: +# - userid: 0000000000000000 +# token: correct-horse-battery-staple +# guildid: 0000000000000000 +# textchannelid: 0000000000000000 +# - userid: 1111111111111111 +# token: correct-horse-battery-staple +# guildid: 0000000000000000 +# textchannelid: 0000000000000000 \ No newline at end of file diff --git a/main.go b/main.go index f8a8050..3e96e12 100644 --- a/main.go +++ b/main.go @@ -36,7 +36,8 @@ var ( // Clients clients manager.Clients // API - webApi api.Api + webApi api.Api + longLivedTokens []apiToken ) func init() { @@ -54,6 +55,7 @@ func init() { token = cfg.Token owner = cfg.Owner address = cfg.Address + longLivedTokens = cfg.ApiTokens // Set lit.LogLevel to the given value switch strings.ToLower(cfg.LogLevel) { @@ -205,6 +207,19 @@ func main() { lit.Error("Can't register commands, %s", err) } + if address != "" && len(longLivedTokens) > 0 { + lit.Info("Loading long lived tokens") + for _, t := range longLivedTokens { + userInfo := api.UserInfo{ + LongLivedToken: t.Token, + Guild: t.Guild, + TextChannel: t.TextChannel, + } + user, _ := dg.User(t.UserID) + webApi.AddLongLivedToken(user, userInfo) + } + } + // Wait here until CTRL-C or another term signal is received. lit.Info("YADMB is now running. Press CTRL-C to exit.") sc := make(chan os.Signal, 1) diff --git a/structures.go b/structures.go index 265a5c9..13001f6 100644 --- a/structures.go +++ b/structures.go @@ -2,13 +2,21 @@ package main // Config holds data parsed from the config.yml type Config struct { - Token string `fig:"token" validate:"required"` - Owner string `fig:"owner" validate:"required"` - ClientID string `fig:"clientid"` - ClientSecret string `fig:"clientsecret"` - DSN string `fig:"datasourcename" validate:"required"` - Driver string `fig:"drivername" validate:"required"` - LogLevel string `fig:"loglevel" validate:"required"` - YouTubeAPI string `fig:"youtubeapikey"` - Address string `fig:"address"` + Token string `fig:"token" validate:"required"` + Owner string `fig:"owner" validate:"required"` + ClientID string `fig:"clientid"` + ClientSecret string `fig:"clientsecret"` + DSN string `fig:"datasourcename" validate:"required"` + Driver string `fig:"drivername" validate:"required"` + LogLevel string `fig:"loglevel" validate:"required"` + YouTubeAPI string `fig:"youtubeapikey"` + Address string `fig:"address"` + ApiTokens []apiToken `fig:"apitokens"` +} + +type apiToken struct { + UserID string `fig:"userid" validate:"required"` + Token string `fig:"token" validate:"required"` + TextChannel string `fig:"textchannelid" validate:"required"` + Guild string `fig:"guildid" validate:"required"` }