diff --git a/packages/backend/src/server/api/mastodon/MastodonConverters.ts b/packages/backend/src/server/api/mastodon/MastodonConverters.ts index 7a1387e4aa..0e8ce5a2a7 100644 --- a/packages/backend/src/server/api/mastodon/MastodonConverters.ts +++ b/packages/backend/src/server/api/mastodon/MastodonConverters.ts @@ -6,6 +6,8 @@ import { Inject, Injectable } from '@nestjs/common'; import { Entity } from 'megalodon'; import mfm from '@transfem-org/sfm-js'; +import { MastodonNotificationType } from 'megalodon/lib/src/mastodon/notification.js'; +import { NotificationType } from 'megalodon/lib/src/notification.js'; import { DI } from '@/di-symbols.js'; import { MfmService } from '@/core/MfmService.js'; import type { Config } from '@/config.js'; @@ -355,27 +357,9 @@ export class MastodonConverters { created_at: notification.created_at, id: notification.id, status: notification.status ? await this.convertStatus(notification.status, me) : undefined, - type: notification.type, + type: convertNotificationType(notification.type as NotificationType), }; } - - // public convertEmoji(emoji: string): MastodonEntity.Emoji { - // const reaction: MastodonEntity.Reaction = { - // name: emoji, - // count: 1, - // }; - // - // if (emoji.startsWith(':')) { - // const [, name] = emoji.match(/^:([^@:]+(?:@[^@:]+)?):$/) ?? []; - // if (name) { - // const url = `${this.config.url}/emoji/${name}.webp`; - // reaction.url = url; - // reaction.static_url = url; - // } - // } - // - // return reaction; - // } } function simpleConvert(data: T): T { @@ -383,6 +367,19 @@ function simpleConvert(data: T): T { return Object.assign({}, data); } +function convertNotificationType(type: NotificationType): MastodonNotificationType { + switch (type) { + case 'emoji_reaction': return 'reaction'; + case 'poll_vote': + case 'poll_expired': + return 'poll'; + // Not supported by mastodon + case 'move': + return type as MastodonNotificationType; + default: return type; + } +} + export function convertAnnouncement(announcement: Entity.Announcement): MastodonEntity.Announcement { return { ...announcement, diff --git a/packages/megalodon/src/index.ts b/packages/megalodon/src/index.ts index 621f007ccf..7a4f10ab02 100644 --- a/packages/megalodon/src/index.ts +++ b/packages/megalodon/src/index.ts @@ -6,7 +6,7 @@ import { MegalodonInterface, WebSocketInterface } from './megalodon' import { detector } from './detector' import Misskey from './misskey' import Entity from './entity' -import NotificationType from './notification' +import * as NotificationType from './notification' import FilterContext from './filter_context' import Converter from './converter' import MastodonEntity from './mastodon/entity'; diff --git a/packages/megalodon/src/mastodon/notification.ts b/packages/megalodon/src/mastodon/notification.ts new file mode 100644 index 0000000000..9c51f9698d --- /dev/null +++ b/packages/megalodon/src/mastodon/notification.ts @@ -0,0 +1,33 @@ +export const Mention = 'mention' as const; +export const Reblog = 'reblog' as const; +export const Favourite = 'favourite' as const; +export const Follow = 'follow' as const; +export const Poll = 'poll' as const; +export const FollowRequest = 'follow_request' as const; +export const Status = 'status' as const; +export const Update = 'update' as const; +export const AdminSignup = 'admin.sign_up' as const; +export const AdminReport = 'admin.report' as const; +export const Reaction = 'reaction' as const; +export const ModerationWarning = 'moderation_warning' as const; +export const SeveredRelationships = 'severed_relationships' as const; +export const AnnualReport = 'annual_report' as const; + +export const mastodonNotificationTypes = [ + Mention, + Reblog, + Favourite, + Follow, + Poll, + FollowRequest, + Status, + Update, + AdminSignup, + AdminReport, + Reaction, + ModerationWarning, + SeveredRelationships, + AnnualReport, +]; + +export type MastodonNotificationType = typeof mastodonNotificationTypes[number]; diff --git a/packages/megalodon/src/misskey/api_client.ts b/packages/megalodon/src/misskey/api_client.ts index 4c975c4dfa..6dfa59f132 100644 --- a/packages/megalodon/src/misskey/api_client.ts +++ b/packages/megalodon/src/misskey/api_client.ts @@ -9,7 +9,8 @@ import MisskeyEntity from './entity' import MegalodonEntity from '../entity' import WebSocket from './web_socket' import MisskeyNotificationType from './notification' -import NotificationType, { UnknownNotificationTypeError } from '../notification' +import * as NotificationType from '../notification' +import { UnknownNotificationTypeError } from '../notification'; namespace MisskeyAPI { export namespace Entity { diff --git a/packages/megalodon/src/notification.ts b/packages/megalodon/src/notification.ts index 7c08c5d47f..846d79c6d7 100644 --- a/packages/megalodon/src/notification.ts +++ b/packages/megalodon/src/notification.ts @@ -1,20 +1,16 @@ -import Entity from './entity' - -namespace NotificationType { - export const Follow: Entity.NotificationType = 'follow' - export const Favourite: Entity.NotificationType = 'favourite' - export const Reblog: Entity.NotificationType = 'reblog' - export const Mention: Entity.NotificationType = 'mention' - export const EmojiReaction: Entity.NotificationType = 'emoji_reaction' - export const FollowRequest: Entity.NotificationType = 'follow_request' - export const Status: Entity.NotificationType = 'status' - export const PollVote: Entity.NotificationType = 'poll_vote' - export const PollExpired: Entity.NotificationType = 'poll_expired' - export const Update: Entity.NotificationType = 'update' - export const Move: Entity.NotificationType = 'move' - export const AdminSignup: Entity.NotificationType = 'admin.sign_up' - export const AdminReport: Entity.NotificationType = 'admin.report' -} +export const Follow = 'follow' as const; +export const Favourite = 'favourite' as const; +export const Reblog = 'reblog' as const; +export const Mention = 'mention' as const; +export const EmojiReaction = 'emoji_reaction' as const; +export const FollowRequest = 'follow_request' as const; +export const Status = 'status' as const; +export const PollVote = 'poll_vote' as const; +export const PollExpired = 'poll_expired' as const; +export const Update = 'update' as const; +export const Move = 'move' as const; +export const AdminSignup = 'admin.sign_up' as const; +export const AdminReport = 'admin.report' as const; export class UnknownNotificationTypeError extends Error { constructor() { @@ -23,4 +19,20 @@ export class UnknownNotificationTypeError extends Error { } } -export default NotificationType +export const notificationTypes = [ + Follow, + Favourite, + Reblog, + Mention, + EmojiReaction, + FollowRequest, + Status, + PollVote, + PollExpired, + Update, + Move, + AdminSignup, + AdminReport, +]; + +export type NotificationType = typeof notificationTypes[number]; diff --git a/packages/megalodon/test/integration/misskey.spec.ts b/packages/megalodon/test/integration/misskey.spec.ts index ed3b9a40f2..84d85498d6 100644 --- a/packages/megalodon/test/integration/misskey.spec.ts +++ b/packages/megalodon/test/integration/misskey.spec.ts @@ -1,7 +1,7 @@ import MisskeyEntity from '@/misskey/entity' import MisskeyNotificationType from '@/misskey/notification' import Misskey from '@/misskey' -import MegalodonNotificationType from '@/notification' +import * as MegalodonNotificationType from '@/notification' import axios, { AxiosHeaders, AxiosResponse, InternalAxiosRequestConfig } from 'axios' jest.mock('axios') diff --git a/packages/megalodon/test/unit/misskey/api_client.spec.ts b/packages/megalodon/test/unit/misskey/api_client.spec.ts index 38039385cb..ab40bab6c2 100644 --- a/packages/megalodon/test/unit/misskey/api_client.spec.ts +++ b/packages/megalodon/test/unit/misskey/api_client.spec.ts @@ -1,7 +1,7 @@ import MisskeyAPI from '@/misskey/api_client' import MegalodonEntity from '@/entity' import MisskeyEntity from '@/misskey/entity' -import MegalodonNotificationType from '@/notification' +import * as MegalodonNotificationType from '@/notification' import MisskeyNotificationType from '@/misskey/notification' const user: MisskeyEntity.User = {