From 3885f9af78b0860475d27677e7b09d5566b97153 Mon Sep 17 00:00:00 2001 From: Nathan Schneider Date: Fri, 30 Jul 2021 16:28:55 -0600 Subject: [PATCH] Testing cascading functions in interactions --- .../overrides/interactions/interactions.lua | 57 ++++++++++++------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/modpol_minetest/overrides/interactions/interactions.lua b/modpol_minetest/overrides/interactions/interactions.lua index e34058e..175a5bb 100644 --- a/modpol_minetest/overrides/interactions/interactions.lua +++ b/modpol_minetest/overrides/interactions/interactions.lua @@ -80,7 +80,16 @@ minetest.register_on_player_receive_fields(function (player, formname, fields) if nil then -- buttons first elseif fields.test_poll then - modpol.interactions.binary_poll_org(pname, 1, "Poll question (yes/no):") + local func_announce_vote = function(vote) + modpol.interacts.message( + pname, pname .. " voted " .. vote) + end + local func_start_poll = function(input) + modpol.interactions.binary_poll_user( + pname, input, func_announce_vote) + end + modpol.interactions.text_query( + pname,"Poll question:",func_start_poll) elseif fields.add_org then modpol.interactions.add_org(pname, 1) elseif fields.remove_org then @@ -227,10 +236,10 @@ end -- Function: modpol.interactions.text_query -- Overrides function at modpol/interactions.lua --- input: Query (string), User (string) --- output: Saves user response (string) to _contexts[pname] --- TODO Need to switch "user" to index not name -function modpol.interactions.text_query(user, query) +-- input: user (string), query (string), func (function) +-- func input: user input (string) +-- output: Applies "func" to user input +function modpol.interactions.text_query(user, query, func) -- set up formspec local formspec = { "formspec_version[4]", @@ -242,15 +251,22 @@ function modpol.interactions.text_query(user, query) local formspec_string = table.concat(formspec, "") -- present to players minetest.show_formspec(user, "modpol:text_query", formspec_string) + -- put func in _contexts + _contexts[user] = {} + _contexts[user]["text_query_func"] = func end -- receive fields minetest.register_on_player_receive_fields(function (player, formname, fields) if formname == "modpol:text_query" then local pname = player:get_player_name() - if _contexts[pname] then - _contexts[pname](fields.input) - end + local input = fields.input minetest.close_formspec(pname, formname) + if _contexts[pname]["text_query_func"] then + local func = _contexts[pname]["text_query_func"] + func(input) + else + modpol.interactions.message(pname, "text_query: " .. input) + end end end) @@ -285,11 +301,12 @@ end) -- SECONDARY INTERACTIONS -- ====================== --- Function: modpol.binary_poll_user(user, question) +-- Function: modpol.binary_poll_user(user, question, function) -- Overrides function at modpol/interactions.lua --- presents a yes/no poll to a user, returns answer --- -function modpol.interactions.binary_poll_user(user, question) +-- Params: user (string), question (string), func (function) +-- func input: user input (string: y/n) +-- Output: Applies "func" to user input +function modpol.interactions.binary_poll_user(user, question, func) -- set up formspec local text = "Poll: " .. question local formspec = { @@ -302,10 +319,12 @@ function modpol.interactions.binary_poll_user(user, question) --TKTK we could use scroll boxes to contain the text } local formspec_string = table.concat(formspec, "") + _contexts[user] = {} + _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) end - minetest.register_on_player_receive_fields(function (player, formname, fields) local pname = player:get_player_name() -- modpol:binary_poll @@ -313,15 +332,13 @@ minetest.register_on_player_receive_fields(function (player, formname, fields) local vote = nil if fields.yes then vote = fields.yes elseif fields.no then vote = fields.no - elseif fields.abstain then vote = fields.abstain - end - if vote then - modpol.interactions.message(pname, "Vote recorded") - minetest.chat_send_all(pname .. " voted " .. vote) - --TODO : we should send the message to all in that org, not to all players end minetest.close_formspec(pname, formname) - return vote + if vote then + modpol.interactions.message(pname, "Vote recorded") + local func = _contexts[user]["binary_poll_func"] + func(vote) + end end end)