modpol.modules = modpol.modules or {} modpol.modules.consent = {} -- sets consent to its own callback modpol.modules.consent.__index = modpol.modules.consent function temp_consent_process() return { type = "consent", id = nil, org_id = nil, request_id = nil, total_votes = 0, majority_to_pass = 0.51, votes_yes = {}, votes_no = {} } end -- =============================================== -- function to create a new consent process to resolve a pending process function modpol.modules.consent:new_process(id, request_id, org_id) local process = temp_consent_process() process.id = id process.request_id = request_id process.org_id = org_id setmetatable(process, modpol.modules.consent) modpol.ocutil.log('Created new process #' .. id .. ' for request id #' .. request_id) local p_org = modpol.orgs.get_org(org_id) for i, member in ipairs(p_org.members) do p_org:add_pending_action(id, member) end return process 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 end -- ========================================= -- function to delete a process, called when process finishes function modpol.modules.consent:delete() local process_org = modpol.orgs.get_org(self.org_id) process_org:wipe_pending_actions(self.id) process_org.processes[self.id] = "deleted" modpol.ocutil.log('Deleted process #' .. self.id) end -- ====================================================== -- function for users to vote on a pending request function modpol.modules.consent:approve(user, decision) if not modpol.orgs.get_org(self.org_id):has_member(user) then modpol.ocutil.log('Error in consent:approve -> user not a member of the org') return end if decision then table.insert(self.votes_yes, user) modpol.ocutil.log('User ' .. user .. ' voted yes on request #' .. self.request_id) else table.insert(self.votes_no, user) modpol.ocutil.log('User ' .. user .. ' voted no on request #' .. self.request_id) end self.total_votes = self.total_votes + 1 local p_org = modpol.orgs.get_org(self.org_id) p_org:remove_pending_action(self.id, user) self:update_status() end -- =================================================== -- determines whether process has finished and resolves request if it has (unfinished) function modpol.modules.consent:update_status() local process_org = modpol.orgs.get_org(self.org_id) local eligible_voters = process_org:get_member_count() local votes_needed = math.ceil(self.majority_to_pass * eligible_voters) if #self.votes_yes >= votes_needed then modpol.ocutil.log('Request #' .. self.request_id .. ' passes') process_org:resolve_request(self.request_id, true) self:delete() elseif #self.votes_no >= votes_needed then modpol.ocutil.log('Request #' .. self.request_id .. ' fails to pass') process_org:resolve_request(self.request_id, false) self:delete() else modpol.ocutil.log('Waiting for more votes...') end end