Files
modpol/modpol/modules/consent.lua
T

91 lines
3.0 KiB
Lua
Raw Normal View History

2021-05-06 01:05:57 -04:00
modpol.modules = modpol.modules or {}
modpol.modules.consent = {}
2021-05-02 23:34:05 -04:00
2021-05-06 00:36:30 -04:00
-- sets consent to its own callback
modpol.modules.consent.__index = modpol.modules.consent
function temp_consent_process()
return {
type = "consent",
2021-05-06 00:36:30 -04:00
org_id = nil,
request_id = nil,
actions = {},
2021-05-06 01:05:57 -04:00
total_votes = 0,
majority_to_pass = 0.51,
2021-05-06 00:36:30 -04:00
votes_yes = {},
votes_no = {}
}
end
-- ===============================================
-- function to create a new consent process to resolve a pending process
2021-05-06 01:05:57 -04:00
function modpol.modules.consent:new_process(request_id, org_id)
2021-05-06 00:36:30 -04:00
local process = temp_consent_process()
process.request_id = request_id
process.org_id = org_id
setmetatable(process, modpol.modules.consent)
2021-05-06 01:05:57 -04:00
modpol.ocutil.log('Created new process for request id #' .. request_id)
2021-05-06 00:36:30 -04:00
-- adding new pending action for all users in the org to vote on the request
local process_org = modpol.orgs.get_org(org_id)
for k, member in ipairs(process_org.members) do
process.actions[member] = {'approve'}
end
2021-05-06 01:05:57 -04:00
return process
2021-05-06 00:36:30 -04:00
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.processes[self.id] = "deleted"
modpol.ocutil.log('Deleted process #' .. self.id)
end
2021-05-06 00:36:30 -04:00
-- ======================================================
-- 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
2021-05-06 00:36:30 -04:00
if decision then
table.insert(self.votes_yes, user)
modpol.ocutil.log('User ' .. user .. ' voted yes on request #' .. self.request_id)
2021-05-02 23:34:05 -04:00
else
2021-05-06 00:36:30 -04:00
table.insert(self.votes_no, user)
modpol.ocutil.log('User ' .. user .. ' voted no on request #' .. self.request_id)
2021-05-06 01:05:57 -04:00
end
2021-05-06 00:36:30 -04:00
self.total_votes = self.total_votes + 1
self:update_status()
2021-05-02 23:34:05 -04:00
end
2021-05-06 00:36:30 -04:00
-- ===================================================
-- 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
2021-05-06 00:36:30 -04:00
function modpol.modules.consent.pending_processes()
end