Skip to content
David Gerber edited this page Dec 9, 2023 · 4 revisions

Service type: 18

Is used to chat.

Contains distant chat, peer chat and distributed chat.

Items

Item Subtype Purpose
ChatMessage 1 Contains a chat message.
ChatAvatar 3 Contains a JPEG image of the peer's avatar.
ChatStatus 4 Contains the chat status string (for example, Foo is typing...). Sent at most every 5 seconds and only for private chats.
PrivateChatMessageConfig 5
ChatRoomConnectChallenge 9 Contains a connect challenge code. Used to find if a peer is on the same private channel but also used for public ones. If successful, a ChatRoomInvite is sent back.
ChatRoomUnsubscribe 10
ChatRoomListRequest 13 Requests a ChatRoomList item. Sent every 120 seconds.
ChatRoomConfig 21
ChatRoomMessage 23
ChatRoomEvent 24
ChatRoomList 25 Contains the list of rooms a peer is subscribed to.
ChatRoomInvite 27 Contains a chat room details. Sent either when responding to a challenge or when needing to subscribe to an available room. The flags are set accordingly.
PrivateOutgoingMap 28
SubscribedChatRoomConfig 29

Distributed chat

The distributed chat protocol is an equivalent of IRC but without a central server.

It uses 6 kind of items:

  • ChatRoomEvent
  • ChatRoomInvite
  • ChatRoomConnectChallenge
  • ChatRoomUnsubscribe
  • ChatRoomListRequest
  • ChatRoomList

ChatRoomListRequest

When receiving this, send back the list of subscribed rooms, which are any of those:

  • public rooms
  • private room: where the sender is participating in that room
  • private room: where the sender is a previously known peer of that room (rejoin)

Implementations

  • RS: sends a chat room list request each 121 seconds to all peers when there is already some chat rooms available. Otherwise each 20 seconds. (Note: in practice it asks for the list each 20 seconds because of a bug).
  • Xeres: sends a chat room list request immediately upon peer connection, then each 120 seconds.

ChatRoomList

When receiving this:

  • process a maximum of 50 chat rooms

For each chat room in the list:

  • update the chat rooms with the latest infos
  • insert the peer as participating friend in it
  • if not in the room already, subscribe to it and send invites to the participating peers
  • if already subscribed, send invite

ChatRoomEvent

  • do the usual processing like for chat messages (XXX: document it)

  • event type:

    • peer_left: remove user from the list
    • peer_joined: add user to the list send a keep alive packet to signal our presence to other users
    • keep_alive: add user to the list

ChatRoomConnectChallenge

  • search all currently joined chat room messages no older than 35 seconds
  • check if any of their challenge code matches
  • if yes, add the peer to the list of participating chat room peers (where the message is in) and send an invitation to the chat room

A connection challenge is sent from the cleanup routine to all send_challenge_lobbies. It is done as follows:

  • find a recent message from the destination chat room, no older than 30 seconds
  • send to all connected peers

ChatRoomInvite

  • if already in the chat room, add the peer in the chatroom's participating peers
  • if not, show a requested inviting us to the room

ChatRoomUnsubscribe

  • if in the chat room, remove peer from participating peers

When wanting to unsubscribe:

  • send a PEER_LEFT message
  • send a unsubscribe item to all participating peers of the room

Additional information

Distributed Chats in Retroshare

Clone this wiki locally