mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 21:15:32 +09:00
fix(api): re-evaluate link embeds when a message is edited (#1622)
This commit is contained in:
1 parent
6ef0f1fbe1
commit
78d81dd407
2 files changed
+16
-13
No files matched your search
@@ -295,10 +295,7 @@ export class MessagePersistenceService {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
const uploadUserId = params.attachmentUploadUserId;
|
const uploadUserId = params.attachmentUploadUserId;
|
||||||
assert(
|
assert(uploadUserId !== undefined, 'Attachment upload actor must be resolved before processing new attachments');
|
||||||
uploadUserId !== undefined,
|
|
||||||
'Attachment upload actor must be resolved before processing new attachments',
|
|
||||||
);
|
|
||||||
return this.attachmentService.computeAttachments({
|
return this.attachmentService.computeAttachments({
|
||||||
message: {
|
message: {
|
||||||
id: params.messageId,
|
id: params.messageId,
|
||||||
@@ -528,7 +525,8 @@ export class MessagePersistenceService {
|
|||||||
}
|
}
|
||||||
hasChanges = true;
|
hasChanges = true;
|
||||||
}
|
}
|
||||||
if (allowEmbeds && (data.embeds !== undefined || (data.content !== undefined && message.embeds.length === 0))) {
|
const embedsExplicitlyProvided = data.embeds !== undefined;
|
||||||
|
if (allowEmbeds && (embedsExplicitlyProvided || data.content !== undefined)) {
|
||||||
const attachmentsForResolution = updatedRowData.attachments || [];
|
const attachmentsForResolution = updatedRowData.attachments || [];
|
||||||
const resolvedEmbeds = this.embedAttachmentResolver.resolveEmbedAttachmentUrls({
|
const resolvedEmbeds = this.embedAttachmentResolver.resolveEmbedAttachmentUrls({
|
||||||
embeds: data.embeds,
|
embeds: data.embeds,
|
||||||
@@ -546,7 +544,15 @@ export class MessagePersistenceService {
|
|||||||
nsfwMode: isNSFWAllowed ? 'allow' : 'block',
|
nsfwMode: isNSFWAllowed ? 'allow' : 'block',
|
||||||
isBugHunterBot: params.isBugHunterBot,
|
isBugHunterBot: params.isBugHunterBot,
|
||||||
});
|
});
|
||||||
|
if (embedsExplicitlyProvided) {
|
||||||
updatedRowData.embeds = initialEmbeds;
|
updatedRowData.embeds = initialEmbeds;
|
||||||
|
} else {
|
||||||
|
const preservedEmbeds = message.embeds
|
||||||
|
.map((embed) => embed.toMessageEmbed())
|
||||||
|
.filter((embed) => embed.type === 'rich');
|
||||||
|
const nextEmbeds = [...preservedEmbeds, ...(initialEmbeds ?? [])];
|
||||||
|
updatedRowData.embeds = nextEmbeds.length > 0 ? nextEmbeds : null;
|
||||||
|
}
|
||||||
hasUncachedUrls = embedUrls;
|
hasUncachedUrls = embedUrls;
|
||||||
hasChanges = true;
|
hasChanges = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import type {IGatewayService} from '../../infrastructure/IGatewayService';
|
|||||||
import type {MediaProxyNsfwMode} from '../../infrastructure/IMediaService';
|
import type {MediaProxyNsfwMode} from '../../infrastructure/IMediaService';
|
||||||
import {Logger} from '../../Logger';
|
import {Logger} from '../../Logger';
|
||||||
import type {Channel} from '../../models/Channel';
|
import type {Channel} from '../../models/Channel';
|
||||||
import {Embed} from '../../models/Embed';
|
|
||||||
import {Message} from '../../models/Message';
|
import {Message} from '../../models/Message';
|
||||||
import {deleteMessageSearchDocuments} from '../../search/MessageSearchIndexCleanup';
|
import {deleteMessageSearchDocuments} from '../../search/MessageSearchIndexCleanup';
|
||||||
import * as UnfurlerUtils from '../../utils/UnfurlerUtils';
|
import * as UnfurlerUtils from '../../utils/UnfurlerUtils';
|
||||||
@@ -368,13 +367,15 @@ async function updateMessageEmbeds(
|
|||||||
orderedEmbeds: Array<MessageEmbed>,
|
orderedEmbeds: Array<MessageEmbed>,
|
||||||
): Promise<Message | null> {
|
): Promise<Message | null> {
|
||||||
const existingEmbeds = (freshMessage.embeds ?? []).map((embed) => embed.toMessageEmbed());
|
const existingEmbeds = (freshMessage.embeds ?? []).map((embed) => embed.toMessageEmbed());
|
||||||
if (areEmbedsEquivalent(existingEmbeds, orderedEmbeds)) {
|
const preservedEmbeds = existingEmbeds.filter((embed) => embed.type === 'rich');
|
||||||
|
const nextEmbeds = [...preservedEmbeds, ...orderedEmbeds];
|
||||||
|
if (areEmbedsEquivalent(existingEmbeds, nextEmbeds)) {
|
||||||
Logger.debug({messageId: freshMessage.id.toString()}, 'Embeds unchanged, skipping update');
|
Logger.debug({messageId: freshMessage.id.toString()}, 'Embeds unchanged, skipping update');
|
||||||
return freshMessage;
|
return freshMessage;
|
||||||
}
|
}
|
||||||
const messageWithEmbeds = new Message({
|
const messageWithEmbeds = new Message({
|
||||||
...freshMessage.toRow(),
|
...freshMessage.toRow(),
|
||||||
embeds: orderedEmbeds.length > 0 ? orderedEmbeds : null,
|
embeds: nextEmbeds.length > 0 ? nextEmbeds : null,
|
||||||
});
|
});
|
||||||
await channelRepository.updateEmbeds(messageWithEmbeds);
|
await channelRepository.updateEmbeds(messageWithEmbeds);
|
||||||
return messageWithEmbeds;
|
return messageWithEmbeds;
|
||||||
@@ -382,7 +383,6 @@ async function updateMessageEmbeds(
|
|||||||
|
|
||||||
interface DispatchEmbedUpdateParams {
|
interface DispatchEmbedUpdateParams {
|
||||||
latestMessage: Message;
|
latestMessage: Message;
|
||||||
orderedEmbeds: Array<MessageEmbed>;
|
|
||||||
channel: Channel;
|
channel: Channel;
|
||||||
guildId: GuildID | null;
|
guildId: GuildID | null;
|
||||||
gatewayService: IGatewayService;
|
gatewayService: IGatewayService;
|
||||||
@@ -390,15 +390,13 @@ interface DispatchEmbedUpdateParams {
|
|||||||
|
|
||||||
async function dispatchEmbedUpdate({
|
async function dispatchEmbedUpdate({
|
||||||
latestMessage,
|
latestMessage,
|
||||||
orderedEmbeds,
|
|
||||||
channel,
|
channel,
|
||||||
guildId,
|
guildId,
|
||||||
gatewayService,
|
gatewayService,
|
||||||
}: DispatchEmbedUpdateParams): Promise<void> {
|
}: DispatchEmbedUpdateParams): Promise<void> {
|
||||||
const embedObjects = orderedEmbeds.length > 0 ? orderedEmbeds.map((e) => new Embed(e)) : latestMessage.embeds;
|
|
||||||
const messageWithUpdatedEmbeds = new Message({
|
const messageWithUpdatedEmbeds = new Message({
|
||||||
...latestMessage.toRow(),
|
...latestMessage.toRow(),
|
||||||
embeds: embedObjects.map((e) => e.toMessageEmbed()),
|
embeds: latestMessage.embeds.map((e) => e.toMessageEmbed()),
|
||||||
});
|
});
|
||||||
const messageData = await buildBroadcastMessageData({
|
const messageData = await buildBroadcastMessageData({
|
||||||
channel,
|
channel,
|
||||||
@@ -512,7 +510,6 @@ const extractEmbeds: WorkerTaskHandler = async (payload, helpers) => {
|
|||||||
if (!(latestMessage.flags & MessageFlags.SUPPRESS_EMBEDS)) {
|
if (!(latestMessage.flags & MessageFlags.SUPPRESS_EMBEDS)) {
|
||||||
await dispatchEmbedUpdate({
|
await dispatchEmbedUpdate({
|
||||||
latestMessage,
|
latestMessage,
|
||||||
orderedEmbeds,
|
|
||||||
channel,
|
channel,
|
||||||
guildId,
|
guildId,
|
||||||
gatewayService,
|
gatewayService,
|
||||||
|
|||||||
Reference in new issue
Block a user