Клиент .NET для сервера Nakama, написанный на C#.
Nakama — это сервер с открытым исходным кодом, предназначенный для поддержки современных игр и приложений. Функции включают учетные записи пользователей, чат, социальные сети, подбор игроков, многопользовательскую игру в реальном времени и многое другое.
Этот клиент реализует полный API и параметры сокетов с сервером. Он написан на C# с минимальными зависимостями для поддержки Unity, Xamarin, Godot, XNA и других механизмов и платформ.
Полная документация доступна онлайн — https://heroiclabs.com/docs.
Прежде чем вы сможете подключиться к клиенту, вам необходимо настроить сервер и базу данных. Самый простой способ — использовать Docker, но другие варианты можно найти в документации сервера.
Установите и запустите серверы. Следуйте этим инструкциям.
Загрузите клиент со страницы релизов и импортируйте его в свой проект. Вы также можете собрать из исходного кода.
Используйте учетные данные подключения для создания клиентского объекта.
// using Nakama;
const string scheme = "http" ;
const string host = "127.0.0.1" ;
const int port = 7350 ;
const string serverKey = "defaultkey" ;
var client = new Client ( scheme , host , port , serverKey ) ;
Клиентский объект имеет множество методов для выполнения различных функций на сервере или открытия сокетных соединений с сервером в реальном времени.
Существует множество способов аутентификации на сервере. Аутентификация может создать пользователя с этими учетными данными, если он еще не существует. Также легко пройти аутентификацию с помощью профиля социальной сети Google Play Games, Facebook, Game Center и т. д.
var email = "[email protected]" ;
var password = "batsignal" ;
var session = await client . AuthenticateEmailAsync ( email , password ) ;
System . Console . WriteLine ( session ) ;
При аутентификации сервер отвечает токеном аутентификации (JWT), который содержит полезные свойства и десериализуется в объект Session
.
System . Console . WriteLine ( session . AuthToken ) ; // raw JWT token
System . Console . WriteLine ( session . RefreshToken ) ; // raw JWT token.
System . Console . WriteLine ( session . UserId ) ;
System . Console . WriteLine ( session . Username ) ;
System . Console . WriteLine ( "Session has expired: {0}" , session . IsExpired ) ;
System . Console . WriteLine ( "Session expires at: {0}" , session . ExpireTime ) ;
Рекомендуется сохранить токен аутентификации из сеанса и проверить при запуске, не истек ли срок его действия. Если срок действия токена истек, вам необходимо пройти повторную аутентификацию. Срок действия токена можно изменить в настройках сервера.
var authToken = "restored from somewhere" ;
var refreshToken = "restored from somewhere" ;
var session = Session . Restore ( authToken , refreshToken ) ;
// Check whether a session is close to expiry.
if ( session . HasExpired ( DateTime . UtcNow . AddDays ( 1 ) ) )
{
try
{
session = await client . SessionRefreshAsync ( session ) ;
}
catch ( ApiResponseException e )
{
System . Console . WriteLine ( "Session can no longer be refreshed. Must reauthenticate!" ) ;
}
}
Клиент включает в себя множество встроенных API для различных функций игрового сервера. Доступ к ним можно получить с помощью асинхронных методов. Он также может вызывать пользовательскую логику в функциях RPC на сервере. Их также можно выполнить с помощью объекта сокета.
Все запросы отправляются с объектом сеанса, который авторизует клиента.
var account = await client . GetAccountAsync ( session ) ;
System . Console . WriteLine ( account . User . Id ) ;
System . Console . WriteLine ( account . User . Username ) ;
System . Console . WriteLine ( account . Wallet ) ;
Запросы могут предоставляться с конфигурациями повторной попытки в случае временных ошибок сети или сервера.
Для управления всем поведением повторных запросов можно использовать одну конфигурацию:
var retryConfiguration = new RetryConfiguration ( baseDelayMs : 1000 , maxRetries : 5 , delegate { System . Console . Writeline ( "about to retry." ) ; } ) ;
client . GlobalRetryConfiguration = retryConfiguration ;
var account = await client . GetAccountAsync ( session ) ;
Или конфигурация может предоставляться по каждому запросу:
var retryConfiguration = new RetryConfiguration ( baseDelayMs : 1000 , maxRetries : 5 , delegate { System . Console . Writeline ( "about to retry." ) ; } ) ;
var account = await client . GetAccountAsync ( session , retryConfiguration ) ;
Конфигурации повторов для каждого запроса переопределяют глобальную конфигурацию повторов.
Запросы также могут быть снабжены токеном отмены, если вам нужно отменить их в процессе выполнения:
var canceller = new CancellationTokenSource ( ) ;
var account = await client . GetAccountAsync ( session , retryConfiguration : null , canceller ) ;
await Task . Delay ( 25 ) ;
canceller . Cancel ( ) ; // will raise a TaskCanceledException
Клиент может создать с сервером один или несколько сокетов. Каждый сокет может иметь свои собственные прослушиватели событий, зарегистрированные для ответов, полученных от сервера.
var socket = Socket . From ( client ) ;
socket . Connected += ( ) =>
{
System . Console . WriteLine ( "Socket connected." ) ;
} ;
socket . Closed += ( ) =>
{
System . Console . WriteLine ( "Socket closed." ) ;
} ;
socket . ReceivedError += e => System . Console . WriteLine ( e ) ;
await socket . ConnectAsync ( session ) ;
Satori — это liveops-сервер для игр, который обеспечивает действенную аналитику, A/B-тестирование и удаленную настройку. Используйте клиент Satori .NET для связи с Satori из вашей .NET-игры.
Полная документация доступна онлайн — https://heroiclabs.com/docs/satori/client-libraries/unity/index.html.
Создайте клиентский объект, который принимает API, который вам предоставили как клиенту Satori.
using Satori ;
const string scheme = "https" ;
const string host = "127.0.0.1" ; // add your host here
const int port = 443 ;
const string apiKey = "apiKey" ; // add the api key that was given to you as a Satori customer.
var client = new Client ( scheme , host , port , apiKey ) ;
Затем авторизуйтесь на сервере, чтобы получить сеанс.
// Authenticate with the Satori server.
try
{
session = await client . AuthenticateAsync ( id ) ;
Debug . Log ( "Authenticated successfully." ) ;
}
catch ( ApiResponseException ex )
{
Debug . LogFormat ( "Error authenticating: {0}" , ex . Message ) ;
}
Используя клиент, вы можете получить любые эксперименты или флаги функций, к которым принадлежит пользователь.
var experiments = await client . GetExperimentsAsync ( session ) ;
var flag = await client . GetFlagAsync ( session , "FlagName" ) ;
Вы также можете отправлять на сервер произвольные события:
await client . EventAsync ( session , new Event ( "gameLaunched" , DateTime . UtcNow ) ) ;
Это лишь подмножество клиентского API Satori, поэтому полный API см. по ссылке на документацию, указанной ранее.
Дорожная карта разработки управляется, поскольку проблемы GitHub и запросы на включение приветствуются. Если вы заинтересованы в улучшении кода, откройте вопрос, чтобы обсудить изменения, или зайдите и обсудите его на форуме сообщества.
Базу кода можно создать с помощью Dotnet CLI. Все зависимости загружаются во время сборки с помощью Nuget.
dotnet build Nakama/Nakama.csproj
dotnet build Satori/Satori.csproj
Релизные сборки смотрите в наших инструкциях:
Для запуска тестов вам понадобится запустить сервер и базу данных. Большинство тестов написаны как интеграционные тесты, которые выполняются на сервере. Быстрый подход, который мы используем в нашем рабочем процессе тестирования, — это использовать файл компоновки Docker, описанный в документации.
docker-compose -f ./docker-compose-postgres.yml up
dotnet test Nakama.Tests/Nakama.Tests.csproj
Чтобы запустить конкретный тест, передайте полное имя метода в dotnet test --filter
:
dotnet test --filter " Nakama.Tests.Api.GroupTest.ShouldPromoteAndDemoteUsers "
Если вы хотите подключить к тесту отладчик Visual Studio, установите для VSTEST_HOST_DEBUG
значение true
в среде оболочки и запустите dotnet test
. Присоедините отладчик к процессу, указанному в консоли.
Чтобы пройти тесты для Satori, консоль Satori должна быть заполнена образцами данных, доступными через кнопку в ее графическом интерфейсе. Затем вы можете протестировать SDK с помощью dotnet test Satori.Tests/Satori.Tests.csproj
.
Документы API nakama-dotnet создаются с помощью Doxygen и развертываются на страницах GitHub.
При изменении комментариев API перезапустите Doxygen и зафиксируйте изменения в docs/*
.
Чтобы запустить Doxygen:
brew install doxygen
cd docs/
doxygen
Этот проект распространяется по лицензии Apache-2.
Спасибо Алексу Паркеру (@zanders3) за отличную библиотеку json и Дэвиду Хейгу (@ninjasource) за Ninja.WebSockets.