From ec67a610e3062d3e60891332f33ace4ad5a448bd Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Sun, 16 Feb 2020 16:26:55 +0100 Subject: First commit with working stub of IRC bridge --- connector/connector.go | 134 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 connector/connector.go (limited to 'connector/connector.go') 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 +} -- cgit v1.2.3