From 4e10d74bff0da03b40696aef641becc192872e34 Mon Sep 17 00:00:00 2001 From: Nathan Schneider Date: Sat, 31 Jul 2021 17:11:26 -0600 Subject: [PATCH] Further implementation of nested functions in interactions, including in consent module --- modpol/interactions/interactions.lua | 13 ++++ modpol/modules/consent.lua | 18 +++-- .../overrides/interactions/interactions.lua | 75 +++++++++++-------- 3 files changed, 66 insertions(+), 40 deletions(-) diff --git a/modpol/interactions/interactions.lua b/modpol/interactions/interactions.lua index 692f2e0..096cedf 100644 --- a/modpol/interactions/interactions.lua +++ b/modpol/interactions/interactions.lua @@ -172,3 +172,16 @@ function modpol.interactions.binary_poll_user(user, question, func) modpol.interactions.message(user, "Error: invalid response") end end + +-- COMPLEX INTERACTIONS +-- ==================== + +-- Function: modpol.interactions.message_org +-- input: initiator (string), org_id (number), message (string) +-- output: broadcasts message to all org members + +-- Function: modpol.interactions.binary_poll_org +-- input: initator (user string), org_id (number) +-- output: gets question from initiator, asks all org members, broadcasts answers + + diff --git a/modpol/modules/consent.lua b/modpol/modules/consent.lua index d91f28e..3047a6b 100644 --- a/modpol/modules/consent.lua +++ b/modpol/modules/consent.lua @@ -41,12 +41,16 @@ end -- ============================ -- interact function for the consent module function modpol.modules.consent:interact(user) - local resp = modpol.interactions.binary_poll_user(user, "How do you vote?") - if resp == 'yes' then - self:approve(user, true) - elseif resp == 'no' then - self:approve(user, false) - end + -- TODO this needs more context on the vote at hand + modpol.interactions.binary_poll_user( + user, "How do you vote?", + function(vote) + if vote == 'yes' then + self:approve(user, true) + elseif vote == 'no' then + self:approve(user, false) + end + end) end -- ========================================= @@ -100,4 +104,4 @@ function modpol.modules.consent:update_status() else modpol.ocutil.log('Waiting for more votes...') end -end \ No newline at end of file +end diff --git a/modpol_minetest/overrides/interactions/interactions.lua b/modpol_minetest/overrides/interactions/interactions.lua index 0ac4bdc..1a60789 100644 --- a/modpol_minetest/overrides/interactions/interactions.lua +++ b/modpol_minetest/overrides/interactions/interactions.lua @@ -82,7 +82,7 @@ minetest.register_on_player_receive_fields(function (player, formname, fields) modpol.interactions.binary_poll_user( pname, input, function(vote) - modpol.interacts.message( + modpol.interactions.message( pname, pname .. " voted " .. vote) end) end) @@ -196,21 +196,17 @@ minetest.register_on_player_receive_fields(function (player, formname, fields) org:remove_member(pname) modpol.interactions.dashboard(pname) elseif fields.test_poll then - modpol.interactions.binary_poll_org(pname, _contexts.pname.current_org.id, "Poll question (yes/no):") + modpol.interactions.binary_poll_org( + pname, _contexts[pname].current_org.id, + "Poll question (yes/no):", + function(input) + modpol.interactions.message_org( + _contexts[pname].current_org.id, + pname .. " voted " .. input) + end) elseif fields.add_child then - --DEPRICATED pre-request version to remove: - --modpol.interactions.add_org(pname, org.id) - modpol.interactions.text_query(pname, "Org name:") - -- local new_org_name = _contexts[pname]["new_org_name"] - _contexts[pname] = function(input) - local new_request = { - user = pname, - type = "add_org", - params = {input} - } - org:make_request(new_request) - _contexts[pname] = nil - end + modpol.interactions.add_org( + pname, _contexts[pname].current_org.id) elseif fields.remove_org then modpol.interactions.remove_org(pname) elseif fields.back then @@ -257,16 +253,19 @@ minetest.register_on_player_receive_fields(function (player, formname, fields) local pname = player:get_player_name() local input = fields.input minetest.close_formspec(pname, formname) - local func = _contexts[pname]["text_query_func"] - if func then - func(input) + if not input then + -- no input, do nothing else - modpol.interactions.message(pname, "text_query: " .. input) + local func = _contexts[pname]["text_query_func"] + if func then + func(input) + else + modpol.interactions.message(pname, "text_query: " .. input) + end end end end) - -- Function: dropdown_query -- input: user (string), label (string), options (table of strings), func (function) -- func input: choice (string) @@ -330,7 +329,7 @@ function modpol.interactions.binary_poll_user(user, question, func) _contexts[user]["binary_poll_func"] = func -- present to player minetest.show_formspec(user, "modpol:binary_poll_user", formspec_string) - modpol.interactions.message(user,"should have showed formspec: " .. question) + modpol.interactions.message(user,"should have showed formspec: " .. question) end minetest.register_on_player_receive_fields(function (player, formname, fields) local pname = player:get_player_name() @@ -342,8 +341,8 @@ minetest.register_on_player_receive_fields(function (player, formname, fields) end minetest.close_formspec(pname, formname) if vote then - modpol.interactions.message(pname, "Vote recorded") - local func = _contexts[user]["binary_poll_func"] + modpol.interactions.message(pname, "Voted " .. vote) + local func = _contexts[pname]["binary_poll_func"] func(vote) end end @@ -352,21 +351,31 @@ end) -- COMPLEX INTERACTIONS -- ==================== +-- Function: modpol.interactions.message_org +-- input: initiator (string), org_id (number), message (string) +-- output: broadcasts message to all org members +function modpol.interactions.message_org(initiator, org_id, message) + local org = modpol.orgs.get_org(org_id) + local users = org:list_member() + for k,v in ipairs(users) do + modpol.interactions.message(v, message) + end +end + + -- Function: modpol.interactions.binary_poll_org --- input: initator (user string), org (number) --- output: interaction begins -function modpol.interactions.binary_poll_org(initiator, org) - -- start formspec - modpol.interactions.text_query(initiator, "Poll question (yes/no):") - -- set user's context to followup function - _contexts[initiator] = +-- input: initator (user string), org_id (number) +-- output: gets question from initiator, asks all org members, broadcasts answers +function modpol.interactions.binary_poll_org(initiator, org_id) + local org = modpol.orgs.get_org(org_id) + local users = org:list_member() + modpol.interactions.text_query( + initiator, "Yes/no poll question:", function(input) - local users = modpol.list_users() for k,v in ipairs(users) do modpol.interactions.binary_poll_user(v, input) end - _contexts[initiator] = nil - end + end) end -- Function: modpol.interactions.add_org