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
identify
andemail
boxes, then choosehttp://localhost:11000/v1/account/discord-redirect
under the Select Redirect URL dropdown.
Configure the Pragma Engine Discord Identity Provider #
- Obtain your
clientSecret
andclientId
from 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
, andauthorizedRoleId
are 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
guildId
by right-clicking on a server and selecting Copy ID.Access your
authorizedRoleId
by 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/5-ext/config
directory and openlocal-dev.yml
.Insert the following code while making sure to edit in your
clientId
,clientSecret
, andredirectUri
:
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 [main] 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.h
in 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 AMyPlayerController::Tick(float DeltaTime) override;
// ...
private:
discord::Core* Discord;
// ...
}
- Open
MyPlayerController.cpp
in 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
BeginPlay
method.
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 AccessTokenStr{UTF8_TO_TCHAR(AccessTokenUtf8)};
Player->LogIn(EPragma_Account_IdProvider::Discord, AccessTokenStrs, Pragma::FPlayer::FLoggedInDelegate::AddUObject(this, &AMyPlayerController::HandleLoggedIn));
});s
}
void AMyPawn::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
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 typeLogInDiscord
.Navigate to your local Pragma Portal and sign in via Pragma Unsafe using the
test04
account.Confirm that you see both the
test04
account 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.