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 |
providers/whatsapp |
Chat | QR code | |
| Slack | providers/slack |
Chat | OAuth tokens |
| Gmail | providers/email/gmail |
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 | 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)
}