diff --git a/.gitignore b/.gitignore
index 6074e13..126dc20 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,6 @@
target/
+build
+.gradle
!.mvn/wrapper/maven-wrapper.jar
### IntelliJ IDEA ###
@@ -14,6 +16,8 @@ target/
# Sensitive or high-churn files:
.idea/dataSources
+.idea/dataSources*
+.idea/shelf
.idea/dataSources.ids
.idea/dataSources.xml
.idea/sqlDataSources.xml
@@ -21,3 +25,4 @@ target/
.idea/uiDesigner.xml
.idea/inspectionProfiles/
.idea/libraries
+.idea/libraries-with-intellij-classes.xml
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
index a55e7a1..79ee123 100644
--- a/.idea/codeStyles/codeStyleConfig.xml
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 164a1cb..3027965 100644
--- a/build.gradle
+++ b/build.gradle
@@ -58,8 +58,8 @@ dependencies {
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8'
implementation 'com.github.jasminb:jsonapi-converter:0.10'
- implementation 'com.github.FAForever.faf-java-commons:faf-commons-data:6d6219744c88f271fd1dd4903d4977f08db13c9e'
- implementation 'com.github.FAForever.faf-java-commons:faf-commons-api:6d6219744c88f271fd1dd4903d4977f08db13c9e'
+ implementation 'com.github.FAForever.faf-java-commons:faf-commons-data:4330e1fffd8c8a78d18a9f3da74ddffb233ad159'
+ implementation 'com.github.FAForever.faf-java-commons:faf-commons-api:4330e1fffd8c8a78d18a9f3da74ddffb233ad159'
implementation 'com.github.micheljung:nocatch:1.1'
implementation 'org.apache.httpcomponents:httpclient:4.5.11'
implementation 'com.github.rutledgepaulv:q-builders:1.6'
diff --git a/src/main/java/com/faforever/moderatorclient/api/FafApiCommunicationService.java b/src/main/java/com/faforever/moderatorclient/api/FafApiCommunicationService.java
index b1a88a0..5896a43 100644
--- a/src/main/java/com/faforever/moderatorclient/api/FafApiCommunicationService.java
+++ b/src/main/java/com/faforever/moderatorclient/api/FafApiCommunicationService.java
@@ -32,6 +32,7 @@
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestOperations;
import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
import java.io.Serializable;
import java.lang.reflect.Array;
@@ -127,6 +128,17 @@ public void authorize(HydraAuthorizedEvent event) {
applicationEventPublisher.publishEvent(new ApiAuthorizedEvent());
}
+ public void forceRenameUserName(String userId, String newName) {
+ String path = String.format("/users/%s/forceChangeUsername", userId);
+ String url = UriComponentsBuilder.fromPath(path).queryParam("newUsername", newName).toUriString();
+ try {
+ restTemplate.exchange(url, HttpMethod.POST, null, Void.class, Map.of());
+ } catch (Throwable t) {
+ applicationEventPublisher.publishEvent(new FafApiFailModifyEvent(t, Void.class, url));
+ throw t;
+ }
+ }
+
@SneakyThrows
public T post(ElideNavigatorOnCollection navigator, T object) {
String url = navigator.build();
diff --git a/src/main/java/com/faforever/moderatorclient/api/domain/UserService.java b/src/main/java/com/faforever/moderatorclient/api/domain/UserService.java
index f6446c4..e051344 100644
--- a/src/main/java/com/faforever/moderatorclient/api/domain/UserService.java
+++ b/src/main/java/com/faforever/moderatorclient/api/domain/UserService.java
@@ -215,4 +215,9 @@ public UserNoteFX patchUserNote(UserNote userNote) {
log.debug("Patching UserNote of id: " + userNote.getId());
return userNoteMapper.map(fafApi.patch(ElideNavigator.of(UserNote.class).id(userNote.getId()), userNote));
}
+
+ public void updatePlayer(String id, String newName) {
+ log.debug("Update of player of player id: " + id);
+ fafApi.forceRenameUserName(id, newName);
+ }
}
diff --git a/src/main/java/com/faforever/moderatorclient/ui/ForceRenameController.java b/src/main/java/com/faforever/moderatorclient/ui/ForceRenameController.java
new file mode 100644
index 0000000..b5378ba
--- /dev/null
+++ b/src/main/java/com/faforever/moderatorclient/ui/ForceRenameController.java
@@ -0,0 +1,45 @@
+package com.faforever.moderatorclient.ui;
+
+import com.faforever.moderatorclient.api.domain.UserService;
+import com.faforever.moderatorclient.ui.domain.PlayerFX;
+import javafx.scene.Parent;
+import javafx.scene.control.Label;
+import javafx.scene.control.TextField;
+import javafx.scene.layout.GridPane;
+import javafx.stage.Stage;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class ForceRenameController implements Controller {
+
+ private final UserService userService;
+
+ private PlayerFX player;
+
+ public GridPane root;
+ public TextField newNameTextField;
+ public Label oldNameLabel;
+
+ @Override
+ public Parent getRoot() {
+ return root;
+ }
+
+ public void close() {
+ ((Stage) root.getScene().getWindow()).close();
+ }
+
+ public void submit() {
+ userService.updatePlayer(player.getId(), newNameTextField.getText());
+ close();
+ }
+
+ public void setPlayer(PlayerFX player) {
+ this.player = player;
+ oldNameLabel.setText(player.getLogin());
+ }
+}
diff --git a/src/main/java/com/faforever/moderatorclient/ui/ViewHelper.java b/src/main/java/com/faforever/moderatorclient/ui/ViewHelper.java
index 61ac2a5..d554773 100644
--- a/src/main/java/com/faforever/moderatorclient/ui/ViewHelper.java
+++ b/src/main/java/com/faforever/moderatorclient/ui/ViewHelper.java
@@ -8,26 +8,56 @@
import com.faforever.commons.api.dto.VotingChoice;
import com.faforever.commons.api.dto.VotingQuestion;
import com.faforever.commons.api.dto.VotingSubject;
+import com.faforever.moderatorclient.api.FafApiCommunicationService;
import com.faforever.moderatorclient.api.domain.MessagesService;
import com.faforever.moderatorclient.api.domain.TutorialService;
import com.faforever.moderatorclient.api.domain.VotingService;
import com.faforever.moderatorclient.ui.caches.LargeThumbnailCache;
import com.faforever.moderatorclient.ui.data_cells.TextAreaTableCell;
import com.faforever.moderatorclient.ui.data_cells.UrlImageViewTableCell;
+import com.faforever.moderatorclient.ui.domain.AvatarAssignmentFX;
+import com.faforever.moderatorclient.ui.domain.AvatarFX;
+import com.faforever.moderatorclient.ui.domain.BanInfoFX;
+import com.faforever.moderatorclient.ui.domain.GameFX;
+import com.faforever.moderatorclient.ui.domain.GamePlayerStatsFX;
+import com.faforever.moderatorclient.ui.domain.MapFX;
+import com.faforever.moderatorclient.ui.domain.MapVersionFX;
+import com.faforever.moderatorclient.ui.domain.MessageFx;
+import com.faforever.moderatorclient.ui.domain.ModFX;
+import com.faforever.moderatorclient.ui.domain.ModVersionFX;
+import com.faforever.moderatorclient.ui.domain.ModerationReportFX;
+import com.faforever.moderatorclient.ui.domain.NameRecordFX;
+import com.faforever.moderatorclient.ui.domain.PlayerFX;
+import com.faforever.moderatorclient.ui.domain.TeamkillFX;
+import com.faforever.moderatorclient.ui.domain.TutorialCategoryFX;
+import com.faforever.moderatorclient.ui.domain.TutorialFx;
+import com.faforever.moderatorclient.ui.domain.UserNoteFX;
import com.faforever.moderatorclient.ui.domain.VotingChoiceFX;
import com.faforever.moderatorclient.ui.domain.VotingQuestionFX;
import com.faforever.moderatorclient.ui.domain.VotingSubjectFX;
-import com.faforever.moderatorclient.ui.domain.*;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.ObservableList;
-import javafx.scene.control.*;
+import javafx.scene.Scene;
+import javafx.scene.control.Alert;
import javafx.scene.control.Button;
+import javafx.scene.control.ButtonType;
+import javafx.scene.control.ContextMenu;
+import javafx.scene.control.Control;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
+import javafx.scene.control.SelectionMode;
+import javafx.scene.control.TableCell;
+import javafx.scene.control.TableColumn;
+import javafx.scene.control.TablePosition;
+import javafx.scene.control.TableView;
import javafx.scene.control.TextArea;
+import javafx.scene.control.Tooltip;
+import javafx.scene.control.TreeItem;
+import javafx.scene.control.TreeTableColumn;
+import javafx.scene.control.TreeTableView;
import javafx.scene.control.cell.CheckBoxTableCell;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TreeItemPropertyValueFactory;
@@ -42,6 +72,7 @@
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.scene.text.TextAlignment;
+import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.util.StringConverter;
import javafx.util.converter.DefaultStringConverter;
@@ -73,6 +104,8 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;
+import static com.faforever.commons.api.dto.GroupPermission.ROLE_ADMIN_ACCOUNT_NAME_CHANGE;
+
@Component
@Slf4j
public class ViewHelper {
@@ -480,12 +513,23 @@ protected void updateItem(PlayerFX item, boolean empty) {
};
}
+
+ public static void loadForceRenameDialog(UiService uiService, PlayerFX playerFX) {
+ ForceRenameController forceRenameController = uiService.loadFxml("ui/forceRename.fxml");
+ forceRenameController.setPlayer(playerFX);
+ Stage newCategoryDialog = new Stage();
+ newCategoryDialog.setTitle("Force rename");
+ newCategoryDialog.setScene(new Scene(forceRenameController.getRoot()));
+ newCategoryDialog.showAndWait();
+ }
+
/**
- * @param tableView The tableview to be populated
- * @param data data to be put in the tableView
- * @param onAddBan if not null shows a ban button which triggers this consumer
+ * @param tableView The tableview to be populated
+ * @param data data to be put in the tableView
+ * @param onAddBan if not null shows a ban button which triggers this consumer
+ * @param communicationService
*/
- public static void buildUserTableView(PlatformService platformService, TableView tableView, ObservableList data, Consumer onAddBan) {
+ public static void buildUserTableView(PlatformService platformService, TableView tableView, ObservableList data, Consumer onAddBan, Consumer onForceRename, FafApiCommunicationService communicationService) {
tableView.setItems(data);
HashMap, Function> extractors = new HashMap<>();
@@ -545,7 +589,7 @@ public static void buildUserTableView(PlatformService platformService, TableView
if (onAddBan != null) {
TableColumn banOptionColumn = new TableColumn<>("Ban");
banOptionColumn.setCellValueFactory(param -> new SimpleObjectProperty<>(param.getValue()));
- banOptionColumn.setCellFactory(param -> new TableCell() {
+ banOptionColumn.setCellFactory(param -> new TableCell<>() {
@Override
protected void updateItem(PlayerFX item, boolean empty) {
@@ -576,7 +620,17 @@ protected void updateItem(PlayerFX item, boolean empty) {
platformService.showDocument("https://steamidfinder.com/lookup/" + playerFX.getSteamId());
}
});
+
contextMenu.getItems().add(steamLookupMenuItem);
+
+ if (communicationService.hasPermission(ROLE_ADMIN_ACCOUNT_NAME_CHANGE)) {
+ MenuItem forceRenameMenuItem = new MenuItem("Rename");
+ forceRenameMenuItem.setOnAction(action -> {
+ PlayerFX playerFX = tableView.getSelectionModel().getSelectedItem();
+ onForceRename.accept(playerFX);
+ });
+ contextMenu.getItems().add(forceRenameMenuItem);
+ }
}
public static void buildUserAvatarsTableView(TableView tableView, ObservableList data) {
diff --git a/src/main/java/com/faforever/moderatorclient/ui/main_window/RecentActivityController.java b/src/main/java/com/faforever/moderatorclient/ui/main_window/RecentActivityController.java
index 6ae678c..8ada70b 100644
--- a/src/main/java/com/faforever/moderatorclient/ui/main_window/RecentActivityController.java
+++ b/src/main/java/com/faforever/moderatorclient/ui/main_window/RecentActivityController.java
@@ -62,7 +62,8 @@ private boolean checkPermissionForTitledPane(String permissionTechnicalName, Tit
@FXML
public void initialize() {
if (checkPermissionForTitledPane(GroupPermission.ROLE_READ_ACCOUNT_PRIVATE_DETAILS, userRegistrationFeedPane)) {
- ViewHelper.buildUserTableView(platformService, userRegistrationFeedTableView, users, this::addBan);
+ ViewHelper.buildUserTableView(platformService, userRegistrationFeedTableView, users, this::addBan,
+ playerFX -> ViewHelper.loadForceRenameDialog(uiService, playerFX), communicationService);
}
if (checkPermissionForTitledPane(GroupPermission.ROLE_READ_TEAMKILL_REPORT, teamkillFeedPane)) {
diff --git a/src/main/java/com/faforever/moderatorclient/ui/main_window/UserManagementController.java b/src/main/java/com/faforever/moderatorclient/ui/main_window/UserManagementController.java
index f284c9e..6d2629b 100644
--- a/src/main/java/com/faforever/moderatorclient/ui/main_window/UserManagementController.java
+++ b/src/main/java/com/faforever/moderatorclient/ui/main_window/UserManagementController.java
@@ -96,7 +96,6 @@ public class UserManagementController implements Controller {
private Runnable loadMoreGamesRunnable;
private int userGamesPage = 1;
-
@Override
public SplitPane getRoot() {
return root;
@@ -113,7 +112,8 @@ public void initialize() {
disableTabOnMissingPermission(teamkillsTab, GroupPermission.ROLE_READ_TEAMKILL_REPORT);
disableTabOnMissingPermission(avatarsTab, GroupPermission.ROLE_WRITE_AVATAR);
- ViewHelper.buildUserTableView(platformService, userSearchTableView, users, null);
+ ViewHelper.buildUserTableView(platformService, userSearchTableView, users, null,
+ playerFX -> ViewHelper.loadForceRenameDialog(uiService, playerFX), communicationService);
ViewHelper.buildNotesTableView(userNoteTableView, userNotes, false);
ViewHelper.buildNameHistoryTableView(userNameHistoryTableView, nameRecords);
ViewHelper.buildBanTableView(userBansTableView, bans, false);
diff --git a/src/main/java/com/faforever/moderatorclient/ui/moderation_reports/ModerationReportController.java b/src/main/java/com/faforever/moderatorclient/ui/moderation_reports/ModerationReportController.java
index 8fb32ae..5300953 100644
--- a/src/main/java/com/faforever/moderatorclient/ui/moderation_reports/ModerationReportController.java
+++ b/src/main/java/com/faforever/moderatorclient/ui/moderation_reports/ModerationReportController.java
@@ -1,6 +1,7 @@
package com.faforever.moderatorclient.ui.moderation_reports;
import com.faforever.commons.api.dto.ModerationReportStatus;
+import com.faforever.moderatorclient.api.FafApiCommunicationService;
import com.faforever.moderatorclient.api.domain.ModerationReportService;
import com.faforever.moderatorclient.ui.*;
import com.faforever.moderatorclient.ui.domain.BanInfoFX;
@@ -31,6 +32,7 @@
public class ModerationReportController implements Controller {
private final ModerationReportService moderationReportService;
private final UiService uiService;
+ private final FafApiCommunicationService communicationService;
private final PlatformService platformService;
private final ObservableList reportedPlayersOfCurrentlySelectedReport = FXCollections.observableArrayList();
@@ -75,7 +77,8 @@ public void initialize() {
}
});
- ViewHelper.buildUserTableView(platformService, reportedPlayerView, reportedPlayersOfCurrentlySelectedReport, this::addBan);
+ ViewHelper.buildUserTableView(platformService, reportedPlayerView, reportedPlayersOfCurrentlySelectedReport, this::addBan,
+ playerFX -> ViewHelper.loadForceRenameDialog(uiService, playerFX), communicationService);
}
private void addBan(PlayerFX accountFX) {
diff --git a/src/main/resources/ui/forceRename.fxml b/src/main/resources/ui/forceRename.fxml
new file mode 100644
index 0000000..e0ffb23
--- /dev/null
+++ b/src/main/resources/ui/forceRename.fxml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+