Multiple meeting lobbies and beta-gated features (3.5.2)

- /meeting add-lobby, remove-lobby, lobbies: up to 10 lobbies per server, capped in the database
- Deleted voice channels are dropped from the lobbies
- Beta features: registered only in the beta server and usable only with the Beta Tester role (BETA_GUILD_ID, BETA_ROLE_ID); fails closed
- /beta (bot owner only) shows how beta access is set up

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
This commit is contained in:
FernandoJVideiraandClaude Sonnet 5.5 committed 2026-10-23 00:38:48 +01:00
1 parent 136377d81a
commit a364435bab
15 files changed
+789 -52

No files matched your search

+44 -1
View File
@@ -4,13 +4,14 @@ import (
"context"
"log"
"time"
"velox-bot/internal/beta"
"velox-bot/internal/commands"
"velox-bot/internal/db/repos/musicrepo"
"velox-bot/internal/db/services"
"velox-bot/internal/events"
"velox-bot/internal/music"
"velox-bot/internal/tickets"
"velox-bot/internal/security"
"velox-bot/internal/tickets"
"github.com/bwmarrin/discordgo"
)
@@ -113,8 +114,14 @@ func (b *Bot) Start() error {
b.registeredCommands = append(b.registeredCommands, created)
}
b.registerBetaCommands()
b.Session.AddHandler(commands.HandleInteraction)
b.Session.AddHandler(func(s *discordgo.Session, c *discordgo.ChannelDelete) {
events.HandleChannelDelete(s, c, b.Services)
})
b.Session.AddHandler(func(s *discordgo.Session, m *discordgo.MessageCreate) {
if eng := security.Default(); eng != nil {
eng.OnMessage(context.Background(), m)
@@ -196,6 +203,42 @@ func (b *Bot) Start() error {
return nil
}
// registerBetaCommands puts the beta commands in the beta server, and only
// there, so nobody else sees them. Commands this bot left there that are no
// longer beta (or no longer exist) are removed. When the beta server is also
// the bot's main server, its regular commands are kept.
func (b *Bot) registerBetaCommands() {
guildID := beta.GuildID()
if guildID == "" {
return
}
keep := map[string]bool{}
for _, cmd := range b.Commands {
if b.GuildID == guildID {
keep[cmd.Name] = true
}
}
for _, cmd := range commands.BetaCommands {
keep[cmd.Name] = true
if _, err := b.Session.ApplicationCommandCreate(b.AppID, guildID, cmd); err != nil {
log.Printf("beta: cannot create '%v' command: %v", cmd.Name, err)
}
}
existing, err := b.Session.ApplicationCommands(b.AppID, guildID)
if err != nil {
log.Printf("beta: cannot list commands, leaving stale ones alone: %v", err)
return
}
for _, cmd := range existing {
if keep[cmd.Name] {
continue
}
if err := b.Session.ApplicationCommandDelete(b.AppID, guildID, cmd.ID); err != nil {
log.Printf("beta: cannot remove stale '%v' command: %v", cmd.Name, err)
}
}
}
func (b *Bot) Close() error {
for _, cmd := range b.registeredCommands {
if err := b.Session.ApplicationCommandDelete(b.AppID, b.GuildID, cmd.ID); err != nil {