عميل لوا لخادم ناكاما مكتوب في لوا 5.1.
Nakama هو خادم مفتوح المصدر مصمم لتشغيل الألعاب والتطبيقات الحديثة. تتضمن الميزات حسابات المستخدمين ، والدردشة ، والاجتماعية ، وصانع الثقاب ، ومتعدد اللاعبين الحقيقيين ، وأكثر من ذلك بكثير.
يقوم هذا العميل بتنفيذ خيارات API والمقبس الكاملة مع الخادم. إنه مكتوب في Lua 5.1 ليكون متوافقًا مع محركات الألعاب المستندة إلى LUA.
الوثائق الكاملة متوفرة هنا.
ستحتاج إلى إعداد الخادم وقاعدة البيانات قبل أن تتمكن من الاتصال بالعميل. أبسط طريقة هي استخدام Docker ولكن إلقاء نظرة على وثائق الخادم لخيارات أخرى.
تثبيت وتشغيل الخوادم. اتبع هذه التعليمات.
أضف العميل إلى مشروعك.
game.project . سيظهر العميل الآن في مجلد nakama في مشروعك.أضف تبعيات إلى مشروعك. في مشاريع Defold ، تحتاج إلى إضافة واحدة من التبعيات التالية إلى Game.Project:
استخدم بيانات اعتماد الاتصال لتهيئة عميل Nakama.
local defold = require " nakama.engine.defold "
local nakama = require " nakama.nakama "
local config = {
host = " 127.0.0.1 " ,
port = 7350 ,
use_ssl = false ,
username = " defaultkey " ,
password = " " ,
engine = defold ,
timeout = 10 , -- connection timeout in seconds
}
local client = nakama . create_client ( config )(اختياري) يستخدم Nakama فك تشفير BASE64 للجلسة الرموز المميزة للجلسة وكلا من ترميز بيانات المطابقة وفك تشفيرها. يتم كتابة تشفير BASE64 الافتراضي و decoder في لوا. لزيادة أداء BASE64 ENCODE و DOCODE ، من الممكن استخدام مشفر BASE64 مكتوب في C. في مشاريع Defold ، تحتاج إلى إضافة التبعية التالية إلى Game.Project:
لدى العميل العديد من الطرق لتنفيذ ميزات مختلفة في الخادم أو فتح اتصالات مقبس الوقت الحقيقي مع الخادم.
هناك مجموعة متنوعة من الطرق للمصادقة مع الخادم. يمكن للمصادقة إنشاء مستخدم إذا لم يكن موجودًا بالفعل مع بيانات الاعتماد هذه. من السهل أيضًا المصادقة مع ملف تعريف اجتماعي من Google Play Games و Facebook و Game Center وما إلى ذلك.
local client = nakama . create_client ( config )
local email = " [email protected] "
local password = " batsignal "
local session = client . authenticate_email ( email , password )
pprint ( session )ملاحظة : راجع قسم الطلبات أدناه لتشغيل هذا المقتطف (أ) بشكل متزامن.
عند المصادقة ، يستجيب الخادم برمز مصادقة (JWT) والذي يمكن استخدامه لمصادقة طلبات API. يحتوي الرمز المميز على خصائص مفيدة ويحصل على جدولة في جدول session .
local client = nakama . create_client ( config )
local session = client . authenticate_email ( email , password )
print ( session . created )
print ( session . token ) -- raw JWT token
print ( session . expires )
print ( session . user_id )
print ( session . username )
print ( session . refresh_token ) -- raw JWT token for use when refreshing the session
print ( session . refresh_token_expires )
print ( session . refresh_token_user_id )
print ( session . refresh_token_username )
-- Use the token to authenticate future API requests
nakama . set_bearer_token ( client , session . token )
-- Use the refresh token to refresh the authentication token
nakama . session_refresh ( client , session . refresh_token ) يوصى بتخزين رمز المصادقة من الجلسة والتحقق من بدء التشغيل إذا انتهت صلاحيته. إذا انتهت صلاحية الرمز المميز. إذا كان الرمز المميز على وشك انتهاء صلاحيته ، فيجب تحديثه. يمكن تغيير وقت انتهاء الصلاحية للرمز المميز كإعداد في الخادم. يمكنك تخزين الجلسة باستخدام session.store(session) واستعادتها لاحقًا باستخدام session.restore() :
local nakama_session = require " nakama.session "
local client = nakama . create_client ( config )
-- restore a session
local session = nakama_session . restore ()
if session and nakama_session . is_token_expired_soon ( session ) and not nakama . is_refresh_token_expired ( session ) then
print ( " Session has expired or is about to expire. Refreshing. " )
session = nakama . session_refresh ( client , session . refresh_token )
nakama_session . store ( session )
elseif not session or nakama_session . is_refresh_token_expired ( session ) then
print ( " Session does not exist or it has expired. Must reauthenticate. " )
session = client . authenticate_email ( " [email protected] " , " foobar123 " , nil , true , " britzl " )
nakama_session . store ( session )
end
client . set_bearer_token ( session . token )يتضمن العميل الكثير من واجهات برمجة التطبيقات المدمجة لمختلف ميزات خادم اللعبة. يمكن الوصول إلى هذه الطرق التي تستخدم وظيفة رد الاتصال لإرجاع نتيجة (أي غير متزامن) أو العائد حتى يتم استلام النتيجة (أي متزامنة ويجب تشغيلها داخل Lua coroutine).
local client = nakama . create_client ( config )
-- using a callback
client . get_account ( function ( account )
print ( account . user . id );
print ( account . user . username );
print ( account . wallet );
end )
-- if run from within a coroutine
local account = client . get_account ()
print ( account . user . id );
print ( account . user . username );
print ( account . wallet );يوفر عميل Nakama وظيفة راحة لإنشاء وبدء Coroutine لتشغيل طلبات متعددة بشكل متزامن واحد تلو الآخر:
nakama . sync ( function ()
local account = client . get_account ()
local result = client . update_account ( request )
end )لدى Nakama تكوين إعادة محاكاة عالمي ومكلف للسيطرة على كيفية إعادة تحريك مكالمات API الفاشلة.
local retries = require " nakama.util.retries "
-- use a global retry policy with 5 attempts with 1 second intervals
local config = {
host = " 127.0.0.1 " ,
port = 7350 ,
username = " defaultkey " ,
password = " " ,
retry_policy = retries . fixed ( 5 , 1 ),
engine = defold ,
}
local client = nakama . create_client ( config )
-- use a retry policy specifically for this request
-- 5 retries at intervals increasing by 1 second between attempts (eg 1s, 2s, 3s, 4s, 5s)
nakama . list_friends ( client , 10 , 0 , " " , retries . incremental ( 5 , 1 ))قم بإنشاء رمز الإلغاء وقم بتمرير ذلك باستخدام طلب لإلغاء الطلب قبل إكماله.
-- use a global retry policy with 5 attempts with 1 second intervals
local config = {
host = " 127.0.0.1 " ,
port = 7350 ,
username = " defaultkey " ,
password = " " ,
retry_policy = retries . fixed ( 5 , 1 ),
engine = defold ,
}
local client = nakama . create_client ( config )
-- create a cancellation token
local token = nakama . cancellation_token ()
-- start a request and proivide the cancellation token
nakama . list_friends ( client , 10 , 0 , " " , nil , callback , token )
-- immediately cancel the request without waiting for the request callback to be invoked
nakama . cancel ( token )يمكنك الاتصال بالخادم عبر اتصال WebSocket الحقيقي لإرسال واستقبال رسائل الدردشة والحصول على إشعارات ومقامات في مباراة متعددة اللاعبين.
تحتاج أولاً إلى إنشاء مقبس حقيقي للخادم:
local client = nakama . create_client ( config )
-- create socket
local socket = client . create_socket ()
nakama . sync ( function ()
-- connect
local ok , err = socket . connect ()
end )ثم انتقل للانضمام إلى قناة الدردشة وأرسل رسالة:
-- send channel join message
local channel_id = " pineapple-pizza-lovers-room "
local result = socket . channel_join ( socket , 1 , channel_id , false , false )
-- send channel messages
local result = socket . channel_message_send ( channel_id , " Pineapple doesn't belong on a pizza! " )يحتوي مقبس العميل على مستمعين أحداث يتم استدعاؤهم في مختلف الأحداث المستلمة من الخادم. مثال:
socket . on_disconnect ( function ( message )
print ( " Disconnected! " )
end )المستمعون المتاحون:
on_disconnect - يتعامل مع حدث عندما يتم فصل العميل عن الخادم.on_channel_presence_eventon_match_presence_eventon_match_dataon_matchon_matchmaker_matchedon_notificationson_party_presence_eventon_partyon_party_dataon_party_join_requeston_status_presence_eventon_statuson_stream_dataon_erroron_channel_messageon_channel_message يدعم Nakama أي محتوى ثنائي في سمة data رسالة مطابقة. بغض النظر عن نوع البيانات الخاص بك ، فإن الخادم يقبل فقط البيانات المشفرة BASE64 ، لذا تأكد من عدم نشر بيانات النص العادي أو حتى JSON ، أو سيطالب Nakama Server بالبيانات مشوهة وتفصل عميلك (تعيين تسجيل الخادم debug للكشف عن هذه الأحداث).
ستقوم Nakama تلقائيًا بتشفير بيانات المطابقة الخاصة بك إذا تم إنشاء الرسالة باستخدام nakama.create_match_data_message() . ستقوم Nakama أيضًا بإلغاء تشغيل أي بيانات مطابقة مستلمة تلقائيًا قبل الاتصال بمستمع on_matchdata .
local json = require " nakama.util.json "
local match_id = " ... "
local op_code = 1
local data = json . encode ({
dest_x = 1.0 ,
dest_y = 0.1 ,
})
-- send a match data message. The data will be automatically base64 encoded.
socket . match_data ( match_id , op_code , data ) في لعبة متعددة الترحيل ، ستتلقى رسائل عملاء آخرين. لقد قام العميل بالفعل بإرهاق بيانات الرسالة قبل إرسالها إلى مستمع on_matchdata . إذا كانت البيانات مشفرة JSON ، كما في المثال أعلاه ، فأنت بحاجة إلى فك تشفيرها بنفسك:
socket . on_matchdata ( function ( message )
local match_data = message . match_data
local data = json . decode ( match_data . data )
pprint ( data ) -- gameplay coordinates from the example above
end )الرسائل التي بدأها الخادم في مباراة موثوقة ستأتي كـ JSON صالحة بشكل افتراضي.
عميل لوا لـ Satori المكتوبة في Lua 5.1.
Satori هو خادم LiveOps للألعاب التي تعمل على تشغيل التحليلات القابلة للتنفيذ ، واختبار A/B والتكوين البعيد. استخدم عميل Satori Defold للتواصل مع Satori من داخل لعبة Defold الخاصة بك.
قم بإنشاء عميل Satori باستخدام مفتاح API من لوحة معلومات Satori.
local config = {
host = " myhost.com " ,
api_key = " my-api-key " ,
use_ssl = true ,
port = 443 ,
retry_policy = retries . incremental ( 5 , 1 ),
engine = defold ,
}
local client = satori . create_client ( config )ثم المصادقة للحصول على جلستك:
satori . sync ( function ()
local uuid = defold . uuid ()
local result = client . authenticate ( nil , nil , uuid )
if not result . token then
error ( " Unable to login " )
return
end
client . set_bearer_token ( result . token )
end )باستخدام العميل ، يمكنك الحصول على أي تجارب أو أعلام الميزات ، ينتمي المستخدم إلى.
satori . sync ( function ()
local experiments = satori . get_experiments ( client )
pprint ( experiments )
local flags = satori . get_flags ( client )
pprint ( flags )
end )تتم إدارة خريطة طريق التطوير حيث يتم الترحيب بقضايا github وطلبات السحب. إذا كنت مهتمًا بتعزيز الكود ، فيرجى فتح مشكلة لمناقشة التغييرات أو الاطلاع عليها ومناقشتها في منتدى المجتمع.
يمكن العثور على اختبارات الوحدة في مجلد tests . قم بتشغيلها باستخدام Telescope (Fork الذي يدعم Lua 5.3+):
./tsc -f test/test_nakama.lua test/test_satori.lua test/test_socket.lua test/test_session.lua
يتم إنشاء مستندات API مع LDOC ونشرها في صفحات github.
عند تغيير تعليقات واجهة برمجة التطبيقات ، قم بإعادة تشغيل LDOC وارتكاب التغييرات في docs/* .
ملاحظة: يجب إجراء تعليقات لـ nakama/nakama.lua في codegen/main.go .
لتشغيل LDOC:
# in the project root, generate nakama.lua
# requires go and https://github.com/heroiclabs/nakama to be checked out
go run codegen/main.go -output nakama/nakama.lua ../nakama/apigrpc/apigrpc.swagger.json
# install ldoc (mac)
brew install luarocks
luarocks install ldoc
# run ldoc
doc . -d docs
الرجوع إلى الإرشادات في مجلد CodeGen.
يجب أن يكون تكييف عملاء Nakama و Satori Defold مع محرك آخر يعتمد على LUA سهلاً مثل توفير وحدة محرك أخرى عند تكوين عميل Nakama:
-- nakama
local myengine = require " nakama.engine.myengine "
local nakama = require " nakama.nakama "
local nakama_config = {
engine = myengine ,
}
local nakama_client = nakama . create_client ( nakama_config )
-- satori
local myengine = require " nakama.engine.myengine "
local satori = require " satori.satori "
local satori_config = {
engine = myengine ,
}
local satori_client = satori . create_client ( satori_config )يجب أن توفر وحدة المحرك الوظائف التالية:
http(config, url_path, query_params, method, post_data, cancellation_token, callback) - تقديم طلب http.
config - تم تمريره إلى nakama.create() أو satori.create()url_path - مسار لإلحاق القاعدة URIquery_params - أزواج القيمة الرئيسية لاستخدامها كمعلمات استعلام عناوين URLmethod - "GET" ، "Post"post_data - بيانات للنشرcancellation_token - تحقق مما إذا كان cancellation_token.cancelled صحيحcallback - وظيفة للاتصال مع النتيجة (استجابة) socket_create(config, on_message) - إنشاء مأخذ التوصيل. يجب إرجاع مثيل المقبس (الجدول مع حالة مقبس محددة محرك).
config - تم تمريره إلى nakama.create() أو `satori.create ()on_message - وظيفة للاتصال عند إرسال رسالة من الخادم socket_connect(socket, callback) - توصيل المقبس.
socket - مثيل المقبس الذي تم إرجاعه من socket_create()callback - وظيفة للاتصال مع النتيجة (موافق ، خطأ) socket_send(socket, message) - أرسل رسالة على المقبس.
socket - مثيل المقبس الذي تم إرجاعه من socket_create()message - رسالة لإرسالها uuid() - إنشاء uuid
هذا المشروع مرخص بموجب ترخيص Apache-2.