* most of the groups refactoring on client * register OnMethods for group stuff * start implementing client (still pretty broken) * finish implementing new api first iteration * idk rework everything for pair shit (still WIP); goal is to remove PairedClients and GroupPairClients from ApiController * move everything to PairManager, remove dictionaries from APiController * remove admin stuff from client, cleanup * adjust reconnection handling, add new settings, todo still to remove access from old stuff that's marked obsolete from config * add back adding servers, fix intro ui * fix obsolete calls * adjust config namespace * add UI for setting animation/sound permissions to syncshells * add ConfigurationService to hot reload config on change from external * move transient data cache to configuration * add deleting service to ui * fix saving of transient resources * fix group pair user assignments * halt scanner when penumbra inactive, add visible/online/offline split to individual pairs and tags * add presence to syncshell ui * move fullpause from config to server config * fixes in code style * more codestyle * show info icon on player in shells, don't show icon when no changes from default state are made, add online notifs * fixes to intro UI --------- Co-authored-by: rootdarkarchon <root.darkarchon@outlook.com>
97 lines
3.2 KiB
C#
97 lines
3.2 KiB
C#
using MareSynchronos.API.Data;
|
|
using MareSynchronos.API.Dto.User;
|
|
using MareSynchronos.FileCache;
|
|
using MareSynchronos.Utils;
|
|
using MareSynchronos.WebAPI;
|
|
|
|
namespace MareSynchronos.Managers;
|
|
|
|
public class OnlinePlayerManager : IDisposable
|
|
{
|
|
private readonly ApiController _apiController;
|
|
private readonly DalamudUtil _dalamudUtil;
|
|
private readonly PlayerManager _playerManager;
|
|
private readonly FileCacheManager _fileDbManager;
|
|
private readonly PairManager _pairManager;
|
|
|
|
public OnlinePlayerManager(ApiController apiController, DalamudUtil dalamudUtil, PlayerManager playerManager, FileCacheManager fileDbManager, PairManager pairManager)
|
|
{
|
|
Logger.Verbose("Creating " + nameof(OnlinePlayerManager));
|
|
|
|
_apiController = apiController;
|
|
_dalamudUtil = dalamudUtil;
|
|
_playerManager = playerManager;
|
|
_fileDbManager = fileDbManager;
|
|
_pairManager = pairManager;
|
|
|
|
_playerManager.PlayerHasChanged += PlayerManagerOnPlayerHasChanged;
|
|
|
|
_dalamudUtil.LogIn += DalamudUtilOnLogIn;
|
|
_dalamudUtil.LogOut += DalamudUtilOnLogOut;
|
|
|
|
if (_dalamudUtil.IsLoggedIn)
|
|
{
|
|
DalamudUtilOnLogIn();
|
|
}
|
|
}
|
|
|
|
private void PlayerManagerOnPlayerHasChanged(CharacterData characterCache)
|
|
{
|
|
PushCharacterData(_pairManager.VisibleUsers);
|
|
}
|
|
|
|
private void DalamudUtilOnLogIn()
|
|
{
|
|
_dalamudUtil.DelayedFrameworkUpdate += FrameworkOnUpdate;
|
|
}
|
|
|
|
private void DalamudUtilOnLogOut()
|
|
{
|
|
_dalamudUtil.DelayedFrameworkUpdate -= FrameworkOnUpdate;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Logger.Verbose("Disposing " + nameof(OnlinePlayerManager));
|
|
|
|
_playerManager.PlayerHasChanged -= PlayerManagerOnPlayerHasChanged;
|
|
_dalamudUtil.LogIn -= DalamudUtilOnLogIn;
|
|
_dalamudUtil.LogOut -= DalamudUtilOnLogOut;
|
|
_dalamudUtil.DelayedFrameworkUpdate -= FrameworkOnUpdate;
|
|
}
|
|
|
|
private void FrameworkOnUpdate()
|
|
{
|
|
if (!_dalamudUtil.IsPlayerPresent || !_apiController.IsConnected) return;
|
|
|
|
var playerCharacters = _dalamudUtil.GetPlayerCharacters();
|
|
var onlinePairs = _pairManager.OnlineUserPairs;
|
|
foreach (var pChar in playerCharacters)
|
|
{
|
|
var pair = _pairManager.FindPair(pChar);
|
|
if (pair == null) continue;
|
|
|
|
pair.InitializePair(pChar.Address, pChar.Name.ToString());
|
|
}
|
|
|
|
var newlyVisiblePlayers = onlinePairs.Select(v => v.CachedPlayer)
|
|
.Where(p => p != null && p.PlayerCharacter != IntPtr.Zero && p.IsVisible && !p.WasVisible).Select(p => (UserDto)p!.OnlineUser)
|
|
.ToList();
|
|
if (newlyVisiblePlayers.Any())
|
|
{
|
|
Logger.Verbose("Has new visible players, pushing character data");
|
|
PushCharacterData(newlyVisiblePlayers.Select(c => c.User).ToList());
|
|
}
|
|
}
|
|
|
|
private void PushCharacterData(List<UserData> visiblePlayers)
|
|
{
|
|
if (visiblePlayers.Any() && _playerManager.LastCreatedCharacterData != null)
|
|
{
|
|
Task.Run(async () =>
|
|
{
|
|
await _apiController.PushCharacterData(_playerManager.LastCreatedCharacterData, visiblePlayers).ConfigureAwait(false);
|
|
});
|
|
}
|
|
}
|
|
} |