From b19902d92c51b5cfb8d303db77efc0e82b776305 Mon Sep 17 00:00:00 2001 From: tamaina Date: Tue, 30 Nov 2021 04:04:47 +0900 Subject: [PATCH] truncate notification --- .../backend/src/services/push-notification.ts | 29 +++++++++- .../sw/src/scripts/create-notification.ts | 13 ++--- packages/sw/src/scripts/get-note-summary.ts | 55 ------------------- 3 files changed, 33 insertions(+), 64 deletions(-) delete mode 100644 packages/sw/src/scripts/get-note-summary.ts diff --git a/packages/backend/src/services/push-notification.ts b/packages/backend/src/services/push-notification.ts index b4e1c4fd8a..c1386b6963 100644 --- a/packages/backend/src/services/push-notification.ts +++ b/packages/backend/src/services/push-notification.ts @@ -3,8 +3,9 @@ import config from '@/config/index'; import { SwSubscriptions } from '@/models/index'; import { fetchMeta } from '@/misc/fetch-meta'; import { Packed } from '@/misc/schema'; +import { getNoteSummary } from '@/misc/get-note-summary'; -// Defined also @client/sw/types.ts#L14-L21 +// Defined also packages/sw/types.ts#L14-L21 type pushNotificationsTypes = { 'notification': Packed<'Notification'>; 'unreadMessagingMessage': Packed<'MessagingMessage'>; @@ -14,6 +15,28 @@ type pushNotificationsTypes = { 'readAllMessagingMessagesOfARoom': { userId: string } | { groupId: string }; }; +// プッシュメッセージサーバーには文字数制限があるため、内容を削減します +function truncateNotification(notification: Packed<'Notification'>): Packed<'Notification'> { + if (notification.note) { + return { + ...notification, + note: { + ...notification.note, + // textをgetNoteSummaryしたものに置き換える + text: getNoteSummary(notification.type === 'renote' ? notification.note.renote as Packed<'Note'> : notification.note), + ...{ + cw: undefined, + reply: undefined, + renote: undefined, + user: undefined as any, // 通知を受け取ったユーザーである場合が多いのでこれも捨てる + } + } + }; + } + + return notification; +} + export async function pushNotification(userId: string, type: T, body: pushNotificationsTypes[T]) { const meta = await fetchMeta(); @@ -39,7 +62,9 @@ export async function pushNotification(u }; push.sendNotification(pushSubscription, JSON.stringify({ - type, body, userId + type, + body: type === 'notification' ? truncateNotification(body as Packed<'Notification'>) : body, + userId, }), { proxy: config.proxy }).catch((err: any) => { diff --git a/packages/sw/src/scripts/create-notification.ts b/packages/sw/src/scripts/create-notification.ts index 39a47d2413..674accc76a 100644 --- a/packages/sw/src/scripts/create-notification.ts +++ b/packages/sw/src/scripts/create-notification.ts @@ -6,7 +6,6 @@ declare var self: ServiceWorkerGlobalScope; import { swLang } from '@/scripts/lang'; import { cli } from '@/scripts/operations'; import { pushNotificationDataMap } from '@/types'; -import { getNoteSummary } from '@/scripts/get-note-summary'; import getUserName from '@/scripts/get-user-name'; import { I18n } from '@/scripts/i18n'; import { getAccountFromId } from '@/scripts/get-account-from-id'; @@ -56,7 +55,7 @@ async function composeNotification(data case 'mention': return [t('_notification.youGotMention', { name: getUserName(data.body.user) }), { - body: getNoteSummary(data.body.note, i18n), + body: data.body.note.text || '', icon: data.body.user.avatarUrl, data, actions: [ @@ -69,7 +68,7 @@ async function composeNotification(data case 'reply': return [t('_notification.youGotReply', { name: getUserName(data.body.user) }), { - body: getNoteSummary(data.body.note, i18n), + body: data.body.note.text || '', icon: data.body.user.avatarUrl, data, actions: [ @@ -82,7 +81,7 @@ async function composeNotification(data case 'renote': return [t('_notification.youRenoted', { name: getUserName(data.body.user) }), { - body: getNoteSummary(data.body.note.renote, i18n), + body: data.body.note.text || '', icon: data.body.user.avatarUrl, data, actions: [ @@ -95,7 +94,7 @@ async function composeNotification(data case 'quote': return [t('_notification.youGotQuote', { name: getUserName(data.body.user) }), { - body: getNoteSummary(data.body.note, i18n), + body: data.body.note.text || '', icon: data.body.user.avatarUrl, data, actions: [ @@ -114,7 +113,7 @@ async function composeNotification(data case 'reaction': return [`${data.body.reaction} ${getUserName(data.body.user)}`, { - body: getNoteSummary(data.body.note, i18n), + body: data.body.note.text || '', icon: data.body.user.avatarUrl, data, actions: [ @@ -127,7 +126,7 @@ async function composeNotification(data case 'pollVote': return [t('_notification.youGotPoll', { name: getUserName(data.body.user) }), { - body: getNoteSummary(data.body.note, i18n), + body: data.body.note.text || '', icon: data.body.user.avatarUrl, data, }]; diff --git a/packages/sw/src/scripts/get-note-summary.ts b/packages/sw/src/scripts/get-note-summary.ts deleted file mode 100644 index da5ad20df2..0000000000 --- a/packages/sw/src/scripts/get-note-summary.ts +++ /dev/null @@ -1,55 +0,0 @@ -import * as misskey from 'misskey-js'; -import { I18n } from '@/scripts/i18n'; - -/** - * 投稿を表す文字列を取得します。 - * @param {*} note (packされた)投稿 - */ -export const getNoteSummary = (note: misskey.entities.Note, i18n: I18n): string => { - if (note.deletedAt) { - return `(${i18n.locale.deletedNote})`; - } - - if (note.isHidden) { - return `(${i18n.locale.invisibleNote})`; - } - - let summary = ''; - - // 本文 - if (note.cw != null) { - summary += note.cw; - } else { - summary += note.text ? note.text : ''; - } - - // ファイルが添付されているとき - if ((note.files || []).length != 0) { - summary += ` (${i18n.t('withNFiles', { n: note.files.length })})`; - } - - // 投票が添付されているとき - if (note.poll) { - summary += ` (${i18n.locale.poll})`; - } - - // 返信のとき - if (note.replyId) { - if (note.reply) { - summary += `\n\nRE: ${getNoteSummary(note.reply, i18n)}`; - } else { - summary += '\n\nRE: ...'; - } - } - - // Renoteのとき - if (note.renoteId) { - if (note.renote) { - summary += `\n\nRN: ${getNoteSummary(note.renote, i18n)}`; - } else { - summary += '\n\nRN: ...'; - } - } - - return summary.trim(); -};