Authenticate with Discord #
In this section, we’ll log into the platform with Discord. This method is appropriate for use in production.
Prerequisites:
- A Discord account
- Set Up the Unreal SDK.
- Create Player Controller and Blueprint.
- Handle login and logout.
- (Optional) For Portal setup see Identity Providers.
Discord admin panel setup #
- Log into the Discord Admin Panel.
- Click on the Applications tab, then click the New Application button.
If the application has already been created, then you can click on it under My Applications.
- Name your application, then click the Create button.
- (optional) After your application has been created, you can click on the Bot section in the left sidebar, then click the Add Bot button. Confirm that you wish to create a bot. Once the bot has been created, click Reset Token and save the generated token–you can use this later in your config as the botToken.
- Click on OAuth2 in the left sidebar, then click the Add Redirect button. Paste the following URL: http://localhost:11000/v1/account/discord-redirect. Click the Save Changes button.
- In the left sidebar, click URL Generator which is nested under OAuth2. Tick the identifyandemailboxes, then choosehttp://localhost:11000/v1/account/discord-redirectunder the Select Redirect URL dropdown.
Configure the Pragma Engine Discord Identity Provider #
- Obtain your clientSecretandclientIdfrom the OAuth2 General tab of your application in the Discord Admin Panel. If you have not yet been issued a Client Secret, click the Reset Secret button.
The fieldsbotToken,guildId, andauthorizedRoleIdare only required if you plan on using a bot to automatically authorize users from your Discord server who have a specific role.
- Open the User Settings cog in your Discord client, then scroll down to Advanced and toggle on Developer Mode. 
- Access your - guildIdby right-clicking on a server and selecting Copy ID.
- Access your - authorizedRoleIdby opening Server Settings within a server, opening the Roles page, right-clicking on the desired Role, and selecting Copy ID.
- Navigate to the - pragma-engine/platform/<PROJECT>/config/directory and open- local-dev.yml.
- Insert the following code while making sure to edit in your - clientId,- clientSecret, and- redirectUri:
social:
  pluginConfigs:
    AccountService.identityProviderPlugins:
      plugins:
        Discord:
          class: "pragma.account.DiscordIdentityProviderPlugin"
          config:
            clientId: "${discordClientId}"
            clientSecret: "${discordClientSecret}"
            redirectUri: "http://localhost:11000/v1/account/discord-redirect"
            botToken: "${discordBotToken}"
            guildId: "${guildId}"
            allowedRoleIds: 
              1: "${RoleId1}"
              2: "${RoleId2}"
            playerLoginEnabled: true
            operatorLoginEnabled: false
            accountLinkingEnabled: true
            showPortalLoginButton: false
            visibleToOtherPlayers: false
- Run Pragma Engine via one of the following methods.
Once the engine has started successfully, it prints the message INFO main - Pragma server startup complete.
Import the Discord SDK into Unreal #
- Download the Discord SDK from the Discord Developer site.
- Follow the directions on the Discord developer site to import the Discord SDK into your Unreal project.
- Add the bot to your server by doing the following:- In your bot’s settings go to OAuth2 -> URL Generator.
- Tick the “bot” field.
- Copy the URL and visit it.
- Authorize your bot to your server.
 
Note that the code provided by the Discord guide for editing your-project-name.Build.cs is missing trailing semicolons.Instead of creating a MyPawn class in the Discord, continue following the instructions here.Integrate Discord login into your game #
We will use the MyPlayerController class we created in Create Player Controller and Blueprint to add a Discord login method.
- Open MyPlayerController.hin your IDE.
- Make sure your class has these definitions.
class discord::Core;
class AMyPlayerController : public APlayerController
{
    // ...
public:
    AMyPlayerController();
    virtual void BeginPlay() override;
    UFUNCTION(Exec)
    void LogInDiscord();
	    virtual void Tick(float DeltaSeconds) override;
        // ...
private:
    discord::Core* Discord;
    // ...
}
- Open MyPlayerController.cppin your IDE.
- Add the following includes.
#include "discord-files/discord.h"
- Add the following to the constructor.
AMyPlayerController::AMyPlayerController()
{
    PrimaryActorTick.bStartWithTickEnabled = true;
    PrimaryActorTick.bCanEverTick = true;
}
- Add the following to the BeginPlaymethod.
    auto Result = discord::Core::Create("Discord Client Token", DiscordCreateFlags_Default, &Discord);
    if (Result != discord::Result::Ok)
    {
        UE_LOG(LogTemp, Display, TEXT("Pragma -- Error creating discord core object."));
        return;
    }
- Add the following method definitions to finish it off. - void AMyPlayerController::LogInDiscord() { Discord->ApplicationManager().GetOAuth2Token([this]( discord::Result Result, discord::OAuth2Token token) { if (Result != discord::Result::Ok) { UE_LOG(LogTemp, Display, TEXT("Pragma -- Discord::GetOAuth2Token error.")); return; } const char* AccessTokenUtf8 = token.GetAccessToken(); const FString AccessTokenStrs{UTF8_TO_TCHAR(AccessTokenUtf8)}; Player->LogIn( EPragma_Account_IdProvider::Discord, AccessTokenStrs, Pragma::FPlayer::FLoggedInDelegate::CreateWeakLambda( this, [this](const TPragmaResult<>& Result) { if (Result.IsSuccessful()) { UE_LOG(LogTemp, Display, TEXT("MyGameClient -- Logged in with Discord.")); } else { UE_LOG(LogTemp, Error, TEXT("MyGameClient -- Discord login failed: %s"), *Result.GetErrorAsString()); } })); }); } void AMyPlayerController::Tick(float DeltaSecond) { Super::Tick(DeltaSecond); Discord->RunCallbacks(); }
- Compile the project in your IDE. 
- Save and click the Play icon at the top of the window. 
- Click on the game window to focus it, open the in-game console with - ~, and type- LogInDiscord.
- Navigate to your local Pragma Portal and sign in via Pragma Unsafe using the - test04account.
- Confirm that you see both the - test04account and your Discord account’s display name in the list of logged-in players.
- Click on the Discord account’s display name. Under the Identity providers section, verify that the account’s identity provider is Discord. 





