truncate notification

This commit is contained in:
tamaina 2021-11-30 04:04:47 +09:00
parent 47d77d14fd
commit b19902d92c
3 changed files with 33 additions and 64 deletions

View File

@ -3,8 +3,9 @@ import config from '@/config/index';
import { SwSubscriptions } from '@/models/index'; import { SwSubscriptions } from '@/models/index';
import { fetchMeta } from '@/misc/fetch-meta'; import { fetchMeta } from '@/misc/fetch-meta';
import { Packed } from '@/misc/schema'; 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 = { type pushNotificationsTypes = {
'notification': Packed<'Notification'>; 'notification': Packed<'Notification'>;
'unreadMessagingMessage': Packed<'MessagingMessage'>; 'unreadMessagingMessage': Packed<'MessagingMessage'>;
@ -14,6 +15,28 @@ type pushNotificationsTypes = {
'readAllMessagingMessagesOfARoom': { userId: string } | { groupId: string }; '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<T extends keyof pushNotificationsTypes>(userId: string, type: T, body: pushNotificationsTypes[T]) { export async function pushNotification<T extends keyof pushNotificationsTypes>(userId: string, type: T, body: pushNotificationsTypes[T]) {
const meta = await fetchMeta(); const meta = await fetchMeta();
@ -39,7 +62,9 @@ export async function pushNotification<T extends keyof pushNotificationsTypes>(u
}; };
push.sendNotification(pushSubscription, JSON.stringify({ push.sendNotification(pushSubscription, JSON.stringify({
type, body, userId type,
body: type === 'notification' ? truncateNotification(body as Packed<'Notification'>) : body,
userId,
}), { }), {
proxy: config.proxy proxy: config.proxy
}).catch((err: any) => { }).catch((err: any) => {

View File

@ -6,7 +6,6 @@ declare var self: ServiceWorkerGlobalScope;
import { swLang } from '@/scripts/lang'; import { swLang } from '@/scripts/lang';
import { cli } from '@/scripts/operations'; import { cli } from '@/scripts/operations';
import { pushNotificationDataMap } from '@/types'; import { pushNotificationDataMap } from '@/types';
import { getNoteSummary } from '@/scripts/get-note-summary';
import getUserName from '@/scripts/get-user-name'; import getUserName from '@/scripts/get-user-name';
import { I18n } from '@/scripts/i18n'; import { I18n } from '@/scripts/i18n';
import { getAccountFromId } from '@/scripts/get-account-from-id'; import { getAccountFromId } from '@/scripts/get-account-from-id';
@ -56,7 +55,7 @@ async function composeNotification<K extends keyof pushNotificationDataMap>(data
case 'mention': case 'mention':
return [t('_notification.youGotMention', { name: getUserName(data.body.user) }), { 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, icon: data.body.user.avatarUrl,
data, data,
actions: [ actions: [
@ -69,7 +68,7 @@ async function composeNotification<K extends keyof pushNotificationDataMap>(data
case 'reply': case 'reply':
return [t('_notification.youGotReply', { name: getUserName(data.body.user) }), { 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, icon: data.body.user.avatarUrl,
data, data,
actions: [ actions: [
@ -82,7 +81,7 @@ async function composeNotification<K extends keyof pushNotificationDataMap>(data
case 'renote': case 'renote':
return [t('_notification.youRenoted', { name: getUserName(data.body.user) }), { 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, icon: data.body.user.avatarUrl,
data, data,
actions: [ actions: [
@ -95,7 +94,7 @@ async function composeNotification<K extends keyof pushNotificationDataMap>(data
case 'quote': case 'quote':
return [t('_notification.youGotQuote', { name: getUserName(data.body.user) }), { 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, icon: data.body.user.avatarUrl,
data, data,
actions: [ actions: [
@ -114,7 +113,7 @@ async function composeNotification<K extends keyof pushNotificationDataMap>(data
case 'reaction': case 'reaction':
return [`${data.body.reaction} ${getUserName(data.body.user)}`, { return [`${data.body.reaction} ${getUserName(data.body.user)}`, {
body: getNoteSummary(data.body.note, i18n), body: data.body.note.text || '',
icon: data.body.user.avatarUrl, icon: data.body.user.avatarUrl,
data, data,
actions: [ actions: [
@ -127,7 +126,7 @@ async function composeNotification<K extends keyof pushNotificationDataMap>(data
case 'pollVote': case 'pollVote':
return [t('_notification.youGotPoll', { name: getUserName(data.body.user) }), { 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, icon: data.body.user.avatarUrl,
data, data,
}]; }];

View File

@ -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<any>): 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();
};