Skip to content

Providers

OmniChat supports multiple messaging platforms through a unified provider interface.

Available Providers

Provider Package Type Authentication
Discord providers/discord Chat Bot token
Telegram providers/telegram Chat Bot token
WhatsApp providers/whatsapp Chat QR code
Slack providers/slack Chat OAuth tokens
Gmail providers/email/gmail Email OAuth2
IRC providers/irc Chat NickServ (optional)

Provider Interface

All providers implement the Provider interface:

type Provider interface {
    // Name returns the provider identifier
    Name() string

    // Connect establishes the connection
    Connect(ctx context.Context) error

    // Disconnect closes the connection
    Disconnect(ctx context.Context) error

    // Send sends a message
    Send(ctx context.Context, chatID string, msg OutgoingMessage) error

    // SetMessageHandler sets the incoming message callback
    SetMessageHandler(handler MessageHandler)
}

Message Types

IncomingMessage

type IncomingMessage struct {
    ID           string    // Message ID
    ProviderName string    // Provider that received the message
    ChatID       string    // Chat/channel/thread ID
    SenderID     string    // Sender's user ID
    SenderName   string    // Sender's display name
    Content      string    // Text content
    ReplyTo      string    // Parent message ID (for threads)
    Media        []Media   // Attachments
    IsDM         bool      // True if direct message
    Timestamp    time.Time // When the message was sent
}

OutgoingMessage

type OutgoingMessage struct {
    Content string  // Text content
    ReplyTo string  // Message ID to reply to
    Media   []Media // Attachments
}

Media

type Media struct {
    Type     MediaType // Image, Audio, Video, Document, Voice
    URL      string    // Remote URL
    Data     []byte    // Binary data
    MimeType string    // MIME type
    Filename string    // Original filename
}

type MediaType string

const (
    MediaTypeImage    MediaType = "image"
    MediaTypeAudio    MediaType = "audio"
    MediaTypeVideo    MediaType = "video"
    MediaTypeDocument MediaType = "document"
    MediaTypeVoice    MediaType = "voice"
)

Registering Providers

router := provider.NewRouter(logger)

// Register multiple providers
router.Register(discordProvider)
router.Register(telegramProvider)
router.Register(whatsappProvider)

// Connect all at once
router.ConnectAll(ctx)

Provider-Specific Features

Each provider may support additional features:

Feature Discord Telegram WhatsApp Slack Gmail IRC
Text messages Yes Yes Yes Yes Yes Yes
Media attachments Yes Yes Yes Yes Yes No
Voice messages No Yes Yes No No No
Reactions Yes Yes Yes Yes No No
Threads Yes Yes Yes Yes Yes No
Typing indicators Yes Yes Yes No No No
Read receipts No Yes Yes No No No

Error Handling

Providers return errors for connection and send failures:

err := provider.Connect(ctx)
if err != nil {
    log.Printf("Failed to connect %s: %v", provider.Name(), err)
}

err = provider.Send(ctx, chatID, msg)
if err != nil {
    log.Printf("Failed to send to %s: %v", chatID, err)
}

Next Steps