Skip to content

Decentralized Chat

parg edited this page Aug 29, 2020 · 5 revisions

Decentralized chat within BiglyBT operates via the DHT (Distributed Hash Tables, or Distributed Databases)- there are no central servers through which messages are relayed/distributed, rather each person contributing in a particular chat is responsible for message distribution.

The feature can be configured by the 'Friends' plugin - the existing 'Friends' functionality can still be found there under the 'classic' tab.

Tools->Plugins->Friends (and Tools->Options->Plugins->Friends (to enable/disable the feature))

Quick Start Guide

There is a lot of information below - for the first time user some 'top-tips' have been collected here to get them started!

How to ignore messages

If a user is sending messages that you would rather not see then you can 'mute' that user by right-clicking on their nickname and selecting 'mute'. This will remove all of their contributions to the channel. You can undo this action by right-clicking their nickname and selecting 'listen'

User Interface

There is one major user interface component for a chat channel - this is used in various places within BiglyBT, either by embedding or by linking.

Here it is in its stand-alone, windowed form (note that there is more explanation of terms used further down on this page)

    • RTENOTITLE

The title of the window tells you whether it is a public or anonymous chat, followed by the 'channel key' - this is a unique channel name.

Below the title there is a status line starting with a down arrow - click this to access a channel-specific menu for obtaining information and changing channel settings. To the right is the status (nodes, requests etc). On the far right there is a 'Help' link that will bring you to this page.

On the right, below the status text, is your current nickname and a checkbox indicating whether this is a shared nickname or one unique to this chat. 

The large area on the left contains the chat messages, the narrow section on the right has the nicknames of contributors of messages to the chat and the box running along the bottom of the window is where you enter your own messages.

The date/time stamp shown for messages is in your local time zone. There is an option to change the format of this in settings, see User Interface for formatting details,

Links

Chat windows are linked from various places, one being the Community menu in the main window:

There are channels for your detected language and country. If you want to explicitly visit a channel for a different language/country then you need to manually create the required chat key. For languages this is

    • BiglyBT: Language: <language-code>

Note that this is case sensitive and that there are single space characters after the ':'s

For example:

  • BiglyBT: Language: en
  • BiglyBT: Language: pt_BR

For countries this is similar:

    • BiglyBT: Country: <country-code>

For example

  • BiglyBT: Country: US
  • BiglyBT: Country: NZ

Once you have figured out the channel key then open the chat by, for example, typing

    • /join "<channel-key>"

Note that the quotes are required. For example

    • /join "BiglyBT: Country: US"

Others are for Tag-specific chats (right-click on the Tag in the sidebar) and for Download-specific chats (check the right-click context menu in the Library views)

Embedding

The main place that the chat control is embedded is in the Library view sub-tabs (and download 'Detailed View' tabs). The control is augmented to allow quick access to various standard chat channels, your favorite channels and tag/download specific ones:

    • ChatLibraryView.png

The left-most set of buttons determine the chat-type and affects what is shown to the right.

  • Download - download-specific chat
  • Trackers - each unique tracker defined for the selected download has its own chat channel created
  • Tags - these are the tags associated with the selected download
  • General - a generally useful list of channels for announcements, help etc.
  • Favorites - channels you have marked as favorites are listed here

On the right there are tabs giving access to either the public or the anonymous version of the related chat.

Also, to the right of the 'Help' link there is an icon that you can click to 'pop out' the chat - this creates a standalone view of the chat so that you can keep this active while navigating around the BiglyBT interface if so desired.

The control is also embedded in the 'Open Torrent Options' dialog to allow you to check out any torrent-specific messages, or ask questions about content to anyone else on the channel, before deciding whether or not to download something:

    • ChatOpenTorrentOptions.png

Chat Overview

This is accessible from the main View menu, and as a right-click option on the status icon, and gives an overview of all current chat channels. It shows some of their options, message and user counts and status,

Status

