Store MAX chat URLs for direct opens

This commit is contained in:
sevenhill
2026-07-05 15:17:11 +03:00
parent 64764e99ef
commit bb92651714
11 changed files with 593 additions and 78 deletions
+18 -6
View File
@@ -59,7 +59,7 @@ public sealed class MaxOutboxService(
MaxSendResult result;
try
{
result = await SendToMaxAsync(chat.ExternalId, message, cancellationToken);
result = await SendToMaxAsync(chat, message, cancellationToken);
}
catch (Exception ex)
{
@@ -74,6 +74,12 @@ public sealed class MaxOutboxService(
: result.ExternalMessageId;
message.DeliveryState = MessageDeliveryState.Sent;
message.Error = null;
if (!string.IsNullOrWhiteSpace(result.ChatUrl) &&
!string.Equals(chat.WebUrl, result.ChatUrl, StringComparison.Ordinal))
{
chat.WebUrl = result.ChatUrl;
chat.UpdatedAt = DateTimeOffset.UtcNow;
}
}
else
{
@@ -86,14 +92,16 @@ public sealed class MaxOutboxService(
return true;
}
private async Task<MaxSendResult> SendToMaxAsync(string externalChatId, Message message, CancellationToken cancellationToken)
private async Task<MaxSendResult> SendToMaxAsync(Chat chat, Message message, CancellationToken cancellationToken)
{
var externalChatId = chat.ExternalId!;
var chatUrl = chat.WebUrl;
var attachments = message.Attachments.OrderBy(attachment => attachment.SortOrder).ToArray();
if (attachments.Length == 0)
{
return string.IsNullOrWhiteSpace(message.Text)
? new MaxSendResult(false, null, "Text is empty.")
: await maxBridge.SendTextAsync(externalChatId, message.Text, cancellationToken);
: await maxBridge.SendTextAsync(externalChatId, chatUrl, message.Text, cancellationToken);
}
MaxSendResult? lastResult = null;
@@ -108,7 +116,11 @@ public sealed class MaxOutboxService(
}
var caption = attachment.SortOrder == 0 ? message.Text ?? "" : "";
var result = await maxBridge.SendAttachmentAsync(externalChatId, path, caption, cancellationToken);
var result = await maxBridge.SendAttachmentAsync(externalChatId, chatUrl, path, caption, cancellationToken);
if (!string.IsNullOrWhiteSpace(result.ChatUrl))
{
chatUrl = result.ChatUrl;
}
lastResult = result;
if (!result.Success && !string.IsNullOrWhiteSpace(result.Error))
{
@@ -117,8 +129,8 @@ public sealed class MaxOutboxService(
}
return errors.Count == 0
? new MaxSendResult(true, lastResult?.ExternalMessageId, null)
: new MaxSendResult(false, lastResult?.ExternalMessageId, string.Join("; ", errors.Distinct()));
? new MaxSendResult(true, lastResult?.ExternalMessageId, null, chatUrl)
: new MaxSendResult(false, lastResult?.ExternalMessageId, string.Join("; ", errors.Distinct()), chatUrl);
}
private async Task MarkFailedAsync(Message message, string error, CancellationToken cancellationToken)