Update 0.1.9.2 - Fix BubleChat

This commit is contained in:
2025-10-04 19:15:27 +02:00
parent 7706ef1fa7
commit b59a579f56
13 changed files with 923 additions and 89 deletions

View File

@@ -2,7 +2,6 @@ using MareSynchronos.MareConfiguration;
using System.Collections.Generic;
using MareSynchronos.PlayerData.Pairs;
using System;
using System.Collections.Concurrent;
using System.Linq;
using Dalamud.Game.Text;
using Dalamud.Game.Text.SeStringHandling;
@@ -20,56 +19,25 @@ public class PartyListTypingService : DisposableMediatorSubscriberBase
private readonly IPartyList _partyList;
private readonly MareConfigService _configService;
private readonly PairManager _pairManager;
private readonly ConcurrentDictionary<string, DateTime> _typingUsers = new();
private readonly ConcurrentDictionary<string, DateTime> _typingNames = new(StringComparer.OrdinalIgnoreCase);
private readonly TypingIndicatorStateService _typingStateService;
private static readonly TimeSpan TypingDisplayTime = TimeSpan.FromSeconds(2);
private static readonly TimeSpan TypingDisplayDelay = TimeSpan.FromMilliseconds(500);
private static readonly TimeSpan TypingDisplayFade = TypingDisplayTime;
public PartyListTypingService(ILogger<PartyListTypingService> logger,
MareMediator mediator,
IPartyList partyList,
PairManager pairManager,
MareConfigService configService)
MareConfigService configService,
TypingIndicatorStateService typingStateService)
: base(logger, mediator)
{
_logger = logger;
_partyList = partyList;
_pairManager = pairManager;
_configService = configService;
_typingStateService = typingStateService;
Mediator.Subscribe<UserTypingStateMessage>(this, OnUserTyping);
}
private void OnUserTyping(UserTypingStateMessage msg)
{
var now = DateTime.UtcNow;
var uid = msg.Typing.User.UID;
var aliasOrUid = msg.Typing.User.AliasOrUID ?? uid;
if (msg.Typing.IsTyping)
{
_typingUsers[uid] = now;
_typingNames[aliasOrUid] = now;
}
else
{
_typingUsers.TryRemove(uid, out _);
_typingNames.TryRemove(aliasOrUid, out _);
}
}
private static bool HasTypingBubble(SeString name)
{
return name.Payloads.Any(p => p is IconPayload ip && ip.Icon == BitmapFontIcon.AutoTranslateBegin);
}
private static SeString WithTypingBubble(SeString baseName)
{
var ssb = new SeStringBuilder();
ssb.Append(baseName);
ssb.Add(new IconPayload(BitmapFontIcon.AutoTranslateBegin));
ssb.AddText("...");
ssb.Add(new IconPayload(BitmapFontIcon.AutoTranslateEnd));
return ssb.Build();
}
public void Draw()
@@ -91,22 +59,20 @@ public class PartyListTypingService : DisposableMediatorSubscriberBase
_logger.LogDebug(ex, "PartyListTypingService: failed to get visible users");
}
var activeTypers = _typingStateService.GetActiveTypers(TypingDisplayTime);
var now = DateTime.UtcNow;
foreach (var member in _partyList)
{
if (string.IsNullOrEmpty(member.Name?.TextValue)) continue;
var now = DateTime.UtcNow;
var displayName = member.Name.TextValue;
if (visibleByAlias.TryGetValue(displayName, out var uid)
&& _typingUsers.TryGetValue(uid, out var last)
&& (now - last) < TypingDisplayTime)
&& activeTypers.TryGetValue(uid, out var entry)
&& (now - entry.LastUpdate) <= TypingDisplayFade)
{
if (!HasTypingBubble(member.Name))
{
// IPartyMember.Name is read-only; rendering bubble here requires Addon-level modification. Keeping compile-safe for now.
_logger.LogDebug("PartyListTypingService: bubble would be shown for {name}", displayName);
}
_logger.LogDebug("PartyListTypingService: bubble would be shown for {name}", displayName);
}
}
}
}
}