Group Channel: Advanced

This section explains the advanced features of Group Channel. Some of them are the premium features available only to a paying user.


Add users of an application as friends

To find and chat with other users within the application easily, users can add friends by using unique identifiers such as hashed phone numbers for privacy. When the unique identifier, which is used as the discovering keys, linked to a user using our service is uploaded, we can match and retrieve the users and then automatically register them as friends.

//In case of uploading friend discovery keys
var discoveryMap = {
    '0001-0002-0003': 'John',
    '0004-0005-0006': 'Jay',
    '0007-0008-0009': 'Jin'
};
sb.uploadFriendDiscoveries(discoveryMap, function(response, error) {
    ...
});

//In case of deleting friend discovery keys
var discoveryKeys = [
    '0001-0002-0003',
    '0004-0005-0006'
];
sb.deleteFriendDiscoveries(discoveryKeys, function(response, error) {
    ...
});

Or you can make any user add and delete friends by using the userIds of others like below.

var userIds = [ 'harry' ];

// In case of adding friends
sb.addFriends(userIds, function(response, error) {
    ...
});

// In case of deleting friends
sb.deleteFriends(userIds, function(response, error) {
    ...
});

Also you can retrieve a list of friends of a certain user by creating a FriendListQuery. The next() method returns a list of User objects.

var friendListQuery = sb.createFriendListQuery();
friendListQuery.next(function(users, error) {
    if (error) {
        return;
    }

    console(users);
});

Send typing indicators to other members in a group channel

Calling startTyping() and endTyping() when a user is typing will invoke a onTypingStatusUpdate() in the channel event handler.

groupChannel.startTyping();
groupChannel.endTyping();
...

var handler = new sb.ChannelHandler();
handler.onTypingStatusUpdated = function(groupChannel) {
    var members = groupChannel.getTypingMembers();
    // Refresh typing status of members within channel.
};

sb.addChannelHandler(UNIQUE_HANDLER_ID, handler);

Mark messages as read in a group channel

Calling markAsRead() when a member reads messages will invoke a onReadReceiptUpdated() in the channel event handlers of all members within and then make the channel up-to-date.

groupChannel.markAsRead();
...

var handler = new sb.ChannelHandler();
handler.onReadReceiptUpdated = function(groupChannel) {
    ...
};

sb.addChannelHandler(UNIQUE_HANDLER_ID, handler);

Retrieve the read receipt of a message in a group channel

You can check the number of members in a group channel who have not read a message using getReadReceipt(). To get the exact value, the channel should be updated by markAsRead() before calling the getReadReceipt().

groupChannel.markAsRead();
...

var handler = new sb.ChannelHandler();
handler.onReadReceiptUpdated = function(groupChannel) {
    var unreadCount = groupChannel.getReadReceipt(message);
    if (unreadCount <= 0) {
        // All members have read the message.
    } else {
        // Some of members haven't read the message.
    }
};

sb.addChannelHandler(UNIQUE_HANDLER_ID, handler);

Retrieve the last message of a group channel

You can view the last message of a group channel.

groupChannel.lastMessage;

Retrieve count of unread messages in a group channel

You can retrieve count of unread messages of a certain user in a group channel.

sb.GroupChannel.getTotalUnreadMessageCount(function(count, error) {
    if (error) {
        return;
    }

    console.log(count);
});

Retrieve total count of unread messages in group channels

You can retrieve total count of unread messages of a certain user in all joined group channels.

sb.GroupChannel.getTotalUnreadChannelCount(function(count, error) {
    if (error) {
        return;
    }

    console.log(count);
});

Retrieve total count of group channels which have unread messages

You can retrieve total count of group channels which have unread messages of a certain user.

sb.GroupChannel.getTotalUnreadChannelCount(function(count, error) {
    if (error) {
        return;
    }

    console.log(count);
});

Send admin messages to a group channel

You can send admin messages to users in a channel using the SendBird Dashboard or the Platform API. To send an admin message via the Dashboard, in the Group Channels panel, select a group channel, find the message box below, click the Admin Message tab, and write the message in the box. An admin message is limited to 1000 characters.

If you are currently developing under the Free Plan and therefore cannot use the Moderation Tools from the Dashboard, you must send the admin messages through the Platform API.


Categorize group channels by custom types

When creating a channel, you can specify additional custom types to further subclassify your channels. This custom type takes on the form of a String, and can be useful in searching or filtering channels.

Note: DATA and CUSTOM_TYPE are both String fields that allow you to append information to your channels. The use case is for CUSTOM_TYPE to contain information that can subclassify the channel (for example, categorizing into School and Work channels). However, both these fields can be flexibly utilized.

sb.GroupChannel.createChannel(NAME, COVER_URL, DATA, CUSTOM_TYPE, function(channel, error) {
    if (error) {
        return;
    }

    console.log(channel);
});

To get a channel's custom type, call channel.customType.


Categorize messages in a group channel by custom types

Likewise, you can specify additional custom types for messages to categorize them into more specific groups. This custom type takes on the form of a String, and can be useful in searching or filtering messages.

Note: DATA and CUSTOM_TYPE are both String fields that allow you to append information to your messages. The use case is for CUSTOM_TYPE to contain information that can subclassify the message (for example, categorizing into FILE_IMAGE and FILE_AUDIO type messages). However, both these fields can be flexibly utilized.

To embed a custom type into a message, pass a String parameter to sendUserMessage() or sendFileMessage().

channel.sendUserMessage(MESSAGE, DATA, CUSTOM_TYPE, function(message, error) {
    if (error) {
        return;
    }

    console.log(message);
});

