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 @@ + + + + + + + + + + + + + + + + + + + + + +