Skip to content

Commit

Permalink
Allow force rename (#128)
Browse files Browse the repository at this point in the history
  • Loading branch information
1-alex98 authored Jul 26, 2021
1 parent 3d370a4 commit 608b95c
Show file tree
Hide file tree
Showing 11 changed files with 179 additions and 14 deletions.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
target/
build
.gradle
!.mvn/wrapper/maven-wrapper.jar

### IntelliJ IDEA ###
Expand All @@ -14,10 +16,13 @@ target/

# Sensitive or high-churn files:
.idea/dataSources
.idea/dataSources*
.idea/shelf
.idea/dataSources.ids
.idea/dataSources.xml
.idea/sqlDataSources.xml
.idea/dynamic.xml
.idea/uiDesigner.xml
.idea/inspectionProfiles/
.idea/libraries
.idea/libraries-with-intellij-classes.xml
2 changes: 1 addition & 1 deletion .idea/codeStyles/codeStyleConfig.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 extends ElideEntity> T post(ElideNavigatorOnCollection<T> navigator, T object) {
String url = navigator.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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<Parent> {

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());
}
}
68 changes: 61 additions & 7 deletions src/main/java/com/faforever/moderatorclient/ui/ViewHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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<PlayerFX> tableView, ObservableList<PlayerFX> data, Consumer<PlayerFX> onAddBan) {
public static void buildUserTableView(PlatformService platformService, TableView<PlayerFX> tableView, ObservableList<PlayerFX> data, Consumer<PlayerFX> onAddBan, Consumer<PlayerFX> onForceRename, FafApiCommunicationService communicationService) {
tableView.setItems(data);
HashMap<TableColumn<PlayerFX, ?>, Function<PlayerFX, ?>> extractors = new HashMap<>();

Expand Down Expand Up @@ -545,7 +589,7 @@ public static void buildUserTableView(PlatformService platformService, TableView
if (onAddBan != null) {
TableColumn<PlayerFX, PlayerFX> banOptionColumn = new TableColumn<>("Ban");
banOptionColumn.setCellValueFactory(param -> new SimpleObjectProperty<>(param.getValue()));
banOptionColumn.setCellFactory(param -> new TableCell<PlayerFX, PlayerFX>() {
banOptionColumn.setCellFactory(param -> new TableCell<>() {

@Override
protected void updateItem(PlayerFX item, boolean empty) {
Expand Down Expand Up @@ -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<AvatarAssignmentFX> tableView, ObservableList<AvatarAssignmentFX> data) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,6 @@ public class UserManagementController implements Controller<SplitPane> {
private Runnable loadMoreGamesRunnable;
private int userGamesPage = 1;


@Override
public SplitPane getRoot() {
return root;
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -31,6 +32,7 @@
public class ModerationReportController implements Controller<Region> {
private final ModerationReportService moderationReportService;
private final UiService uiService;
private final FafApiCommunicationService communicationService;
private final PlatformService platformService;
private final ObservableList<PlayerFX> reportedPlayersOfCurrentlySelectedReport = FXCollections.observableArrayList();

Expand Down Expand Up @@ -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) {
Expand Down
40 changes: 40 additions & 0 deletions src/main/resources/ui/forceRename.fxml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.RowConstraints?>
<GridPane fx:id="root" hgap="10.0" prefWidth="600.0" vgap="10.0" xmlns="http://javafx.com/javafx/16"
xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.faforever.moderatorclient.ui.ForceRenameController">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="200.0" minWidth="90.0" prefWidth="200.0"/>
<ColumnConstraints hgrow="ALWAYS" minWidth="200.0"/>
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="30.0"/>
<RowConstraints minHeight="30.0"/>
<RowConstraints minHeight="30.0"/>
</rowConstraints>
<children>
<Label text="Old name:"/>
<Label fx:id="oldNameLabel" text="&lt;name&gt;" GridPane.columnIndex="1"/>
<Label text="Rename to:" GridPane.rowIndex="1"/>
<TextField fx:id="newNameTextField" promptText="New name" GridPane.columnIndex="1" GridPane.rowIndex="1"/>
<HBox alignment="CENTER_RIGHT" spacing="10.0" GridPane.columnIndex="1" GridPane.rowIndex="2"
GridPane.vgrow="NEVER">
<children>
<Button onAction="#close" mnemonicParsing="false" text="Cancel"/>
<Button onAction="#submit" alignment="TOP_RIGHT" contentDisplay="CENTER" defaultButton="true"
mnemonicParsing="false" text="Forcibly Rename"/>
</children>
</HBox>
</children>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/>
</padding>

</GridPane>

0 comments on commit 608b95c

Please sign in to comment.