diff --git a/app/http/endpoints/api/guilds.go b/app/http/endpoints/api/guilds.go index 4240067..d598042 100644 --- a/app/http/endpoints/api/guilds.go +++ b/app/http/endpoints/api/guilds.go @@ -56,7 +56,7 @@ func GetGuilds(ctx *gin.Context) { fakeGuild := guild.Guild{ Id: g.GuildId, Owner: g.Owner, - Permissions: uint64(g.UserPermissions), + Permissions: g.UserPermissions, } if g.Owner { diff --git a/app/http/endpoints/api/settings/updatesettings.go b/app/http/endpoints/api/settings/updatesettings.go index 44d7c3f..9a4df7b 100644 --- a/app/http/endpoints/api/settings/updatesettings.go +++ b/app/http/endpoints/api/settings/updatesettings.go @@ -1,11 +1,17 @@ package api import ( + "context" + "errors" + "github.com/TicketsBot/GoPanel/botcontext" dbclient "github.com/TicketsBot/GoPanel/database" "github.com/TicketsBot/GoPanel/rpc/cache" "github.com/TicketsBot/database" "github.com/gin-gonic/gin" "github.com/rxdn/gdl/objects/channel" + "github.com/rxdn/gdl/objects/interaction" + "github.com/rxdn/gdl/rest" + "golang.org/x/sync/errgroup" ) func UpdateSettingsHandler(ctx *gin.Context) { @@ -15,7 +21,7 @@ func UpdateSettingsHandler(ctx *gin.Context) { if err := ctx.BindJSON(&settings); err != nil { ctx.AbortWithStatusJSON(400, gin.H{ "success": false, - "error": err.Error(), + "error": err.Error(), }) return } @@ -24,7 +30,7 @@ func UpdateSettingsHandler(ctx *gin.Context) { channels := cache.Instance.GetGuildChannels(guildId) // TODO: Errors - settings.updateSettings(guildId) + err := settings.updateSettings(guildId) validPrefix := settings.updatePrefix(guildId) validWelcomeMessage := settings.updateWelcomeMessage(guildId) validTicketLimit := settings.updateTicketLimit(guildId) @@ -37,18 +43,68 @@ func UpdateSettingsHandler(ctx *gin.Context) { settings.updateFeedbackEnabled(guildId) ctx.JSON(200, gin.H{ - "prefix": validPrefix, + "prefix": validPrefix, "welcome_message": validWelcomeMessage, - "ticket_limit": validTicketLimit, + "ticket_limit": validTicketLimit, "archive_channel": validArchiveChannel, - "category": validCategory, - "naming_scheme": validNamingScheme, + "category": validCategory, + "naming_scheme": validNamingScheme, + "error": err, }) } -// TODO: Return error -func (s *Settings) updateSettings(guildId uint64) { - go dbclient.Client.Settings.Set(guildId, s.Settings) +func (s *Settings) updateSettings(guildId uint64) error { + group, _ := errgroup.WithContext(context.Background()) + + group.Go(func() error { + return dbclient.Client.Settings.Set(guildId, s.Settings) + }) + + group.Go(func() error { + return setOpenCommandPermissions(guildId, s.DisableOpenCommand) + }) + + return group.Wait() +} + +func setOpenCommandPermissions(guildId uint64, disabled bool) error { + ctx, err := botcontext.ContextForGuild(guildId) + if err != nil { + return err + } + + commands, err := rest.GetGlobalCommands(ctx.Token, ctx.RateLimiter, ctx.BotId) + if err != nil { + return err + } + + var commandId uint64 + for _, cmd := range commands { + if cmd.Name == "open" { + commandId = cmd.Id + break + } + } + + if commandId == 0 { + return errors.New("open command not found") + } + + data := rest.CommandWithPermissionsData{ + Id: commandId, + ApplicationId: ctx.BotId, + GuildId: guildId, + Permissions: []interaction.ApplicationCommandPermissions{ + { + Id: guildId, + Type: interaction.ApplicationCommandPermissionTypeRole, + Permission: !disabled, + }, + }, + } + + _, err = rest.EditCommandPermissions(ctx.Token, ctx.RateLimiter, ctx.BotId, guildId, commandId, data) + return err } func (s *Settings) updatePrefix(guildId uint64) bool { @@ -113,6 +169,7 @@ func (s *Settings) updateArchiveChannel(channels []channel.Channel, guildId uint } var validScheme = []database.NamingScheme{database.Id, database.Username} + func (s *Settings) updateNamingScheme(guildId uint64) bool { var valid bool for _, scheme := range validScheme { @@ -142,7 +199,6 @@ func (s *Settings) updateCloseConfirmation(guildId uint64) { go dbclient.Client.CloseConfirmation.Set(guildId, s.CloseConfirmation) } - func (s *Settings) updateFeedbackEnabled(guildId uint64) { go dbclient.Client.FeedbackEnabled.Set(guildId, s.FeedbackEnabled) } diff --git a/botcontext/botcontext.go b/botcontext/botcontext.go index b5d86c0..ad1c2bc 100644 --- a/botcontext/botcontext.go +++ b/botcontext/botcontext.go @@ -16,6 +16,7 @@ import ( ) type BotContext struct { + BotId uint64 Token string RateLimiter *ratelimit.Ratelimiter } @@ -113,7 +114,6 @@ func (ctx BotContext) SearchMembers(guildId uint64, query string) (members []mem return } - func (ctx BotContext) ListMembers(guildId uint64) (members []member.Member, err error) { data := rest.ListGuildMembersData{ Limit: 100, diff --git a/botcontext/get.go b/botcontext/get.go index 4a2452a..8b95f64 100644 --- a/botcontext/get.go +++ b/botcontext/get.go @@ -22,9 +22,11 @@ func ContextForGuild(guildId uint64) (ctx BotContext, err error) { return ctx, err } + ctx.BotId = res.BotId ctx.Token = res.Token keyPrefix = fmt.Sprintf("ratelimiter:%d", whitelabelBotId) } else { + ctx.BotId = config.Conf.Bot.Id ctx.Token = config.Conf.Bot.Token keyPrefix = "ratelimiter:public" } diff --git a/config/config.go b/config/config.go index 11205de..640235b 100644 --- a/config/config.go +++ b/config/config.go @@ -53,6 +53,7 @@ type ( } Bot struct { + Id uint64 Token string PremiumLookupProxyUrl string `toml:"premium-lookup-proxy-url"` PremiumLookupProxyKey string `toml:"premium-lookup-proxy-key"` @@ -119,6 +120,7 @@ func fromEnvvar() { rateLimitMax, _ := strconv.Atoi(os.Getenv("RATELIMIT_MAX")) sessionThreads, _ := strconv.Atoi(os.Getenv("SESSION_DB_THREADS")) oauthId, _ := strconv.ParseUint(os.Getenv("OAUTH_ID"), 10, 64) + botId, _ := strconv.ParseUint(os.Getenv("BOT_ID"), 10, 64) redisPort, _ := strconv.Atoi(os.Getenv("REDIS_PORT")) redisThreads, _ := strconv.Atoi(os.Getenv("REDIS_THREADS")) @@ -140,7 +142,7 @@ func fromEnvvar() { }, Secret: os.Getenv("JWT_SECRET"), TrustedProxies: strings.Split(os.Getenv("TRUSTED_PROXIES"), ","), - RealIpHeaders: strings.Split(os.Getenv("REAL_IP_HEADERS"), ","), + RealIpHeaders: strings.Split(os.Getenv("REAL_IP_HEADERS"), ","), }, Oauth: Oauth{ Id: oauthId, @@ -151,6 +153,7 @@ func fromEnvvar() { Uri: os.Getenv("DATABASE_URI"), }, Bot: Bot{ + Id: botId, Token: os.Getenv("BOT_TOKEN"), PremiumLookupProxyUrl: os.Getenv("PREMIUM_PROXY_URL"), PremiumLookupProxyKey: os.Getenv("PREMIUM_PROXY_KEY"), diff --git a/envvars.md b/envvars.md index 600f7fc..902e421 100644 --- a/envvars.md +++ b/envvars.md @@ -33,3 +33,4 @@ - REDIS_THREADS - CACHE_URI - TRUSTED_PROXIES +- BOT_ID diff --git a/frontend/src/components/manage/SettingsCard.svelte b/frontend/src/components/manage/SettingsCard.svelte index 76063e3..27a7132 100644 --- a/frontend/src/components/manage/SettingsCard.svelte +++ b/frontend/src/components/manage/SettingsCard.svelte @@ -23,6 +23,7 @@ +
diff --git a/go.mod b/go.mod index 6c2ca0d..aaaa02e 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/BurntSushi/toml v0.3.1 github.com/TicketsBot/archiverclient v0.0.0-20210220155137-a562b2f1bbbb github.com/TicketsBot/common v0.0.0-20210727134627-35eb7ed03a44 - github.com/TicketsBot/database v0.0.0-20210801121328-1e2e1c5e3346 + github.com/TicketsBot/database v0.0.0-20210808170243-bcb4f117ed18 github.com/TicketsBot/worker v0.0.0-20210727130432-3df3cd1246a3 github.com/apex/log v1.1.2 github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff // indirect