2024-09-02 22:32:20 +02:00
|
|
|
local Gui = require 'utils.gui'
|
|
|
|
|
local Global = require 'utils.global'
|
|
|
|
|
local AdminPanel = require 'features.gui.admin_panel.core'
|
|
|
|
|
|
|
|
|
|
local main_button_name = Gui.uid_name()
|
|
|
|
|
local clear_button_name = Gui.uid_name()
|
|
|
|
|
local dry_run_button_name = Gui.uid_name()
|
|
|
|
|
local confirm_button_name = Gui.uid_name()
|
|
|
|
|
|
|
|
|
|
local this = {
|
|
|
|
|
last_lua_input = {},
|
|
|
|
|
last_lua_output = {},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Global.register(this, function(tbl) this = tbl end)
|
|
|
|
|
|
|
|
|
|
local pages = AdminPanel.get_pages()
|
|
|
|
|
pages[#pages +1] = {
|
|
|
|
|
type = 'sprite-button',
|
|
|
|
|
sprite = 'utility/scripting_editor_icon',
|
|
|
|
|
tooltip = '[font=default-bold]Lua console[/font]',
|
|
|
|
|
name = main_button_name,
|
|
|
|
|
auto_toggle = true,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
local function draw_gui(player)
|
|
|
|
|
local canvas = AdminPanel.get_canvas(player)
|
|
|
|
|
Gui.clear(canvas)
|
|
|
|
|
|
|
|
|
|
this.last_lua_input[player.index] = this.last_lua_input[player.index] or ''
|
|
|
|
|
this.last_lua_output[player.index] = this.last_lua_output[player.index] or ''
|
|
|
|
|
|
2024-10-22 21:22:35 +02:00
|
|
|
local info = canvas.add { type = 'frame', style = 'deep_frame_in_shallow_frame', direction = 'vertical' }
|
2024-09-02 22:32:20 +02:00
|
|
|
Gui.set_style(info, { padding = 12, horizontally_stretchable = true })
|
|
|
|
|
info.add { type = 'label', caption = '[font=default-bold][color=green]Input:[/color][/font]' }
|
|
|
|
|
info.add { type = 'label', caption = ' - no need to append `/c` at the beginning of the code' }
|
|
|
|
|
info.add { type = 'label', caption = ' - can accept pure strings instead of commands' }
|
|
|
|
|
info.add { type = 'label', caption = '[font=default-bold][color=red]Output:[/color][/font]' }
|
|
|
|
|
info.add { type = 'label', caption = ' - errors of the code will be displayed here, if any' }
|
|
|
|
|
|
|
|
|
|
local input = canvas
|
|
|
|
|
.add { type = 'frame', style = 'bordered_frame', direction = 'vertical', caption = 'Input' }
|
|
|
|
|
.add { type = 'text-box', name = 'input' }
|
|
|
|
|
input.word_wrap = true
|
|
|
|
|
input.text = this.last_lua_input[player.index]
|
|
|
|
|
Gui.set_style(input, { minimal_height = 240, minimal_width = 460, maximal_height = 800 })
|
|
|
|
|
|
|
|
|
|
local output = canvas
|
|
|
|
|
.add { type = 'frame', style = 'bordered_frame', direction = 'vertical', caption = 'Output' }
|
|
|
|
|
.add { type = 'text-box', name = 'output' }
|
|
|
|
|
output.word_wrap = true
|
|
|
|
|
output.text = this.last_lua_output[player.index]
|
|
|
|
|
Gui.set_style(output, { minimal_height = 60, minimal_width = 460, maximal_height = 120 })
|
|
|
|
|
|
|
|
|
|
local button_flow = canvas.add { type = 'flow', direction = 'horizontal' }
|
|
|
|
|
Gui.add_pusher(button_flow)
|
|
|
|
|
button_flow.add { type = 'button', name = clear_button_name, style = 'red_back_button', caption = 'Clear' }
|
|
|
|
|
local dry_run = button_flow.add { type = 'button', name = dry_run_button_name, style = 'forward_button', caption = 'Dry run' }
|
|
|
|
|
local confirm = button_flow.add { type = 'button', name = confirm_button_name, style = 'confirm_double_arrow_button', caption = 'Confirm', tooltip = 'Run input code' }
|
2024-09-13 18:05:47 +02:00
|
|
|
Gui.set_style(confirm, { left_margin = -9 })
|
2024-09-02 22:32:20 +02:00
|
|
|
|
|
|
|
|
Gui.set_data(dry_run, { input = input, output = output })
|
|
|
|
|
Gui.set_data(confirm, { input = input, output = output })
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function process_command(event)
|
|
|
|
|
local player = event.player
|
|
|
|
|
local data = Gui.get_data(event.element)
|
|
|
|
|
local input, output = data.input, data.output
|
|
|
|
|
|
|
|
|
|
local cmd = input.text
|
|
|
|
|
this.last_lua_input[player.index] = cmd
|
|
|
|
|
rawset(game, 'player', player)
|
|
|
|
|
|
|
|
|
|
local f, err, _
|
|
|
|
|
f, err = loadstring(cmd)
|
|
|
|
|
if not f then
|
|
|
|
|
cmd = 'game.players[' .. player.index .. '].print(' .. cmd .. ')'
|
|
|
|
|
f, err = loadstring(cmd)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if event.element.name ~= dry_run_button_name then
|
|
|
|
|
_, err = pcall(f)
|
|
|
|
|
end
|
|
|
|
|
rawset(game, 'player', nil)
|
|
|
|
|
|
|
|
|
|
if err then
|
|
|
|
|
local text = ''
|
|
|
|
|
text = text .. cmd .. '\n'
|
|
|
|
|
text = text .. '----------------------------------------------------------------------\n'
|
|
|
|
|
text = text .. err:sub(1, err:find('\n'))
|
|
|
|
|
output.text = text
|
|
|
|
|
this.last_lua_output[player.index] = text
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
Gui.on_click(main_button_name, function(event)
|
|
|
|
|
local player = event.player
|
|
|
|
|
local element = event.element
|
|
|
|
|
if element.toggled then
|
|
|
|
|
AdminPanel.close_all_pages(player)
|
|
|
|
|
event.element.toggled = true
|
|
|
|
|
draw_gui(player)
|
|
|
|
|
else
|
|
|
|
|
Gui.clear(AdminPanel.get_canvas(player))
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
Gui.on_click(dry_run_button_name, process_command)
|
|
|
|
|
Gui.on_click(confirm_button_name, process_command)
|
|
|
|
|
|
|
|
|
|
Gui.on_click(clear_button_name, function(event)
|
|
|
|
|
local player = event.player
|
|
|
|
|
this.last_lua_input[player.index] = ''
|
|
|
|
|
this.last_lua_output[player.index] = ''
|
|
|
|
|
draw_gui(player)
|
|
|
|
|
end)
|