Skip to main content

Configure advanced filter for content browsing

Last updated on October 24, 2024

Overview

With so much content being created, either by developers as official content or by players as user-generated content (UGC), browsing content can become difficult and time-consuming. AccelByte Gaming Services (AGS) offers a way to let players choose and filter content based on their needs, so the player can choose content that reflects their personality, preferences, and style.

In this guide, you will learn how to implement tags, types, and subtypes to content, and also use them to filter content from the game client.

browsing content sample image 01 browsing content sample image 02

Goals

The goals of this guide are to explain how to:

  • Configure predefined tags, types, and subtypes.
  • Add tags, types, and subtypes to content.
  • Implement content filtering.

Prerequisites

You will need access to:

Configure content tags, types, and subtypes

You can create Types and Tags that can be used to categorize UGC. For example, a custom design for a car might have Vehicle as the Type and Body or Wheels as the Subtype. Tags could also include Car, Vehicle, or Body.

Configure predefined tags

  1. In your game namespace, go to Engagement > UGC > Tags.

  2. On the Tags page, click on the + New Tag button.

    New Tag button

  3. On the Add New Tag form, type in a name for the new tag and click Add.

    Add New Tag form

    The new tag is added to the tags list.

    Tags list

Configure predefined types

  1. In your game namespace, go to Engagement > UGC > Types.

  2. On the Types page, click on the + New Type button.

    New Type button

  3. On the Add New Type form, type in a name for the new type and click Add. The new type is be added to the list.

    Add New Type form

  4. You can also add a subtype by clicking View in the type's Action menu.

Configure predefined subtypes

  1. In your game namespace, go to Engagement > UGC > Types. The Types page appears.

  2. From the types list, find the type to which you want to add a subtype and click on the View option next to it.

    Types list

  3. On the details page of the type, click on the + New Subtype button.

    New Subtype button

  4. On the Add New Subtype form, type in a name for the new subtype and click Add.

    Add New Subtype form

    The new Subtype will be added to the list.

    Subtypes list

Update content tags, types, and subtypes

  1. On the Admin Portal sidebar, go to Engagement > UGC > Lookup UGC.

  2. On the Lookup UGC page, you can search for content using content name, ID, type, subtype, tags, share code, and user ID.

  3. From the results, find and open the content you want to update.

    Contents search results

  4. On the content's details page, you can update the content as follows:

    • Change its type and subtype. Click on the edit (pencil) icon next to Type or Subtype fields.

      Edit type or subtype

      On the Edit Type and Subtype form, change the values as needed and click Add to save your changes.

      Edit type and subtype form

    • Add more tags. Click on the Add More option in the Tag field.

      Add more tags

      On the Add New Tag form, create the tag you want to add or select from the predefined tags list. Then, click Save.

      Add new tag

Add tags, types, and subtypes to content using the Client SDK

You can use the following function to set the player content metadata, such as tags, types, and subtypes while creating the content:

FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();

FString ChannelId = "YourChannelId";
FAccelByteModelsCreateUGCRequestV2 UGCRequest = {};
UGCRequest.ContentType = "application/octet-stream";
UGCRequest.FileExtension = "bin";
UGCRequest.Name = "Custom sports body";
UGCRequest.Type = "Vehicle";
UGCRequest.SubType = "Body";
UGCRequest.Tags = { "Red", "Sporty"};

ApiClient->UGC.CreateV2Content(ChannelId, UGCRequest, THandler<FAccelByteModelsUGCCreateUGCResponseV2>::CreateLambda([](const FAccelByteModelsUGCCreateUGCResponseV2& Result)
{
// Do something if CreateV2Content succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if CreateV2Content fails
}));

You can use the following function to update the player content metadata, such as tags, types, and subtypes:

FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();

FString ChannelId = "YourChannelId";
FString ContentId = "YourContentId";

FAccelByteModelsModifyUGCRequestV2 ModifyRequest = {};
ModifyRequest.Name = "Custom sports body";
ModifyRequest.Type = "Vehicle";
ModifyRequest.SubType = "Body";
ModifyRequest.Tags = { "Blue", "Sporty", "Body"};

ApiClient->UGC.ModifyV2Content(ChannelId, ContentId, ModifyRequest, THandler<FAccelByteModelsUGCModifyUGCResponseV2>::CreateLambda([](const FAccelByteModelsUGCModifyUGCResponseV2& Result)
{
// Do something if ModifyV2Content succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if ModifyV2Content fails
}));

