package com.faforever.client.user; import com.faforever.client.api.FafApiAccessor; import com.faforever.client.preferences.PreferencesService; import com.faforever.client.remote.FafService; import com.faforever.client.remote.domain.LoginMessage; import com.faforever.client.user.event.LoginSuccessEvent; import com.google.common.eventbus.EventBus; import javafx.beans.property.BooleanProperty; import javafx.beans.property.ReadOnlyStringProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.lang.invoke.MethodHandles; import java.util.concurrent.CompletionStage; public class UserServiceImpl implements UserService { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private final StringProperty username; private final BooleanProperty loggedIn; @Resource FafService fafService; @Resource PreferencesService preferencesService; @Resource FafApiAccessor fafApiAccessor; @Resource EventBus eventBus; private String password; private Integer uid; public UserServiceImpl() { loggedIn = new SimpleBooleanProperty(); username = new SimpleStringProperty(); } @Override public BooleanProperty loggedInProperty() { return loggedIn; } @Override public CompletionStage<Void> login(String username, String password, boolean autoLogin) { preferencesService.getPreferences().getLogin() .setUsername(username) .setPassword(password) .setAutoLogin(autoLogin); preferencesService.storeInBackground(); this.password = password; return fafService.connectAndLogIn(username, password) .thenAccept(loginInfo -> { uid = loginInfo.getId(); // Because of different case (upper/lower) String login = loginInfo.getLogin(); UserServiceImpl.this.username.set(login); preferencesService.getPreferences().getLogin().setUsername(login); preferencesService.storeInBackground(); fafApiAccessor.authorize(loginInfo.getId()); loggedIn.set(true); eventBus.post(new LoginSuccessEvent(login)); }) .whenComplete((aVoid, throwable) -> { if (throwable != null) { logger.warn("Error during login", throwable); fafService.disconnect(); } }); } @Override public String getUsername() { return username.get(); } @Override public String getPassword() { return password; } @Override public Integer getUid() { return uid; } @Override public void cancelLogin() { fafService.disconnect(); } @Override public void logOut() { logger.info("Logging out"); fafService.disconnect(); loggedIn.set(false); } @Override public ReadOnlyStringProperty currentUserProperty() { return username; } @PostConstruct void postConstruct() { fafService.addOnMessageListener(LoginMessage.class, loginInfo -> uid = loginInfo.getId()); } }