From d1c9c7cc3111fbaa5e09362688809635f27116f4 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 9 Jul 2023 21:27:09 +0200 Subject: [PATCH 1/7] [mastodon-client] fix poll notifications --- packages/megalodon/src/misskey/api_client.ts | 13 +++++++++---- packages/megalodon/src/misskey/notification.ts | 2 +- packages/megalodon/src/notification.ts | 3 +-- packages/megalodon/test/integration/misskey.spec.ts | 4 ++-- .../megalodon/test/unit/misskey/api_client.spec.ts | 8 ++++---- 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/packages/megalodon/src/misskey/api_client.ts b/packages/megalodon/src/misskey/api_client.ts index 34e11784e..813ffe08a 100644 --- a/packages/megalodon/src/misskey/api_client.ts +++ b/packages/megalodon/src/misskey/api_client.ts @@ -396,8 +396,8 @@ namespace MisskeyAPI { return MisskeyNotificationType.Reaction case NotificationType.Reblog: return MisskeyNotificationType.Renote - case NotificationType.PollVote: - return MisskeyNotificationType.PollVote + case NotificationType.Poll: + return MisskeyNotificationType.PollEnded case NotificationType.FollowRequest: return MisskeyNotificationType.ReceiveFollowRequest default: @@ -417,8 +417,8 @@ namespace MisskeyAPI { return NotificationType.Reblog case MisskeyNotificationType.Reaction: return NotificationType.EmojiReaction - case MisskeyNotificationType.PollVote: - return NotificationType.PollVote + case MisskeyNotificationType.PollEnded: + return NotificationType.Poll case MisskeyNotificationType.ReceiveFollowRequest: return NotificationType.FollowRequest case MisskeyNotificationType.FollowRequestAccepted: @@ -458,6 +458,11 @@ namespace MisskeyAPI { notification = Object.assign(notification, { status: this.note(n.note, host) }) + if (notification.type === NotificationType.Poll) { + notification = Object.assign(notification, { + account: this.note(n.note, host).account + }) + } } if (n.reaction) { notification = Object.assign(notification, { diff --git a/packages/megalodon/src/misskey/notification.ts b/packages/megalodon/src/misskey/notification.ts index 9cf3dc58a..e44b6159c 100644 --- a/packages/megalodon/src/misskey/notification.ts +++ b/packages/megalodon/src/misskey/notification.ts @@ -7,7 +7,7 @@ namespace MisskeyNotificationType { export const Renote: MisskeyEntity.NotificationType = 'renote' export const Quote: MisskeyEntity.NotificationType = 'quote' export const Reaction: MisskeyEntity.NotificationType = 'favourite' - export const PollVote: MisskeyEntity.NotificationType = 'pollVote' + export const PollEnded: MisskeyEntity.NotificationType = 'pollEnded' export const ReceiveFollowRequest: MisskeyEntity.NotificationType = 'receiveFollowRequest' export const FollowRequestAccepted: MisskeyEntity.NotificationType = 'followRequestAccepted' export const GroupInvited: MisskeyEntity.NotificationType = 'groupInvited' diff --git a/packages/megalodon/src/notification.ts b/packages/megalodon/src/notification.ts index 9ea3898c6..8e8c13579 100644 --- a/packages/megalodon/src/notification.ts +++ b/packages/megalodon/src/notification.ts @@ -8,8 +8,7 @@ namespace NotificationType { 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 Poll: Entity.NotificationType = 'poll' } export default NotificationType diff --git a/packages/megalodon/test/integration/misskey.spec.ts b/packages/megalodon/test/integration/misskey.spec.ts index 754f6cc28..49d39a097 100644 --- a/packages/megalodon/test/integration/misskey.spec.ts +++ b/packages/megalodon/test/integration/misskey.spec.ts @@ -93,7 +93,7 @@ const pollVote: MisskeyEntity.Notification = { createdAt: '2021-02-01T01:49:29', userId: user.id, user: user, - type: MisskeyNotificationType.PollVote, + type: MisskeyNotificationType.PollEnded, note: note } @@ -168,7 +168,7 @@ describe('getNotifications', () => { }, { event: pollVote, - expected: MegalodonNotificationType.PollVote, + expected: MegalodonNotificationType.Poll, title: 'pollVote' }, { diff --git a/packages/megalodon/test/unit/misskey/api_client.spec.ts b/packages/megalodon/test/unit/misskey/api_client.spec.ts index acaac39ca..b8e1df048 100644 --- a/packages/megalodon/test/unit/misskey/api_client.spec.ts +++ b/packages/megalodon/test/unit/misskey/api_client.spec.ts @@ -42,8 +42,8 @@ describe('api_client', () => { dist: MisskeyNotificationType.Renote }, { - src: MegalodonNotificationType.PollVote, - dist: MisskeyNotificationType.PollVote + src: MegalodonNotificationType.Poll, + dist: MisskeyNotificationType.PollEnded }, { src: MegalodonNotificationType.FollowRequest, @@ -83,8 +83,8 @@ describe('api_client', () => { dist: MegalodonNotificationType.EmojiReaction }, { - src: MisskeyNotificationType.PollVote, - dist: MegalodonNotificationType.PollVote + src: MisskeyNotificationType.PollEnded, + dist: MegalodonNotificationType.Poll }, { src: MisskeyNotificationType.ReceiveFollowRequest, From 32ea8320ac0a6111016e5cbc0fd96714a476f98a Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 9 Jul 2023 21:47:49 +0200 Subject: [PATCH 2/7] [mastodon-client] populate user details for notifications --- packages/megalodon/src/misskey.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/megalodon/src/misskey.ts b/packages/megalodon/src/misskey.ts index dbf3471c0..1c15acf38 100644 --- a/packages/megalodon/src/misskey.ts +++ b/packages/megalodon/src/misskey.ts @@ -1236,6 +1236,8 @@ export default class Misskey implements MegalodonInterface { const notification = this.converter.notification(n, host); if (n.note) notification.status = await this.noteWithDetails(n.note, host, cache); + if (notification.account) + notification.account = (await this.getAccount(notification.account.id)).data return notification; } From 76a10c0a5481d1d3ca2ca9ee93fdd9850a413d5a Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 9 Jul 2023 22:59:04 +0200 Subject: [PATCH 3/7] [mastodon-client] fix posting polls --- .../server/api/mastodon/endpoints/status.ts | 19 +++++++++++++++++++ packages/megalodon/src/misskey.ts | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/server/api/mastodon/endpoints/status.ts b/packages/backend/src/server/api/mastodon/endpoints/status.ts index 76057ef0a..1bff3aa4c 100644 --- a/packages/backend/src/server/api/mastodon/endpoints/status.ts +++ b/packages/backend/src/server/api/mastodon/endpoints/status.ts @@ -67,6 +67,25 @@ export function apiStatusMastodon(router: Router): void { const { sensitive } = body; body.sensitive = typeof sensitive === "string" ? sensitive === "true" : sensitive; + + if (body.poll) { + if ( + body.poll.expires_in != null && + typeof body.poll.expires_in === "string" + ) + body.poll.expires_in = parseInt(body.poll.expires_in); + if ( + body.poll.multiple != null && + typeof body.poll.multiple === "string" + ) + body.poll.multiple = body.poll.multiple == "true"; + if ( + body.poll.hide_totals != null && + typeof body.poll.hide_totals === "string" + ) + body.poll.hide_totals = body.poll.hide_totals == "true"; + } + const data = await client.postStatus(text, body); ctx.body = convertStatus(data.data); } catch (e: any) { diff --git a/packages/megalodon/src/misskey.ts b/packages/megalodon/src/misskey.ts index 1c15acf38..7ff802dc8 100644 --- a/packages/megalodon/src/misskey.ts +++ b/packages/megalodon/src/misskey.ts @@ -1169,7 +1169,7 @@ export default class Misskey implements MegalodonInterface { let pollParam = { choices: options.poll.options, expiresAt: null, - expiredAfter: options.poll.expires_in + expiredAfter: options.poll.expires_in * 1000 } if (options.poll.multiple !== undefined) { pollParam = Object.assign(pollParam, { From 28992db8e463a472ee2e489257376de527586f48 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 9 Jul 2023 23:35:07 +0200 Subject: [PATCH 4/7] [server/api/notes/show] return correct status code --- packages/backend/src/server/api/endpoints/notes/show.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/backend/src/server/api/endpoints/notes/show.ts b/packages/backend/src/server/api/endpoints/notes/show.ts index 39d128134..8c5f91c5c 100644 --- a/packages/backend/src/server/api/endpoints/notes/show.ts +++ b/packages/backend/src/server/api/endpoints/notes/show.ts @@ -21,6 +21,7 @@ export const meta = { message: "No such note.", code: "NO_SUCH_NOTE", id: "24fcbfc6-2e37-42b6-8388-c29b3861a08d", + httpStatusCode: 404, }, }, } as const; From ec06d62d61dcfe2a17f033e50d8daa6078e98c15 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 9 Jul 2023 23:39:48 +0200 Subject: [PATCH 5/7] [mastodon-client] return 404 instead of 401 on NO_SUCH_NOTE --- packages/backend/src/server/api/mastodon/endpoints/status.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/server/api/mastodon/endpoints/status.ts b/packages/backend/src/server/api/mastodon/endpoints/status.ts index 1bff3aa4c..caa9d1d68 100644 --- a/packages/backend/src/server/api/mastodon/endpoints/status.ts +++ b/packages/backend/src/server/api/mastodon/endpoints/status.ts @@ -105,7 +105,7 @@ export function apiStatusMastodon(router: Router): void { ctx.body = convertStatus(data.data); } catch (e: any) { console.error(e); - ctx.status = 401; + ctx.status = ctx.status == 404 ? 404 : 401; ctx.body = e.response.data; } }); From c1e43407d5a23e324c1671c413fb300f59bafeb4 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 9 Jul 2023 23:53:15 +0200 Subject: [PATCH 6/7] [mastodon-client] enforce limits for favorites and bookmarks --- packages/megalodon/src/misskey.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/megalodon/src/misskey.ts b/packages/megalodon/src/misskey.ts index 7ff802dc8..fd765b3dc 100644 --- a/packages/megalodon/src/misskey.ts +++ b/packages/megalodon/src/misskey.ts @@ -408,7 +408,7 @@ export default class Misskey implements MegalodonInterface { if (options) { if (options.limit) { params = Object.assign(params, { - limit: options.limit + limit: options.limit <= 100 ? options.limit : 100 }) } if (options.max_id) { @@ -738,7 +738,7 @@ export default class Misskey implements MegalodonInterface { if (options) { if (options.limit) { params = Object.assign(params, { - limit: options.limit + limit: options.limit <= 100 ? options.limit : 100 }) } else { From 02ddbe2363661cd12ab485559a4c5e6432d23683 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Mon, 10 Jul 2023 00:05:52 +0200 Subject: [PATCH 7/7] [mastodon-client] return actual status bookmark state --- packages/megalodon/src/misskey.ts | 8 ++++++++ packages/megalodon/src/misskey/api_client.ts | 3 ++- packages/megalodon/src/misskey/entities/state.ts | 7 +++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 packages/megalodon/src/misskey/entities/state.ts diff --git a/packages/megalodon/src/misskey.ts b/packages/megalodon/src/misskey.ts index fd765b3dc..026b8e9b7 100644 --- a/packages/megalodon/src/misskey.ts +++ b/packages/megalodon/src/misskey.ts @@ -1243,9 +1243,17 @@ export default class Misskey implements MegalodonInterface { public async noteWithDetails(n: MisskeyAPI.Entity.Note, host: string, cache: AccountCache): Promise { const status = await this.addUserDetailsToStatus(this.converter.note(n, host), cache); + status.bookmarked = await this.isStatusBookmarked(n.id); return this.addMentionsToStatus(status, cache); } + public async isStatusBookmarked(id: string) : Promise { + return this.client + .post('/api/notes/state', { + noteId: id + }).then(p => p.data.isFavorited ?? false); + } + public async addUserDetailsToStatus(status: Entity.Status, cache: AccountCache) : Promise { if (status.account.followers_count === 0 && status.account.followers_count === 0 && status.account.statuses_count === 0) status.account = await this.getAccountCached(status.account.id, status.account.acct, cache) ?? status.account; diff --git a/packages/megalodon/src/misskey/api_client.ts b/packages/megalodon/src/misskey/api_client.ts index 813ffe08a..f80d5a442 100644 --- a/packages/megalodon/src/misskey/api_client.ts +++ b/packages/megalodon/src/misskey/api_client.ts @@ -40,7 +40,8 @@ namespace MisskeyAPI { export type GetAll = MisskeyEntity.GetAll export type UserKey = MisskeyEntity.UserKey export type Session = MisskeyEntity.Session - export type Stats = MisskeyEntity.Stats + export type Stats = MisskeyEntity.Stats + export type State = MisskeyEntity.State export type APIEmoji = { emojis: Emoji[] } } diff --git a/packages/megalodon/src/misskey/entities/state.ts b/packages/megalodon/src/misskey/entities/state.ts new file mode 100644 index 000000000..4538fb461 --- /dev/null +++ b/packages/megalodon/src/misskey/entities/state.ts @@ -0,0 +1,7 @@ +namespace MisskeyEntity { + export type State = { + isFavorited: boolean + isMutedThread: boolean + isWatching: boolean + } +}