LUA Client для Nakama Server написан в LUA 5.1.
Накама-это сервер с открытым исходным кодом, предназначенный для питания современных игр и приложений. Функции включают учетные записи пользователей, чат, социальные, сваха, многопользовательский период в реальном времени и многое другое.
Этот клиент реализует полные параметры API и сокета с сервером. Он написан в Lua 5.1, чтобы быть совместимым с игровыми двигателями на основе Lua.
Полная документация доступна здесь.
Вам нужно будет настроить сервер и базу данных, прежде чем вы сможете подключиться к клиенту. Самый простой способ - использовать Docker, но посмотреть на документацию сервера для других вариантов.
Установите и запустите серверы. Следуйте этим инструкциям.
Добавьте клиента в свой проект.
game.project . Клиент теперь появится в папке nakama в вашем проекте.Добавьте зависимости в свой проект. В проектах DEDLOLD вам необходимо добавить одну из следующих зависимостей в игру. Проект:
Используйте учетные данные для подключения, чтобы инициализировать клиента Накамы.
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 )(Необязательно) Накама использует декодирование BASE64 для сеанса The Session Tokens и оба кодирования BASE64 и декодирования соответствия данных. Энкодер и декодер по умолчанию и декодер написан в Lua. Чтобы повысить производительность кодирования и декодирования BASE64, можно использовать энкодер BASE64, записанный в C. В проектах DEDLOLD вам необходимо добавить следующую зависимость в игру. Проект:
У клиента есть много методов для выполнения различных функций на сервере или открытия подключений в режиме реального времени с сервером.
Существует множество способов аутентификации с сервером. Аутентификация может создать пользователя, если он еще не существует с этими учетными данными. Также легко аутентифицировать с социальным профилем из 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 )Примечание . См. Раздел «Запросы» ниже для выполнения этого фрагмента (а) синхронно.
При аутентификации сервер отвечает с помощью токена Auth (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 ) Рекомендуется сохранить токен Auth из сеанса и проверить за стартапом, если он истек. Если токен истек, вы должны повторно нанести. Если жетон собирается истекать, его нужно обновить. Время истечения токена может быть изменено как настройка на сервере. Вы можете сохранить сеанс, используя 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 )Клиент включает в себя множество встроенных API для различных функций игрового сервера. К ним можно получить доступ с помощью методов, которые либо используют функцию обратного вызова, чтобы вернуть результат (т.е. асинхронное), либо доход до получения результата (т.е. синхронно и должно быть запущено в коратине Луа).
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 )Накама имеет глобальную конфигурацию повторной попытки для контроля, чтобы контролировать, как провальные вызовы 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 Накама поддерживает любое двоичное контент в атрибуте data о соответствии сообщением. Независимо от вашего типа данных, сервер принимает только базовые данные, кодируемые 64 , поэтому убедитесь, что вы не публикуете данные о простых текстах или даже JSON, или Nakama Server будет претендовать на данные данных, и отключите ваш клиент (установите журнал сервера, чтобы debug для обнаружения этих событий).
Nakama автоматически будет Base64 кодировать ваши данные соответствия, если сообщение было создано с использованием nakama.create_match_data_message() . Накама также автоматически будет автоматически базоть 64 декодирование любых полученных данных, прежде чем вызовать прослушиватель 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 )Сообщения, инициированные сервером в авторитетном матче, по умолчанию будут действительными.
LUA Client для 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 . Запустите их с помощью телескопа (вилка, которая поддерживает LUA 5.3+):
./tsc -f test/test_nakama.lua test/test_satori.lua test/test_socket.lua test/test_session.lua
Документы API генерируются с LDOC и развернуты на страницах GitHub.
При изменении комментариев API повторно и совершите изменения в 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 truecallback - функция для вызова с результатом (ответ) socket_create(config, on_message) - создать сокет. Должен вернуть экземпляр гнезда (таблица с конкретным двигателем состоянием сокета).
config - таблица конфигурации, передаваемая на nakama.create() или `satori.create ()on_message - Функция для вызова, когда сообщение отправляется с сервера socket_connect(socket, callback) - подключить сокет.
socket - экземпляр сокета возвращается из socket_create()callback - функция для вызова с результатом (OK, ERR) socket_send(socket, message) - Отправить сообщение на сокет.
socket - экземпляр сокета возвращается из socket_create()message - Сообщение для отправки uuid() - создать uuid
Этот проект лицензирован по лицензии Apache-2.