Хостинг loadingscreen прям на сервере Garry's Mod

Вижу у многих проблемы поднять или найти хостинг для loadingscreen.
Решил написать модуль на C++ пока что собрал только для win32 для обкатки.

gmsv_webserver_win32.zip (141,8 КБ)

Установка:

  1. Скачиваем модуль и пихаем его в garrysmod/lua/bin
  2. В любой серверной части пишем
require("webserver")
web.Start("127.0.0.1",8081)
-- этого должно хватить для начала

После запускаем сам сервер и все, у нас по ссылке http://127.0.0.1:8081 должна появится страница что сервер загружается и т.д.

После запуска модуль создает папку loadingscreen в папке garrysmod.
туда мы можем пихать все что хотим, НО, эта штука может закидывать только статичные ресурсы, т.е всякие php и прочее работать не будет!

API:

-- Запустить веб сервер
-- Тут мы первым параметром указываем какой ip будем слушать
-- вторым параметром указываем порт
-- учитывая что это экран загрузки можно пренебречь красивыми ссылками)
web.Start("127.0.0.1",8081)

-- Это своеобразный хук для отслеживания подключений, пока что он возвращает
-- только ip, жду ваших предложений что еще можно добавить)
web.SetConnectionHook(function(ip)
    print("Web connection from: " .. ip)
end)

-- Очевидно останавливает веб-сервер.

web.Stop()

Думаю добавить шаблонизацию чтобы из луа мы могли передавать значения по типу списка игроков, онлайн и другие параметры.


V0.0.2

В этой версии добавил хук WebConnection который возвращает ip пользователя, в этом хуке можно заблокировать доступ или разрешить.
gmsv_webserver_win32_v0_0_2.zip (193,7 КБ)

Добавил шаблонизацию кода.

API:

-- Запустить веб сервер
-- Тут мы первым параметром указываем какой ip будем слушать
-- вторым параметром указываем порт
-- учитывая что это экран загрузки можно пренебречь красивыми ссылками)
web.Start("127.0.0.1",8081)

-- Это своеобразный хук для отслеживания подключений, пока что он возвращает
-- только ip, и позволяет запретить доступ к сайту
hook.Add("WebConnection","check",function(ip)
        --  false - разрешить доступ к сайту / true - запретить доступ к сайту
	return false 
end)

-- Регистрация тега для шаблонизатора
-- тут мы указываем название тега в моем случае players_count
-- и функцию которая будет возвращать значение в тег
-- ВНИМАНИЕ: функция всегда должна возвращать string!!!!
-- т.е по стандарту заворачиваем ответ в tostring
web.RegisterTemplateTag("players_count", function()
    return tostring(player.GetCount())
end)

-- Очевидно останавливает веб-сервер.


web.Stop()

для работы с шаблонизатором заходим в любой файл сайта к примеру index.html

<body>
    <p>Players: <gm:players_count></p> <!-- <gm:players_count> заменится на кол-во игроков на сервере -->
    <p>Server name: <gm:title></p>
    <p>Server Time: <gm:server_time></p>
</body>

также эти теги можно пихать в css js они везде заменяются!

Добавь возможность не подключать к вебсерверу если такого игрока нет на сервере, как в хуке CheckPassword
Конечный вариант(Lua):

local TIP = {}
local ClearTIP = {}
hook.Add("PlayerConnect", "WebChek", function(name, ip)
    TIP[ip] = true
    ClearTIP[name] = ip
end)

gameevent.Listen("player_disconnect")
hook.Add("player_disconnect", "WebChek", function(data)
    TIP[ClearTIP[data.name] or ''] = nil
    ClearTIP[data.name or ''] = nil
end)

web.SetConnectionHook(function(ip) if not TIP[ip] then return false end end)
hook.Add("PlayerInitialSpawn", "WebChek", function(pl)
    TIP[pl:IPAddress()] = nil
    ClearTIP[pl:Name()] = nil
end)


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

Думаю это можно реализовать

обновил, да PlayerConnect вызывается раньше

Для продвинутых юзеров могу еще посоветовать глянуть в сторону gmsv_luasocket. Это порт самой популярной lua библиотеки, которую используют в чистом луа для создания в том числе веб серверов, драйверов (мостов, коннекторов, библиотек) для работы с базами данных вроде redis или mysql. На основе luasocket можно повторить и даже расширить функционал этой библиотеки. Но требуется гораздо больше опыта, чем «закинул файлик и работает», так как луасокет дает доступ напрямую к самим сокетам, а что с ними делать - дело разработчика.

Если освоите луасокет и корутины - получите non-blocking http client/server. А потом у pegasus.lua можно подсмотреть реализацию примитивного веб сервера

И если хостить лоадинг прямо на сервере кому-то хочется только ради экономии денег, то vercel, cloudflare pages, github pages могут захостить ваш лоадинг абсолютно бесплатно.