diff --git a/src/engine.cpp b/src/engine.cpp index 85a9e42b..800a20d3 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -30,6 +30,7 @@ #include "logic/EngineController.hpp" #include "logic/CommandsInterpreter.hpp" #include "logic/scripting/scripting.hpp" +#include "network/Network.hpp" #include "util/listutil.hpp" #include "util/platform.hpp" #include "window/Camera.hpp" @@ -72,7 +73,8 @@ static std::unique_ptr load_icon(const fs::path& resdir) { Engine::Engine(EngineSettings& settings, SettingsHandler& settingsHandler, EnginePaths* paths) : settings(settings), settingsHandler(settingsHandler), paths(paths), - interpreter(std::make_unique()) + interpreter(std::make_unique()), + network(network::Network::create(settings.network)) { paths->prepare(); loadSettings(); @@ -191,6 +193,7 @@ void Engine::mainloop() { : settings.display.framerate.get() ); + network->update(); processPostRunnables(); Window::swapBuffers(); @@ -235,6 +238,7 @@ Engine::~Engine() { gui.reset(); logger.info() << "gui finished"; audio::close(); + network.reset(); scripting::close(); logger.info() << "scripting finished"; Window::terminate(); @@ -482,3 +486,7 @@ void Engine::postRunnable(const runnable& callback) { SettingsHandler& Engine::getSettingsHandler() { return settingsHandler; } + +network::Network& Engine::getNetwork() { + return *network; +} diff --git a/src/engine.hpp b/src/engine.hpp index 75b9a1b7..891606a5 100644 --- a/src/engine.hpp +++ b/src/engine.hpp @@ -37,6 +37,10 @@ namespace cmd { class CommandsInterpreter; } +namespace network { + class Network; +} + class initialize_error : public std::runtime_error { public: initialize_error(const std::string& message) : std::runtime_error(message) {} @@ -56,6 +60,7 @@ class Engine : public util::ObjectsKeeper { std::recursive_mutex postRunnablesMutex; std::unique_ptr controller; std::unique_ptr interpreter; + std::unique_ptr network; std::vector basePacks; uint64_t frame = 0; @@ -148,4 +153,6 @@ public: PacksManager createPacksManager(const fs::path& worldFolder); SettingsHandler& getSettingsHandler(); + + network::Network& getNetwork(); }; diff --git a/src/logic/scripting/lua/libs/api_lua.hpp b/src/logic/scripting/lua/libs/api_lua.hpp index 12df1d66..a3b2d152 100644 --- a/src/logic/scripting/lua/libs/api_lua.hpp +++ b/src/logic/scripting/lua/libs/api_lua.hpp @@ -32,6 +32,7 @@ extern const luaL_Reg inventorylib[]; extern const luaL_Reg itemlib[]; extern const luaL_Reg jsonlib[]; extern const luaL_Reg mat4lib[]; +extern const luaL_Reg networklib[]; extern const luaL_Reg packlib[]; extern const luaL_Reg particleslib[]; // gfx.particles extern const luaL_Reg playerlib[]; diff --git a/src/logic/scripting/lua/libs/libnetwork.cpp b/src/logic/scripting/lua/libs/libnetwork.cpp new file mode 100644 index 00000000..48016f29 --- /dev/null +++ b/src/logic/scripting/lua/libs/libnetwork.cpp @@ -0,0 +1,43 @@ +#include "api_lua.hpp" + +#include "engine.hpp" +#include "network/Network.hpp" + +using namespace scripting; + +static int l_http_get(lua::State* L) { + std::string url(lua::require_lstring(L, 1)); + + lua::pushvalue(L, 2); + auto onResponse = lua::create_lambda(L); + + engine->getNetwork().httpGet(url, [onResponse](std::vector bytes) { + engine->postRunnable([=]() { + onResponse({std::string(bytes.data(), bytes.size())}); + }); + }); + return 0; +} + +static int l_http_get_binary(lua::State* L) { + std::string url(lua::require_lstring(L, 1)); + + lua::pushvalue(L, 2); + auto onResponse = lua::create_lambda(L); + + engine->getNetwork().httpGet(url, [onResponse](std::vector bytes) { + auto buffer = std::make_shared>( + reinterpret_cast(bytes.data()), bytes.size() + ); + engine->postRunnable([=]() { + onResponse({buffer}); + }); + }); + return 0; +} + +const luaL_Reg networklib[] = { + {"http_get", lua::wrap}, + {"http_get_binary", lua::wrap}, + {NULL, NULL} +}; diff --git a/src/logic/scripting/lua/lua_engine.cpp b/src/logic/scripting/lua/lua_engine.cpp index 93585c41..8f477710 100644 --- a/src/logic/scripting/lua/lua_engine.cpp +++ b/src/logic/scripting/lua/lua_engine.cpp @@ -65,6 +65,7 @@ static void create_libs(State* L, StateType stateType) { openlib(L, "audio", audiolib); openlib(L, "console", consolelib); openlib(L, "player", playerlib); + openlib(L, "network", networklib); openlib(L, "entities", entitylib); openlib(L, "cameras", cameralib); diff --git a/test/network/curltest.cpp b/test/network/curltest.cpp index 50add51e..25f7c3cf 100644 --- a/test/network/curltest.cpp +++ b/test/network/curltest.cpp @@ -16,7 +16,7 @@ TEST(curltest, curltest) { auto view = std::string_view(data.data(), data.size()); auto value = json::parse(view); std::cout << value << std::endl; - } + }, [](auto){} ); if (false) { auto socket = network->connect("localhost", 8000);