Report misbehaving users
Unreal Chat SDK provides moderation mechanisms for:
- Admins to mute misbehaving users on channels.
- Admins to ban misbehaving users from accessing channels.
Requires App Context
To work with stored user metadata, you must enable App Context for your app's keyset in the Admin Portal.
You can also add custom logic that uses the emitted events and defines what an admin can do with reported users. For example, an admin can mute or ban the users from a given channel using Access Manager.
Mute or ban users
As an admin, you can mute a specific user on a channel or ban them from accessing that channel using three SetRestrictions()
methods.
All of them give the same output. The only difference is that you call a given method on the Chat
, User
, or the Channel
object. Depending on the object, these methods take a different set of input parameters.
When an admin mutes or bans a user on a channel, a moderation
event is created (of type muted
or banned
). You can listen to these events and, for example, remove user's membership on that channel.
Also, when an admin mutes or bans a user, an additional moderation membership is created for that user. This membership copies the ID of the channel and adds the PUBNUB_INTERNAL_MODERATION_
prefix to it, even though no new channel gets created for that purpose. This moderation membership stores information about the user's current mute
and ban
restrictions under the custom
property.
The reason behind creating an additional moderation membership was to have an object that could be secured with Access Manager and made inaccessible to users. The standard membership object couldn't serve this purpose as it stores info on the users' lastReadMessageTimetoken
custom data that users should access to be able to see unread messages on channels.
The additional membership is created only for the moderation purposes - when fetching all channel memberships for a given user with the GetMemberships()
method, you won't see the moderation membership as Unreal Chat SDK filters it out automatically with App Context Filtering Language.
When you lift restrictions on the user (unmute or unban them), the moderation membership is removed and a moderation
event of type lifted
is created.
To learn if a user is muted on a given channel or banned, use the Unreal Chat SDK methods to check moderation restrictions.
Requires Secret Key authentication
Mute and ban restrictions for the client devices should be set by servers initializing Unreal Chat SDK with a Secret Key (available on the Admin Portal on your app's keyset).
The Secret Key
should only be used within a secure server and never exposed to client devices. If the Secret Key
is ever compromised, it can be an extreme security risk to your application. If you suspect your Secret Key
has been compromised, you can generate a new Secret Key
for the existing PubNub keyset on the Admin Portal.
Method signature
- Blueprint
- C++ / Input parameters
-
User->SetRestrictions()
User->SetRestrictions(
FString ChannelID,
FPubnubRestriction Restrictions
); -
Channel->SetRestrictions()
Channel->SetRestrictions(
FString UserID,
FPubnubRestriction Restrictions
); -
Chat->SetRestrictions()
Chat->SetRestrictions(
FString UserID,
FString ChannelID,
FPubnubRestriction Restrictions
);
Parameter | Type | Required for Chat | Required for User | Required for Channel | Default | Description |
---|---|---|---|---|---|---|
userId | string | Yes | No | No | n/a | Unique User ID that becomes your app's current user. It's a string of up to 92 characters that identifies a single client (end user, device, or server) that connects to PubNub. Based on User ID, PubNub calculates pricing for your apps' usage. User ID should be persisted and remain unchanged. If you don't set userId , you won't be able to connect to PubNub. In this method, userId stands for the user that you want to mute or ban. |
ChannelID | string | Yes | No | No | n/a | ID of the channel on/from which the user should be muted or banned. |
Restrictions | FPubnubRestriction | Yes | Yes | Yes | n/a | The restrictions to apply. |
FPubnubRestriction
| Parameter | Type | Description |
| Ban
| bool
| Value that represents the user's moderation restrictions. Set to true
to ban the user from the channel or to false
to unban them. |
| Mute
| bool
| Value that represents the user's moderation restrictions. Set to true
to mute the user on the channel or to false
to unmute them. |
| Reason
| FString
| Reason why you want to ban or mute the user. |
Output
These methods don't return any value.
Basic usage
Mute
Mute support_agent_15
on the support
channel.
-
SetRestrictions()
(on theChat
object)
show all 20 lines#include "Kismet/GameplayStatics.h"
#include "PubnubChatSubsystem.h"
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(this);
UPubnubChatSubsystem* PubnubChatSubsystem = GameInstance->GetSubsystem<UPubnubChatSubsystem>();
UPubnubChat* Chat = PubnubChatSubsystem ->InitChat("demo", "demo", "my_user");
// Define user ID
FString UserID = "support_agent_15";
FString ChannelID = "support";
FPubnubRestriction Restrictions;
Restrictions.Mute = true; -
SetRestrictions()
(on theUser
object)
show all 22 lines#include "Kismet/GameplayStatics.h"
#include "PubnubChatSubsystem.h"
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(this);
UPubnubChatSubsystem* PubnubChatSubsystem = GameInstance->GetSubsystem<UPubnubChatSubsystem>();
UPubnubChat* Chat = PubnubChatSubsystem ->InitChat("demo", "demo", "my_user");
// Define user ID
FString UserID = "support_agent_15";
FString ChannelID = "support";
// Get the user and save the reference
UPubnubUser* User = Chat->GetUser(UserID); -
SetRestrictions()
(on theChannel
object)
show all 22 lines#include "Kismet/GameplayStatics.h"
#include "PubnubChatSubsystem.h"
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(this);
UPubnubChatSubsystem* PubnubChatSubsystem = GameInstance->GetSubsystem<UPubnubChatSubsystem>();
UPubnubChat* Chat = PubnubChatSubsystem ->InitChat("demo", "demo", "my_user");
// Define user ID
FString UserID = "support_agent_15";
FString ChannelID = "support";
// Get the user and save the reference
UPubnubChannel* Channel = Chat->GetChannel(ChannelID);
Ban
Ban support_agent_15
from the support
channel.
-
SetRestrictions()
(on theChat
object)
show all 20 lines#include "Kismet/GameplayStatics.h"
#include "PubnubChatSubsystem.h"
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(this);
UPubnubChatSubsystem* PubnubChatSubsystem = GameInstance->GetSubsystem<UPubnubChatSubsystem>();
UPubnubChat* Chat = PubnubChatSubsystem ->InitChat("demo", "demo", "my_user");
// Define user ID
FString UserID = "support_agent_15";
FString ChannelID = "support";
FPubnubRestriction Restrictions;
Restrictions.Mute = false; -
SetRestrictions()
(on theUser
object)
show all 22 lines#include "Kismet/GameplayStatics.h"
#include "PubnubChatSubsystem.h"
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(this);
UPubnubChatSubsystem* PubnubChatSubsystem = GameInstance->GetSubsystem<UPubnubChatSubsystem>();
UPubnubChat* Chat = PubnubChatSubsystem ->InitChat("demo", "demo", "my_user");
// Define user ID
FString UserID = "support_agent_15";
FString ChannelID = "support";
// Get the user and save the reference
UPubnubUser* User = Chat->GetUser(UserID); -
SetRestrictions()
(on theChannel
object)
show all 22 lines#include "Kismet/GameplayStatics.h"
#include "PubnubChatSubsystem.h"
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(this);
UPubnubChatSubsystem* PubnubChatSubsystem = GameInstance->GetSubsystem<UPubnubChatSubsystem>();
UPubnubChat* Chat = PubnubChatSubsystem ->InitChat("demo", "demo", "my_user");
// Define user ID
FString UserID = "support_agent_15";
FString ChannelID = "support";
// Get the user and save the reference
UPubnubChannel* Channel = Chat->GetChannel(ChannelID);
Check restrictions
One user on one channel
Check if there are any mute
or ban
restrictions set for a user on one channel using the GetChannelRestrictions()
and GetUserRestrictions()
methods.
Method signature
- Blueprint
- C++ / Input parameters
-
User->GetChannelRestrictions()
User->GetChannelRestrictions(UPubnubChannel* Channel)
-
Channel->GetUserRestrictions());
Channel->GetUserRestrictions(UPubnubUser* User);
Parameter | Type | Required in User->GetChannelRestrictions() | Required in Channel->GetUserRestrictions() | Default | Description |
---|---|---|---|---|---|
Channel | UPubnubChannel* | Yes | No | n/a | Channel object on/from which the user can be muted or banned. |
User | UPubnubUser* | No | Yes | n/a | User object that can be muted or banned. |
Output
Parameter | Type | Description |
---|---|---|
FPubnubRestriction | struct | Returned object containing three fields: Ban , Mute , and Reason . |
→ Ban | bool | Info whether the user is banned from the channel. |
→ Mute | bool | Info whether the user is muted on the channel. |
→ Reason | FString | Reason why the user was banned or muted. |
Basic usage
Check if the user support_agent_15
has any restrictions set on the support
channel.
-
GetChannelRestrictions()
show all 16 lines#include "Kismet/GameplayStatics.h"
#include "PubnubChatSubsystem.h"
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(this);
UPubnubChatSubsystem* PubnubChatSubsystem = GameInstance->GetSubsystem<UPubnubChatSubsystem>();
UPubnubChat* Chat = PubnubChatSubsystem ->InitChat("demo", "demo", "my_user");
// Define user ID
FString UserID = "support_agent_15";
// Get the user and save the reference
UPubnubUser* User = Chat->GetUser(UserID);
UPubnubChannel* Channel = Chat->GetChannel("support"); -
GetUserRestrictions()
show all 16 lines#include "Kismet/GameplayStatics.h"
#include "PubnubChatSubsystem.h"
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(this);
UPubnubChatSubsystem* PubnubChatSubsystem = GameInstance->GetSubsystem<UPubnubChatSubsystem>();
UPubnubChat* Chat = PubnubChatSubsystem ->InitChat("demo", "demo", "my_user");
// Define user ID
FString UserID = "support_agent_15";
// Get the user and save the reference
UPubnubUser* User = Chat->GetUser(UserID);
UPubnubChannel* Channel = Chat->GetChannel("support");
One user on all channels
Check if there are any mute
or ban
restrictions set for a user on all channels they are a member of using the GetChannelsRestrictions()
method.
Method signature
- Blueprint
- C++ / Input parameters
User->GetChannelsRestrictions(
FString Sort = "",
int Limit = 0,
FPubnubPage Page = FPubnubPage()
);
Parameter | Type | Required | Default | Description |
---|---|---|---|---|
Limit | int | No | 100 | Number of objects to return in response. The default (and maximum) value is 100 . |
Page | FPubnubPage | No | n/a | Object used for pagination to define which previous or next result page you want to fetch. |
→ Next | FString | No | n/a | Random string returned from the server, indicating a specific position in a data set. Used for forward pagination, it fetches the next page, allowing you to continue from where you left off. |
→ Prev | FString | No | n/a | Random string returned from the server, indicating a specific position in a data set. Used for backward pagination, it fetches the previous page, enabling access to earlier data. Ignored if the next parameter is supplied. |
Sort | FString | No | n/a | Key-value pair of a property to sort by, and a sort direction. Available options are id , name , and updated . Use asc or desc to specify the sorting direction, or specify null to take the default sorting direction (ascending). For example: {name: "asc"} . By default, the items are sorted by the last updated date. |
Output
Parameter | Type | Description |
---|---|---|
FPubnubChannelsRestrictionsWrapper | struct | Returned object containing these fields: Page , Total , Status , and Restrictions . |
→ page | object | Object used for pagination to define which previous or next result page you want to fetch. |
→ Next | FString | Random string returned from the server, indicating a specific position in a data set. Used for forward pagination, it fetches the next page, allowing you to continue from where you left off. |
→ Prev | FString | Random string returned from the server, indicating a specific position in a data set. Used for backward pagination, it fetches the previous page, enabling access to earlier data. Ignored if the next parameter is supplied. |
→ Total | int | Total number of restrictions. |
→ Status | int | Status code of a server response, like 200 . |
→ Restrictions | TArray<FPubnubChannelRestriction> | Array containing restrictions. |
→ Ban | bool | Info whether the user is banned from the given channel. |
→ Mute | bool | Info whether the user is muted on the given channel. |
→ Reason | FString | Reason why the user was banned or muted. |
→ Channel ID | FString | ID of the channel containing user restrictions. |
Basic usage
List all mute
and ban
restrictions set for the user support_agent_15
.
#include "Kismet/GameplayStatics.h"
#include "PubnubChatSubsystem.h"
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(this);
UPubnubChatSubsystem* PubnubChatSubsystem = GameInstance->GetSubsystem<UPubnubChatSubsystem>();
UPubnubChat* Chat = PubnubChatSubsystem ->InitChat("demo", "demo", "my_user");
// Define user ID
FString UserID = "support_agent_15";
// Get the user and save the reference
UPubnubUser* User = Chat->GetUser(UserID);
FPubnubChannelsRestrictionsWrapper Restrictions = User->GetChannelsRestrictions();
All users on one channel
Check if there are any mute
or ban
restrictions set for members of a given channel using the GetUsersRestrictions()
method.
Method signature
- Blueprint
- C++ / Input parameters
Channel->GetUsersRestrictions(
FString Sort = "",
int Limit = 0,
FPubnubPage Page = FPubnubPage()
);
Parameter | Type | Required | Default | Description |
---|---|---|---|---|
Limit | int | No | 100 | Number of objects to return in response. The default (and maximum) value is 100 . |
Page | FPubnubPage | No | n/a | Object used for pagination to define which previous or next result page you want to fetch. |
→ Next | FString | No | n/a | Random string returned from the server, indicating a specific position in a data set. Used for forward pagination, it fetches the next page, allowing you to continue from where you left off. |
→ Prev | FString | No | n/a | Random string returned from the server, indicating a specific position in a data set. Used for backward pagination, it fetches the previous page, enabling access to earlier data. Ignored if the next parameter is supplied. |
Sort | FString | No | n/a | Key-value pair of a property to sort by, and a sort direction. Available options are id , name , and updated . Use asc or desc to specify the sorting direction, or specify null to take the default sorting direction (ascending). For example: {name: "asc"} . By default, the items are sorted by the last updated date. |
Output
Parameter | Type | Description |
---|---|---|
FPubnubUsersRestrictionsWrapper | struct | Returned object containing these fields: Page , Total , Status , and Restrictions . |
→ page | object | Object used for pagination to define which previous or next result page you want to fetch. |
→ Next | FString | Random string returned from the server, indicating a specific position in a data set. Used for forward pagination, it fetches the next page, allowing you to continue from where you left off. |
→ Prev | FString | Random string returned from the server, indicating a specific position in a data set. Used for backward pagination, it fetches the previous page, enabling access to earlier data. Ignored if the next parameter is supplied. |
→ Total | int | Total number of restrictions. |
→ Status | int | Status code of a server response, like 200 . |
→ Restrictions | TArray<FPubnubUserRestriction> | Array containing restrictions. |
→ Ban | bool | Info whether the user is banned from the given channel. |
→ Mute | bool | Info whether the user is muted on the given channel. |
→ Reason | FString | Reason why the user was banned or muted. |
→ User ID | FString | ID of the restricted user. |
Basic usage
List all mute
and ban
restrictions set for the support
channel.
#include "Kismet/GameplayStatics.h"
#include "PubnubChatSubsystem.h"
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(this);
UPubnubChatSubsystem* PubnubChatSubsystem = GameInstance->GetSubsystem<UPubnubChatSubsystem>();
UPubnubChat* Chat = PubnubChatSubsystem ->InitChat("demo", "demo", "my_user");
UPubnubChannel* Channel = Chat->GetChannel("support");
FPubnubUsersRestrictionsWrapper Restrictions = Channel->GetUsersRestrictions();
Secure moderation
You could try to use only the banning or muting restrictions on client devices and enforce some UI moderation, like not displaying channels for users who are banned from them, or not displaying input field for users who are muted on a given channel so that they couldn't post a message.
Still, such solely client-side restrictions can easily be bypassed if not secured with an additional server-side logic that uses Access Manager to allow or block user's access to PubNub resources (channels and users). This server-side can also be followed by additional client-side errors that inform app users about their restrictions up front.
Server-side restrictions
It's recommended to use Access Manager alongside the Unreal Chat SDK methods and grant or revoke permissions from users based on their muting or banning restrictions.
For example, you could have a UI moderation dashboard (like Channel Monitor) where admins set restrictions on users by muting or banning them from specific channels. After that, you can use one of the Unreal Chat SDK methods to get moderation restrictions for users and, based on results, call the Access Manager API to either generate or revoke grant tokens for PubNub resources (channels or users).
Let's look at sample steps that use Unreal SDK methods to configure a chat app, set up server permissions, listen to any permission changes in Channel Monitor UI, and invoke access grant or revoke request on the server side.
-
Enable Access Manager.
Navigate to your app's keyset in the Admin Portal and turn on the ACCESS MANAGER option.
-
Initialize Unreal Chat SDK with
Auth Key
.On the frontend of your app, initialize the Unreal Chat SDK (
Init()
) with the authentication key (Auth Key
) on your clients. Use it for all requests made to PubNub APIs to authenticate users in your application and grant them access to PubNub resources (other users' metadata and channels). -
Secure backend initialization.
On the backend, initialize the Unreal SDK with the secret key on your servers to secure your PubNub instance.
Secret key
Secret Key
is a secret shared between your application's server and PubNub and it's used to administer Access Manager permissions for your client applications by signing and verifying the authenticity of messages and requests. Remember to never expose theSecret Key
to client devices. -
Get user permissions.
Retrieve detailed user restrictions and convert these details into a simplified permission format where each channel is marked with whether the user can read, write, or access it, based on such restrictions as bans or mutes using the Get user details and Check restrictions methods.
-
Generate authorization token.
Using the Unreal SDK, generate and assign an access token reflecting the user's permissions.
The token contains information about which channels the user can access and how (read/write), and it's configured with a specific validity period. This token serves as a key for users to interact with the application according to their permissions.
Operation-to-permission mapping
Read the Permissions document for a complete list of available operations that users can do with PubNub resources in apps created with the Unreal Chat SDK.
Set short TTLs
You can mute or ban a user for an indefinite amount of time, but you can unmute/unban them at any time. To make sure that the permissions set with Access Manager reflect the most up-to-date muting/banning restrictions on the client-side, it's recommended to set short-lived tokens (TTLs) for grant calls (valid for seconds and minutes rather than hours or days).
-
Listen for moderation events.
Set up a listener to listen for the
moderation
event type ("banned," "muted," or "lifted") generated when UI restrictions are added or removed. -
Act on moderation events.
Update permissions in response to moderation events and generate new tokens if necessary.
Client-side restrictions
Once you enable and define server-side permissions with Access Manager, you can be sure that your muting and banning restrictions are always enforced.
Additionally, you can read moderation restrictions set with the Unreal Chat SDK methods also on your app's frontend to let a given user know upfront that they are muted on a channel or banned from accessing a channel using popup messages, iconography, etc. For example, before a user tries to write a message on a channel where they are muted and tries to search for the input field that is either greyed out or unavailable, you can display a popup message informing them about the restriction.
Listen to moderation
events
As an admin of your chat app, you can use the ListenForEvents()
method to send notifications to the affected user when you mute or ban them on a channel, or to remove user channel membership each time they are banned.
Events documentation
To read more about the events of type moderation
, refer to the Chat events documentation.
Method signature
- Blueprint
- C++ / Input parameters
Chat->ListenForEvents(
FString ChannelID,
EPubnubChatEventType ChatEventType,
FOnPubnubEventReceived EventCallback
);
Parameter | Type | Required | Default | Description |
---|---|---|---|---|
ChannelID | FString | Yes | n/a | Channel to listen for new moderation events. |
ChatEventType | EPubnubChatEventType | No | n/a | Type of events. PCET_MODERATION is the type defined for all report events. |
EventCallback | FOnPubnubEventReceived | Yes | n/a | Callback function passed as a parameter. It defines the custom behavior to be executed whenever a report event type is detected on the specified channel. |
EPubnubChatEventType
Value | Description |
---|---|
PCET_TYPING | Indicates a user is typing a message. Displayed as Typing. |
PCET_REPORT | Represents an event where a message has been flagged or reported for offensive content. Displayed as Report. |
PCET_RECEIPT | Confirms receipt of a message or event. Displayed as Receipt. |
PCET_MENTION | Indicates that a user has been mentioned in a message. Displayed as Mention. |
PCET_INVITE | Represents an invitation event typically sent to a specific user. Displayed as Invite. |
PCET_CUSTOM | Custom event type for specialized behavior or use cases. Displayed as Custom. |
PCET_MODERATION | Represents an event related to content moderation actions. Displayed as Moderation. |
Output
This method doesn't return any value.
Basic usage
Listen for moderation
events on the support
channel.
#include "Kismet/GameplayStatics.h"
#include "PubnubChatSubsystem.h"
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(this);
UPubnubChatSubsystem* PubnubChatSubsystem = GameInstance->GetSubsystem<UPubnubChatSubsystem>();
UPubnubChat* Chat = PubnubChatSubsystem ->InitChat("demo", "demo", "my_user");
FString ChannelID = "support";
// Create a pubnub response delegate
// you MUST implement your own callback function to handle the response
FOnPubnubEventReceived ListenResponse;
ListenResponse.BindDynamic(this, &AMyActor::OnListenResponseReceived);
show all 20 lines