summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHazelnoot <acomputerdog@gmail.com>2025-03-24 14:26:25 -0400
committerHazelnoot <acomputerdog@gmail.com>2025-03-27 19:51:43 -0400
commit58cdee77d5d7a8dceef39683695d33947a614070 (patch)
treec68d2544191043adc30d60a57795ea5e0ad67a09
parentdon't render CW as HTML for mastodon (diff)
downloadsharkey-58cdee77d5d7a8dceef39683695d33947a614070.tar.gz
sharkey-58cdee77d5d7a8dceef39683695d33947a614070.tar.bz2
sharkey-58cdee77d5d7a8dceef39683695d33947a614070.zip
convert notification types in mastodon API
-rw-r--r--packages/backend/src/server/api/mastodon/MastodonConverters.ts35
-rw-r--r--packages/megalodon/src/index.ts2
-rw-r--r--packages/megalodon/src/mastodon/notification.ts33
-rw-r--r--packages/megalodon/src/misskey/api_client.ts3
-rw-r--r--packages/megalodon/src/notification.ts48
-rw-r--r--packages/megalodon/test/integration/misskey.spec.ts2
-rw-r--r--packages/megalodon/test/unit/misskey/api_client.spec.ts2
7 files changed, 84 insertions, 41 deletions
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<T>(data: T): T {
@@ -383,6 +367,19 @@ function simpleConvert<T>(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 = {