From 9725c71e96162e1f11080bc2e68a7bcfb910ed5f Mon Sep 17 00:00:00 2001 From: tour Date: Sun, 6 Apr 2025 18:10:59 +0200 Subject: [PATCH] party_api: add support for partys that require invite --- .luacheckrc | 1 + party_api/InvitePartyManager.lua | 45 ++++++++++++++++ party_api/InvitePartyObject.lua | 93 ++++++++++++++++++++++++++++++++ party_api/PartyManager.lua | 9 +++- party_api/PartyObject.lua | 9 +++- party_api/api.md | 14 ++++- party_api/init.lua | 3 ++ 7 files changed, 170 insertions(+), 4 deletions(-) create mode 100644 party_api/InvitePartyManager.lua create mode 100644 party_api/InvitePartyObject.lua diff --git a/.luacheckrc b/.luacheckrc index a9e13e8..a640179 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -1,5 +1,6 @@ std = "lua51+luajit+minetest" +-- pattern local res1, error = f1(); if not res1 then return false, error end; local res2, error = f2() ignore = {"411"} globals = {"party_api", "party", "factions"} diff --git a/party_api/InvitePartyManager.lua b/party_api/InvitePartyManager.lua new file mode 100644 index 0000000..587f4d7 --- /dev/null +++ b/party_api/InvitePartyManager.lua @@ -0,0 +1,45 @@ +local InvitePartyManager = {} + +local super = party_api.manager_classes.default_manager +local __index = function (_, key) + return InvitePartyManager[key] or super[key] +end + +InvitePartyManager.setInvite = function (self, partyname, value) + local party, error = self:getParty(partyname) + if not party then return false, error end + + local success, error = party:setInviteRequired(value) + if not success then return false, error end + self:setParty(party) + return success +end + +InvitePartyManager.invite = function (self, playername, partyname) + local party, error = self:getParty(partyname) + if not party then return false, error end + local sucess, error = party:invite(playername) + if not sucess then return false, error end + self:setParty(party) + return "OK" +end + +InvitePartyManager.cancelInvite = function (self, playername, partyname) + local party, error = self:getParty(partyname) + if not party then return false, error end + local sucess, error = party:cancelInvite(playername) + if not sucess then return false, error end + self:setParty(party) + return "OK" +end + + +local call = function (_, ...) + local manager = super(...) + return setmetatable(manager, {__index = __index}) +end + +return setmetatable({}, { + __call = call, + __index = __index, +}) \ No newline at end of file diff --git a/party_api/InvitePartyObject.lua b/party_api/InvitePartyObject.lua new file mode 100644 index 0000000..9b9ef42 --- /dev/null +++ b/party_api/InvitePartyObject.lua @@ -0,0 +1,93 @@ +local core = minetest + +-- core.write_json / core.parse_json has problems when called on {} +local serialize = core.serialize +local deserialize = core.deserialize + +local InviteParty = {} + +local super = party_api.party_classes.default_party +local __index = function (_, key) + return InviteParty[key] or super[key] +end + + +InviteParty.getData = function(self) + local result = super.getData(self) + result.invite_required = self.invite_required + result.invited = self.invited + return result +end + +InviteParty.join = function (self, playername) + if self.invite_required then + local invite_list = deserialize(self.invited) + if not invite_list[playername] then + -- TODO: Notify that someone wanted to join?) + return false, "Missing invitation for this party" + end + invite_list[playername] = nil + self.invited = serialize(invite_list) + end + + return super.join(self, playername) +end + +InviteParty.setInviteRequired = function (self, value) + -- turn value into a bool + value = not not value + self.invite_required = value + + if value == false then + party.invited = serialize({}) + return "Invite is now OFF" + else + return "Invite is now ON" + end +end + +InviteParty.invite = function (self, playername) + if not self.invite_required then + return false, "No invite required" + end + local invite_list = deserialize(self.invited) + invite_list[playername] = true + self.invited = serialize(invite_list) + return "OK" +end + +InviteParty.cancelInvite = function (self, playername) + if not self.invite_required then + return false, "No invite required" + end + local invite_list = deserialize(self.invited) + invite_list[playername] = nil + self.invited = serialize(invite_list) + return "OK" +end + + +local load = function (partyname, data, members) + local party = super(partyname, data, members) + party.invite_required = data.invite_required + party.invited = data.invited + return setmetatable(party, {__index = __index}) +end + +local create = function(partyname, invite_required) + local party = super(partyname) + -- turn invite_required into a bool + party.invite_required = not not invite_required + party.invited = serialize({}) + return setmetatable(party, {__index = __index}) +end + +local call = function (_, ...) + if #{...} < 3 then return create(...) end + if #{...} == 3 then return load(...) end +end + +return setmetatable({}, { + __call = call, + __index = __index, +}) \ No newline at end of file diff --git a/party_api/PartyManager.lua b/party_api/PartyManager.lua index 4296634..a71f5f0 100644 --- a/party_api/PartyManager.lua +++ b/party_api/PartyManager.lua @@ -158,7 +158,7 @@ end -- ----------------------------------------------------------------------------------------------------------------- -return function (kwargs) +local call = function (_, kwargs) if kwargs.storage_ref:get_string("partylist") == "" then kwargs.storage_ref:set_string("partylist", serialize({})) end @@ -166,4 +166,9 @@ return function (kwargs) storage_ref = kwargs.storage_ref, party_class = kwargs.party_class, }, metatable) -end \ No newline at end of file +end + +return setmetatable({}, { + __call = call, + __index = PartyManager, +}) \ No newline at end of file diff --git a/party_api/PartyObject.lua b/party_api/PartyObject.lua index ced32e4..19b4ca3 100644 --- a/party_api/PartyObject.lua +++ b/party_api/PartyObject.lua @@ -59,6 +59,13 @@ PartyObject.getPlayerData = function (self, playername) return deserialize(self.members[playername]) end +PartyObject.setPlayerData = function (self, playername, data) + if not self.members[playername] then + return false, "player is not part of the party" + end + self.members[playername] = serialize(data) + return "OK" +end local load = function (partyname, data, members) local party = table.copy(data) @@ -76,7 +83,7 @@ local create = function(partyname) end local call = function (_, ...) - if #{...} == 1 then return create(...) end + if #{...} < 3 then return create(...) end if #{...} == 3 then return load(...) end end diff --git a/party_api/api.md b/party_api/api.md index cc90474..cfee93f 100644 --- a/party_api/api.md +++ b/party_api/api.md @@ -16,6 +16,12 @@ - leave(playername) ### PartyObject +**data** +- name +- created +- members (structure: see above) + +**functions** - (partyname): creates a new party with the given name - (partyname, data, members): loads a party with the given params - getName() @@ -25,4 +31,10 @@ - rename(newname) - join(playername) - leave(playername) -- getPlayerData(playername) \ No newline at end of file +- getPlayerData(playername) +- setPlayerData(playername, data) + +### InvitePartyObject (additional to PartyObject) +**data** +- invite_required (bool) +- invited: serialized table in the form of members \ No newline at end of file diff --git a/party_api/init.lua b/party_api/init.lua index 9f520e2..2802a4d 100644 --- a/party_api/init.lua +++ b/party_api/init.lua @@ -11,4 +11,7 @@ party_api.manager_classes = {} party_api.party_classes = {} party_api.manager_classes.default_manager = dofile(party_api.modpath .. "/PartyManager.lua") +party_api.manager_classes.invite_manager = dofile(party_api.modpath .. "/InvitePartyManager.lua") + party_api.party_classes.default_party = dofile(party_api.modpath .. "/PartyObject.lua") +party_api.party_classes.invite_party = dofile(party_api.modpath .. "/InvitePartyObject.lua")