The BiglyBT status bar has an icon showing chat status and giving access to various features by right-click menu. Double-clicking the icon will open any channels with outstanding messages.

    • ChatStatusIcon.png

Sidebar Views

The Chat menu has an option to add the chat to the sidebar:

    • RTENOTITLE

Public Chat

With public chat your messages are sent over the public internet and are therefore linked to your public IP address.

Anonymous Chat

With the I2P Helper plugin installed you can send (and receive) messages anonymously. Latency is higher when running over I2P so expect more message delays.

I2P uses 'destinations' to route traffic between users - these do not reveal anything about your public internet address, however all messages sent from a given destination necessarily originate from the same anonymous identity.

Consequentially, if you have multiple anonymous chats and have elected to use different nick names on each for whatever reason, you should realize that they are all linkable back to one anonymous identity.

Currently BiglyBT re-uses the destination used for downloading torrents by default - there are currently significant reliability issues with using a separate destination that are under investigation (there is an option to change this if you want to experiment). Ultimately the intent is to offer different destinations per chat, removing these kind of correlation attacks.

By default BiglyBT switches the torrent destination every 7 days (on BiglyBT restart). Use of a persistent anonymous chat identity allows an observer to link the torrent destinations via that identity, so if this is of concern you should avoid using anonymous chat. On the other hand, if it isn't then you could disable the torrent destination switching to increase reachability via chat (if your torrent destination changes you will need to send at least one new message to an anonymous chat in order for other people to be able to request a private chat with you, for example)

Channels

The most recent messages in a channel are retained by the participants in the channel. As long as there is one or more participants the messages will effectively be persisted and made available to new members of the channel. Once the last member closes their chat the messages will be lost (there is no central server recording the messages!).

One aspect worth understanding here is that your messages are public (even if you send them anonymously) - they generally persist and will be seen by people in the future that join a chat after you send them.

The status of a channel is shown at the top of the channel view. In general it shows the pieces of information:

  • DHT
    • During channel initialisation this will show 'Initialising'. It can take a short time for this to complete. Once initialised this is the number of nodes located directly by the DHT. Note that there is an upper limit of directly discoverable peers so this should not be seen as indicating the number of active nodes.
  • Nodes
    • Three values are shown, slash separated - <total>/<live>/<failing>. The 'total' indicates the number of nodes that you are currently tracking. This also has an upper bound so for very active chats it will represent the subset you currently know about. 'live' indicates how many of the nodes are responding to messages, 'failing' represents the ones that aren't.
  • Requests
    • Each node in the channel periodically talks to other nodes to update its state. The requests entry shows message send/receive per-second rates respectively.

If a channel shows a low total number of nodes, all of which are failing, along with a request rate showing that you are sending messages but not receiving them, and messages aren't being delivered, then it is likely that you are the only person currently in teh channel.

Favourite Channels

The channel drop-down-menu gives you the option to make a channel as a favourite (or not). These appear in the 'Favourites' selection in the Library sub-tab Chat view for quick access. They also are auto-activated when you start BiglyBT and you will therefore receive new-message notifications for them in the status area without having to have an active chat view for the channel.

Create Your Own

While BiglyBT comes with several built-in channels (Per-tag channels accessible from the right-click menu on a Tag; Download-specific, and various general channels in the Chat sub-tab in Library views) you can create your own bespoke channels by either using the 'join' or 'ajoin' commands in an existing chat (see below) or via the 'create' feature in the Friends plugin view.

You can then share this channel with friends by telling them the channel key and asking them to create the same chat in their client.

Read-only Channels

A read-only channel is one that only you can post messages to but others can read. To create such a channel, first create a normal channel with the channel key of your choice. Then right-click in the status area (the part above the channel messages) to access the channel menu. One of the options there is 'Related Channels' that has a sub-option to create the read only channel.

You will need to export the modified channel key using the 'Copy To Clipboard->Channel Key' menu option of the channel menu in the *new* related channel you just created.