Content filtering

Content filtering is the process of finding, sorting, and displaying UGC based on various criteria, such as tags, keywords, types, etc. Content filtering also helps players to discover and enjoy UGC that matches their preferences, interests, and skill levels.

Search content by name

To filter contents using content name, use this function:

FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();

FAccelByteModelsUGCFilterRequest Filter = {};
Filter.Name = "Content Name";

ApiClient->UGC.SearchV2Contents(Filter,
THandler<FAccelByteModelsUGCGetPaginatedUGCContentsResponse>::CreateLambda([](const FAccelByteModelsUGCGetPaginatedUGCContentsResponse& Result)
{
// Do something if SearchV2Contents succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if SearchV2Contents fails
}));

Use tags to filter content

Advanced tag filtering supports & as an AND operator, | as an OR operator, and parentheses () for priority. E.g:

tags=sporty
tags=sporty&red
tags=sporty|red
tags=sporty&red|classic
tags=sporty&(red|classic)

The precedence of the logical operator is AND > OR, so if there are no parentheses, the AND logical operator will be executed first.

Allowed characters for operand: alphanumeric, underscore _ and dash - \ Allowed characters for operator: & | ( ) \ The tags=sporty&red|classic also equals to: tags=sporty,red|classic and tags=sporty&tags=red|classic

You can use this function to filter the content using tags:

FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();

FAccelByteModelsUGCFilterRequest Filter = {};
Filter.Tags = { "Sporty", "Red|Classic" };

ApiClient->UGC.SearchV2Contents(Filter,
THandler<FAccelByteModelsUGCGetPaginatedUGCContentsResponse>::CreateLambda([](const FAccelByteModelsUGCGetPaginatedUGCContentsResponse& Result)
{
// Do something if SearchV2Contents succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if SearchV2Contents fails
}));

Use types and subtypes to filter content

You can use this function to filter the content using types and subtypes:

FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();

FAccelByteModelsUGCFilterRequest Filter = {};
Filter.Type = "Content Type";
Filter.SubType = "Content Subtype";

int32 Limit = 1000;
int32 Offset = 0;

EAccelByteUGCContentSortBy SortBy = EAccelByteUGCContentSortBy::CREATED_TIME_DESC;

ApiClient->UGC.SearchV2Contents(Filter,
THandler<FAccelByteModelsUGCGetPaginatedUGCContentsResponse>::CreateLambda([](const FAccelByteModelsUGCGetPaginatedUGCContentsResponse& Result)
{
// Do something if SearchV2Contents succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if SearchV2Contents fails
}), Limit, Offset, SortBy);

Sort the content

You can use the sorting field to customize how you view the UGC in the game. AGS supports sorting the list of content based on the like count, created time, download count, and content name.

The supported sorting options are as follows:

  • createdTime, createdTime:desc, createdTime:asc
  • download, download:desc, download:asc
  • like, like:desc, like:asc
  • name, name:desc, name:asc

For example, if you want to see the most recent UGC, you can use createdTime:desc to sort by the creation date in descending order. If you want to see the most popular UGC, you can use like:desc to sort by the number of likes in descending order. If you want to see the UGC in alphabetical order, you can use name:asc to sort by the name in ascending order. You can also use download to sort by the number of downloads.

To sort the content, use this function:

FApiClientPtr ApiClient = FMultiRegistry::GetApiClient();

FAccelByteModelsUGCFilterRequest Filter = {};
Filter.Name = "Content Name";
Filter.Type = "Content Type";
Filter.SubType = "Content Subtype";
Filter.Tags = { "Sporty", "Red|Brown" };

int32 Limit = 1000;
int32 Offset = 0;

EAccelByteUGCContentSortBy SortBy = EAccelByteUGCContentSortBy::CREATED_TIME_DESC;

ApiClient->UGC.SearchV2Contents(Filter,
THandler<FAccelByteModelsUGCGetPaginatedUGCContentsResponse>::CreateLambda([](const FAccelByteModelsUGCGetPaginatedUGCContentsResponse& Result)
{
// Do something if SearchV2Contents succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if SearchV2Contents fails
}), Limit, Offset, SortBy);