Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-07-24 18:42:55 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-07-24 18:42:55 +1000
commitaf31bde03216ba337fb6b3b5ef306c4a0bb745b5 (patch)
treef001ad9f8e59c78a30ebb5e4011de5f2e026b02a
parenta2d901bd66178bbaacc2fec3acd07e7a27b9235f (diff)
Handle world creation error when sending world messages, add active world callbacks
-rw-r--r--assets/opensb/scripts/opensb/util/modules.lua2
-rw-r--r--assets/opensb/scripts/opensb/worldserver/messages.lua12
-rw-r--r--assets/opensb/scripts/opensb/worldserver/test.lua12
-rw-r--r--assets/opensb/scripts/opensb/worldserver/worldserver.lua2
-rw-r--r--source/game/StarUniverseServer.cpp15
-rw-r--r--source/game/StarUniverseServer.hpp1
-rw-r--r--source/game/scripting/StarUniverseServerLuaBindings.cpp18
-rw-r--r--source/game/scripting/StarUniverseServerLuaBindings.hpp4
8 files changed, 48 insertions, 18 deletions
diff --git a/assets/opensb/scripts/opensb/util/modules.lua b/assets/opensb/scripts/opensb/util/modules.lua
index 2ce7086..f1cd245 100644
--- a/assets/opensb/scripts/opensb/util/modules.lua
+++ b/assets/opensb/scripts/opensb/util/modules.lua
@@ -1,3 +1,5 @@
+-- Small helper to organize code for the same context into different Lua scripts without having to "hook" previously defined.
+
modules = setmetatable({}, {__call = function(this, path, names)
for i, name in pairs(names) do
require(path .. name .. ".lua")
diff --git a/assets/opensb/scripts/opensb/worldserver/messages.lua b/assets/opensb/scripts/opensb/worldserver/messages.lua
new file mode 100644
index 0000000..1c51eb4
--- /dev/null
+++ b/assets/opensb/scripts/opensb/worldserver/messages.lua
@@ -0,0 +1,12 @@
+local module = {}
+modules.messages = module
+
+function module.init()
+ message.setHandler("keepAlive", function(_, _, time)
+ return world.setExpiryTime(tonumber(time) or 0)
+ end)
+end
+
+function module.update()
+
+end \ No newline at end of file
diff --git a/assets/opensb/scripts/opensb/worldserver/test.lua b/assets/opensb/scripts/opensb/worldserver/test.lua
deleted file mode 100644
index eaaf08f..0000000
--- a/assets/opensb/scripts/opensb/worldserver/test.lua
+++ /dev/null
@@ -1,12 +0,0 @@
-local module = {}
-modules.test = module
-
-function module.init()
- message.setHandler("type", function()
- return world.type()
- end)
-end
-
-function module.update()
-
-end \ No newline at end of file
diff --git a/assets/opensb/scripts/opensb/worldserver/worldserver.lua b/assets/opensb/scripts/opensb/worldserver/worldserver.lua
index a84fa9d..e66edbc 100644
--- a/assets/opensb/scripts/opensb/worldserver/worldserver.lua
+++ b/assets/opensb/scripts/opensb/worldserver/worldserver.lua
@@ -1,2 +1,2 @@
require "/scripts/opensb/util/modules.lua"
-modules("/scripts/opensb/worldserver/", {"test"}) \ No newline at end of file
+modules("/scripts/opensb/worldserver/", {"messages"}) \ No newline at end of file
diff --git a/source/game/StarUniverseServer.cpp b/source/game/StarUniverseServer.cpp
index 51f4cec..dd48085 100644
--- a/source/game/StarUniverseServer.cpp
+++ b/source/game/StarUniverseServer.cpp
@@ -151,6 +151,11 @@ List<WorldId> UniverseServer::activeWorlds() const {
return m_worlds.keys();
}
+bool UniverseServer::isWorldActive(WorldId const& worldId) const {
+ RecursiveMutexLocker locker(m_mainLock);
+ return m_worlds.contains(worldId);
+}
+
List<ConnectionId> UniverseServer::clientIds() const {
ReadLocker clientsLocker(m_clientsLock);
return m_clients.keys();
@@ -1045,8 +1050,14 @@ void UniverseServer::handleWorldMessages() {
auto it = m_pendingWorldMessages.begin();
while (it != m_pendingWorldMessages.end()) {
auto& worldId = it->first;
- if (auto worldPtr = triggerWorldCreation(worldId).value()) {
- worldPtr->passMessages(move(it->second));
+ if (auto worldResult = triggerWorldCreation(worldId)) {
+ auto& world = *worldResult;
+
+ if (world)
+ world->passMessages(move(it->second));
+ else for (auto& message : it->second)
+ message.promise.fail("Error creating world");
+
it = m_pendingWorldMessages.erase(it);
}
else
diff --git a/source/game/StarUniverseServer.hpp b/source/game/StarUniverseServer.hpp
index 33b0838..806d16f 100644
--- a/source/game/StarUniverseServer.hpp
+++ b/source/game/StarUniverseServer.hpp
@@ -51,6 +51,7 @@ public:
void setPause(bool pause);
List<WorldId> activeWorlds() const;
+ bool isWorldActive(WorldId const& worldId) const;
List<ConnectionId> clientIds() const;
size_t numberOfClients() const;
diff --git a/source/game/scripting/StarUniverseServerLuaBindings.cpp b/source/game/scripting/StarUniverseServerLuaBindings.cpp
index 9101be5..ac513a2 100644
--- a/source/game/scripting/StarUniverseServerLuaBindings.cpp
+++ b/source/game/scripting/StarUniverseServerLuaBindings.cpp
@@ -18,7 +18,9 @@ LuaCallbacks LuaBindings::makeUniverseServerCallbacks(UniverseServer* universe)
callbacks.registerCallbackWithSignature<bool, ConnectionId>("isAdmin", bind(UniverseServerCallbacks::isAdmin, universe, _1));
callbacks.registerCallbackWithSignature<bool, ConnectionId>("isPvp", bind(UniverseServerCallbacks::isPvp, universe, _1));
callbacks.registerCallbackWithSignature<void, ConnectionId, bool>("setPvp", bind(UniverseServerCallbacks::setPvp, universe, _1, _2));
- callbacks.registerCallbackWithSignature<RpcThreadPromise<Json>, LuaEngine&, String, String, LuaVariadic<Json>>("sendWorldMessage", bind(UniverseServerCallbacks::sendWorldMessage, universe, _1, _2, _3, _4));
+ callbacks.registerCallbackWithSignature<bool, String>("isWorldActive", bind(UniverseServerCallbacks::isWorldActive, universe, _1));
+ callbacks.registerCallbackWithSignature<bool, StringList>("activeWorlds", bind(UniverseServerCallbacks::activeWorlds, universe));
+ callbacks.registerCallbackWithSignature<RpcThreadPromise<Json>, String, String, LuaVariadic<Json>>("sendWorldMessage", bind(UniverseServerCallbacks::sendWorldMessage, universe, _1, _2, _3));
return callbacks;
}
@@ -108,7 +110,19 @@ void LuaBindings::UniverseServerCallbacks::setPvp(UniverseServer* universe, Conn
universe->setPvp(client, setPvpTo);
}
-RpcThreadPromise<Json> LuaBindings::UniverseServerCallbacks::sendWorldMessage(UniverseServer* universe, LuaEngine& engine, String const& worldId, String const& message, LuaVariadic<Json> args) {
+bool LuaBindings::UniverseServerCallbacks::isWorldActive(UniverseServer* universe, String const& worldId) {
+ return universe->isWorldActive(parseWorldId(worldId));
+}
+
+StringList LuaBindings::UniverseServerCallbacks::activeWorlds(UniverseServer* universe) {
+ StringList worlds;
+ for (WorldId& world : universe->activeWorlds())
+ worlds.append(printWorldId(world));
+
+ return worlds;
+}
+
+RpcThreadPromise<Json> LuaBindings::UniverseServerCallbacks::sendWorldMessage(UniverseServer* universe, String const& worldId, String const& message, LuaVariadic<Json> args) {
return universe->sendWorldMessage(parseWorldId(worldId), message, JsonArray::from(move(args)));
}
diff --git a/source/game/scripting/StarUniverseServerLuaBindings.hpp b/source/game/scripting/StarUniverseServerLuaBindings.hpp
index 5eb1674..0b6b21b 100644
--- a/source/game/scripting/StarUniverseServerLuaBindings.hpp
+++ b/source/game/scripting/StarUniverseServerLuaBindings.hpp
@@ -23,7 +23,9 @@ namespace LuaBindings {
bool isAdmin(UniverseServer* universe, ConnectionId arg1);
bool isPvp(UniverseServer* universe, ConnectionId arg1);
void setPvp(UniverseServer* universe, ConnectionId arg1, Maybe<bool> arg2);
- RpcThreadPromise<Json> sendWorldMessage(UniverseServer* universe, LuaEngine& engine, String const& worldId, String const& message, LuaVariadic<Json> args);
+ bool isWorldActive(UniverseServer* universe, String const& worldId);
+ StringList activeWorlds(UniverseServer* universe);
+ RpcThreadPromise<Json> sendWorldMessage(UniverseServer* universe, String const& worldId, String const& message, LuaVariadic<Json> args);
}
}
}