The status area of a read-only channel shows 'R+' for the channel owner and 'R-' for other people.

You will probably want to backup your channel keys for this channel as if you lose the private key for the channel it will be lost forever.

Managed Channels

These are created in a similar way to read-only channels and show an 'M+' and 'M-' in the status area. They are currently a work in progress but will likely support moderation features for the channel creator.

Password Protected Channels

Well, these don't exist as such, but you can create something similar by using the 'random sub-channel' related-channel. This appends a secure random string to the existing channel key to create a unique channel - the random string acts as a password of sorts. To join the channel an uninvited guest would need to guess this random string, unlikely. Then you share the channel key with the people authorized to use it in the same way that you would share a password. If you need to change the 'password' then simple create a new random sub-channel and share this.

Beta Testing

  • Public beta chat

This is a persistent chat session for testing purposes

  • Anonymous Beta Chat (I2P)

If you have the I2P Helper plugin installed this is an anonymous chat session for testing purposes.

  • Create your own

Each chat channel is identified by its channel key - you can create arbitrary chat channels (public or anonymous) by making up your own key. If you select a hard to guess key then it is unlikely that others will be able to join 'un-invited' - without knowing the key you can't successfully join a channel.

Nicknames

There are two shared nicknames, one for public chats and one for anonymous ones. These are used for all channels that don't have an explicit nickname set. If you want separate nicknames per channel then you can configure these on the individual chat dialogs.

There is a good reason to keep your public and anonymous nicknames distinct - if you use the same one then this allows the potential to correlate your public IP address with your anonymous identity.

There is no central authority issuing nicknames or resolving clashes. However, each chat participant has a unique public and private key and these stay fixed. By right-clicking on a participant name in the chat dialog you can access a 'pin' (and 'unpin') feature. 'Pinning' a participant causes their public key to be saved and any subsequent messages from the participant to be indicated with a green text header entry. This gives you the means to separate messages originating from the 'correct' participant from any others that may use the same nickname.

Nick Colors

  • green, plain font: pinned nick names
  • green, italic font: you
  • blue: other users
  • red: nick clash - two or more users are sharing a nickname
  • light gray: user is being ignored
  • black: user hasn't assigned a nick

Note that a red nick may indicate that another user is attempting to cause confusion by grabbing the nick of another user, so you should be wary. It is also possible for the same person to end up with a red nick if they reset their BiglyBT configuration and end up with a new public key.

You can also mute messages from any participants via the right-click menu.

You are able to mark users as spammers - this results in more aggressive banning of messages from the participant, or indeed any other nodes responsible for delivering messages to you. It is only enabled after a few messages have been delivered from the same participant.

Private Messaging

You can establish private (encrypted, mutually authenticated with perfect forward secrecy) chats on a one-to-one basis (both over public and anonymous networks) by right-clicking on a participant name in the right-hand panel and selecting 'private chat'. To chat with someone they need to have posted at least one message to the channel from their current public/anonymous address.

Message Content

Messages are limited to around 400 characters. Links within messages are underlined and have a right-click menu option to either open within BiglyBT (e.g. for a magnet link) or open in an external browser (for http(s) links). You can also use a 'chat:' protocol to link to another chat channel. The format of these are

chat:?<url-encoded-channel-key>
chat:anon?<url-encoded-channel-key>

e.g. chat:?Test%20Me

As an aside, chats can also be identified via the 'azplug' URI protocol:

azplug:?id=azbuddy&arg=<url-encoded-chat-uri>

e.g. azplug:?id=azbuddy&arg=chat%3Aanon%3FTest%2520Me

Instead of displaying the link itself it is possible to supply text to be displayed by appending URL-encoded text directly to the URL. For example

http://www.biglybt.com/[[BiglyBT%20Website]]

If the URL has parameters then these can be referenced in the

[[...]]

block via $<parameter>. This is most useful for magnet URIs where you want to display the 'dn' parameter instead of the magnet URI. For example

magnet:?....&dn=....[[$dn]]

