99 lines
3.4 KiB
C#
99 lines
3.4 KiB
C#
using MareSynchronos.API.Data;
|
|
using MareSynchronos.API.Dto.User;
|
|
using MareSynchronos.FileCache;
|
|
using MareSynchronos.Mediator;
|
|
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;
|
|
private readonly MareMediator _mediator;
|
|
|
|
public OnlinePlayerManager(ApiController apiController, DalamudUtil dalamudUtil, PlayerManager playerManager, FileCacheManager fileDbManager, PairManager pairManager, MareMediator mediator)
|
|
{
|
|
Logger.Verbose("Creating " + nameof(OnlinePlayerManager));
|
|
|
|
_apiController = apiController;
|
|
_dalamudUtil = dalamudUtil;
|
|
_playerManager = playerManager;
|
|
_fileDbManager = fileDbManager;
|
|
_pairManager = pairManager;
|
|
_mediator = mediator;
|
|
_playerManager.PlayerHasChanged += PlayerManagerOnPlayerHasChanged;
|
|
|
|
_mediator.Subscribe<DalamudLoginMessage>(this, (_) => DalamudUtilOnLogIn());
|
|
_mediator.Subscribe<DalamudLogoutMessage>(this, (_) => DalamudUtilOnLogOut());
|
|
|
|
if (_dalamudUtil.IsLoggedIn)
|
|
{
|
|
DalamudUtilOnLogIn();
|
|
}
|
|
}
|
|
|
|
private void PlayerManagerOnPlayerHasChanged(CharacterData characterCache)
|
|
{
|
|
PushCharacterData(_pairManager.VisibleUsers);
|
|
}
|
|
|
|
private void DalamudUtilOnLogIn()
|
|
{
|
|
_mediator.Subscribe<DelayedFrameworkUpdateMessage>(this, (_) => FrameworkOnUpdate());
|
|
}
|
|
|
|
private void DalamudUtilOnLogOut()
|
|
{
|
|
_mediator.Unsubscribe<DelayedFrameworkUpdateMessage>(this);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Logger.Verbose("Disposing " + nameof(OnlinePlayerManager));
|
|
|
|
_playerManager.PlayerHasChanged -= PlayerManagerOnPlayerHasChanged;
|
|
_mediator.Unsubscribe<DalamudLoginMessage>(this);
|
|
_mediator.Unsubscribe<DalamudLogoutMessage>(this);
|
|
_mediator.Unsubscribe<DelayedFrameworkUpdateMessage>(this);
|
|
}
|
|
|
|
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);
|
|
});
|
|
}
|
|
}
|
|
} |