Reference channels
Channel referencing lets users mention specific channel names in a chat conversation. They can do it by adding #
and typing at least three first letters of the channel name they want to reference. As a result, they get a list of suggested names when typing such a suggestion, like #Sup
.
Generic referencing
Channel references, user mentions, and links are instances of MessageElement
with different MentionTarget
types.
The list of returned channels contains all channels in an app (channel data taken from the Admin Portal keyset for the app), regardless of whether the users are members of these channels. The number of returned suggested channels for reference also depends on the app configuration and can show up to 100
suggestions. The names of the suggested channels can consist of multiple words.
You can configure your app to let users refer up to 100
channels in a single message (default value is 10
) and show references as links.
You can implement channel referencing in your app similarly to user mentions and links.
Requires App Context
To reference channels from a keyset, you must enable App Context for your app's keyset in the Admin Portal.
Add channel references
You can let users reference channels in a message by adding #
and typing at least three first letters of the channel name they want to reference, like #Sup
.
Method signature
You can add a channel reference by calling the addMention()
method with the target
of MentionTarget.Channel
.
Refer to the addMention()
method for details.
Basic usage
Create the Hello Alex! I have sent you this link on the #offtopic channel.
message where #offtopic
is a channel reference.
// create an empty message draft
val messageDraft = channel.createMessageDraft(isTypingIndicatorTriggered = channel.type != ChannelType.PUBLIC)
// change the text
messageDraft.update(text = "Hello Alex! I have sent you this link on the #offtopic channel.")
// add a channel mention to the string '#offtopic'
messageDraft.addMention(offset = 45, length = 9, target = MentionTarget.Channel(channelId = "group.offtopic"))
Remove channel references
removeMention()
lets you remove a previously added channel reference from a draft message.
Method signature
You can remove channel references from a draft message by calling the removeMention()
method at the exact offset where the channel reference starts.
Refer to the removeMention()
method for details.
Offset value
If you don't provide the position of the first character of the message element to remove, it isn't removed.
Basic usage
Remove the channel reference from the Hello Alex! I have sent you this link on the #offtopic channel.
message where #offtopic
is a channel reference.
// assume the message reads
// Hello Alex! I have sent you this link on the #offtopic channel.`
// remove the channel reference
messageDraft.removeMention(offset = 45)
Get channel suggestions
The message elements listener returns all channels referenced in the draft message that match the provided 3-letter string from your app's keyset.
Single listener
The message elements listener returns suggestions for channel references, user mentions, and links.
For example, if you type #Sup
, you will get the list of channels starting with Sup
like Support
or Support-Agents
. The default number of returned suggested channel names is 10
, configurable to a maximum value of 100
.
Method signature
You must add a message elements listener to receive channel suggestions.
Refer to the addChangeListener()
method for details.
Basic usage
// create a message draft
val messageDraft = channel.createMessageDraft(isTypingIndicatorTriggered = channel.type != ChannelType.PUBLIC)
// add the listener
val listener = { elements: List<MessageElement>, suggestedMentions: PNFuture<List<SuggestedMention>> ->
updateUI(elements) // updateUI is your own function for updating UI
suggestedMentions.async { result ->
result.onSuccess { updateSuggestions(it) } // updateSuggestions is your own function for displaying suggestions
}
}
messageDraft.addChangeListener(listener)
Get referenced channels
To return all channel names referenced in a message, use the getMessageElements()
method.
Method signature
This method has the following signature:
message.getMessageElements(): List<MessageElement>
Input
This method doesn't take any parameters.
Output
Type | Description |
---|---|
List<MessageElement> | A list of message elements representing parsed components of the input text, including processed user mentions, links, and referenced channels based on the available data. |
Basic usage
Check if the message with the 16200000000000000
timetoken contains any channel references.
chat.getChannel("incident-management").async { channelResult ->
channelResult.onSuccess { channel ->
// successfully retrieved the channel
channel?.getMessage(16200000000000000L)?.async { messageResult ->
messageResult.onSuccess { message ->
// handle success
val elements = message?.getMessageElements()
val hasChannelReferences = elements?.any { element ->
// Assuming there's a way to check if an element is a channel reference
element is Link && element.target is Channel
} ?: false
if (hasChannelReferences) {
println("The message contains channel references.")
} else {
show all 27 linesGet referenced channels (deprecated)
You can access the referencedChannels
property of the Message
object to return all channel names referenced in a message.
Method signature
This is how you can access the property:
message.referencedChannels
Basic usage
Check if the message with the 16200000000000000
timetoken contains any channel references.
val channel = chat.getChannel("your-channel")
channel.getMessage(16200000000000000).async { result ->
result.onSuccess { message: Message? ->
if (message != null) {
// access the referencedChannels property
val referencedChannels = message.referencedChannels
if (referencedChannels != null && referencedChannels.isNotEmpty()) {
println("The message contains the following referenced channels:")
referencedChannels.forEach { (position, refChannel) ->
println("Position: $position, Channel: ${refChannel.name}, ID: ${refChannel.id}")
}
} else {
println("The message does not contain any channel references.")
show all 23 lines