Emphasis

  • bold - enclose words in <b>...</b> or use **...**
  • italic - enclose words in <i>...</i> or use *...*
  • normal - enclose words in <n>...</n> to prevent emphasis from being applied within words

Commands

A few commands are supported and consist of a forward-slash followed by the command name. After this come arguments as required:

  • /join <channel_name>
    
    • This will create a new Public channel with the given name, or join an existing one if it already exists. This will create a public channel when used in a public channel and an anonymous channel when used in an anonymous one.
  • /pjoin <channel_name>
    
    • As above but for an explicit public channel
  • /ajoin <channel_name>
    
    • As above but for an explicit anonymous channel
  • /msg <nick> [message]
    
    • Starts a private chat with the given nick name and optionally sends an initial message
  • /me message
    
    • Submit an 'action' message
  • /ignore [-r] <nick>
    
    • Ignore (or un-ignore) messages from a given nick

Control Commands

Control commands operate on the underlying messaging system used by the channel

  • /control <control command>
    
    • The sub-commads are as follows:
  • unban <node identifier>
    
    • Allows messages from the node to be delivered to the channel again, typically used after a node has been auto-banned for flooding.
  • unban all
    
    • As above but unbans all nodes
  • banning [enable|disable]
    
    • Enables or disables banning operations for this channel.
  • status
    
    • Displays various status information

Persistence

A channel can be marked to have its messages persisted across a restart of BiglyBT via the advanced chat menu. This is useful if you have a channel with a small number of members - it reduces the chance that a restart of BiglyBT will cause the channel's messages to be lost because there are no other users active at that time.

RSS Feeds

You can generate an RSS feed URL from a channel's message content via the channel's menu 'Copy to Clipboard' options. This can then be added to BiglyBT (simply paste it into the search box and hit enter) or the RSS Feed Plugin (and possibly others). Whenever a magnet URI is encountered in the channel's message content an equivalent RSS feed item will be generated for the feed.

This provides a mechanism for automatically distributing download links via a channel.

There is also a plugin called RSS To Chat that takes an RSS feed and publishes items to a chat. This can be combined with the Chat-To-RSS functionality above to provide a decentralized mechanism for content distribution.

Sharing Files

You can drag and drop a download/file from your BiglyBT library, or an external file/folder from the file system, to a chat window to share it with other people in the channel (or of course anyone who subsequently joins the channel). For content other than existing downloads this results in a Personal Share being created, which by default is decentralized.

All resources shared this way are automatically assigned to a Tag called 'Chat Shares'.

The resulting magnet link is then automatically entered into the chat window for you to then post to the channel.

It can take a small amount of time for decentralized downloads to start due to DHT storage operations, so have a little patience.

Notifications

  • Messages pending
    • Each library view has potentially two active chat tabs ('Public Chat' and 'Anonymous Chat'). If these are active and are not visible, or they are a favourite channel, when a message is received the chat status bar icon will start blinking - mouse over it to see which channel has outstanding messages; right-click on it to get a shortcut to a pop-out view of the channel. By default an audio notification will be played. You can change this or disable it via the configuration (right-click on the chat icon in the status bar and select 'options' - look for 'Notifications').
  • Message(s) not delivered
    • This message can appear in the chat channel after submitting a message. It is triggered when a message you have sent has not been successfully delivered to one or more other people in the chat. One cause for this is if you are the only person on the channel - in this case there isn't anyone else to deliver it to. Another may be that you are firewalled and using a public chat. In this case it can take some time for the message to propagate
      • try and fix your firewalling issue.

Friends Integration

If you want to associate your Friend identity with decentralized chats then enable the setting under 'Integration'. This will result in your friend key being made available within chats and, if configured, your friend profile.

As the friend system works over the public internet this feature is not available within anonymous chats.

Dependencies

This functionality is available, but optional - it requires the 'Message Sync Support' plugin to be installed. See Tools->Plugins->Installation Wizard to install it.