mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2025-12-28 03:55:23 +09:00
261 lines
8.9 KiB
Lua
261 lines
8.9 KiB
Lua
--[[
|
|
Explosive Gaming
|
|
|
|
This file can be used with permission but this and the credit below must remain in the file.
|
|
Contact a member of management on our discord to seek permission to use our code.
|
|
Any changes that you may make to the code are yours but that does not make the script yours.
|
|
Discord: https://discord.gg/r6dC2uK
|
|
]]
|
|
--Please Only Edit Below This Line-----------------------------------------------------------
|
|
|
|
local poll_time_out = 90 -- In seconds
|
|
|
|
local function _polls(reset)
|
|
global.addons = not reset and global.addons or {}
|
|
global.addons.polls = not reset and global.addons.polls or {active={},old={}}
|
|
return global.addons.polls
|
|
end
|
|
|
|
function _poll_end(self)
|
|
local uuid = self.data.poll_uuid
|
|
local poll = _polls().active[uuid]
|
|
if not poll then return end
|
|
local highest = {nil,-1}
|
|
local _votes = {}
|
|
for index,answer in pairs(poll.answers) do
|
|
local _result = poll.votes[index] or 0
|
|
if _result > highest[2] then highest = {answer,_result} end
|
|
_votes[answer] = _result
|
|
end
|
|
local uuid = poll.uuid
|
|
poll.uuid = nil
|
|
poll.votes = _votes
|
|
poll.answers = nil
|
|
poll.voted = nil
|
|
table.insert(_polls().old,poll)
|
|
_polls().active[uuid] = nil
|
|
game.print({'polls.end',poll.question},defines.textcolor.info)
|
|
game.print({'polls.winner',highest[1]},defines.textcolor.info)
|
|
end
|
|
|
|
local function _poll_data(question,answers)
|
|
local poll = {
|
|
uuid=Server.new_uuid(),
|
|
question=question,
|
|
answers=answers or {'None'},
|
|
votes={},
|
|
voted={}
|
|
}
|
|
Server.new_thread{
|
|
data={poll_uuid=poll.uuid},
|
|
timeout=poll_time_out*60
|
|
}:on_event('timeout',_poll_end):open()
|
|
-- This time out is known to cause desyncs and so I have moved it to a hard coded function
|
|
_polls().active[poll.uuid]=poll
|
|
return poll.uuid
|
|
end
|
|
|
|
local function draw_poll(frame)
|
|
frame.clear()
|
|
local index = tonumber(frame.parent.current_index.caption)
|
|
local poll = _polls().old[index]
|
|
if not poll then
|
|
frame.add{
|
|
type='label',
|
|
caption={'polls.no-poll'}
|
|
}
|
|
return
|
|
end
|
|
frame.add{
|
|
type='label',
|
|
caption='Question: '..poll.question
|
|
}
|
|
for answer,votes in pairs(poll.votes) do
|
|
frame.add{
|
|
type='label',
|
|
caption=answer..') '..votes
|
|
}
|
|
end
|
|
end
|
|
|
|
local function _opptions(player,root_frame)
|
|
local opptions = {'Please Select An Opption'}
|
|
local uuid = root_frame.name
|
|
local poll = _polls().active[uuid]
|
|
if not poll then return {'Invalid Poll'} end
|
|
for _,answer in pairs(poll.answers) do
|
|
table.insert(opptions,answer)
|
|
end
|
|
return opptions
|
|
end
|
|
|
|
local opption_drop_down = Gui.inputs.add_drop_down('opption-drop-down-polls',_opptions,1,function(player,selected,items,element)
|
|
local uuid = element.parent.name
|
|
local poll = _polls().active[uuid]
|
|
if not poll then return end
|
|
if poll.voted[player.index] and poll.voted[player.index] > 1 then
|
|
local old_vote = poll.voted[player.index]
|
|
poll.votes[old_vote-1] = poll.votes[old_vote-1] and poll.votes[old_vote-1]-1 or 0
|
|
end
|
|
if element.selected_index > 1 then
|
|
poll.votes[element.selected_index-1] = poll.votes[element.selected_index-1] and poll.votes[element.selected_index-1]+1 or 1
|
|
end
|
|
poll.voted[player.index]=element.selected_index
|
|
element.parent.answer.caption = 'Your Answer: '..selected
|
|
end)
|
|
|
|
local prev = Gui.inputs.add{
|
|
type='button',
|
|
name='prev-poll',
|
|
caption='utility/hint_arrow_left'
|
|
}:on_event('click',function(event)
|
|
local parent = event.element.parent
|
|
local index = parent.parent.current_index.caption
|
|
local _index = tonumber(index)-1
|
|
if _index < 1 then _index = #_polls().old end
|
|
parent.parent.current_index.caption = _index
|
|
parent.parent.title.title.caption = 'Viewing Poll: '.._index
|
|
draw_poll(parent.parent.poll_area)
|
|
end)
|
|
|
|
local next = Gui.inputs.add{
|
|
type='button',
|
|
name='next-poll',
|
|
caption='utility/hint_arrow_right'
|
|
}:on_event('click',function(event)
|
|
local parent = event.element.parent
|
|
local index = parent.parent.current_index.caption
|
|
local _index = tonumber(index)+1
|
|
if _index > #_polls().old then _index = 1 end
|
|
parent.parent.current_index.caption = _index
|
|
parent.parent.title.title.caption = 'Viewing Poll: '.._index
|
|
draw_poll(parent.parent.poll_area)
|
|
end)
|
|
|
|
local poll_question_input = Gui.inputs.add_text('poll-question-input',true,'Question',function(player,text,element)
|
|
local options = element.parent.options
|
|
if not options.question then options.add{type='label',name='question',caption=''}
|
|
else options.question.caption = text end
|
|
end)
|
|
|
|
local _self_referace_poll_option_input = nil
|
|
local poll_option_input = Gui.inputs.add_text('poll-option-input',true,'Enter Option',function(player,text,element)
|
|
local options = element.parent.parent.parent.options
|
|
if not options[element.parent.name] then options.add{type='label',name=element.parent.name,caption=text}
|
|
else options[element.parent.name].caption = text end
|
|
if options.last.caption == element.parent.name then
|
|
options.last.caption = tonumber(options.last.caption)+1
|
|
_self_referace_poll_option_input:draw(element.parent.parent.add{type='flow',name=options.last.caption}).style.minimal_width = 200
|
|
end
|
|
end)
|
|
_self_referace_poll_option_input = poll_option_input
|
|
|
|
local function poll_assembler(frame)
|
|
frame.clear()
|
|
local options = frame.add{type='flow',name='options'}
|
|
options.style.visible = false
|
|
options.add{type='label',name='last',caption='2'}
|
|
poll_question_input:draw(frame).style.minimal_width = 200
|
|
local flow = frame.add{type='flow',direction='vertical'}
|
|
poll_option_input:draw(flow.add{type='flow',name='1'}).style.minimal_width = 200
|
|
poll_option_input:draw(flow.add{type='flow',name='2'}).style.minimal_width = 200
|
|
end
|
|
|
|
local create_poll = Gui.inputs.add{
|
|
type='button',
|
|
name='create-poll',
|
|
caption='utility/add'
|
|
}:on_event('click',function(event)
|
|
local parent = event.element.parent
|
|
if event.element.sprite == 'utility/enter' then
|
|
local inputs = parent.parent.poll_area.options
|
|
if not inputs then
|
|
event.element.sprite = 'utility/add'
|
|
draw_poll(parent.parent.poll_area)
|
|
return
|
|
end
|
|
local options = {}
|
|
for _,option in pairs(inputs.children) do
|
|
if option.name ~= 'question' and option.name ~= 'last' then
|
|
if option.caption ~= 'Enter Option' and option.caption ~= '' then table.insert(options,option.caption) end
|
|
end
|
|
end
|
|
if not inputs.question or #options == 0 then
|
|
event.element.sprite = 'utility/add'
|
|
draw_poll(parent.parent.poll_area)
|
|
return
|
|
end
|
|
local uuid = _poll_data(inputs.question.caption,options)
|
|
Gui.popup.open('polls',{uuid=uuid})
|
|
event.element.sprite = 'utility/add'
|
|
draw_poll(parent.parent.poll_area)
|
|
else
|
|
event.element.sprite = 'utility/enter'
|
|
poll_assembler(parent.parent.poll_area)
|
|
end
|
|
end)
|
|
|
|
Gui.popup.add{
|
|
name='polls',
|
|
caption={'polls.name'},
|
|
draw=function(frame,data)
|
|
frame.style.right_padding = 5
|
|
frame.style.bottom_padding = 5
|
|
local uuid = data.uuid
|
|
local poll = _polls().active[uuid]
|
|
if not poll then return end
|
|
local flow = frame.add{
|
|
type='flow',
|
|
name=uuid,
|
|
direction='vertical'
|
|
}
|
|
flow.add{type='label',caption={'polls.time-left',poll_time_out}}
|
|
flow.add{type='label',caption='Question: '..poll.question}
|
|
flow.add{type='label',name='answer',caption='Your Answer: None'}
|
|
opption_drop_down:draw(flow)
|
|
end
|
|
}:add_left{
|
|
caption='utility/item_editor_icon',
|
|
tooltip={'polls.tooltip'},
|
|
draw=function(frame)
|
|
frame.caption={'polls.name'}
|
|
frame.add{
|
|
type='label',
|
|
name='current_index',
|
|
caption=1
|
|
}.style.visible = false
|
|
local title = frame.add{
|
|
type='flow',
|
|
name='title'
|
|
}
|
|
local btn = prev:draw(title)
|
|
btn.style.width = 20
|
|
btn.style.height = 20
|
|
title.add{
|
|
type='label',
|
|
name='title',
|
|
caption='Viewing Poll: 1',
|
|
style='caption_label'
|
|
}
|
|
local btn = next:draw(title)
|
|
btn.style.width = 20
|
|
btn.style.height = 20
|
|
if Role.get_highest(frame.player_index):allowed('create-poll') then
|
|
local btn = create_poll:draw(title)
|
|
btn.style.width = 20
|
|
btn.style.height = 20
|
|
end
|
|
local flow = frame.add{
|
|
type='flow',
|
|
name='poll_area',
|
|
direction='vertical'
|
|
}
|
|
draw_poll(flow)
|
|
end,
|
|
can_open=function(player)
|
|
if #_polls().old > 0 then return true
|
|
elseif Role.allowed(player,'create-poll') then return true
|
|
else return {'polls.no-poll'} end
|
|
end
|
|
}
|