Skip to content

Release Notes: v0.7.0

Release Date: 2026-05-31

Summary

This release adds significant new capabilities to Discord, Telegram, Slack, and WhatsApp providers including Discord voice channels, Telegram inline keyboards and Web Apps, and WhatsApp newsletter support.

Highlights

  • Discord voice channel support with join/leave, audio streaming, and auto-follow
  • Telegram inline keyboards and Web App integration
  • WhatsApp newsletters (channels) and emoji reactions

New Features

Discord Voice Channels

Full voice channel support for Discord bots:

p, err := discord.New(discord.Config{
    Token:  os.Getenv("DISCORD_TOKEN"),
    Logger: logger,
    Voice: &discord.VoiceConfig{
        ChannelAllowlist: []string{"123456789"},  // Only these channels
        ChannelBlocklist: []string{"111111111"},  // Never these channels
        FollowUsers:      []string{"user_id"},    // Auto-follow into voice
        AutoLeaveEmpty:   true,                   // Leave when empty
        AutoLeaveTimeout: 5 * time.Minute,
    },
})

// Join voice channel
p.JoinVoice(ctx, guildID, channelID)

// Send Opus audio
conn := p.Voice().GetConnection(guildID)
conn.SendAudio(opusData)

// Stream audio from reader
conn.StreamAudio(ctx, audioReader, frameSize)

// Receive audio
for packet := range conn.ReceiveAudio() {
    processAudio(packet.Opus)
}

Voice events:

  • EventTypeVoiceJoin - User joined voice channel
  • EventTypeVoiceLeave - User left voice channel
  • EventTypeVoiceMove - User moved between channels
  • EventTypeVoiceSpeaker - User started/stopped speaking

Telegram Inline Keyboards

Send messages with interactive buttons:

router.Send(ctx, "telegram", chatID, provider.OutgoingMessage{
    Content: "Choose an option:",
    Metadata: map[string]any{
        telegram.MetaInlineKeyboard: [][]telegram.InlineButton{
            {
                {Text: "Option 1", CallbackData: "opt1"},
                {Text: "Option 2", CallbackData: "opt2"},
            },
            {
                {Text: "Open App", WebAppURL: "https://myapp.example.com"},
            },
        },
    },
})

// Handle button callbacks
tgProvider.OnCallback(func(ctx context.Context, cb *telegram.Callback) error {
    tgProvider.AnswerCallback(ctx, cb.ID, "You clicked!", false)
    return nil
})

// Handle Web App data
tgProvider.OnWebAppData(func(ctx context.Context, data *telegram.WebAppData) error {
    log.Printf("Received: %s", data.Data)
    return nil
})

Localized bot commands:

tgProvider.SetLocalizedCommands(ctx, telegram.LocalizedCommands{
    "":   {{Command: "start", Description: "Start the bot"}},
    "es": {{Command: "start", Description: "Iniciar el bot"}},
    "de": {{Command: "start", Description: "Bot starten"}},
})

Slack Metadata Options

Control link unfurling and reply behavior:

router.Send(ctx, "slack", channelID, provider.OutgoingMessage{
    Content: "Check https://example.com",
    Metadata: map[string]any{
        slack.MetaUnfurlLinks:     false,  // Disable link preview
        slack.MetaUnfurlMedia:     false,  // Disable media preview
        slack.MetaReplyBroadcast:  true,   // Broadcast thread reply
    },
})

WhatsApp Newsletters and Reactions

Newsletter (channel) support:

waProvider := p.(*whatsapp.Provider)

// List subscribed newsletters
newsletters, _ := waProvider.GetNewsletters(ctx)

// Subscribe/unsubscribe
waProvider.FollowNewsletter(ctx, "123@newsletter")
waProvider.UnfollowNewsletter(ctx, "123@newsletter")

Emoji reactions:

// Send reaction
waProvider.SendReaction(ctx, chatID, messageID, "👍")

// Remove reaction
waProvider.RemoveReaction(ctx, chatID, messageID)

// Handle incoming reactions
router.OnEvent(func(ctx context.Context, evt provider.Event) error {
    if evt.Type == provider.EventTypeReaction {
        reaction := evt.Data["reaction"].(string)
        added := evt.Data["added"].(bool)
    }
    return nil
})

New chat types for WhatsApp:

  • ChatTypeNewsletter - WhatsApp Channel/Newsletter messages
  • ChatTypeStatus - Status broadcast messages

Feature Matrix Update

Feature Discord Telegram WhatsApp Slack
Voice channels New - - -
Inline keyboards - New - -
Web App - New - -
Localized commands - New - -
Unfurl controls - - - New
Reply broadcast - - - New
Newsletters - - New -
Reactions - - New -

Dependencies

  • Bump github.com/slack-go/slack from 0.23.0 to 0.24.0
  • Bump github.com/plexusone/omni-google from 0.4.0 to 0.4.1
  • Bump modernc.org/sqlite from 1.50.0 to 1.51.0

Upgrade Guide

This release is backwards compatible. Update your dependency:

go get github.com/plexusone/omnichat@v0.7.0

Discord Voice Setup

  1. Enable voice intents in Discord Developer Portal
  2. Add Connect, Speak, and Use Voice Activity permissions to your bot
  3. Configure VoiceConfig when creating the provider

Telegram Inline Keyboards

No setup required. Use MetaInlineKeyboard in message metadata.

WhatsApp Newsletters

Newsletter reading works automatically. Posting requires admin permissions.

Contributors

  • Claude Opus 4.5 (AI pair programming)