As described in VRC.Content.3, all apps with user-generated content (including synchronous or asynchronous multiplayer environments) must have a form for users to notify you about user conduct and user generated content in the application that does not adhere to Meta’s Code of Conduct for Virtual Experiences. Examples of asynchronous multi-user environments include:
Apps that display usernames on leaderboards
Apps that allow users to upload their own in-app creations for other users to view
After setting up the user reporting plugin, you can also customize the user reporting service as a backup reporting tool for your app. This means that even if your plugin isn’t fully operational, your users maintain access to a reporting method. Apps devoid of user interaction elements, such as single-player games or fitness applications without leaderboards, are not subject to this VRC.
Note: The reporting button is only available to users if your app supports multiplayer or co-op game modes. You can review and update your game modes in the Developer Dashboard, located under App Submissions → App Metadata → Specs.
The user reporting plugin connects existing reporting flows in your app to the button. Once you connect your existing flow to this plugin, users can access your reporting flow by pressing the button and clicking the Report button in the universal menu.
Setting up roles and permissions
If you are an admin or have Manage App and Platform Services permissions, skip to the next section. If not, follow these guidelines to establish a user reporting role and assign the necessary permissions for utilizing the user reporting plugin:
If you’re in the App Manager view, expand the dropdown list of your apps, and click View All to open the Org Manager.
From the Org Manager view, click Members in the left-side navigation.
Click Create Role.
Assign a name to the role and provide an optional description. You also have the option to limit access to specific apps in your team by opting for App Constraints.
From Permissions click App to view the list of app-specific team permissions.
From the list, choose both Manage App and Platform Services.
For Members click + Add New to add the members of your team who will use the user reporting service for the apps this role specifies.
When you’re done adding permissions, click Create.
Note: All team members with the Platform Services permission will have access to view and use the Platform Services page for yourteam.
Setting up the user reporting plugin
Before integrating with the Oculus Platform SDK, you must activate the user reporting plugin. Follow these steps to activate the user reporting plugin:
Click My Apps from the left-side navigation and choose the app that you want to pair the user reporting service with.
Click Platform Services in the left-side navigation and click Add Service under User Reporting.
Click Get Started to begin customizing the user reporting service for this app.
On the Customize User Reporting page, choose Use Reporting Plugin from the primary reporting tool dropdown at the top of the page.
Click Activate to enable the user reporting plugin.
Technical implementation
After activating the user reporting plugin, you can begin integrating with the feature in the Platform SDK. The following implementation details are for Unity or native development. while support for Unreal Engine is available, the specific technical implementation is currently in progress.
Unity implementation of the user reporting plugin
After a user initiates the reporting flow, a notification is sent to your application and a timer of less than 3 seconds begins. This timer checks for a developer response to be returned following the receipt of the initial report notification.
You must respond to this report notification by displaying your in-app reporting flow and using AbuseReport.ReportRequestHandled to notify the platform that you have handled the notification.
Your app startup path must contain the following register for the report notification from the pause menu:
/**
* Listen for when user clicks AUI report button
*/
AbuseReport.SetReportButtonPressedNotificationCallback(<insert callback function here>);
When users press the Report button, it invokes the callback function you pass in as a parameter to this function, which fires when the user presses the report button.
Once the notification has been fired, you must send a request to the Platform SDK notifying the platform how you plan to handle the notification.
Use AbuseReport.ReportRequestHandled with either Handled or Unhandled.
Returning Handled indicates that your in-app reporting flow has launched the user reporting plugin and will handle the report flow initialized by the user.
// Notify that you are handling the request and dismiss the AUI
AbuseReport.ReportRequestHandled(ReportRequestResponse.Handled);
Returning Unhandled will notify the user to reach out to the developer directly to file their abuse report.
// Notify that you are not handling the report request, dismiss the AUI
AbuseReport.ReportRequestHandled(ReportRequestResponse.Unhandled);
AbuseReport.SetReportButtonPressedNotificationCallback notifies you that your report flow should be displayed. This function asynchronously notifies that the report view has been requested and sets a timer (<3 seconds) to respond to the request. It also notifies the user to reach out to the developer if True isn’t returned or if False is returned.
User reporting plugin example (Unity)
The following is an example of the user reporting plugin flow including AbuseReport.ReportRequestHandled and AbuseReport.SetReportButtonPressedNotificationCallback:
using System;
using Oculus.Platform;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ReportingCallbackSample : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Core.AsyncInitialize().OnComplete(message => {
if (!message.IsError)
{
/**
* Listen for when user clicks AUI report button
*/
AbuseReport.SetReportButtonPressedNotificationCallback(OnReportButtonIntentNotif);
}
});
}
// User has interacted with the AUI outside this app
void OnReportButtonIntentNotif(Message<string> message)
{
if (!message.IsError)
{
// Show in-app report flow here
// Inform SDK that you've handled the request
AbuseReport.ReportRequestHandled(ReportRequestResponse.Handled);
}
}
When returning Unhandled for AbuseReport.ReportRequestHandled, or if no response is received before the response timer expires (<3 seconds) a message informing the user to contact the developer directly is displayed.
Returning Unhandled for AbuseReport.ReportRequestHandled allows you to respond to a user indicating why a report in the current state of the app does not make sense. This includes instances such as reports initiated during tutorials or loading screens.
Native implementation of the user reporting plugin
Next, set up the message queue polling. For more information on how the message system works, visit Requests and Messages. We recommend that you check the queue every frame for new messages and notifications. The user reporting plugin leverages this queue by appending the ovrMessage_Notification_AbuseReport_ReportButtonPressed message to the queue when a user presses the Report Abuse button.
User reporting plugin
After a user initiates the reporting flow, the ovrMessage_Notification_AbuseReport_ReportButtonPressed message is sent to the queue and a timer of less than 3 seconds begins. This timer checks for a developer response to be returned following the receipt of the initial report notification.
You must respond to this report notification by displaying your in-app reporting flow and using ovr_AbuseReport_ReportRequestHandled(ovrReportRequestResponse_Handled) to notify the platform that you have handled the notification.
Once the notification has been fired, you’ll have to send a request to the Platform SDK notifying the platform of how you plan to handle the notification. To do so, call ovr_AbuseReport_ReportRequestHandled() with either ovrReportRequestResponse_Handled or ovrReportRequestResponse_Unhandled.
Returning ovrReportRequestResponse_Handled indicates that your in-app reporting flow has launched the user reporting plugin and will handle the report flow initiated by the user.
// Notify that you are handling the request and dismiss the AUI
ovr_AbuseReport_ReportRequestHandled(ovrReportRequestResponse_Handled);
Returning ovrReportRequestResponse_Unhandled will notify the user to reach out to the developer directly to file their abuse report.
// Notify that you are not handling the report request, dismiss the AUI
ovr_AbuseReport_ReportRequestHandled(ovrReportRequestResponse_Unhandled);
User reporting plugin example (Native)
The following is an example of the user reporting plugin flow:
ovrMessageHandle message = nullptr;
while ((message = ovr_PopMessage()) != nullptr)
{
switch (ovr_Message_GetType(message))
{
case ovrMessage_Entitlement_GetIsViewerEntitled:
if (!ovr_Message_IsError(message))
{
// User is entitled. Continue with normal game behaviour
}
else
{
// User is NOT entitled. Exit
}
break;
case ovrMessage_Notification_AbuseReport_ReportButtonPressed:
if (!ovr_Message_IsError(message))
{
// Show in-app report flow here
// Inform SDK that you’ve handled the request
ovr_AbuseReport_ReportRequestHandled(ovrReportRequestResponse_Handled);
}
break;
default:
break;
}
}
When returning ovrReportRequestResponse_Unhandled, a message informing the user to contact the developer directly displays.
Returning Unhandled for ovr_AbuseReport_ReportRequestHandled allows you to respond to a user indicating why a report in the current state of the app does not make sense. This includes instances such as reports initiated during tutorials or loading screens.
Additional information
For more information, see the following resources: