From 5a3e3575c3a29756cd324021c9d86af6032db4bb Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Sun, 3 May 2015 21:58:24 +0200 Subject: [PATCH] Added GuiRegister to allow users to create a new account on ReplayMod.com from the Mod itself --- .../replaymod/api/client/ApiClient.java | 9 + .../replaymod/api/client/ApiMethods.java | 1 + .../replaymod/gui/GuiConstants.java | 10 + .../replaymod/gui/GuiKeyframeRepository.java | 7 + .../replaymod/gui/online/GuiLoginPrompt.java | 75 +++++-- .../replaymod/gui/online/GuiRegister.java | 202 ++++++++++++++++++ .../gui/replayviewer/GuiReplayViewer.java | 10 +- .../authentication/AuthenticationHandler.java | 7 + .../registry/UploadedFileHandler.java | 3 +- .../replaymod/utils/EmailAddressUtils.java | 17 ++ .../assets/replaymod/lang/en_US.lang | 13 ++ 11 files changed, 327 insertions(+), 27 deletions(-) create mode 100644 src/main/java/eu/crushedpixel/replaymod/gui/online/GuiRegister.java create mode 100644 src/main/java/eu/crushedpixel/replaymod/utils/EmailAddressUtils.java diff --git a/src/main/java/eu/crushedpixel/replaymod/api/client/ApiClient.java b/src/main/java/eu/crushedpixel/replaymod/api/client/ApiClient.java index bbbbb06e..6a462411 100755 --- a/src/main/java/eu/crushedpixel/replaymod/api/client/ApiClient.java +++ b/src/main/java/eu/crushedpixel/replaymod/api/client/ApiClient.java @@ -29,6 +29,15 @@ public class ApiClient { return auth; } + public AuthKey register(String username, String mail, String password) throws IOException, ApiException { + QueryBuilder builder = new QueryBuilder(ApiMethods.register); + builder.put("username", username); + builder.put("email", mail); + builder.put("password", password); + AuthKey auth = invokeAndReturn(builder, AuthKey.class); + return auth; + } + public boolean logout(String auth) throws IOException, ApiException { QueryBuilder builder = new QueryBuilder(ApiMethods.logout); builder.put("auth", auth); diff --git a/src/main/java/eu/crushedpixel/replaymod/api/client/ApiMethods.java b/src/main/java/eu/crushedpixel/replaymod/api/client/ApiMethods.java index 0499c0f9..b22bd7c1 100755 --- a/src/main/java/eu/crushedpixel/replaymod/api/client/ApiMethods.java +++ b/src/main/java/eu/crushedpixel/replaymod/api/client/ApiMethods.java @@ -2,6 +2,7 @@ package eu.crushedpixel.replaymod.api.client; public class ApiMethods { + public static final String register = "register"; public static final String login = "login"; public static final String logout = "logout"; public static final String replay_files = "replay_files"; diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/GuiConstants.java b/src/main/java/eu/crushedpixel/replaymod/gui/GuiConstants.java index a29aec8a..a5486672 100755 --- a/src/main/java/eu/crushedpixel/replaymod/gui/GuiConstants.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/GuiConstants.java @@ -31,6 +31,16 @@ public class GuiConstants { public static final int LOGIN_OKAY_BUTTON = 1100; public static final int LOGIN_CANCEL_BUTTON = 1101; + public static final int LOGIN_REGISTER_BUTTON = 1102; + public static final int LOGIN_USERNAME_FIELD = 1103; + public static final int LOGIN_PASSWORD_FIELD = 1104; + + public static final int REGISTER_USERNAME_FIELD = 2000; + public static final int REGISTER_PASSWORD_FIELD = 2001; + public static final int REGISTER_PASSWORD_CONFIRM_FIELD = 2002; + public static final int REGISTER_CANCEL_BUTTON = 2003; + public static final int REGISTER_OKAY_BUTTON = 2004; + public static final int REGISTER_MAIL_FIELD = 2005; public static final int REPLAY_EDITOR_TRIM_TAB = 5000; public static final int REPLAY_EDITOR_CONNECT_TAB = 5001; diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/GuiKeyframeRepository.java b/src/main/java/eu/crushedpixel/replaymod/gui/GuiKeyframeRepository.java index 41963ee3..a634fb89 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/GuiKeyframeRepository.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/GuiKeyframeRepository.java @@ -47,6 +47,8 @@ public class GuiKeyframeRepository extends GuiScreen { @Override public void initGui() { + Keyboard.enableRepeatEvents(true); + int h = (int)Math.floor(((double)this.height-(45+20+15))/14); if(!initialized) { @@ -226,4 +228,9 @@ public class GuiKeyframeRepository extends GuiScreen { ReplayHandler.setKeyframeRepository(keyframeRepository, true); ReplayMod.replaySender.setReplaySpeed(prevSpeed); } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } } \ No newline at end of file diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/online/GuiLoginPrompt.java b/src/main/java/eu/crushedpixel/replaymod/gui/online/GuiLoginPrompt.java index 723baff9..a61bc4af 100755 --- a/src/main/java/eu/crushedpixel/replaymod/gui/online/GuiLoginPrompt.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/online/GuiLoginPrompt.java @@ -26,6 +26,16 @@ public class GuiLoginPrompt extends GuiScreen { private PasswordTextField password; private GuiButton loginButton; private GuiButton cancelButton; + private GuiButton registerButton; + + private String noacc; + private int strwidth; + + private boolean initialized = false; + + public GuiScreen getSuccessScreen() { + return successScreen; + } public GuiLoginPrompt(GuiScreen parent, GuiScreen successScreen) { this.parent = parent; @@ -36,22 +46,44 @@ public class GuiLoginPrompt extends GuiScreen { public void initGui() { Keyboard.enableRepeatEvents(true); - username = new GuiTextField(GuiConstants.REPLAY_CENTER_LOGIN_TEXT_ID, fontRendererObj, this.width / 2 - 45, 30, 145, 20); - username.setEnabled(true); - username.setFocused(true); + if(!initialized) { + username = new GuiTextField(GuiConstants.LOGIN_USERNAME_FIELD, fontRendererObj, this.width / 2 - 45, 30, 145, 20); + username.setEnabled(true); + username.setFocused(true); - password = new PasswordTextField(GuiConstants.REPLAY_CENTER_PASSWORD_TEXT_ID, fontRendererObj, this.width / 2 - 45, 60, 145, 20); - password.setEnabled(true); - password.setFocused(false); + password = new PasswordTextField(GuiConstants.LOGIN_PASSWORD_FIELD, fontRendererObj, this.width / 2 - 45, 60, 145, 20); + password.setEnabled(true); + password.setFocused(false); + + loginButton = new GuiButton(GuiConstants.LOGIN_OKAY_BUTTON, this.width / 2 - 150 - 2, 110, I18n.format("replaymod.gui.login")); + loginButton.enabled = false; + loginButton.width = 150; + + cancelButton = new GuiButton(GuiConstants.LOGIN_CANCEL_BUTTON, this.width / 2 + 2, 110, I18n.format("replaymod.gui.cancel")); + cancelButton.width = 150; + + registerButton = new GuiButton(GuiConstants.LOGIN_REGISTER_BUTTON, 0, this.height-30, I18n.format("replaymod.gui.register")); + registerButton.width = 150; + } else { + username.xPosition = password.xPosition = this.width / 2 - 45; + loginButton.xPosition = this.width / 2 - 150 - 2; + cancelButton.xPosition = this.width / 2 + 2; + registerButton.yPosition = this.height-30; + } + + noacc = I18n.format("replaymod.gui.login.noacc"); + strwidth = fontRendererObj.getStringWidth(noacc); + + int tw = 150+5+strwidth; + registerButton.xPosition = (width/2) - (tw/2) + strwidth+5; - loginButton = new GuiButton(GuiConstants.LOGIN_OKAY_BUTTON, this.width / 2 - 150 - 2, 110, I18n.format("replaymod.gui.login")); - loginButton.width = 150; - loginButton.enabled = false; buttonList.add(loginButton); - - cancelButton = new GuiButton(GuiConstants.LOGIN_CANCEL_BUTTON, this.width / 2 + 2, 110, I18n.format("replaymod.gui.cancel")); - cancelButton.width = 150; buttonList.add(cancelButton); + buttonList.add(registerButton); + + strwidth2 = Math.max(fontRendererObj.getStringWidth(usernameLabel), fontRendererObj.getStringWidth(passwordLabel)); + + initialized = true; } @Override @@ -86,18 +118,24 @@ public class GuiLoginPrompt extends GuiScreen { } } else if(button.id == GuiConstants.LOGIN_CANCEL_BUTTON) { mc.displayGuiScreen(parent); + } else if(button.id == GuiConstants.LOGIN_REGISTER_BUTTON) { + mc.displayGuiScreen(new GuiRegister(this)); } } + private String usernameLabel = I18n.format("replaymod.gui.username"); + private String passwordLabel = I18n.format("replaymod.gui.password"); + private int strwidth2 = 100; + @Override public void drawScreen(int mouseX, int mouseY, float partialTicks) { this.drawDefaultBackground(); drawCenteredString(fontRendererObj, I18n.format("replaymod.gui.login.title"), this.width / 2, 10, Color.WHITE.getRGB()); - drawString(fontRendererObj, I18n.format("replaymod.gui.username"), this.width / 2 - 100, 37, Color.WHITE.getRGB()); + drawString(fontRendererObj, usernameLabel, this.width / 2 - (45+10+strwidth2), 37, Color.WHITE.getRGB()); username.drawTextBox(); - drawString(fontRendererObj, I18n.format("replaymod.gui.password"), this.width / 2 - 100, 67, Color.WHITE.getRGB()); + drawString(fontRendererObj, passwordLabel, this.width / 2 - (45+10+strwidth2), 67, Color.WHITE.getRGB()); password.drawTextBox(); switch(textState) { @@ -111,6 +149,10 @@ public class GuiLoginPrompt extends GuiScreen { drawCenteredString(fontRendererObj, I18n.format("replaymod.gui.login.connectionerror"), this.width / 2, 92, Color.RED.getRGB()); break; } + + int tw = 150+5+strwidth; + drawString(fontRendererObj, noacc, this.width / 2 - (tw/2), this.height-22, Color.WHITE.getRGB()); + super.drawScreen(mouseX, mouseY, partialTicks); } @@ -143,8 +185,7 @@ public class GuiLoginPrompt extends GuiScreen { password.setFocused(true); } return; - } - if(keyCode == 28) { //Enter key + } else if(keyCode == Keyboard.KEY_RETURN) { actionPerformed(loginButton); return; } @@ -154,5 +195,7 @@ public class GuiLoginPrompt extends GuiScreen { password.textboxKeyTyped(typedChar, keyCode); } loginButton.enabled = username.getText().length() > 0 && password.getText().length() > 0; + + super.keyTyped(typedChar, keyCode); } } diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/online/GuiRegister.java b/src/main/java/eu/crushedpixel/replaymod/gui/online/GuiRegister.java new file mode 100644 index 00000000..4616c851 --- /dev/null +++ b/src/main/java/eu/crushedpixel/replaymod/gui/online/GuiRegister.java @@ -0,0 +1,202 @@ +package eu.crushedpixel.replaymod.gui.online; + +import eu.crushedpixel.replaymod.api.client.ApiException; +import eu.crushedpixel.replaymod.gui.GuiConstants; +import eu.crushedpixel.replaymod.gui.PasswordTextField; +import eu.crushedpixel.replaymod.online.authentication.AuthenticationHandler; +import eu.crushedpixel.replaymod.utils.EmailAddressUtils; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.client.resources.I18n; +import org.lwjgl.input.Keyboard; + +import java.awt.*; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class GuiRegister extends GuiScreen { + private String message = null; + + private GuiTextField usernameInput, mailInput; + private PasswordTextField passwordInput, passwordConfirmation; + private GuiButton registerButton, cancelButton; + + private boolean initialized = false; + + private int strwidth = 0; + + private String[] labels = new String[]{I18n.format("replaymod.gui.username"), I18n.format("replaymod.gui.mail"), I18n.format("replaymod.gui.password"), + I18n.format("replaymod.gui.register.confirmpw")}; + + private List inputFields; + + private GuiLoginPrompt parent = null; + + public GuiRegister(GuiLoginPrompt parent) { + this.parent = parent; + } + + @Override + public void initGui() { + Keyboard.enableRepeatEvents(true); + + if(!initialized) { + usernameInput = new GuiTextField(GuiConstants.REGISTER_USERNAME_FIELD, fontRendererObj, this.width / 2 - 45, 30, 145, 20); + mailInput = new GuiTextField(GuiConstants.REGISTER_MAIL_FIELD, fontRendererObj, this.width / 2 - 45, 60, 145, 20); + passwordInput = new PasswordTextField(GuiConstants.REGISTER_PASSWORD_FIELD, fontRendererObj, this.width / 2 - 45, 90, 145, 20); + passwordConfirmation = new PasswordTextField(GuiConstants.REGISTER_PASSWORD_CONFIRM_FIELD, fontRendererObj, this.width / 2 - 45, 120, 145, 20); + + registerButton = new GuiButton(GuiConstants.REGISTER_OKAY_BUTTON, this.width / 2 - 150 - 2, 170, I18n.format("replaymod.gui.register")); + registerButton.enabled = false; + registerButton.width = 150; + + cancelButton = new GuiButton(GuiConstants.REGISTER_CANCEL_BUTTON, this.width / 2 + 2, 170, I18n.format("replaymod.gui.cancel")); + cancelButton.width = 150; + } else { + usernameInput.xPosition = mailInput.xPosition = passwordInput.xPosition = passwordConfirmation.xPosition = this.width / 2 - 45; + + registerButton.xPosition = this.width / 2 - 150 - 2; + cancelButton.xPosition = this.width / 2 + 2; + } + + inputFields = new ArrayList(); + inputFields.add(usernameInput); + inputFields.add(mailInput); + inputFields.add(passwordInput); + inputFields.add(passwordConfirmation); + + buttonList.add(registerButton); + buttonList.add(cancelButton); + + strwidth = Math.max(Math.max(fontRendererObj.getStringWidth(labels[0]), fontRendererObj.getStringWidth(labels[1])), + Math.max(fontRendererObj.getStringWidth(labels[2]), fontRendererObj.getStringWidth(labels[3]))); + + initialized = true; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + this.drawDefaultBackground(); + + for(GuiTextField f : inputFields) { + f.drawTextBox(); + } + + int i = 0; + for(String label : labels) { + drawString(fontRendererObj, label, this.width / 2 - (45 + 10 + strwidth), 37+(i*30), Color.WHITE.getRGB()); + i++; + } + + if(message != null) { + drawCenteredString(fontRendererObj, message, this.width / 2, 152, Color.RED.getRGB()); + } + + super.drawScreen(mouseX, mouseY, partialTicks); + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { + super.mouseClicked(mouseX, mouseY, mouseButton); + for(GuiTextField f : inputFields) { + f.mouseClicked(mouseX, mouseY, mouseButton); + } + } + + @Override + public void updateScreen() { + for(GuiTextField f : inputFields) { + f.updateCursorCounter(); + } + } + + @Override + protected void keyTyped(char typedChar, int keyCode) throws IOException { + if(keyCode == Keyboard.KEY_TAB) { + int i = 0; + for(GuiTextField f : inputFields) { + if(f.isFocused()) { + i = inputFields.indexOf(f); + f.setFocused(false); + } + } + + if(i == inputFields.size()-1) { + i = 0; + } else { + i++; + } + + inputFields.get(i).setFocused(true); + } else if(keyCode == Keyboard.KEY_RETURN) { + actionPerformed(registerButton); + return; + } + + for(GuiTextField f : inputFields) { + if(f.isFocused()) f.textboxKeyTyped(typedChar, keyCode); + } + + registerButton.enabled = usernameInput.getText().length() >= 5 && EmailAddressUtils.isValidEmailAddress(mailInput.getText()) + && passwordInput.getText().length() >= 5 && passwordConfirmation.getText().equals(passwordInput.getText()); + + //only show message if user has filled out every text field + if(!registerButton.enabled && usernameInput.getText().length() > 0 && mailInput.getText().length() > 0 + && passwordInput.getText().length() > 0 && passwordConfirmation.getText().length() > 0) { + if(usernameInput.getText().length() < 5) { + message = I18n.format("replaymod.gui.register.error.shortusername"); + } else if(!EmailAddressUtils.isValidEmailAddress(mailInput.getText())) { + message = I18n.format("replaymod.gui.register.error.invalidmail"); + } else if(!(passwordInput.getText().length() >= 5)) { + message = I18n.format("replaymod.gui.register.error.shortpw"); + } else if(!passwordConfirmation.getText().equals(passwordInput.getText())) { + message = I18n.format("replaymod.gui.register.error.nomatch"); + } + } else { + message = null; + } + + super.keyTyped(typedChar, keyCode); + } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + } + + @Override + protected void actionPerformed(GuiButton button) { + if(!button.enabled) return; + switch(button.id) { + case GuiConstants.REGISTER_CANCEL_BUTTON: + mc.displayGuiScreen(parent); + break; + case GuiConstants.REGISTER_OKAY_BUTTON: + message = I18n.format("replaymod.gui.login.logging"); + + new Thread(new Runnable() { + @Override + public void run() { + try { + AuthenticationHandler.register(usernameInput.getText().trim(), + mailInput.getText().trim(), passwordInput.getText()); + + mc.addScheduledTask(new Runnable() { + @Override + public void run() { + mc.displayGuiScreen(parent.getSuccessScreen()); + } + }); + } catch(ApiException ae) { + message = ae.getLocalizedMessage(); + } catch(Exception e) { + message = I18n.format("replaymod.gui.login.connectionerror"); + } + } + }).start(); + break; + } + } +} diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/replayviewer/GuiReplayViewer.java b/src/main/java/eu/crushedpixel/replaymod/gui/replayviewer/GuiReplayViewer.java index 9e5f43a5..ce9518f5 100755 --- a/src/main/java/eu/crushedpixel/replaymod/gui/replayviewer/GuiReplayViewer.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/replayviewer/GuiReplayViewer.java @@ -44,16 +44,10 @@ public class GuiReplayViewer extends GuiScreen implements GuiYesNoCallback { private static final int SETTINGS_BUTTON_ID = 9006; private static final int CANCEL_BUTTON_ID = 9007; private static Gson gson = new Gson(); - private GuiScreen parentScreen; - private GuiButton btnEditServer; - private GuiButton btnSelectServer; - private GuiButton btnDeleteServer; - private String hoveringText; private boolean initialized; private GuiReplayListExtended replayGuiList; private List, File>> replayFileList = new ArrayList, File>>(); private GuiButton loadButton, uploadButton, folderButton, renameButton, deleteButton, cancelButton, settingsButton; - private boolean replaying = false; private boolean delete_file = false; public static GuiYesNo getYesNoGui(GuiYesNoCallback p_152129_0_, String file, int p_152129_2_) { @@ -72,7 +66,6 @@ public class GuiReplayViewer extends GuiScreen implements GuiYesNoCallback { for(File file : ReplayFileIO.getAllReplayFiles()) { try { ZipFile archive = new ZipFile(file); - ZipArchiveEntry recfile = archive.getEntry("recording" + ConnectionEventHandler.TEMP_FILE_EXTENSION); ZipArchiveEntry metadata = archive.getEntry("metaData" + ConnectionEventHandler.JSON_FILE_EXTENSION); ZipArchiveEntry image = archive.getEntry("thumb"); @@ -164,7 +157,6 @@ public class GuiReplayViewer extends GuiScreen implements GuiYesNoCallback { @Override public void drawScreen(int mouseX, int mouseY, float partialTicks) { - this.hoveringText = null; this.drawDefaultBackground(); this.replayGuiList.drawScreen(mouseX, mouseY, partialTicks); this.drawCenteredString(this.fontRendererObj, I18n.format("replaymod.gui.replayviewer"), this.width / 2, 20, 16777215); @@ -188,7 +180,7 @@ public class GuiReplayViewer extends GuiScreen implements GuiYesNoCallback { if(button.id == LOAD_BUTTON_ID) { loadReplay(replayGuiList.selected); } else if(button.id == CANCEL_BUTTON_ID) { - mc.displayGuiScreen(parentScreen); + mc.displayGuiScreen(null); } else if(button.id == DELETE_BUTTON_ID) { String s = replayGuiList.getListEntry(replayGuiList.selected).getFileInfo().getName(); diff --git a/src/main/java/eu/crushedpixel/replaymod/online/authentication/AuthenticationHandler.java b/src/main/java/eu/crushedpixel/replaymod/online/authentication/AuthenticationHandler.java index 39bfd6c5..7eb343df 100755 --- a/src/main/java/eu/crushedpixel/replaymod/online/authentication/AuthenticationHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/online/authentication/AuthenticationHandler.java @@ -3,6 +3,7 @@ package eu.crushedpixel.replaymod.online.authentication; import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.api.client.ApiClient; import eu.crushedpixel.replaymod.api.client.ApiException; +import eu.crushedpixel.replaymod.api.client.holders.AuthKey; import java.io.IOException; @@ -28,6 +29,12 @@ public class AuthenticationHandler { return apiClient.hasDonated(uuid); } + public static void register(String username, String mail, String password) throws IOException, ApiException { + AuthKey auth = apiClient.register(username, mail, password); + authkey = auth.getAuthkey(); + } + + public static int authenticate(String username, String password) { try { authkey = ReplayMod.apiClient.getLogin(username, password).getAuthkey(); diff --git a/src/main/java/eu/crushedpixel/replaymod/registry/UploadedFileHandler.java b/src/main/java/eu/crushedpixel/replaymod/registry/UploadedFileHandler.java index 5f63fe59..02c46863 100644 --- a/src/main/java/eu/crushedpixel/replaymod/registry/UploadedFileHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/registry/UploadedFileHandler.java @@ -1,7 +1,6 @@ package eu.crushedpixel.replaymod.registry; import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.common.config.Property; import org.apache.commons.io.FileUtils; import java.io.File; @@ -21,7 +20,7 @@ public class UploadedFileHandler { configuration = new Configuration(confFile); configuration.load(); - Property uploaded = configuration.get("uploaded", "hashes", new String[0]); + configuration.get("uploaded", "hashes", new String[0]); configuration.save(); } catch(Exception e) { diff --git a/src/main/java/eu/crushedpixel/replaymod/utils/EmailAddressUtils.java b/src/main/java/eu/crushedpixel/replaymod/utils/EmailAddressUtils.java new file mode 100644 index 00000000..8e4ebbc6 --- /dev/null +++ b/src/main/java/eu/crushedpixel/replaymod/utils/EmailAddressUtils.java @@ -0,0 +1,17 @@ +package eu.crushedpixel.replaymod.utils; + +import java.net.URLEncoder; + +public class EmailAddressUtils { + public static boolean isValidEmailAddress(String mail) { + try { + String[] spl1 = mail.split("@"); + String[] spl2 = spl1[1].split("\\."); + String suffix = spl2[1]; + + return spl1[0].equals(URLEncoder.encode(spl1[0], "UTF-8")) && spl1[1].equals(URLEncoder.encode(spl1[1], "UTF-8")); + } catch(Exception e) { + return false; + } + } +} diff --git a/src/main/resources/assets/replaymod/lang/en_US.lang b/src/main/resources/assets/replaymod/lang/en_US.lang index e073d5f5..abdfeb65 100644 --- a/src/main/resources/assets/replaymod/lang/en_US.lang +++ b/src/main/resources/assets/replaymod/lang/en_US.lang @@ -64,6 +64,8 @@ replaymod.gui.end=End replaymod.gui.delete=Delete replaymod.gui.recording=Recording replaymod.gui.speed=Speed +replaymod.gui.register=Register +replaymod.gui.mail=e-Mail Address replaymod.gui.unknownerror=An unknown error occured @@ -89,6 +91,15 @@ replaymod.gui.login.logging=Logging in... replaymod.gui.login.incorrect=Incorrect username or password replaymod.gui.login.connectionerror=Could not connect to ReplayMod.com +replaymod.gui.register.title=Register on ReplayMod.com +replaymod.gui.register.confirmpw=Confirm Password + +replaymod.gui.register.error.nomatch=Passwords don't match +replaymod.gui.register.error.shortusername=Username has to be at least 5 characters long +replaymod.gui.register.error.shortpw=Password has to be at least 5 characters long +replaymod.gui.register.error.invalidmail=Invalid eMail Address + + #Replay Viewer GUI replaymod.gui.viewer.rename.title=Rename Replay replaymod.gui.viewer.rename.name=Replay Name @@ -101,6 +112,8 @@ replaymod.gui.viewer.delete.linea=Are you sure you want to delete this replay? #The Replay file name is inserted before the following string, e.g. "Some Replay will be lost forever!..." replaymod.gui.viewer.delete.lineb=will be lost forever! (a long time!) +replaymod.gui.login.noacc=Don't have an account yet? + #Replay Center GUI replaymod.gui.center.logoutcallback=Do you really want to log out? replaymod.gui.center.newest=Newest Replays