More very messy work on drafting module structure
This commit is contained in:
		| @@ -8,9 +8,13 @@ dofile (localdir .. "/users/users.lua") | |||||||
| --orgs | --orgs | ||||||
| dofile (localdir .. "/orgs/base.lua") | dofile (localdir .. "/orgs/base.lua") | ||||||
| dofile (localdir .. "/orgs/requests.lua") | dofile (localdir .. "/orgs/requests.lua") | ||||||
|  | dofile (localdir .. "/orgs/consent.lua") | ||||||
|  | dofile (localdir .. "/orgs/defer_to.lua") | ||||||
|  |  | ||||||
| --interactions | --interactions | ||||||
| dofile (localdir .. "/interactions/interactions.lua") | dofile (localdir .. "/interactions/interactions.lua") | ||||||
|  |  | ||||||
| --modules | --modules | ||||||
| dofile (localdir .. "/modules/consent.lua") | dofile (loaldir .. "/modules/join_org.lua") | ||||||
|  | dofile (loaldir .. "/modules/remove_org.lua") | ||||||
|  | dofile (loaldir .. "/modules/child_org.lua") | ||||||
|   | |||||||
| @@ -64,10 +64,16 @@ dofile (modpol.storage_file_path) | |||||||
| modpol.load_storage() | modpol.load_storage() | ||||||
|  |  | ||||||
| -- =================================================================== | -- =================================================================== | ||||||
| -- ModPol core features | -- Modpol core features | ||||||
|  |  | ||||||
| dofile (topdir .. "/api.lua") | dofile (topdir .. "/api.lua") | ||||||
|  |  | ||||||
|  | -- =================================================================== | ||||||
|  | -- Modpol modules | ||||||
|  |  | ||||||
|  | modpol.modules = modpol.modules or {} | ||||||
|  |  | ||||||
|  | -- TKTK need to specify modules to include | ||||||
|  |  | ||||||
| -- =================================================================== | -- =================================================================== | ||||||
| -- Final checks | -- Final checks | ||||||
|   | |||||||
| @@ -1,98 +0,0 @@ | |||||||
| 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_needed = nil, |  | ||||||
|         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 |  | ||||||
|  |  | ||||||
|     process.votes_needed = math.ceil(process.majority_to_pass * p_org:get_member_count()) |  | ||||||
|  |  | ||||||
|     return process |  | ||||||
| end |  | ||||||
|  |  | ||||||
| -- ============================ |  | ||||||
| -- interact function for the consent module |  | ||||||
| -- input: user (string) |  | ||||||
| function modpol.modules.consent:interact(user) |  | ||||||
|    -- TODO this needs more context on the vote at hand |  | ||||||
|    modpol.interactions.binary_poll_user( |  | ||||||
|       user, "Do you consent?", |  | ||||||
|       function(vote) |  | ||||||
|          if vote == 'Yes' then |  | ||||||
|             self:approve(user, true) |  | ||||||
|          elseif vote == 'No' then |  | ||||||
|             self:approve(user, false) |  | ||||||
|          end |  | ||||||
|    end) |  | ||||||
| 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) |  | ||||||
|      |  | ||||||
|     if #self.votes_yes >= self.votes_needed then |  | ||||||
|         modpol.ocutil.log('Request #' .. self.request_id .. ' passes') |  | ||||||
|         process_org:resolve_request(self.request_id, true) |  | ||||||
|     elseif #self.votes_no >= self.votes_needed then |  | ||||||
|         modpol.ocutil.log('Request #' .. self.request_id .. ' fails to pass') |  | ||||||
|         process_org:resolve_request(self.request_id, false) |  | ||||||
|     else |  | ||||||
|         modpol.ocutil.log('Waiting for more votes...') |  | ||||||
|     end |  | ||||||
| end |  | ||||||
		Reference in New Issue
	
	Block a user