feat: show tne current playing station in the bot status
This commit is contained in:
parent
9dafbe26c7
commit
96c8e2b797
2 changed files with 63 additions and 3 deletions
|
@ -8,6 +8,13 @@ A Discord bot that streams radio stations to your voice channel.
|
||||||
- FFmpeg installed on your system
|
- FFmpeg installed on your system
|
||||||
- Discord Bot Token
|
- Discord Bot Token
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Streams radio stations to Discord voice channels
|
||||||
|
- Slash command interface for easy control
|
||||||
|
- Support for multiple radio stations
|
||||||
|
- Container-ready with provided Containerfile
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
1. Install FFmpeg on your system:
|
1. Install FFmpeg on your system:
|
||||||
|
|
59
main.go
59
main.go
|
@ -38,9 +38,10 @@ var (
|
||||||
Description: "A tope con la",
|
Description: "A tope con la",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
logger *slog.Logger
|
logger *slog.Logger
|
||||||
debug bool
|
debug bool
|
||||||
guildID string // For testing in a specific guild
|
guildID string // For testing in a specific guild
|
||||||
|
currentStation string // Track current playing station
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -351,6 +352,18 @@ func handleRadioCommand(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||||||
guildID := i.GuildID
|
guildID := i.GuildID
|
||||||
logger = logger.With("guild_id", guildID)
|
logger = logger.With("guild_id", guildID)
|
||||||
|
|
||||||
|
// Check if we're already connected to a voice channel in this guild
|
||||||
|
existingVC, err := findExistingVoiceConnection(ctx, s, guildID)
|
||||||
|
if err == nil && existingVC != nil {
|
||||||
|
// We're already connected, disconnect first
|
||||||
|
logger.Info("Already connected to voice channel, disconnecting first")
|
||||||
|
if err := existingVC.Disconnect(); err != nil {
|
||||||
|
logger.Error("Error disconnecting from voice channel", "error", err)
|
||||||
|
}
|
||||||
|
// Give Discord a moment to process the disconnection
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
}
|
||||||
|
|
||||||
// Find the voice channel the user is in
|
// Find the voice channel the user is in
|
||||||
vs, err := findUserVoiceState(ctx, s, guildID, i.Member.User.ID)
|
vs, err := findUserVoiceState(ctx, s, guildID, i.Member.User.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -379,6 +392,10 @@ func handleRadioCommand(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||||||
// Wait for connection to be ready
|
// Wait for connection to be ready
|
||||||
time.Sleep(2 * time.Second)
|
time.Sleep(2 * time.Second)
|
||||||
|
|
||||||
|
// Update bot status to show the current station
|
||||||
|
currentStation = stationName
|
||||||
|
updateBotStatus(s, stationName)
|
||||||
|
|
||||||
// Update message
|
// Update message
|
||||||
followupMsg(s, i, fmt.Sprintf("¡Ahora transmitiendo la radio %s en tu canal de voz!", station.Name))
|
followupMsg(s, i, fmt.Sprintf("¡Ahora transmitiendo la radio %s en tu canal de voz!", station.Name))
|
||||||
|
|
||||||
|
@ -397,6 +414,10 @@ func handleRadioCommand(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("Audio streaming error", "error", err)
|
logger.Error("Audio streaming error", "error", err)
|
||||||
followupMsg(s, i, "La transmisión de audio ha terminado inesperadamente. Por favor, inténtalo más tarde.")
|
followupMsg(s, i, "La transmisión de audio ha terminado inesperadamente. Por favor, inténtalo más tarde.")
|
||||||
|
|
||||||
|
// Clear status if streaming ends with error
|
||||||
|
currentStation = ""
|
||||||
|
updateBotStatus(s, "")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
@ -413,10 +434,42 @@ func handleRadioCommand(s *discordgo.Session, i *discordgo.InteractionCreate) {
|
||||||
if vc.Disconnect() != nil {
|
if vc.Disconnect() != nil {
|
||||||
logger.Error("Error disconnecting from voice channel", "error", err)
|
logger.Error("Error disconnecting from voice channel", "error", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clear the bot status
|
||||||
|
currentStation = ""
|
||||||
|
updateBotStatus(s, "")
|
||||||
|
|
||||||
followupMsg(s, i, "Desconectado del canal de voz.")
|
followupMsg(s, i, "Desconectado del canal de voz.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// updateBotStatus updates the bot's status to show the current station
|
||||||
|
func updateBotStatus(s *discordgo.Session, stationName string) {
|
||||||
|
var status string
|
||||||
|
if stationName != "" {
|
||||||
|
station, ok := stations[stationName]
|
||||||
|
if ok {
|
||||||
|
status = station.Name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err := s.UpdateStatusComplex(discordgo.UpdateStatusData{
|
||||||
|
Status: "online",
|
||||||
|
Activities: []*discordgo.Activity{
|
||||||
|
{
|
||||||
|
Name: status,
|
||||||
|
Type: discordgo.ActivityTypeListening,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("Error updating bot status", "error", err, "station", stationName)
|
||||||
|
} else {
|
||||||
|
logger.Info("Bot status updated", "status", status)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Helper function to send followup messages
|
// Helper function to send followup messages
|
||||||
func followupMsg(s *discordgo.Session, i *discordgo.InteractionCreate, content string) {
|
func followupMsg(s *discordgo.Session, i *discordgo.InteractionCreate, content string) {
|
||||||
_, err := s.FollowupMessageCreate(i.Interaction, false, &discordgo.WebhookParams{
|
_, err := s.FollowupMessageCreate(i.Interaction, false, &discordgo.WebhookParams{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue