aboutsummaryrefslogtreecommitdiff
path: root/connector/connector.go
diff options
context:
space:
mode:
authorAlex Auvolat <alex@adnab.me>2020-02-16 16:26:55 +0100
committerAlex Auvolat <alex@adnab.me>2020-02-16 16:26:55 +0100
commitec67a610e3062d3e60891332f33ace4ad5a448bd (patch)
treedb4f271270c20419a620b91db4224bfeda083bf2 /connector/connector.go
downloadeasybridge-ec67a610e3062d3e60891332f33ace4ad5a448bd.tar.gz
easybridge-ec67a610e3062d3e60891332f33ace4ad5a448bd.zip
First commit with working stub of IRC bridge
Diffstat (limited to 'connector/connector.go')
-rw-r--r--connector/connector.go134
1 files changed, 134 insertions, 0 deletions
diff --git a/connector/connector.go b/connector/connector.go
new file mode 100644
index 0000000..2116bb5
--- /dev/null
+++ b/connector/connector.go
@@ -0,0 +1,134 @@
+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
+
+ // 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
+ Message string
+
+ // 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
+}