diff --git a/modpol/modules/join_org.lua b/modpol/modules/join_org.lua index 9b20287..3353dae 100644 --- a/modpol/modules/join_org.lua +++ b/modpol/modules/join_org.lua @@ -12,20 +12,20 @@ function join_org.initiate(initiator, org, result) end ) - -- for i, member in ipairs(org.members) do - -- org:add_pending_action( - -- member, - -- function () - -- modpol.interactions.binary_poll_user( - -- member, - -- "Let " .. initiator .. " join " .. org.name .. "?", - -- function (resp) - - -- end - -- ) - -- end - -- ) - -- end + for i, member in ipairs(org.members) do + org:add_pending_action( + member, + function () + modpol.interactions.binary_poll_user( + member, + "Let " .. initiator .. " join " .. org.name .. "?", + function (resp) + + end + ) + end + ) + end if result then result() end end diff --git a/modpol/modules/join_org_class.lua b/modpol/modules/join_org_class.lua index 5d8305c..5e574c9 100644 --- a/modpol/modules/join_org_class.lua +++ b/modpol/modules/join_org_class.lua @@ -23,11 +23,44 @@ function JoinOrg:initiate(result) "Would you like to join", function (resp) if resp == "Yes" then - self:implement() + + modpol.call_module( + "consent", + "", + org, + result + + ) + + + modpol.modules.consent( + "Let " .. initiator .. " join " .. org.name .. "?", + org, + params, + self:on_failure, + self:on_success + ) + + -- for i, member in ipairs(org.members) do + -- org:add_pending_action( + -- member, + -- function () + -- modpol.interactions.binary_poll_user( + -- member, + -- "Let " .. initiator .. " join " .. org.name .. "?", + -- function (resp) + -- self:vote() + -- end + -- ) + -- end + -- ) + -- end end end ) + + if result then result() end end @@ -36,7 +69,7 @@ function JoinOrg:request() end -function JoinOrg:implement() +function JoinOrg:on_success() self.org:add_member(self.initiator) end diff --git a/modpol/orgs/base.lua b/modpol/orgs/base.lua index b86d7bf..f26523c 100644 --- a/modpol/orgs/base.lua +++ b/modpol/orgs/base.lua @@ -18,7 +18,7 @@ function temp_org() remove_member={process_type='consent', must_be_member=false} }, processes = {}, - requests = {}, + -- requests = {}, pending = {}, members = {}, parent = nil, diff --git a/modpol/orgs/process.lua b/modpol/orgs/process.lua index 0105f71..c1b2f60 100644 --- a/modpol/orgs/process.lua +++ b/modpol/orgs/process.lua @@ -1,153 +1,33 @@ -old_request_format = { - user=user, -- requesting user - type="add_member", -- action - params={user} -- action params -} - -old_process_format = { - type = "consent", -- delete - id = nil, - org_id = nil, - request_id = nil, -- delete - - -- consent config - majority_to_pass = 0.51, -- voting threshold - votes_needed = nil, - - -- consent data - total_votes = 0, - votes_yes = {}, - votes_no = {} -} - -new_process_format = { - initiator = "user", - status = "request", - org_id = 12314, - module = "create_child_org", -- policy table lookup - process_id = 8347, - timestamp = 1632850133, -- look into supporting other formats, overrides (turn based, etc.) - - data = { - child_org_name = "oligarchy" - }, - - consent = { - -- voter eligibilty frozen by action table invites - start_time = 384179234, - member_count = 14, - votes_yes = {}, - votes_no = {} - } - -} - --- initialize values -function init_consent(policy) { - self.start_time = os.time() - self.member_count = modpol.orgs.get_org(self.org_id):get_member_count() - - if policy.duration then - -- mintest.after(time, func, ...args) - -- should override modpol callback function - register_callback(self.start_time + policy.duration) +function modpol.orgs:call_module(module_name, initiator) + if not modpol.modules[module_name] then + modpol.ocutil.log('Error in ' .. self.name .. ':call_module -> module "' .. name .. '" not found') + return end - if (duration and (consent_ratio or yes_threshold or no_threshold)) or (yes_threshold) or (consent_ratio) then - -- well formed policy - else - -- invalid - end + local module = modpol.modules[module_name] + local new_process = module.create(initiator, self) -} + table.insert(self.processes, new_process) + + return new_process +end --- update vote count -function update_consent(user, approve) { - if approve then - table.insert(yes_votes, user) - else - table.insert(no_votes, user) +function modpol.orgs:create_process() - if not duration then - eval_consent() - end +end -} +function modpol.orgs:add_pending_action() --- evaluate state of vote -function eval_consent() { - consent_ratio = #yes_votes / (#yes_votes + #no_votes) - quorum = (#yes_votes + #no_votes) / member_count +end - if policy.duration then +function mopdol.orgs:remove_pending_action() - if policy.consent_ratio then - if policy.quorum then - if quorum < policy.quorum then - fail() - end - end - if consent_ratio >= policy.consent_ratio then - pass() - else - fail() - end +end - elseif policy.yes_threshold then - if #yes_votes >= policy.yes_threshold then - pass() - else - fail() - end +function modpol.orgs:wipe_pending_actions() - elseif policy.no_threshold then - if #no_votes <= policy.no_threshold then - fail() - else - pass() - end - end +end - elseif policy.yes_threshold then - if policy.no_threshold then - if #no_votes >= policy.no_threshold then - fail() - end - if #yes_votes >= policy.yes_threshold then - pass() - end +function modpol.orgs:has_pending_actions() - elseif policy.consent_ratio and policy.quorum then - if quorum >= policy.quorum then - if consent_ratio >= policy.consent_ratio then - pass() - else - fail() - end - end - end - -} - - -policy_table_format = { - "create_child_org": { - defer_to = nil, - - -- duration - duration = nil, -- evaluates end conditions when reached - - -- thesholds - no_threshold = nil, -- fails if reached - yes_threshold = nil, -- succeeds if reached - - --ratios - consent_ratio = nil, -- % of voters - quorum = nil, -- % of members that vote - } - "create_child_org": { - consent_threshold = 0.51, - max_duration = 89324, -- seconds until vote closes if threshold not reached, or nil for no limit - defer = nil, -- org id to defer to, or nil - } -} \ No newline at end of file +end \ No newline at end of file diff --git a/modpol/orgs/process_old.lua b/modpol/orgs/process_old.lua new file mode 100644 index 0000000..0105f71 --- /dev/null +++ b/modpol/orgs/process_old.lua @@ -0,0 +1,153 @@ +old_request_format = { + user=user, -- requesting user + type="add_member", -- action + params={user} -- action params +} + +old_process_format = { + type = "consent", -- delete + id = nil, + org_id = nil, + request_id = nil, -- delete + + -- consent config + majority_to_pass = 0.51, -- voting threshold + votes_needed = nil, + + -- consent data + total_votes = 0, + votes_yes = {}, + votes_no = {} +} + +new_process_format = { + initiator = "user", + status = "request", + org_id = 12314, + module = "create_child_org", -- policy table lookup + process_id = 8347, + timestamp = 1632850133, -- look into supporting other formats, overrides (turn based, etc.) + + data = { + child_org_name = "oligarchy" + }, + + consent = { + -- voter eligibilty frozen by action table invites + start_time = 384179234, + member_count = 14, + votes_yes = {}, + votes_no = {} + } + +} + +-- initialize values +function init_consent(policy) { + self.start_time = os.time() + self.member_count = modpol.orgs.get_org(self.org_id):get_member_count() + + if policy.duration then + -- mintest.after(time, func, ...args) + -- should override modpol callback function + register_callback(self.start_time + policy.duration) + end + + if (duration and (consent_ratio or yes_threshold or no_threshold)) or (yes_threshold) or (consent_ratio) then + -- well formed policy + else + -- invalid + end + +} + +-- update vote count +function update_consent(user, approve) { + if approve then + table.insert(yes_votes, user) + else + table.insert(no_votes, user) + + if not duration then + eval_consent() + end + +} + +-- evaluate state of vote +function eval_consent() { + consent_ratio = #yes_votes / (#yes_votes + #no_votes) + quorum = (#yes_votes + #no_votes) / member_count + + if policy.duration then + + if policy.consent_ratio then + if policy.quorum then + if quorum < policy.quorum then + fail() + end + end + if consent_ratio >= policy.consent_ratio then + pass() + else + fail() + end + + elseif policy.yes_threshold then + if #yes_votes >= policy.yes_threshold then + pass() + else + fail() + end + + elseif policy.no_threshold then + if #no_votes <= policy.no_threshold then + fail() + else + pass() + end + end + + elseif policy.yes_threshold then + if policy.no_threshold then + if #no_votes >= policy.no_threshold then + fail() + end + if #yes_votes >= policy.yes_threshold then + pass() + end + + elseif policy.consent_ratio and policy.quorum then + if quorum >= policy.quorum then + if consent_ratio >= policy.consent_ratio then + pass() + else + fail() + end + end + end + +} + + +policy_table_format = { + "create_child_org": { + defer_to = nil, + + -- duration + duration = nil, -- evaluates end conditions when reached + + -- thesholds + no_threshold = nil, -- fails if reached + yes_threshold = nil, -- succeeds if reached + + --ratios + consent_ratio = nil, -- % of voters + quorum = nil, -- % of members that vote + } + "create_child_org": { + consent_threshold = 0.51, + max_duration = 89324, -- seconds until vote closes if threshold not reached, or nil for no limit + defer = nil, -- org id to defer to, or nil + } +} \ No newline at end of file diff --git a/modpol/tests/new_module_test.lua b/modpol/tests/new_module_test.lua index 2f83e9a..5dcf4a4 100644 --- a/modpol/tests/new_module_test.lua +++ b/modpol/tests/new_module_test.lua @@ -11,7 +11,7 @@ function completion() print("completed") end --- modpol.modules.join_org.initiate("paul", test_org, completion) +modpol.modules.join_org.initiate("paul", test_org, completion) -process = modpol.modules.join_org_class.create("paul", test_org) -process:initiate(completion) \ No newline at end of file +-- process = modpol.modules.join_org_class.create("paul", test_org) +-- process:initiate(completion) \ No newline at end of file