mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-11-15 01:12:36 -06:00
48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
import { notify } from "~/features/notifications/core/notify.server";
|
|
import * as NotificationRepository from "~/features/notifications/NotificationRepository.server";
|
|
import { hasPermission } from "~/modules/permissions/utils";
|
|
import { avatarUrl } from "~/utils/urls";
|
|
import type * as ChatRoomResolver from "./ChatRoomResolver.server";
|
|
import type { ChatMessageWithAuthor } from "./chat-types";
|
|
import * as Mentions from "./core/Mentions";
|
|
|
|
export async function notifyMentioned({
|
|
room,
|
|
message,
|
|
}: {
|
|
room: ChatRoomResolver.ResolvedRoom;
|
|
message: ChatMessageWithAuthor;
|
|
}) {
|
|
if (!message.contents || !message.author) return;
|
|
|
|
const recipientIds = Mentions.mentionedUserIds(message.contents).filter(
|
|
(userId) =>
|
|
userId !== message.authorUserId &&
|
|
hasPermission(room, "VIEW", { id: userId }),
|
|
);
|
|
const alreadyNotifiedIds =
|
|
await NotificationRepository.findUserIdsWithUnseenByType({
|
|
userIds: recipientIds,
|
|
type: "CHAT_MENTION",
|
|
meta: { roomId: room.roomId },
|
|
});
|
|
|
|
await notify({
|
|
userIds: recipientIds.filter(
|
|
(userId) => !alreadyNotifiedIds.includes(userId),
|
|
),
|
|
notification: {
|
|
type: "CHAT_MENTION",
|
|
meta: {
|
|
roomId: room.roomId,
|
|
messageId: message.id,
|
|
mentionerUsername: message.author.username,
|
|
roomUrl: room.url,
|
|
},
|
|
pictureUrl: message.author.avatar
|
|
? avatarUrl(message.author.avatar, "sm")
|
|
: undefined,
|
|
},
|
|
});
|
|
}
|