diff --git a/client/.classpath b/client/.classpath
index 99d4cc0..4328dab 100644
--- a/client/.classpath
+++ b/client/.classpath
@@ -20,7 +20,6 @@
-
diff --git a/client/.settings/org.eclipse.jdt.ui.prefs b/client/.settings/org.eclipse.jdt.ui.prefs
index 359aaeb..8eb1c29 100644
--- a/client/.settings/org.eclipse.jdt.ui.prefs
+++ b/client/.settings/org.eclipse.jdt.ui.prefs
@@ -6,4 +6,4 @@ org.eclipse.jdt.ui.importorder=java;javax;javafx;org;com;envoy;
org.eclipse.jdt.ui.javadoc=true
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=2
-org.eclipse.jdt.ui.text.custom_code_templates=/**\r\n * @return the ${bare_field_name}\r\n * @since Envoy Client v0.2-beta\r\n *//**\r\n * @param ${param} the ${bare_field_name} to set\r\n * @since Envoy Client v0.2-beta\r\n *//**\r\n * ${tags}\r\n * @since Envoy Client v0.2-beta\r\n *//**\r\n * Project\: <strong>${project_name}</strong><br>\r\n * File\: <strong>${file_name}</strong><br>\r\n * Created\: <strong>${date}</strong><br>\r\n *\r\n * @author ${user}\r\n * @since Envoy Client v0.2-beta\r\n *//**\r\n * ${tags}\r\n * @since Envoy Client v0.2-beta\r\n *//**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n * @since Envoy Client v0.2-beta\r\n *//**\r\n * ${tags}\r\n * ${see_to_target}\r\n * @since Envoy Client v0.2-beta\r\n */${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}\r\n\r\n\r\n\r\n${exception_var}.printStackTrace();${body_statement}${body_statement}return ${field};${field} \= ${param};
+org.eclipse.jdt.ui.text.custom_code_templates=/**\r\n * @return the ${bare_field_name}\r\n * @since Envoy Client v0.2-beta\r\n *//**\r\n * @param ${param} the ${bare_field_name} to set\r\n * @since Envoy Client v0.2-beta\r\n *//**\r\n * ${tags}\r\n * @since Envoy Client v0.2-beta\r\n *//**\r\n * Project\: <strong>${project_name}</strong><br>\r\n * File\: <strong>${file_name}</strong><br>\r\n * Created\: <strong>${d\:date('dd.MM.yyyy')}</strong><br>\r\n *\r\n * @author ${user}\r\n * @since Envoy Client v0.2-beta\r\n *//**\r\n * ${tags}\r\n * @since Envoy Client v0.2-beta\r\n *//**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n * @since Envoy Client v0.2-beta\r\n *//**\r\n * ${tags}\r\n * ${see_to_target}\r\n * @since Envoy Client v0.2-beta\r\n */${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}\r\n\r\n\r\n\r\n${exception_var}.printStackTrace();${body_statement}${body_statement}return ${field};${field} \= ${param};\r\n
diff --git a/client/src/main/java/envoy/client/Main.java b/client/src/main/java/envoy/client/Main.java
index 57f2d6d..6119062 100644
--- a/client/src/main/java/envoy/client/Main.java
+++ b/client/src/main/java/envoy/client/Main.java
@@ -19,6 +19,8 @@ import envoy.client.ui.Startup;
*/
public class Main {
+ private static final boolean debug = false;
+
/**
* Starts the application.
*
@@ -26,5 +28,12 @@ public class Main {
* client configuration
* @since Envoy Client v0.1-beta
*/
- public static void main(String[] args) { Application.launch(Startup.class, args); }
+ public static void main(String[] args) {
+ if (debug) {
+ // Put testing code here
+ System.out.println();
+ System.exit(0);
+ }
+ Application.launch(Startup.class, args);
+ }
}
diff --git a/client/src/main/java/envoy/client/ui/controller/SettingsScene.java b/client/src/main/java/envoy/client/ui/controller/SettingsScene.java
index 5656588..b8802fd 100644
--- a/client/src/main/java/envoy/client/ui/controller/SettingsScene.java
+++ b/client/src/main/java/envoy/client/ui/controller/SettingsScene.java
@@ -1,10 +1,13 @@
package envoy.client.ui.controller;
import javafx.fxml.FXML;
-import javafx.scene.control.*;
+import javafx.scene.control.Label;
+import javafx.scene.control.ListView;
+import javafx.scene.control.TitledPane;
import envoy.client.net.Client;
import envoy.client.ui.SceneContext;
+import envoy.client.ui.listcell.AbstractListCell;
import envoy.client.ui.settings.*;
/**
@@ -36,17 +39,15 @@ public class SettingsScene {
settingsList.getItems().add(new GeneralSettingsPane());
settingsList.getItems().add(new UserSettingsPane(sceneContext, client.getSender(), client.isOnline()));
settingsList.getItems().add(new DownloadSettingsPane(sceneContext));
+ settingsList.getItems().add(new BugReportPane(client.getSender(), client.isOnline()));
}
@FXML
private void initialize() {
- settingsList.setCellFactory(listView -> new ListCell<>() {
+ settingsList.setCellFactory(listView -> new AbstractListCell<>(listView) {
@Override
- protected void updateItem(SettingsPane item, boolean empty) {
- super.updateItem(item, empty);
- if (!empty && item != null) setGraphic(new Label(item.getTitle()));
- }
+ protected Label renderItem(SettingsPane item) { return new Label(item.getTitle()); }
});
}
diff --git a/client/src/main/java/envoy/client/ui/settings/BugReportPane.java b/client/src/main/java/envoy/client/ui/settings/BugReportPane.java
new file mode 100644
index 0000000..6a3ca59
--- /dev/null
+++ b/client/src/main/java/envoy/client/ui/settings/BugReportPane.java
@@ -0,0 +1,78 @@
+package envoy.client.ui.settings;
+
+import javafx.event.EventHandler;
+import javafx.scene.control.*;
+import javafx.scene.input.InputEvent;
+
+import envoy.client.event.SendEvent;
+import envoy.client.util.IssueUtil;
+import envoy.data.User;
+import envoy.event.EventBus;
+import envoy.event.IssueProposal;
+
+/**
+ * This class offers the option for users to submit a bug report. Only the title
+ * of a bug is needed to be sent.
+ *
+ * Project: client
+ * File: BugReportPane.java
+ * Created: Aug 4, 2020
+ *
+ * @author Leon Hofmeister
+ * @since Envoy Client v0.2-beta
+ */
+public class BugReportPane extends OnlyIfOnlineSettingsPane {
+
+ private final Label titleLabel = new Label("Suggest a title for the bug:");
+ private final TextField titleTextField = new TextField();
+ private final Label pleaseExplainLabel = new Label("Paste here the log of what went wrong and/ or explain what went wrong:");
+ private final TextArea errorDetailArea = new TextArea();
+ private final CheckBox showUsernameInBugReport = new CheckBox("Show your username in the bug report?");
+ private final Button submitReportButton = new Button("Submit report");
+
+ private final EventHandler super InputEvent> inputEventHandler = e -> submitReportButton.setDisable(titleTextField.getText().isBlank());
+
+ /**
+ * Creates a new {@code BugReportPane}.
+ *
+ * @param user the user whose details to use
+ * @param online whether this user is currently online
+ * @since Envoy Client v0.2-beta
+ */
+ public BugReportPane(User user, boolean online) {
+ super("Report a bug", online);
+ setSpacing(10);
+ setToolTipText("A bug can only be reported while being online");
+
+ // Displaying the label to ask for a title
+ titleLabel.setWrapText(true);
+ getChildren().add(titleLabel);
+
+ // Displaying the TextField where to enter the title of this bug
+ titleTextField.setOnKeyTyped(inputEventHandler);
+ titleTextField.setOnInputMethodTextChanged(inputEventHandler);
+ getChildren().add(titleTextField);
+
+ // Displaying the label to ask for clarification
+ pleaseExplainLabel.setWrapText(true);
+ getChildren().add(pleaseExplainLabel);
+
+ // Displaying the TextArea where to enter the log and/or own description
+ errorDetailArea.setWrapText(true);
+ getChildren().add(errorDetailArea);
+
+ // Displaying the consent button that your user name will be shown
+ showUsernameInBugReport.setSelected(true);
+ getChildren().add(showUsernameInBugReport);
+
+ // Displaying the submitReportButton
+ submitReportButton.setDisable(true);
+ submitReportButton.setOnAction(e -> {
+ EventBus.getInstance()
+ .dispatch(new SendEvent(new IssueProposal(titleTextField.getText(),
+ IssueUtil.sanitizeIssueDescription(errorDetailArea.getText(), showUsernameInBugReport.isSelected() ? user.getName() : null),
+ true)));
+ });
+ getChildren().add(submitReportButton);
+ }
+}
diff --git a/client/src/main/java/envoy/client/ui/settings/OnlyIfOnlineSettingsPane.java b/client/src/main/java/envoy/client/ui/settings/OnlyIfOnlineSettingsPane.java
new file mode 100644
index 0000000..886a2b9
--- /dev/null
+++ b/client/src/main/java/envoy/client/ui/settings/OnlyIfOnlineSettingsPane.java
@@ -0,0 +1,49 @@
+package envoy.client.ui.settings;
+
+import javafx.geometry.Insets;
+import javafx.scene.control.Label;
+import javafx.scene.control.Tooltip;
+import javafx.scene.layout.Background;
+import javafx.scene.layout.BackgroundFill;
+import javafx.scene.layout.CornerRadii;
+import javafx.scene.paint.Color;
+
+/**
+ * Inheriting from this class signifies that options should only be available if
+ * the {@link envoy.data.User} is currently online. If the user is currently
+ * offline, all {@link javafx.scene.Node} variables will be disabled and a
+ * {@link Tooltip} will be displayed for the whole node.
+ *
+ * Project: client
+ * File: OnlyIfOnlineSettingsPane.java
+ * Created: 04.08.2020
+ *
+ * @author Leon Hofmeister
+ * @since Envoy Client v0.2-beta
+ */
+public abstract class OnlyIfOnlineSettingsPane extends SettingsPane {
+
+ private final Tooltip beOnlineReminder = new Tooltip("You need to be online to modify your account.");
+
+ /**
+ * @param title
+ * @since Envoy Client v0.2-beta
+ */
+ protected OnlyIfOnlineSettingsPane(String title, boolean online) {
+ super(title);
+
+ setDisable(!online);
+
+ if (!online) {
+ final var infoLabel = new Label("You shall not pass!\n(... Unless you would happen to be online)");
+ infoLabel.setId("infoLabel-warning");
+ infoLabel.setWrapText(true);
+ getChildren().add(infoLabel);
+ setBackground(new Background(new BackgroundFill(Color.grayRgb(100, 0.3), CornerRadii.EMPTY, Insets.EMPTY)));
+
+ Tooltip.install(this, beOnlineReminder);
+ } else Tooltip.uninstall(this, beOnlineReminder);
+ }
+
+ protected void setToolTipText(String text) { beOnlineReminder.setText(text); }
+}
diff --git a/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java b/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java
index cad265b..098abac 100644
--- a/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java
+++ b/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java
@@ -22,7 +22,6 @@ import envoy.client.event.SendEvent;
import envoy.client.ui.IconUtil;
import envoy.client.ui.SceneContext;
import envoy.client.ui.custom.ProfilePicImageView;
-import envoy.client.util.ReflectionUtil;
import envoy.data.User;
import envoy.event.*;
import envoy.util.Bounds;
@@ -36,7 +35,7 @@ import envoy.util.EnvoyLog;
* @author Leon Hofmeister
* @since Envoy Client v0.2-beta
*/
-public class UserSettingsPane extends SettingsPane {
+public class UserSettingsPane extends OnlyIfOnlineSettingsPane {
private boolean profilePicChanged, usernameChanged, validPassword;
private byte[] currentImageBytes;
@@ -49,8 +48,6 @@ public class UserSettingsPane extends SettingsPane {
private final PasswordField repeatNewPasswordField = new PasswordField();
private final Button saveButton = new Button("Save");
- private final Tooltip beOnlineReminder = new Tooltip("You need to be online to modify your acount.");
-
private static final EventBus eventBus = EventBus.getInstance();
private static final Logger logger = EnvoyLog.getLogger(UserSettingsPane.class);
@@ -63,7 +60,7 @@ public class UserSettingsPane extends SettingsPane {
* @since Envoy Client v0.2-beta
*/
public UserSettingsPane(SceneContext sceneContext, User user, boolean online) {
- super("User");
+ super("User", online);
setSpacing(10);
// Display of profile pic change mechanism
@@ -143,17 +140,6 @@ public class UserSettingsPane extends SettingsPane {
saveButton.setOnAction(e -> save(user.getID(), currentPasswordField.getText()));
saveButton.setAlignment(Pos.BOTTOM_RIGHT);
getChildren().add(saveButton);
-
- final var offline = !online;
- ReflectionUtil.getAllDeclaredNodeVariables(this).forEach(node -> node.setDisable(offline));
- if (offline) {
- final var infoLabel = new Label("You shall not pass!\n(... Unless you would happen to be online)");
- infoLabel.setId("infoLabel-warning");
- infoLabel.setWrapText(true);
- getChildren().add(infoLabel);
-
- Tooltip.install(this, beOnlineReminder);
- } else Tooltip.uninstall(this, beOnlineReminder);
}
/**
diff --git a/client/src/main/java/envoy/client/util/IssueUtil.java b/client/src/main/java/envoy/client/util/IssueUtil.java
new file mode 100644
index 0000000..c4f3e6e
--- /dev/null
+++ b/client/src/main/java/envoy/client/util/IssueUtil.java
@@ -0,0 +1,40 @@
+package envoy.client.util;
+
+/**
+ * Provides methods to handle outgoing issues.
+ *
+ * Project: client
+ * File: IssueUtil.java
+ * Created: 20.08.2020
+ *
+ * @author Leon Hofmeister
+ * @since Envoy Client v0.2-beta
+ */
+public class IssueUtil {
+
+ /**
+ *
+ * @since Envoy Client v0.2-beta
+ */
+ private IssueUtil() {}
+
+ /**
+ * Performs actions to ensure the description of an issue will be displayed as
+ * intended by the user.
+ *
+ * @param rawDescription the description to sanitize
+ * @param username the user who submitted the issue. Should be
+ * {@code null} if he does not want to be named.
+ * @return the sanitized description
+ * @since Envoy Client v0.2-beta
+ */
+ public static String sanitizeIssueDescription(String rawDescription, String username) {
+ // Appending the submitter name, if this option was enabled
+ rawDescription += username != null
+ ? (rawDescription.endsWith("\n") || rawDescription.endsWith("
") ? "" : "
") + String.format("Submitted by user %s.", username)
+ : "";
+ // Markdown does not support "normal" line breaks. It uses "
"
+ rawDescription = rawDescription.replaceAll(System.getProperty("line.separator", "\r?\n"), "
");
+ return rawDescription;
+ }
+}
diff --git a/client/src/main/java/envoy/client/util/ReflectionUtil.java b/client/src/main/java/envoy/client/util/ReflectionUtil.java
index 132f5da..92c243a 100644
--- a/client/src/main/java/envoy/client/util/ReflectionUtil.java
+++ b/client/src/main/java/envoy/client/util/ReflectionUtil.java
@@ -42,7 +42,6 @@ public class ReflectionUtil {
try {
field.setAccessible(true);
final var value = field.get(instance);
- field.setAccessible(false);
return value;
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new RuntimeException(e);
diff --git a/client/src/main/resources/fxml/SettingsScene.fxml b/client/src/main/resources/fxml/SettingsScene.fxml
index 8474c1d..fdf4a8f 100644
--- a/client/src/main/resources/fxml/SettingsScene.fxml
+++ b/client/src/main/resources/fxml/SettingsScene.fxml
@@ -30,7 +30,7 @@
+ prefHeight="400.0" prefWidth="400.0">
diff --git a/common/.settings/org.eclipse.jdt.ui.prefs b/common/.settings/org.eclipse.jdt.ui.prefs
index 3110cf7..2b7c75d 100644
--- a/common/.settings/org.eclipse.jdt.ui.prefs
+++ b/common/.settings/org.eclipse.jdt.ui.prefs
@@ -6,4 +6,4 @@ org.eclipse.jdt.ui.importorder=java;javax;javafx;org;com;envoy;
org.eclipse.jdt.ui.javadoc=true
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=2
-org.eclipse.jdt.ui.text.custom_code_templates=/**\r\n * @return the ${bare_field_name}\r\n * @since Envoy Common v0.2-beta\r\n *//**\r\n * @param ${param} the ${bare_field_name} to set\r\n * @since Envoy Common v0.2-beta\r\n *//**\r\n * ${tags}\r\n * @since Envoy Common v0.2-beta\r\n *//**\r\n * Project\: <strong>${project_name}</strong><br>\r\n * File\: <strong>${file_name}</strong><br>\r\n * Created\: <strong>${date}</strong><br>\r\n *\r\n * @author ${user}\r\n * @since Envoy Common v0.2-beta\r\n *//**\r\n * ${tags}\r\n * @since Envoy Common v0.2-beta\r\n *//**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n * @since Envoy Common v0.2-beta\r\n *//**\r\n * ${tags}\r\n * ${see_to_target}\r\n * @since Envoy Common v0.2-beta\r\n */${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}\r\n\r\n\r\n\r\n${exception_var}.printStackTrace();${body_statement}${body_statement}return ${field};${field} \= ${param};
+org.eclipse.jdt.ui.text.custom_code_templates=/**\r\n * @return the ${bare_field_name}\r\n * @since Envoy Common v0.2-beta\r\n *//**\r\n * @param ${param} the ${bare_field_name} to set\r\n * @since Envoy Common v0.2-beta\r\n *//**\r\n * ${tags}\r\n * @since Envoy Common v0.2-beta\r\n *//**\r\n * Project\: <strong>${project_name}</strong><br>\r\n * File\: <strong>${file_name}</strong><br>\r\n * Created\: <strong>${d\:date('dd.MM.yyyy')}</strong><br>\r\n *\r\n * @author ${user}\r\n * @since Envoy Common v0.2-beta\r\n *//**\r\n * ${tags}\r\n * @since Envoy Common v0.2-beta\r\n *//**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n * @since Envoy Common v0.2-beta\r\n *//**\r\n * ${tags}\r\n * ${see_to_target}\r\n * @since Envoy Common v0.2-beta\r\n */${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}\r\n\r\n\r\n\r\n${exception_var}.printStackTrace();${body_statement}${body_statement}return ${field};${field} \= ${param};\r\n
diff --git a/common/src/main/java/envoy/event/IssueProposal.java b/common/src/main/java/envoy/event/IssueProposal.java
new file mode 100644
index 0000000..b032424
--- /dev/null
+++ b/common/src/main/java/envoy/event/IssueProposal.java
@@ -0,0 +1,47 @@
+package envoy.event;
+
+/**
+ * This class allows envoy users to send an issue proposal to the server who, if
+ * not disabled by its admin, will forward it directly to gitea.
+ *
+ * Project: common
+ * File: IssueProposal.java
+ * Created: 05.08.2020
+ *
+ * @author Leon Hofmeister
+ * @since Envoy Common v0.2-beta
+ */
+public class IssueProposal extends Event {
+
+ private final String description;
+ private final boolean bug;
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @param title the title of the reported bug
+ * @param description the description of this bug
+ * @param isBug determines whether this {@code IssueProposal} is
+ * supposed to be a
+ * feature or a bug (true = bug, false = feature)
+ * @since Envoy Common v0.2-beta
+ */
+ public IssueProposal(String title, String description, boolean isBug) {
+ super(title);
+ this.description = description;
+ bug = isBug;
+ }
+
+ /**
+ * @return the description
+ * @since Envoy Common v0.2-beta
+ */
+ public String getDescription() { return description; }
+
+ /**
+ * @return whether this issue is supposed to be a bug - otherwise it is intended
+ * as a feature
+ * @since Envoy Common v0.2-beta
+ */
+ public boolean isBug() { return bug; }
+}
diff --git a/server/.settings/org.eclipse.jdt.ui.prefs b/server/.settings/org.eclipse.jdt.ui.prefs
index d951389..099b1f8 100755
--- a/server/.settings/org.eclipse.jdt.ui.prefs
+++ b/server/.settings/org.eclipse.jdt.ui.prefs
@@ -2,4 +2,4 @@ eclipse.preferences.version=1
formatter_profile=_KSKE
formatter_settings_version=18
org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=/**\r\n * @return the ${bare_field_name}\r\n * @since Envoy Server v0.2-beta\r\n *//**\r\n * @param ${param} the ${bare_field_name} to set\r\n * @since Envoy Server v0.2-beta\r\n *//**\r\n * Creates an instance of @link{${enclosing_type}}.\r\n *\r\n * ${tags}\r\n * @since Envoy Server v0.2-beta\r\n *//**\r\n * Project\: <strong>${project_name}</strong><br>\r\n * File\: <strong>${file_name}</strong><br>\r\n * Created\: <strong>${date}</strong><br>\r\n * \r\n * @author ${user}\r\n * @since Envoy Server v0.2-beta\r\n *//**\r\n * ${tags}\r\n * @since Envoy Server v0.2-beta\r\n *//**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n * @since Envoy Server v0.2-beta\r\n *//**\r\n * ${tags}\r\n * ${see_to_target}\r\n * @since Envoy Server v0.2-beta\r\n */${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}\r\n\r\n\r\n\r\n${exception_var}.printStackTrace();${body_statement}\r\n${body_statement}\r\nreturn ${field};${field} \= ${param};
+org.eclipse.jdt.ui.text.custom_code_templates=/**\r\n * @return the ${bare_field_name}\r\n * @since Envoy Server v0.2-beta\r\n *//**\r\n * @param ${param} the ${bare_field_name} to set\r\n * @since Envoy Server v0.2-beta\r\n *//**\r\n * Creates an instance of @link{${enclosing_type}}.\r\n *\r\n * ${tags}\r\n * @since Envoy Server v0.2-beta\r\n *//**\r\n * Project\: <strong>${project_name}</strong><br>\r\n * File\: <strong>${file_name}</strong><br>\r\n * Created\: <strong>${d\:date('dd.MM.yyyy')}</strong><br>\r\n * \r\n * @author ${user}\r\n * @since Envoy Server v0.2-beta\r\n *//**\r\n * ${tags}\r\n * @since Envoy Server v0.2-beta\r\n *//**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n * @since Envoy Server v0.2-beta\r\n *//**\r\n * ${tags}\r\n * ${see_to_target}\r\n * @since Envoy Server v0.2-beta\r\n */${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}\r\n\r\n\r\n\r\n${exception_var}.printStackTrace();${body_statement}\r\n${body_statement}\r\nreturn ${field};${field} \= ${param};\r\n
diff --git a/server/src/main/java/envoy/server/Startup.java b/server/src/main/java/envoy/server/Startup.java
index c131fce..84b569c 100755
--- a/server/src/main/java/envoy/server/Startup.java
+++ b/server/src/main/java/envoy/server/Startup.java
@@ -59,7 +59,7 @@ public class Startup {
public static void main(String[] args) throws IOException {
initLogging();
- final Server server = new Server(8080, ObjectMessageReader::new,
+ final var server = new Server(8080, ObjectMessageReader::new,
new ObjectMessageProcessor(Set.of(new LoginCredentialProcessor(),
new MessageProcessor(),
new GroupMessageProcessor(),
@@ -73,10 +73,11 @@ public class Startup {
new IsTypingProcessor(),
new NameChangeProcessor(),
new ProfilePicChangeProcessor(),
- new PasswordChangeRequestProcessor())));
+ new PasswordChangeRequestProcessor(),
+ new IssueProposalProcessor())));
// Initialize the current message ID
- final PersistenceManager persistenceManager = PersistenceManager.getInstance();
+ final var persistenceManager = PersistenceManager.getInstance();
if (persistenceManager.getConfigItemByID("currentMessageId") == null)
persistenceManager.addConfigItem(new envoy.server.data.ConfigItem("currentMessageId", "0"));
diff --git a/server/src/main/java/envoy/server/processors/IssueProposalProcessor.java b/server/src/main/java/envoy/server/processors/IssueProposalProcessor.java
new file mode 100644
index 0000000..97a9b54
--- /dev/null
+++ b/server/src/main/java/envoy/server/processors/IssueProposalProcessor.java
@@ -0,0 +1,79 @@
+package envoy.server.processors;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import envoy.event.IssueProposal;
+import envoy.server.net.ObjectWriteProxy;
+import envoy.util.EnvoyLog;
+
+/**
+ * This processor handles incoming {@link IssueProposal}s and automatically
+ * creates a new issue on the gitea site, if not disabled by its administrator.
+ *
+ * Project: server
+ * File: IssueProposalProcessor.java
+ * Created: 05.08.2020
+ *
+ * @author Leon Hofmeister
+ * @since Envoy Server v0.2-beta
+ */
+public class IssueProposalProcessor implements ObjectProcessor {
+
+ private static boolean issueReportingEnabled = true;
+ private static final Logger logger = EnvoyLog.getLogger(IssueProposalProcessor.class);
+
+ @Override
+ public void process(IssueProposal issueProposal, long socketID, ObjectWriteProxy writeProxy) throws IOException {
+ // Do nothing if manually disabled
+ if (!issueReportingEnabled) return;
+ try {
+ final var url = new URL(
+ "https://git.kske.dev/api/v1/repos/zdm/envoy/issues?access_token=6d8ec2a72d64cbaf6319434aa2e7caf0130701b3");
+ final var connection = (HttpURLConnection) url.openConnection();
+ connection.setRequestMethod("POST");
+ connection.setRequestProperty("Content-Type", "application/json; utf-8");
+ connection.setRequestProperty("Accept", "application/json");
+ connection.setDoOutput(true);
+
+ final var json = String.format("{\"title\":\"%s\",\"body\":\"%s\",\"labels\":[240, %d]}",
+ issueProposal.get(),
+ issueProposal.getDescription(),
+ // Label 240 should be user-made, label 117 bug and label 119 feature
+ issueProposal.isBug() ? 117 : 119);
+ try (final var os = connection.getOutputStream()) {
+ final byte[] input = json.getBytes("utf-8");
+ os.write(input, 0, input.length);
+ }
+ final var status = connection.getResponseCode();
+ if (status == 201) logger.log(Level.INFO, "Successfully created an issue");
+ else logger.log(Level.WARNING,
+ String.format("Tried creating an issue for %s but received status code %d - Request params:title=%s,description=%s,json=%s",
+ url,
+ status,
+ issueProposal.get(),
+ issueProposal.getDescription(),
+ json));
+ } catch (final IOException e) {
+ logger.log(Level.WARNING, "An error occurred while creating an issue: ", e);
+ }
+ }
+
+ /**
+ * @return whether issue reporting is enabled
+ * @since Envoy Server v0.2-beta
+ */
+ public static boolean isIssueReportingEnabled() { return issueReportingEnabled; }
+
+ /**
+ * @param issueReportingEnabled whether issue reporting should be enabled - true
+ * by default
+ * @since Envoy Server v0.2-beta
+ */
+ public static void setIssueReportingEnabled(boolean issueReportingEnabled) {
+ IssueProposalProcessor.issueReportingEnabled = issueReportingEnabled;
+ }
+}