package envoy.client.util; import java.util.logging.*; import javafx.scene.control.*; import javafx.scene.control.Alert.AlertType; import dev.kske.eventbus.core.EventBus; import envoy.data.*; import envoy.data.User.UserStatus; import envoy.event.*; import envoy.event.contact.UserOperation; import envoy.util.EnvoyLog; import envoy.client.data.Context; import envoy.client.event.*; import envoy.client.helper.*; import envoy.client.ui.SceneInfo; import envoy.client.ui.controller.ChatScene; /** * Contains methods that change something about the currently logged in user. * * @author Leon Hofmeister * @since Envoy Client v0.3-beta */ public final class UserUtil { private static final Context context = Context.getInstance(); private static final Logger logger = EnvoyLog.getLogger(UserUtil.class); private UserUtil() {} /** * Logs the current user out and reopens {@link envoy.client.ui.controller.LoginScene}. * * @since Envoy Client v0.2-beta */ public static void logout() { final var alert = new Alert(AlertType.CONFIRMATION); alert.setTitle("Logout?"); alert.setContentText("Are you sure you want to log out?"); AlertHelper.confirmAction(alert, () -> { EnvoyLog.getLogger(ShutdownHelper.class).log(Level.INFO, "A logout was requested"); EventBus.getInstance().dispatch(new EnvoyCloseEvent()); EventBus.getInstance().dispatch(new Logout()); context.getSceneContext().load(SceneInfo.LOGIN_SCENE); logger.log(Level.INFO, "A logout occurred."); }); } /** * Notifies the application that the status of the currently logged in user has changed. * * @param newStatus the new status * @since Envoy Client v0.3-beta */ public static void changeStatus(UserStatus newStatus) { // Sending the already active status is a valid action if (newStatus.equals(context.getLocalDB().getUser().getStatus())) return; else { EventBus.getInstance().dispatch(new OwnStatusChange(newStatus)); if (context.getClient().isOnline()) context.getClient() .send(new UserStatusChange(context.getLocalDB().getUser().getID(), newStatus)); logger.log(Level.INFO, "A manual status change occurred."); } } /** * Removes the given contact. * * @param block the contact that should be removed * @since Envoy Client v0.3-beta */ public static void disableContact(Contact block) { if (!context.getClient().isOnline() || block == null) return; else { final var alert = new Alert(AlertType.CONFIRMATION); alert.setContentText("Are you sure you want to " + (block instanceof User ? "block " : "leave group ") + block.getName() + "?"); AlertHelper.confirmAction(alert, () -> { final var isUser = block instanceof User; context.getClient() .send(isUser ? new UserOperation((User) block, ElementOperation.REMOVE) : new GroupResize(context.getLocalDB().getUser(), (Group) block, ElementOperation.REMOVE)); if (!isUser) block.getContacts().remove(context.getLocalDB().getUser()); EventBus.getInstance().dispatch(new ContactDisabled(block)); logger.log(Level.INFO, isUser ? "A user was blocked." : "The user left a group."); }); } } /** * Deletes the given contact with all his messages entirely. * * @param delete the contact to delete * @since Envoy Client v0.3-beta */ public static void deleteContact(Contact delete) { if (delete == null) return; else { final var alert = new Alert(AlertType.CONFIRMATION); alert.setContentText("Are you sure you want to delete " + delete.getName() + " entirely? All messages with this contact will be deleted. This action cannot be undone."); AlertHelper.confirmAction(alert, () -> { context.getLocalDB().getUsers().remove(delete.getName()); context.getLocalDB().getChats() .removeIf(chat -> chat.getRecipient().equals(delete)); if (context.getSceneContext().getController() instanceof ChatScene) ((ChatScene) context.getSceneContext().getController()).resetState(); logger.log(Level.INFO, "A contact with all his messages was deleted."); }); } } /** * Deletes anything pointing to this user, independent of client or server. Will do nothing if * the client is currently offline. * * @since Envoy Client v0.3-beta */ public static void deleteAccount() { // Show the first wall of defense, if not disabled by the user final var outerAlert = new Alert(AlertType.CONFIRMATION); outerAlert.setContentText( "Are you sure you want to delete your account entirely? This action can seriously not be undone."); outerAlert.setTitle("Delete Account?"); AlertHelper.confirmAction(outerAlert, () -> { // Show the final wall of defense in every case final var lastAlert = new Alert(AlertType.WARNING, "Do you REALLY want to delete your account? Last Warning. Proceed?", ButtonType.CANCEL, ButtonType.OK); lastAlert.setTitle("Delete Account?"); lastAlert.showAndWait().filter(ButtonType.OK::equals).ifPresent(b2 -> { // Delete the account // TODO: Notify server of account deletion context.getLocalDB().delete(); logger.log(Level.INFO, "The user just deleted his account. Goodbye."); ShutdownHelper.exit(true); }); }); } }