To get a message's custom type, call message.customType.


Search for group channels by name and URLs

You can search for specific channels by adding keywords to GroupChannelListQuery instance. There are two types of keywords: a Name and a URL. A query returns a list of group channels that partially match the specified Name keyword in the names of the channels.

var myChannelListQuery = sb.GroupChannel.createMyGroupChannelListQuery();
myChannelListQuery.includeEmpty = true;
myChannelListQuery.channelNameContainsFilter = "SendBird";

myChannelListQuery.next(function(channels, error) {
    if (error) {
        return;
    }

    // A list of group channels that have "SendBird" in their names is returned.
    console.log(channels);
});

A query returns a list of group channels that partially match the specified URL keywords in the urls of the channels.

var myChannelListQuery = GroupChannel.createMyGroupChannelListQuery();
myChannelListQuery.includeEmpty = true;
myChannelListQuery.channelUrlsFilter = [ 'seminar', 'lecture' ];

myChannelListQuery.next(function(channels, error) {
    if (error) {
        return;
    }

    // A list of group channels that have "seminar" or "lecture" in their urls is returned.
    console.log(channels);
});

Generate thumbnails of a file message

When sending an image file, you can choose to create thumbnails of the image, which you can fetch and render into your UI. You can specify up to 3 different dimensions to generate thumbnail images in, which can be convenient for supporting various display densities.

Note: Supported file types are files whose media type is image/* or video/*. The SDK does not support creating thumbnails when sending a file message via a file URL.

Create ThumbnailSize object to pass to channel.sendFileMessage(). A ThumbnailSize can be created with object {'maxWidth', 'maxHeight'}, where the values specify pixels. The callback subsequently returns a Array of Thumbnail objects that each contain the URL of the generated thumbnail image file.

var thumbnailSizes = [];
// Create and add ThumbnailSizes (Max: 3 ThumbnailSizes).
thumbnailSizes.push({'maxWidth': 100,'maxHeight': 100});
thumbnailSizes.push({'maxWidth': 200,'maxHeight': 200});

channel.sendFileMessage(FILE, DATA, CUSTOM_TYPE, thumbnailSizes, function(message, error){
    if (error) {
        return;
    }

    var thumbnailFirst = message.thumbnails[0];
    var thumbnailSecond = message.thumbnails[1];

    var maxHeightFirst = thumbnailFirst.maxHeight; // 100
    var maxHeightSecond = thumbnailSecond.maxHeight; // 200

    var urlFirst = thumbnailFirst.url; // URL of first thumbnail file.
    var urlSecond = thumbnailSecond.url; // URL of second thumbnail file.
});

As this is one of SendBird's Premium Features, please contact our sales team for further assistance.


Track file upload progress using a handler

You can track the file upload progress by passing progressHandler as a parameter when calling sendFileMessage().

var sentFileMessage = channel.sendFileMessage(FILE, '', '', 
    function(event) { // check progress of upload request
        // do something...
        console.log(parseInt(Math.floor(e.loaded/e.total * 100)) + '%');
    },
    function(fileMessage, error) { // callback
        // do something...
        console.log(fileMessage, error);
    }
);

Cancel an in-progress file upload

You can cancel an in-progress file upload while it is not yet completed. If this function runs successfully, it returns true.

Note: If you attempt to cancel the uploading after it is already completed, or cancelled, or returned an error, the function returns false.

var sentFileMessage = channel.sendFileMessage(FILE, '', '', function(fileMessage, error) {
    // do something...
    console.log(fileMessage, error);
});

var cancelResult = channel.cancelUploadingFileMessage(sentFileMessage.reqId);
console.log(cancelResult);

Share an encrypted file with other members

This feature encrypts all file messages sent by a channel member with a master key when saved on SendBird server. This encrypted file has its own access URL, and only member with the master key can decrypt the file and open it.

As this is one of SendBird's Premium Features, please contact our sales team for further assistance. This feature will also require customized implementation efforts from your side.


Spam flood protection

This feature allows you to customize the number of messages a member can send in a group channel per second. By doing so, all excess messages will be deleted and only the number of messages allowed to be sent per member per second will be delivered. This feature protects your application from some members spamming others in the channel with the same messages.

Note: Our default system setting is 5 messages per second. This limit can be manually adjusted only by our side. You can contact our engineering team for further assistance on this setting. As this is one of SendBird's Premium Features, please contact our sales team for further assistance.


Message auto-translation

This feature is not available under the Free plan. Contact sales@sendbird.com if you want to implement this functionality.

SendBird makes it possible for messages to be sent in different languages through its auto-translation feature. Pass in a List of language codes to sendUserMessage() to request translated messages in the corresponding languages.

var targetLanguages = ["es", "ko"];

channel.sendUserMessage(MESSAGE, DATA, CUSTOM_TYPE, targetLanguages, function(response, error){
    if (error) {
        return;
    }

    // onSent
});

You can obtain translations of a message using userMessage.translations. This method returns a Object containing the language codes and translations.

var ChannelHandler = new sb.ChannelHandler();

ChannelHandler.onMessageReceived = function (channel, message) {
    var esTranslation = message.translations["es"];

    // Display translation in UI.
};

sb.addChannelHandler(UNIQUE_CHANNEL_ID, ChannelHandler);

Note: The message auto-translation supports 53 languages. For the language code table, see the Miscellaneous > Supported Languages. As this is one of SendBird's Premium Features, please contact our sales team for further assistance.