truncate notification
This commit is contained in:
parent
47d77d14fd
commit
b19902d92c
3 changed files with 33 additions and 64 deletions
|
@ -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) => {
|
||||||
|
|
|
@ -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,
|
||||||
}];
|
}];
|
||||||
|
|
|
@ -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();
|
|
||||||
};
|
|
Loading…
Reference in a new issue