fix(discord): resolve race condition and strip mention from content
- Get botUserID before opening session to avoid race condition - Add stripBotMention to remove @mention from message content - Handles both <@USER_ID> and <@!USER_ID> mention formats
This commit is contained in:
parent
9d0903515a
commit
f1faa067d8
1 changed files with 22 additions and 5 deletions
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
|
@ -64,6 +65,14 @@ func (c *DiscordChannel) Start(ctx context.Context) error {
|
||||||
logger.InfoC("discord", "Starting Discord bot")
|
logger.InfoC("discord", "Starting Discord bot")
|
||||||
|
|
||||||
c.ctx = ctx
|
c.ctx = ctx
|
||||||
|
|
||||||
|
// Get bot user ID before opening session to avoid race condition
|
||||||
|
botUser, err := c.session.User("@me")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to get bot user: %w", err)
|
||||||
|
}
|
||||||
|
c.botUserID = botUser.ID
|
||||||
|
|
||||||
c.session.AddHandler(c.handleMessage)
|
c.session.AddHandler(c.handleMessage)
|
||||||
|
|
||||||
if err := c.session.Open(); err != nil {
|
if err := c.session.Open(); err != nil {
|
||||||
|
|
@ -72,11 +81,6 @@ func (c *DiscordChannel) Start(ctx context.Context) error {
|
||||||
|
|
||||||
c.setRunning(true)
|
c.setRunning(true)
|
||||||
|
|
||||||
botUser, err := c.session.User("@me")
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to get bot user: %w", err)
|
|
||||||
}
|
|
||||||
c.botUserID = botUser.ID
|
|
||||||
logger.InfoCF("discord", "Discord bot connected", map[string]any{
|
logger.InfoCF("discord", "Discord bot connected", map[string]any{
|
||||||
"username": botUser.Username,
|
"username": botUser.Username,
|
||||||
"user_id": botUser.ID,
|
"user_id": botUser.ID,
|
||||||
|
|
@ -203,6 +207,7 @@ func (c *DiscordChannel) handleMessage(s *discordgo.Session, m *discordgo.Messag
|
||||||
}
|
}
|
||||||
|
|
||||||
content := m.Content
|
content := m.Content
|
||||||
|
content = c.stripBotMention(content)
|
||||||
mediaPaths := make([]string, 0, len(m.Attachments))
|
mediaPaths := make([]string, 0, len(m.Attachments))
|
||||||
localFiles := make([]string, 0, len(m.Attachments))
|
localFiles := make([]string, 0, len(m.Attachments))
|
||||||
|
|
||||||
|
|
@ -352,3 +357,15 @@ func (c *DiscordChannel) downloadAttachment(url, filename string) string {
|
||||||
LoggerPrefix: "discord",
|
LoggerPrefix: "discord",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// stripBotMention removes the bot mention from the message content.
|
||||||
|
// Discord mentions have the format <@USER_ID> or <@!USER_ID> (with nickname).
|
||||||
|
func (c *DiscordChannel) stripBotMention(text string) string {
|
||||||
|
if c.botUserID == "" {
|
||||||
|
return text
|
||||||
|
}
|
||||||
|
// Remove both regular mention <@USER_ID> and nickname mention <@!USER_ID>
|
||||||
|
text = strings.ReplaceAll(text, fmt.Sprintf("<@%s>", c.botUserID), "")
|
||||||
|
text = strings.ReplaceAll(text, fmt.Sprintf("<@!%s>", c.botUserID), "")
|
||||||
|
return strings.TrimSpace(text)
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue