package com.faforever.client.chat; import com.faforever.client.audio.AudioController; import com.faforever.client.preferences.ChatPrefs; import com.google.common.annotations.VisibleForTesting; import javafx.application.Platform; import javafx.fxml.FXML; import javafx.scene.control.Tab; import javafx.scene.control.TextInputControl; import javafx.scene.web.WebView; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.time.Instant; import static com.faforever.client.chat.SocialStatus.FOE; public class PrivateChatTabController extends AbstractChatTabController { @FXML Tab privateChatTabRoot; @FXML WebView messagesWebView; @FXML TextInputControl messageTextField; @Resource AudioController audioController; @Resource ChatService chatService; private boolean userOffline; public boolean isUserOffline() { return userOffline; } @Override public Tab getRoot() { return privateChatTabRoot; } @Override public void setReceiver(String username) { super.setReceiver(username); privateChatTabRoot.setId(username); privateChatTabRoot.setText(username); } @PostConstruct @Override void postConstruct() { super.postConstruct(); userOffline = false; chatService.addChatUsersByNameListener(change -> { if (change.wasRemoved()) { onPlayerDisconnected(change.getKey(), change.getValueRemoved()); } if (change.wasAdded()) { onPlayerConnected(change.getKey(), change.getValueRemoved()); } }); } @Override protected TextInputControl getMessageTextField() { return messageTextField; } @Override protected WebView getMessagesWebView() { return messagesWebView; } @Override protected void onWebViewLoaded() { getMessagesWebView().getEngine().executeScript("document.getElementById('" + CHANNEL_TOPIC_CONTAINER_ID + "').style.display = \"none\";"); getMessagesWebView().getEngine().executeScript("document.getElementById('" + CHANNEL_TOPIC_SHADOW_CONTAINER_ID + "').style.display = \"none\";"); } @Override public void onChatMessage(ChatMessage chatMessage) { PlayerInfoBean playerInfoBean = playerService.getPlayerForUsername(chatMessage.getUsername()); ChatPrefs chatPrefs = preferencesService.getPreferences().getChat(); if (playerInfoBean != null && playerInfoBean.getSocialStatus() == FOE && chatPrefs.getHideFoeMessages()) { return; } super.onChatMessage(chatMessage); if (!hasFocus()) { audioController.playPrivateMessageSound(); showNotificationIfNecessary(chatMessage); setUnread(true); incrementUnreadMessagesCount(1); } } @VisibleForTesting void onPlayerDisconnected(String userName, ChatUser userItem) { if (userName.equals(getReceiver())) { userOffline = true; Platform.runLater(() -> onChatMessage(new ChatMessage(userName, Instant.now(), i18n.get("chat.operator") + ":", i18n.get("chat.privateMessage.playerLeft", userName), true))); } } @VisibleForTesting void onPlayerConnected(String userName, ChatUser userItem) { if (userOffline && userName.equals(getReceiver())) { userOffline = false; Platform.runLater(() -> onChatMessage(new ChatMessage(userName, Instant.now(), i18n.get("chat.operator") + ":", i18n.get("chat.privateMessage.playerReconnect", userName), true))); } } }