Как реализовать общение между Garry's Mod сервером и Django?

Задача: Реализовать общение между Garry's Mod сервером и Django.

Описание:
Разрабатываю портал, хочется сделать его как можно связаннее с сервером. Все MySql таблицы описаны в Django для удобной работы с ними. Игровой сервер и Django на одной машине (Debain). В планах добавить WebSocket. В Garry's Mode используется LUA.

Cхема:
Игрок заходит на игровой сервер ->
Просим Django дать нам о нем данные (Кол-во убийств, последний заход и т.д.) ->
Django ищет в MySql этого игрока и возвращает данные игровому серверу ->
Работаем на игровом сервере с этими данными (Выводим статистику в чат) ->
На сервере произошло событие (Игрок убил другого игрока) ->
Сообщаем об этом Django и передаем некоторые данные (SteamID обоих игроков) ->
Django реализует некоторую логику (Ищет в MySql обоих игроков) ->
В MySql записывается результат (Добавили первому игроку 1 убийство, второму 1 смерть)

Варианты решения:
1) Первый который сразу пришел в голову TCP, но т.к. Django синхронный пришлось копать в сторону асинхронных реализаций типо Twisted, Tornado и т.д. В итоге нашел Orbited и все вылилось в такую вот схемку
1391626046-clip-33kb.jpg
Как мне показалось, это слишком сложно, хотя возможно самое правильное решение.

2) Затем вспомнил про Redis, но опять таки Django синхронный, возникает та же схема.
3) Самое простое решение, реализовать на Django API и вызывать его с игрового сервера.

Вполне возможно что я где-то ошибаюсь, т.к. полез во все эти дебри только из-за этой надобности, до этого лишь не много игрался с NodeJS и при выборе асинхронного сервер так же подумал о нем, но быстро отмел т.к. не хочется использовать слишком много разных технологий.

Так же если все таки и делать с использованием асинхронного сервера, хотелось бы сразу там прикрутить WebSocket.
  • Вопрос задан
  • 4229 просмотров
Решения вопроса 1
Narkeba
@Narkeba Автор вопроса
Постараюсь по подробнее описать решение.
NodeJS выступает посредником между сервером и Django. Когда происходит событие на сервере, он отсылает данные по TCP NodeJS, который в свою очередь вызывает скрытое API Django и рассылает по WebSocket'ам данные. Если же в Django происходит некоторое событие, он так же по TCP связывается с NodeJS. Это дает возможность без переписывания кода пользоваться нужным функционалом, ко всему этому в случае падения NodeJS сайт или сервер сильно не пострадают (На сайте не будет работать WebSocket, на игровом сервере не будет сохранятся данные, но играть все так же можно будет).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Narkeba
@Narkeba Автор вопроса
Дополню. Есть готовые реализации socket'ов для Win, с Linux простого решения не нашлось. После долгих и упорных попыток сделать все же это самому решил искать помощи у одного из разработчиков garrysmod socket'ov для вин, в итоге все заработало.
1) Качаем g1.metastruct.org:20080/modules/gmsv_luasocket_lin... скидываем в "garrysmod/lua/bin"
2) Открываем srcds_run, ищем LD_LIBRARY_PATH, меняем на LD_LIBRARY_PATH=".:bin:garrysmod/bin"
3) Убедитесь что gmsv_luasocket_linux.dll имеет доступ к lua_shared_srv.so который находится в "/garrysmod/bin/"
4) Копируем файл code.google.com/p/gmod-haza/source/browse/trunk/PI... в "garrysmod/lua/includes/modules/socket.lua"
5) В вашем скрипте пишем "require('luasocket')" и вызываем "luasocket_stuff.luaopen_socket_core()"
6) Пользуемся)
Простой пример:
require("luasocket")
luasocket_stuff.luaopen_socket_core()

local host, port = "127.0.0.1", 5000
local tcp = assert(socket.tcp())
tcp:send("hello world\n");
local line = tcp:receive('*line')
print(line)
tcp:close()
Ответ написан
Комментировать
Narkeba
@Narkeba Автор вопроса
Вообщем свелся к решению с NodeJS как прокси между сервером и django.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы