1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2025-12-28 00:44:48 +02:00
Files
RedMew/features/gui/admin_panel/lua_console.lua

118 lines
4.2 KiB
Lua
Raw Permalink Normal View History

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 ''
local info = canvas.add { type = 'frame', style = 'deep_frame_in_shallow_frame', direction = 'vertical' }
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' }
Gui.set_style(confirm, { left_margin = -9 })
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)