]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - builtin/mainmenu/dlg_register.lua
Add register dialog to separate login/register (#12185)
[dragonfireclient.git] / builtin / mainmenu / dlg_register.lua
diff --git a/builtin/mainmenu/dlg_register.lua b/builtin/mainmenu/dlg_register.lua
new file mode 100644 (file)
index 0000000..a765824
--- /dev/null
@@ -0,0 +1,123 @@
+--Minetest
+--Copyright (C) 2022 rubenwardy
+--
+--This program is free software; you can redistribute it and/or modify
+--it under the terms of the GNU Lesser General Public License as published by
+--the Free Software Foundation; either version 2.1 of the License, or
+--(at your option) any later version.
+--
+--This program is distributed in the hope that it will be useful,
+--but WITHOUT ANY WARRANTY; without even the implied warranty of
+--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--GNU Lesser General Public License for more details.
+--
+--You should have received a copy of the GNU Lesser General Public License along
+--with this program; if not, write to the Free Software Foundation, Inc.,
+--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+--------------------------------------------------------------------------------
+
+local function register_formspec(dialogdata)
+       local title = fgettext("Joining $1", dialogdata.server and dialogdata.server.name or dialogdata.address)
+       local buttons_y = 4 + 1.3
+       if dialogdata.error then
+               buttons_y = buttons_y + 0.8
+       end
+
+       local retval = {
+               "formspec_version[4]",
+               "size[8,", tostring(buttons_y + 1.175), "]",
+               "set_focus[", (dialogdata.name ~= "" and "password" or "name"), "]",
+               "label[0.375,0.8;", title, "]",
+               "field[0.375,1.575;7.25,0.8;name;", core.formspec_escape(fgettext("Name")), ";",
+                               core.formspec_escape(dialogdata.name), "]",
+               "pwdfield[0.375,2.875;7.25,0.8;password;", core.formspec_escape(fgettext("Password")), "]",
+               "pwdfield[0.375,4.175;7.25,0.8;password_2;", core.formspec_escape(fgettext("Confirm Password")), "]"
+       }
+
+       if dialogdata.error then
+               table.insert_all(retval, {
+                       "box[0.375,", tostring(buttons_y - 0.9), ";7.25,0.6;darkred]",
+                       "label[0.625,", tostring(buttons_y - 0.6), ";", core.formspec_escape(dialogdata.error), "]",
+               })
+       end
+
+       table.insert_all(retval, {
+               "container[0.375,", tostring(buttons_y), "]",
+               "button[0,0;2.5,0.8;dlg_register_confirm;", fgettext("Register"), "]",
+               "button[4.75,0;2.5,0.8;dlg_register_cancel;", fgettext("Cancel"), "]",
+               "container_end[]",
+       })
+
+       return table.concat(retval, "")
+end
+
+--------------------------------------------------------------------------------
+local function register_buttonhandler(this, fields)
+       this.data.name = fields.name
+       this.data.error = nil
+
+       if fields.dlg_register_confirm or fields.key_enter then
+               if fields.name == "" then
+                       this.data.error = fgettext("Missing name")
+                       return true
+               end
+               if fields.password ~= fields.password_2 then
+                       this.data.error = fgettext("Passwords do not match")
+                       return true
+               end
+
+               gamedata.playername = fields.name
+               gamedata.password   = fields.password
+               gamedata.address    = this.data.address
+               gamedata.port       = this.data.port
+               gamedata.allow_login_or_register = "register"
+               gamedata.selected_world = 0
+
+               assert(gamedata.address and gamedata.port)
+
+               local server = this.data.server
+               if server then
+                       serverlistmgr.add_favorite(server)
+                       gamedata.servername        = server.name
+                       gamedata.serverdescription = server.description
+               else
+                       gamedata.servername        = ""
+                       gamedata.serverdescription = ""
+
+                       serverlistmgr.add_favorite({
+                               address = gamedata.address,
+                               port = gamedata.port,
+                       })
+               end
+
+               core.settings:set("name", fields.name)
+               core.settings:set("address",     gamedata.address)
+               core.settings:set("remote_port", gamedata.port)
+
+               core.start()
+       end
+
+       if fields["dlg_register_cancel"] then
+               this:delete()
+               return true
+       end
+
+       return false
+end
+
+--------------------------------------------------------------------------------
+function create_register_dialog(address, port, server)
+       assert(address)
+       assert(type(port) == "number")
+
+       local retval = dialog_create("dlg_register",
+                       register_formspec,
+                       register_buttonhandler,
+                       nil)
+       retval.data.address = address
+       retval.data.port = port
+       retval.data.server = server
+       retval.data.name = core.settings:get("name") or ""
+       return retval
+end