mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-12 07:04:52 +09:00
211 lines
5.1 KiB
Lua
211 lines
5.1 KiB
Lua
local clusterio_api = require("modules/clusterio/api")
|
|
local auth = {}
|
|
|
|
local function open_dialog(player, url, code)
|
|
if player.gui.screen.player_auth_dialog then
|
|
player.gui.screen.player_auth_dialog.destroy()
|
|
end
|
|
|
|
local frame = player.gui.screen.add {
|
|
name = "player_auth_dialog",
|
|
type = "frame",
|
|
direction = "vertical",
|
|
}
|
|
|
|
local titlebar = frame.add {
|
|
type = "flow",
|
|
}
|
|
titlebar.drag_target = frame
|
|
|
|
local title = titlebar.add {
|
|
type = "label",
|
|
style = "frame_title",
|
|
caption = "Web Interface Login",
|
|
}
|
|
title.drag_target = frame
|
|
|
|
local filler = titlebar.add {
|
|
type = "empty-widget",
|
|
style = "draggable_space_header",
|
|
}
|
|
filler.style.horizontally_stretchable = "on"
|
|
filler.style.right_margin = 4
|
|
filler.style.height = 24
|
|
filler.drag_target = frame
|
|
|
|
titlebar.add {
|
|
name = "player_auth_dialog_close_button",
|
|
type = "sprite-button",
|
|
sprite = "utility/close_white",
|
|
hovered_sprite = "utility/close_black",
|
|
clicked_sprite = "utility/close_black",
|
|
style = "frame_action_button",
|
|
}
|
|
|
|
local content = frame.add {
|
|
name = "player_auth_dialog_content",
|
|
type = "frame",
|
|
direction = "vertical",
|
|
style = "inside_shallow_frame_with_padding",
|
|
}
|
|
content.style.width = 300
|
|
|
|
local p1 = content.add {
|
|
type = "label",
|
|
caption = "Login to the web interface is a 3 step process:",
|
|
}
|
|
p1.style.single_line = false
|
|
p1.style.bottom_margin = 8
|
|
|
|
local p2 = content.add {
|
|
type = "label",
|
|
caption = "1. Open the web interface in a browser, the url to it is shown below:",
|
|
}
|
|
p2.style.single_line = false
|
|
p2.style.bottom_margin = 8
|
|
|
|
local url_textfield = content.add {
|
|
type = "textfield",
|
|
text = url,
|
|
}
|
|
url_textfield.style.bottom_margin = 8
|
|
url_textfield.style.width = 300 - 24
|
|
|
|
local p3 = content.add {
|
|
type = "label",
|
|
caption = "2. Enter the following code into step 2 of the Factorio login:",
|
|
}
|
|
p3.style.single_line = false
|
|
p3.style.bottom_margin = 8
|
|
|
|
local player_code_textfield = content.add {
|
|
type = "textfield",
|
|
text = code,
|
|
}
|
|
player_code_textfield.style.bottom_margin = 8
|
|
player_code_textfield.style.width = 180
|
|
|
|
local p4 = content.add {
|
|
type = "label",
|
|
caption = "3. Enter the code in step 3 of the Factorio login here:"
|
|
}
|
|
p4.style.single_line = false
|
|
p4.style.bottom_margin = 8
|
|
|
|
local verify_code_row = content.add {
|
|
type = "flow",
|
|
}
|
|
local verify_code_input = verify_code_row.add {
|
|
name = "player_auth_verify_code_input",
|
|
type = "textfield",
|
|
}
|
|
verify_code_input.style.bottom_margin = 8
|
|
verify_code_input.style.width = 180
|
|
local verify_code_button = verify_code_row.add {
|
|
name = "player_auth_verify_code_button",
|
|
type = "button",
|
|
style = "green_button",
|
|
sprite = "utility/check_mark",
|
|
caption = "Log in",
|
|
}
|
|
verify_code_button.style.minimal_width = 80
|
|
|
|
frame.force_auto_center()
|
|
player.opened = frame
|
|
end
|
|
|
|
function auth.add_commands()
|
|
commands.add_command("web-login", "Login to the web interface", function(event)
|
|
if event.player_index then
|
|
local player = game.players[event.player_index]
|
|
clusterio_api.send_json("player_auth", {
|
|
type = "open_dialog",
|
|
player = player.name,
|
|
})
|
|
return
|
|
end
|
|
|
|
if event.parameter then
|
|
local args = {}
|
|
for w in string.gmatch(event.parameter, "[^ ]+") do
|
|
args[#args + 1] = w
|
|
end
|
|
if #args < 1 then
|
|
rcon.print("Incorrect number of parameters")
|
|
return
|
|
end
|
|
|
|
local command = table.remove(args, 1)
|
|
if command == "open" then
|
|
if #args ~= 3 then
|
|
rcon.print("Incorrect number of parameters")
|
|
return
|
|
end
|
|
|
|
local player_name, url, code = table.unpack(args)
|
|
local player = game.players[player_name]
|
|
if not player then
|
|
rcon.print("Player " .. player_name .. " does not exist")
|
|
return
|
|
end
|
|
|
|
open_dialog(player, url, code)
|
|
|
|
elseif command == "code_set" then
|
|
local player_name = args[1]
|
|
local player = game.players[player_name]
|
|
if not player then
|
|
rcon.print("Player " .. player_name .. " does not exist")
|
|
return
|
|
end
|
|
|
|
if player.gui.screen.player_auth_dialog then
|
|
player.gui.screen.player_auth_dialog.destroy()
|
|
end
|
|
|
|
elseif command == "error" then
|
|
local player_name = table.remove(args, 1)
|
|
local player = game.players[player_name]
|
|
if not player then
|
|
rcon.print("Player " .. player_name .. " does not exist")
|
|
return
|
|
end
|
|
|
|
player.print("Error: " .. table.concat(args, " "))
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
auth.events = {}
|
|
auth.events[defines.events.on_gui_click] = function(event)
|
|
if not event.element or not event.element.valid then
|
|
return
|
|
end
|
|
|
|
if event.element.name == "player_auth_dialog_close_button" then
|
|
event.element.parent.parent.destroy()
|
|
|
|
elseif event.element.name == "player_auth_verify_code_button" then
|
|
local verify_code = event.element.parent.player_auth_verify_code_input.text
|
|
local player_name = game.players[event.player_index].name
|
|
clusterio_api.send_json("player_auth", {
|
|
type = "set_verify_code",
|
|
player = player_name,
|
|
verify_code = verify_code,
|
|
})
|
|
end
|
|
end
|
|
|
|
auth.events[defines.events.on_gui_closed] = function(event)
|
|
if
|
|
event.element
|
|
and event.element.valid
|
|
and event.element.name == "player_auth_dialog"
|
|
then
|
|
event.element.destroy()
|
|
end
|
|
end
|
|
|
|
return auth
|