عميل .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!" ) ;
}
}
يشتمل العميل على الكثير من واجهات برمجة التطبيقات المضمنة لمختلف ميزات خادم اللعبة. يمكن الوصول إليها باستخدام الطرق غير المتزامنة. يمكنه أيضًا استدعاء المنطق المخصص في وظائف 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 Client للتواصل مع 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 ) ) ;
هذه ليست سوى مجموعة فرعية من واجهة برمجة تطبيقات عميل Satori، لذا يرجى الاطلاع على رابط التوثيق المذكور سابقًا للحصول على واجهة برمجة التطبيقات الكاملة.
تتم إدارة خارطة طريق التطوير حيث يتم الترحيب بمشكلات 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
في بيئة Shell الخاصة بك وقم بتشغيل dotnet test
. قم بإرفاق مصحح الأخطاء بالعملية التي حددتها وحدة التحكم.
من أجل اجتياز اختبارات Satori، يجب ملء وحدة تحكم Satori ببيانات نموذجية متاحة عبر زر في واجهة المستخدم الرسومية الخاصة بها. ثم يمكنك اختبار SDK باستخدام dotnet test Satori.Tests/Satori.Tests.csproj
.
يتم إنشاء مستندات nakama-dotnet API باستخدام Doxygen ونشرها على صفحات GitHub.
عند تغيير تعليقات API، أعد تشغيل Doxygen وقم بتنفيذ التغييرات في docs/*
.
لتشغيل دوكسيجين:
brew install doxygen
cd docs/
doxygen
تم ترخيص هذا المشروع بموجب ترخيص Apache-2.
شكرًا Alex Parker (@zanders3) على مكتبة json الممتازة وDavid Haig (@ninjasource) على Ninja.WebSockets.