diff --git a/MareSynchronos/Managers/CharacterManager.cs b/MareSynchronos/Managers/CharacterManager.cs index 93d5923..7f75f5f 100644 --- a/MareSynchronos/Managers/CharacterManager.cs +++ b/MareSynchronos/Managers/CharacterManager.cs @@ -45,7 +45,7 @@ namespace MareSynchronos.Managers private string _lastSentHash = string.Empty; private Task? _playerChangedTask = null; - private HashSet _onlineWhitelistedUsers = new(); + private HashSet _onlinePairedUsers = new(); public CharacterManager(ClientState clientState, Framework framework, ApiController apiController, ObjectTable objectTable, IpcManager ipcManager, FileReplacementFactory factory, Configuration pluginConfiguration) @@ -148,14 +148,14 @@ namespace MareSynchronos.Managers _apiController.Connected -= ApiController_Connected; _apiController.Disconnected -= ApiController_Disconnected; _apiController.CharacterReceived -= ApiControllerOnCharacterReceived; - _apiController.RemovedFromWhitelist -= ApiControllerOnRemovedFromWhitelist; - _apiController.AddedToWhitelist -= ApiControllerOnAddedToWhitelist; - _apiController.WhitelistedPlayerOffline -= ApiControllerOnWhitelistedPlayerOffline; + _apiController.UnpairedFromOther -= ApiControllerOnUnpairedFromOther; + _apiController.PairedWithOther -= ApiControllerOnPairedWithOther; + _apiController.PairedClientOffline -= ApiControllerOnPairedClientOffline; _watcher.Disable(); _watcher.PlayerChanged -= Watcher_PlayerChanged; _watcher?.Dispose(); - foreach (var character in _onlineWhitelistedUsers) + foreach (var character in _onlinePairedUsers) { RestoreCharacter(character); } @@ -169,7 +169,7 @@ namespace MareSynchronos.Managers public async Task UpdatePlayersFromService(Dictionary currentLocalPlayers) { PluginLog.Debug("Updating local players from service"); - currentLocalPlayers = currentLocalPlayers.Where(k => _onlineWhitelistedUsers.Contains(k.Key)) + currentLocalPlayers = currentLocalPlayers.Where(k => _onlinePairedUsers.Contains(k.Key)) .ToDictionary(k => k.Key, k => k.Value); await _apiController.GetCharacterData(currentLocalPlayers .ToDictionary( @@ -190,10 +190,10 @@ namespace MareSynchronos.Managers _apiController.Connected += ApiController_Connected; _apiController.Disconnected += ApiController_Disconnected; _apiController.CharacterReceived += ApiControllerOnCharacterReceived; - _apiController.RemovedFromWhitelist += ApiControllerOnRemovedFromWhitelist; - _apiController.AddedToWhitelist += ApiControllerOnAddedToWhitelist; - _apiController.WhitelistedPlayerOffline += ApiControllerOnWhitelistedPlayerOffline; - _apiController.WhitelistedPlayerOnline += ApiControllerOnWhitelistedPlayerOnline; + _apiController.UnpairedFromOther += ApiControllerOnUnpairedFromOther; + _apiController.PairedWithOther += ApiControllerOnPairedWithOther; + _apiController.PairedClientOffline += ApiControllerOnPairedClientOffline; + _apiController.PairedClientOnline += ApiControllerOnPairedClientOnline; PluginLog.Debug("Watching Player, ApiController is Connected: " + _apiController.IsConnected); if (_apiController.IsConnected) @@ -210,10 +210,10 @@ namespace MareSynchronos.Managers Task.WaitAll(apiTask); - _onlineWhitelistedUsers = new HashSet(apiTask.Result); + _onlinePairedUsers = new HashSet(apiTask.Result); var assignTask = AssignLocalPlayersData(); Task.WaitAll(assignTask); - PluginLog.Debug("Online and whitelisted users: " + string.Join(",", _onlineWhitelistedUsers)); + PluginLog.Debug("Online and paired users: " + string.Join(",", _onlinePairedUsers)); _framework.Update += Framework_Update; _ipcManager.PenumbraRedrawEvent += IpcManager_PenumbraRedrawEvent; @@ -226,7 +226,7 @@ namespace MareSynchronos.Managers _framework.Update -= Framework_Update; _ipcManager.PenumbraRedrawEvent -= IpcManager_PenumbraRedrawEvent; _clientState.TerritoryChanged -= ClientState_TerritoryChanged; - foreach (var character in _onlineWhitelistedUsers) + foreach (var character in _onlinePairedUsers) { RestoreCharacter(character); } @@ -234,14 +234,14 @@ namespace MareSynchronos.Managers _lastSentHash = string.Empty; } - private void ApiControllerOnAddedToWhitelist(object? sender, EventArgs e) + private void ApiControllerOnPairedWithOther(object? sender, EventArgs e) { var characterHash = (string?)sender; if (string.IsNullOrEmpty(characterHash)) return; var players = GetLocalPlayers(); if (players.ContainsKey(characterHash)) { - PluginLog.Debug("Removed from whitelist, restoring data for " + characterHash); + PluginLog.Debug("Removed pairing, restoring data for " + characterHash); _ = _apiController.GetCharacterData(new Dictionary { { characterHash, (int)players[characterHash].ClassJob.Id } }); } } @@ -322,7 +322,7 @@ namespace MareSynchronos.Managers _ipcManager.PenumbraRedraw(otherPlayerName); } - private void ApiControllerOnRemovedFromWhitelist(object? sender, EventArgs e) + private void ApiControllerOnUnpairedFromOther(object? sender, EventArgs e) { var characterHash = (string?)sender; if (string.IsNullOrEmpty(characterHash)) return; @@ -343,23 +343,23 @@ namespace MareSynchronos.Managers if (player.Key != characterHash) continue; var playerName = player.Value.Name.ToString(); RestorePreviousCharacter(playerName); - PluginLog.Debug("Removed from whitelist, restoring glamourer state for " + playerName); + PluginLog.Debug("Removed from pairing, restoring glamourer state for " + playerName); _ipcManager.PenumbraRemoveTemporaryCollection(playerName); _ipcManager.GlamourerRevertCharacterCustomization(playerName); break; } } - private void ApiControllerOnWhitelistedPlayerOffline(object? sender, EventArgs e) + private void ApiControllerOnPairedClientOffline(object? sender, EventArgs e) { PluginLog.Debug("Player offline: " + sender!); - _onlineWhitelistedUsers.Remove((string)sender!); + _onlinePairedUsers.Remove((string)sender!); } - private void ApiControllerOnWhitelistedPlayerOnline(object? sender, EventArgs e) + private void ApiControllerOnPairedClientOnline(object? sender, EventArgs e) { PluginLog.Debug("Player online: " + sender!); - _onlineWhitelistedUsers.Add((string)sender!); + _onlinePairedUsers.Add((string)sender!); } private async Task AssignLocalPlayersData() @@ -428,7 +428,7 @@ namespace MareSynchronos.Managers var pObj = (PlayerCharacter)obj; var hashedName = Crypto.GetHash256(pObj.Name.ToString() + pObj.HomeWorld.Id.ToString()); - if (!_onlineWhitelistedUsers.Contains(hashedName)) continue; + if (!_onlinePairedUsers.Contains(hashedName)) continue; localPlayersList.Add(hashedName); if (!_cachedLocalPlayers.ContainsKey(hashedName)) newPlayers[hashedName] = pObj; diff --git a/MareSynchronos/UI/IntroUI.cs b/MareSynchronos/UI/IntroUI.cs index c5c5b24..9073144 100644 --- a/MareSynchronos/UI/IntroUI.cs +++ b/MareSynchronos/UI/IntroUI.cs @@ -59,7 +59,7 @@ namespace MareSynchronos.UI ImGui.Text("Welcome to Mare Synchronos!"); ImGui.SetWindowFontScale(1.0f); ImGui.Separator(); - UIShared.TextWrapped("Mare Synchronos is a plugin that will replicate your full current character state including all Penumbra mods to other whitelisted Mare Synchronos users. " + + UIShared.TextWrapped("Mare Synchronos is a plugin that will replicate your full current character state including all Penumbra mods to other paired Mare Synchronos users. " + "Note that you will have to have Penumbra as well as Glamourer installed to use this plugin."); UIShared.TextWrapped("We will have to setup a few things first before you can start using this plugin. Click on next to continue."); @@ -90,11 +90,11 @@ namespace MareSynchronos.UI "Files present on the service that already represent your active mod files will not be uploaded again."); ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudRed); UIShared.TextWrapped("The mod files you are uploading are confidential and will not be distributed to parties other than the ones who are requesting the exact same mod files. " + - "Please think about who you are going to whitelist since it is unavoidable that they will receive and locally cache the necessary mod files that you have currently in use. " + + "Please think about who you are going to pair since it is unavoidable that they will receive and locally cache the necessary mod files that you have currently in use. " + "Locally cached mod files will have arbitrary file names to discourage attempts at replicating the original mod."); ImGui.PopStyleColor(); ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudYellow); - UIShared.TextWrapped("The plugin creator tried their best to keep you secure. However, there is no guarantee for 100% security. Do not blindly add everyone to your whitelist."); + UIShared.TextWrapped("The plugin creator tried their best to keep you secure. However, there is no guarantee for 100% security. Do not blindly pair your client with everyone."); ImGui.PopStyleColor(); UIShared.TextWrapped("Mod files that are saved on the service will remain on the service as long as there are requests for the files from clients. " + "After a period of not being used, the mod files will be automatically deleted. " + diff --git a/MareSynchronos/UI/PluginUI.cs b/MareSynchronos/UI/PluginUI.cs index 841dacc..52f0989 100644 --- a/MareSynchronos/UI/PluginUI.cs +++ b/MareSynchronos/UI/PluginUI.cs @@ -1,14 +1,10 @@ using Dalamud.Interface; using Dalamud.Interface.Colors; using Dalamud.Interface.Windowing; -using Dalamud.Logging; using ImGuiNET; using MareSynchronos.WebAPI; using System; using System.Linq; -using System.Numerics; -using Dalamud.Configuration; -using MareSynchronos.API; namespace MareSynchronos.UI { @@ -80,9 +76,9 @@ namespace MareSynchronos.UI { ImGui.SetClipboardText(_apiController.UID); } - ImGui.Text("Share this UID to other Mare users so they can add you to their whitelist."); + ImGui.Text("Share this UID to other Mare users so they pair their client with yours."); ImGui.Separator(); - DrawWhiteListContent(); + DrawPairedClientsContent(); DrawFileCacheSettings(); DrawCurrentTransfers(); } @@ -172,12 +168,12 @@ namespace MareSynchronos.UI } } - private void DrawWhiteListContent() + private void DrawPairedClientsContent() { if (!_apiController.ServerAlive) return; - if (ImGui.TreeNode("Whitelist Configuration")) + if (ImGui.TreeNode("PairedWithOther Clients")) { - if (ImGui.BeginTable("WhitelistTable", 6)) + if (ImGui.BeginTable("PairedClientsTable", 6)) { ImGui.TableSetupColumn("Pause", ImGuiTableColumnFlags.WidthFixed, 50); ImGui.TableSetupColumn("UID", ImGuiTableColumnFlags.WidthFixed, 110); @@ -187,14 +183,16 @@ namespace MareSynchronos.UI ImGui.TableSetupColumn("", ImGuiTableColumnFlags.WidthFixed, 70); ImGui.TableHeadersRow(); - foreach (var item in _apiController.WhitelistEntries.ToList()) + foreach (var item in _apiController.PairedClients.ToList()) { ImGui.TableNextColumn(); - bool isPaused = item.IsPaused; - if (ImGui.Checkbox("##paused" + item.OtherUID, ref isPaused)) + ImGui.PushFont(UiBuilder.IconFont); + string pauseIcon = item.IsPaused ? FontAwesomeIcon.Play.ToIconString() : FontAwesomeIcon.Pause.ToIconString(); + if (ImGui.Button(pauseIcon + "##paused" + item.OtherUID)) { - _ = _apiController.SendWhitelistPauseChange(item.OtherUID, isPaused); + _ = _apiController.SendPairedClientPauseChange(item.OtherUID, !item.IsPaused); } + ImGui.PopFont(); ImGui.TableNextColumn(); ImGui.TextColored( @@ -202,7 +200,7 @@ namespace MareSynchronos.UI item.OtherUID); ImGui.TableNextColumn(); ImGui.TextColored(UIShared.GetBoolColor(item.IsSynced), - !item.IsSynced ? "Has not added you" : "Whitelisted"); + !item.IsSynced ? "Has not added you" : "PairedWithOther"); ImGui.TableNextColumn(); string pauseYou = item.IsPaused ? "You paused them" : ""; string pauseThey = item.IsPausedFromOthers ? "They paused you" : ""; @@ -219,11 +217,13 @@ namespace MareSynchronos.UI _configuration.Save(); } ImGui.TableNextColumn(); - if (ImGui.Button("Delete##" + item.OtherUID)) + ImGui.PushFont(UiBuilder.IconFont); + if (ImGui.Button(FontAwesomeIcon.Trash.ToIconString() + "##" + item.OtherUID)) { - _ = _apiController.SendWhitelistRemoval(item.OtherUID); - _apiController.WhitelistEntries.Remove(item); + _ = _apiController.SendPairedClientRemoval(item.OtherUID); + _apiController.PairedClients.Remove(item); } + ImGui.PopFont(); ImGui.TableNextRow(); } @@ -231,26 +231,22 @@ namespace MareSynchronos.UI ImGui.EndTable(); } - var whitelistEntry = tempDto.OtherUID; + var pairedClientEntry = tempNameUID; ImGui.SetNextItemWidth(200); - if (ImGui.InputText("UID", ref whitelistEntry, 20)) + if (ImGui.InputText("UID", ref pairedClientEntry, 20)) { - tempDto.OtherUID = whitelistEntry; + tempNameUID = pairedClientEntry; } ImGui.SameLine(); - if (ImGui.Button("Add to whitelist")) + ImGui.PushFont(UiBuilder.IconFont); + if (ImGui.Button(FontAwesomeIcon.Plus.ToIconString()+"##addToPairedClients")) { - if (_apiController.WhitelistEntries.All(w => w.OtherUID != tempDto.OtherUID)) + if (_apiController.PairedClients.All(w => w.OtherUID != tempNameUID)) { - _apiController.WhitelistEntries.Add(new WhitelistDto() - { - OtherUID = tempDto.OtherUID - }); + _ = _apiController.SendPairedClientAddition(tempNameUID); - _ = _apiController.SendWhitelistAddition(tempDto.OtherUID); - - tempDto.OtherUID = string.Empty; + tempNameUID = string.Empty; } } @@ -258,6 +254,6 @@ namespace MareSynchronos.UI } } - private WhitelistDto tempDto = new WhitelistDto() { OtherUID = string.Empty }; + private string tempNameUID = string.Empty; } } diff --git a/MareSynchronos/WebAPI/ApiController.cs b/MareSynchronos/WebAPI/ApiController.cs index 9d3726e..6ce540c 100644 --- a/MareSynchronos/WebAPI/ApiController.cs +++ b/MareSynchronos/WebAPI/ApiController.cs @@ -68,12 +68,12 @@ namespace MareSynchronos.WebAPI public event EventHandler? Connected; public event EventHandler? Disconnected; public event EventHandler? CharacterReceived; - public event EventHandler? RemovedFromWhitelist; - public event EventHandler? AddedToWhitelist; - public event EventHandler? WhitelistedPlayerOnline; - public event EventHandler? WhitelistedPlayerOffline; + public event EventHandler? UnpairedFromOther; + public event EventHandler? PairedWithOther; + public event EventHandler? PairedClientOnline; + public event EventHandler? PairedClientOffline; - public List WhitelistEntries { get; set; } = new List(); + public List PairedClients { get; set; } = new(); readonly CancellationTokenSource cts; private HubConnection? _heartbeatHub; @@ -143,8 +143,8 @@ namespace MareSynchronos.WebAPI private async Task LoadInitialData() { - var whiteList = await _userHub!.InvokeAsync>("GetWhitelist"); - WhitelistEntries = whiteList.ToList(); + var pairedClients = await _userHub!.InvokeAsync>("GetPairedClients"); + PairedClients = pairedClients.ToList(); } public void RestartHeartbeat() @@ -215,10 +215,10 @@ namespace MareSynchronos.WebAPI }) .Build(); await _userHub.StartAsync(); - _userHub.On("UpdateWhitelist", UpdateLocalWhitelist); + _userHub.On("UpdateClientPairs", UpdateLocalClientPairs); _userHub.On("ReceiveCharacterData", ReceiveCharacterData); - _userHub.On("RemoveOnlineWhitelistedPlayer", (s) => WhitelistedPlayerOffline?.Invoke(s, EventArgs.Empty)); - _userHub.On("AddOnlineWhitelistedPlayer", (s) => WhitelistedPlayerOnline?.Invoke(s, EventArgs.Empty)); + _userHub.On("RemoveOnlinePairedPlayer", (s) => PairedClientOffline?.Invoke(s, EventArgs.Empty)); + _userHub.On("AddOnlinePairedPlayer", (s) => PairedClientOnline?.Invoke(s, EventArgs.Empty)); PluginLog.Debug("Creating File Hub"); _fileHub = new HubConnectionBuilder() @@ -239,19 +239,19 @@ namespace MareSynchronos.WebAPI await _fileHub.StartAsync(cts.Token); } - private void UpdateLocalWhitelist(WhitelistDto dto, string characterIdentifier) + private void UpdateLocalClientPairs(ClientPairDto dto, string characterIdentifier) { - var entry = WhitelistEntries.SingleOrDefault(e => e.OtherUID == dto.OtherUID); + var entry = PairedClients.SingleOrDefault(e => e.OtherUID == dto.OtherUID); if (entry == null) { - RemovedFromWhitelist?.Invoke(characterIdentifier, EventArgs.Empty); + UnpairedFromOther?.Invoke(characterIdentifier, EventArgs.Empty); return; } if ((entry.IsPausedFromOthers != dto.IsPausedFromOthers || entry.IsSynced != dto.IsSynced || entry.IsPaused != dto.IsPaused) && !dto.IsPaused && dto.IsSynced && !dto.IsPausedFromOthers) { - AddedToWhitelist?.Invoke(characterIdentifier, EventArgs.Empty); + PairedWithOther?.Invoke(characterIdentifier, EventArgs.Empty); } entry.IsPaused = dto.IsPaused; @@ -260,7 +260,7 @@ namespace MareSynchronos.WebAPI if (dto.IsPaused || dto.IsPausedFromOthers || !dto.IsSynced) { - RemovedFromWhitelist?.Invoke(characterIdentifier, EventArgs.Empty); + UnpairedFromOther?.Invoke(characterIdentifier, EventArgs.Empty); } } @@ -445,37 +445,22 @@ namespace MareSynchronos.WebAPI hashedCharacterNames); } - public async Task SendWhitelistPauseChange(string uid, bool paused) + public async Task SendPairedClientPauseChange(string uid, bool paused) { if (!IsConnected || SecretKey == "-") return; - await _userHub!.SendAsync("SendWhitelistPauseChange", uid, paused); + await _userHub!.SendAsync("SendPairedClientPauseChange", uid, paused); } - public async Task SendWhitelistAddition(string uid) + public async Task SendPairedClientAddition(string uid) { if (!IsConnected || SecretKey == "-") return; - await _userHub!.SendAsync("SendWhitelistAddition", uid); + await _userHub!.SendAsync("SendPairedClientAddition", uid); } - public async Task SendWhitelistRemoval(string uid) + public async Task SendPairedClientRemoval(string uid) { if (!IsConnected || SecretKey == "-") return; - await _userHub!.SendAsync("SendWhitelistRemoval", uid); - } - - public async Task SendWhitelist() - { - if (!IsConnected || SecretKey == "-") return; - await _userHub!.SendAsync("SendWhitelist", WhitelistEntries.ToList()); - WhitelistEntries = (await _userHub!.InvokeAsync>("GetWhitelist")).ToList(); - } - - public async Task> GetWhitelist() - { - PluginLog.Debug("Getting whitelist from service " + ApiUri); - - List whitelist = new(); - return whitelist; + await _userHub!.SendAsync("SendPairedClientRemoval", uid); } public void Dispose() @@ -488,11 +473,5 @@ namespace MareSynchronos.WebAPI { return await _userHub!.InvokeAsync>("SendCharacterNameHash", hashedName); } - - public async Task SendVisibilityData(List visibilities) - { - if (!IsConnected) return; - await _userHub!.SendAsync("SendVisibilityList", visibilities); - } } }