2020-02-16 15:26:55 +00:00
|
|
|
package connector
|
|
|
|
|
|
|
|
/*
|
|
|
|
A generic connector framework for instant messaging protocols.
|
|
|
|
|
|
|
|
Model:
|
|
|
|
|
|
|
|
- A connector represents a connection to an outgoing service (IRC, XMPP, etc)
|
|
|
|
It satisfies a generic interface representing the actions that can be called
|
|
|
|
(send messages, join room, etc)
|
|
|
|
|
|
|
|
- A handler represents a consumer of events happening on a connection
|
|
|
|
It satisfies a generic interface representing the events that can happend
|
|
|
|
(message received, rooms autojoined, etc)
|
|
|
|
|
|
|
|
- A connector implements a given protocol that has an identifier
|
|
|
|
Each protocol identifier determines a namespace for user identifiers
|
|
|
|
and room identifiers which are globally unique for all connections using
|
|
|
|
this protocol.
|
|
|
|
For instance, a user can have two IRC conections to different servers.
|
|
|
|
Internally used user names and room identifiers must contain
|
|
|
|
the server name to be able to differentiate.
|
|
|
|
*/
|
|
|
|
|
|
|
|
type UserID string
|
|
|
|
type RoomID string
|
|
|
|
|
|
|
|
type Connector interface {
|
|
|
|
// Set the handler that will receive events happening on this connection
|
|
|
|
SetHandler(handler Handler)
|
|
|
|
|
|
|
|
// Configure (or reconfigure) the connector and attempt to connect
|
|
|
|
Configure(conf Configuration) error
|
|
|
|
|
|
|
|
// Get the identifier of the protocol that is implemented by this connector
|
|
|
|
Protocol() string
|
|
|
|
|
|
|
|
// Get the user id of the connected user
|
|
|
|
User() UserID
|
|
|
|
|
|
|
|
// Set user information (nickname, picture, etc)
|
|
|
|
SetUserInfo(info *UserInfo) error
|
|
|
|
|
|
|
|
// Set room information (name, description, picture, etc)
|
|
|
|
SetRoomInfo(roomId RoomID, info *RoomInfo) error
|
|
|
|
|
|
|
|
// Try to join a channel
|
|
|
|
// If no error happens, it must fire a Handler.Joined event
|
|
|
|
Join(roomId RoomID) error
|
|
|
|
|
2020-02-16 15:41:13 +00:00
|
|
|
// Try to invite someone to a channel
|
|
|
|
Invite(user UserID, roomId RoomID) error
|
|
|
|
|
2020-02-16 15:26:55 +00:00
|
|
|
// Leave a channel
|
|
|
|
Leave(roomId RoomID)
|
|
|
|
|
|
|
|
// Send an event
|
|
|
|
Send(event *Event) error
|
|
|
|
|
|
|
|
// Close the connection
|
|
|
|
Close()
|
|
|
|
}
|
|
|
|
|
|
|
|
type Handler interface {
|
|
|
|
// Called when a room was joined (automatically or by call to Connector.Join)
|
|
|
|
Joined(roomId RoomID)
|
|
|
|
|
|
|
|
// Called when the user left a room
|
|
|
|
Left(roomId RoomID)
|
|
|
|
|
|
|
|
// Called when a user's info is updated (changed their nickname, status, etc)
|
|
|
|
// Can also be called with our own user ID when first loaded our user info
|
|
|
|
UserInfoUpdated(user UserID, info *UserInfo)
|
|
|
|
|
|
|
|
// Called when a room's info was updated,
|
|
|
|
// or the first tome a room's info is retreived
|
|
|
|
RoomInfoUpdated(roomId RoomID, info *RoomInfo)
|
|
|
|
|
|
|
|
// Called when an event occurs in a room
|
|
|
|
// This must not be called for events authored by the user of the connection
|
|
|
|
Event(event *Event)
|
|
|
|
}
|
|
|
|
|
|
|
|
type EventType int
|
|
|
|
const (
|
|
|
|
EVENT_JOIN EventType = iota
|
|
|
|
EVENT_LEAVE
|
|
|
|
EVENT_MESSAGE
|
|
|
|
EVENT_ACTION
|
|
|
|
)
|
|
|
|
|
|
|
|
type Event struct {
|
|
|
|
Type EventType
|
|
|
|
|
|
|
|
// UserID of the user that sent the event
|
|
|
|
// If this is a direct message event, this event can only have been authored
|
|
|
|
// by the user we are talking to (and not by ourself)
|
|
|
|
Author UserID
|
|
|
|
|
|
|
|
// UserID of the targetted user in the case of a direct message,
|
|
|
|
// empty if targetting a room
|
|
|
|
Recipient UserID
|
|
|
|
|
|
|
|
// RoomID of the room where the event happenned or of the targetted room,
|
|
|
|
// or empty string if it happenned by direct message
|
|
|
|
Room RoomID
|
|
|
|
|
|
|
|
// Message text or action text
|
2020-02-16 16:53:31 +00:00
|
|
|
Text string
|
2020-02-16 15:26:55 +00:00
|
|
|
|
|
|
|
// Attached files such as images
|
|
|
|
Attachements map[string]MediaObject
|
|
|
|
}
|
|
|
|
|
|
|
|
type UserInfo struct {
|
|
|
|
Nickname string
|
|
|
|
Status string
|
|
|
|
Avatar MediaObject
|
|
|
|
}
|
|
|
|
|
|
|
|
type RoomInfo struct {
|
|
|
|
Name string
|
|
|
|
Description string
|
|
|
|
Picture MediaObject
|
|
|
|
}
|
|
|
|
|
|
|
|
type MediaObject interface {
|
|
|
|
Size() int
|
|
|
|
MimeType() string
|
|
|
|
|
|
|
|
// AsBytes: must always be implemented
|
|
|
|
AsBytes() ([]byte, error)
|
|
|
|
|
|
|
|
// AsString: not mandatory, may return an empty string
|
|
|
|
// If so, AsBytes() is the only way to retrieve the object
|
|
|
|
AsURL() string
|
|
|
|
}
|