diff options
| author | MeiMei <30769358+mei23@users.noreply.github.com> | 2019-12-15 03:37:19 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2019-12-15 03:37:19 +0900 |
| commit | 3e85aad80a882abc764c13a0fc40e3333bb61c4b (patch) | |
| tree | c4ef1a407e5a714dda25cb907bc4d40acb89ec26 /src/server | |
| parent | Fix #5637 (#5638) (diff) | |
| download | sharkey-3e85aad80a882abc764c13a0fc40e3333bb61c4b.tar.gz sharkey-3e85aad80a882abc764c13a0fc40e3333bb61c4b.tar.bz2 sharkey-3e85aad80a882abc764c13a0fc40e3333bb61c4b.zip | |
Implement Talk has read federation (#5636)
* Talk read
* fix
* 複数のRead ActivityはCollectionとして送るように
* あ
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/api/common/read-messaging-message.ts | 21 | ||||
| -rw-r--r-- | src/server/api/endpoints/messaging/messages.ts | 9 | ||||
| -rw-r--r-- | src/server/api/stream/channels/messaging.ts | 14 |
3 files changed, 39 insertions, 5 deletions
diff --git a/src/server/api/common/read-messaging-message.ts b/src/server/api/common/read-messaging-message.ts index d18d8cd9d2..90510bb393 100644 --- a/src/server/api/common/read-messaging-message.ts +++ b/src/server/api/common/read-messaging-message.ts @@ -1,12 +1,17 @@ import { publishMainStream, publishGroupMessagingStream } from '../../../services/stream'; import { publishMessagingStream } from '../../../services/stream'; import { publishMessagingIndexStream } from '../../../services/stream'; -import { User } from '../../../models/entities/user'; +import { User, ILocalUser, IRemoteUser } from '../../../models/entities/user'; import { MessagingMessage } from '../../../models/entities/messaging-message'; import { MessagingMessages, UserGroupJoinings, Users } from '../../../models'; import { In } from 'typeorm'; import { IdentifiableError } from '../../../misc/identifiable-error'; import { UserGroup } from '../../../models/entities/user-group'; +import { toArray } from '../../../prelude/array'; +import { renderReadActivity } from '../../../remote/activitypub/renderer/read'; +import { renderActivity } from '../../../remote/activitypub/renderer'; +import { deliver } from '../../../queue'; +import orderedCollection from '../../../remote/activitypub/renderer/ordered-collection'; /** * Mark messages as read @@ -101,3 +106,17 @@ export async function readGroupMessagingMessage( publishMainStream(userId, 'readAllMessagingMessages'); } } + +export async function deliverReadActivity(user: ILocalUser, recipient: IRemoteUser, messages: MessagingMessage | MessagingMessage[]) { + messages = toArray(messages).filter(x => x.uri); + const contents = messages.map(x => renderReadActivity(user, x)); + + if (contents.length > 1) { + const collection = orderedCollection(null, contents.length, undefined, undefined, contents); + deliver(user, renderActivity(collection), recipient.inbox); + } else { + for (const content of contents) { + deliver(user, renderActivity(content), recipient.inbox); + } + } +} diff --git a/src/server/api/endpoints/messaging/messages.ts b/src/server/api/endpoints/messaging/messages.ts index b0b3e20d02..ea01086a8b 100644 --- a/src/server/api/endpoints/messaging/messages.ts +++ b/src/server/api/endpoints/messaging/messages.ts @@ -3,10 +3,10 @@ import { ID } from '../../../../misc/cafy-id'; import define from '../../define'; import { ApiError } from '../../error'; import { getUser } from '../../common/getters'; -import { MessagingMessages, UserGroups, UserGroupJoinings } from '../../../../models'; +import { MessagingMessages, UserGroups, UserGroupJoinings, Users } from '../../../../models'; import { makePaginationQuery } from '../../common/make-pagination-query'; import { Brackets } from 'typeorm'; -import { readUserMessagingMessage, readGroupMessagingMessage } from '../../common/read-messaging-message'; +import { readUserMessagingMessage, readGroupMessagingMessage, deliverReadActivity } from '../../common/read-messaging-message'; export const meta = { desc: { @@ -114,6 +114,11 @@ export default define(meta, async (ps, user) => { // Mark all as read if (ps.markAsRead) { readUserMessagingMessage(user.id, recipient.id, messages.filter(m => m.recipientId === user.id).map(x => x.id)); + + // リモートユーザーとのメッセージだったら既読配信 + if (Users.isLocalUser(user) && Users.isRemoteUser(recipient)) { + deliverReadActivity(user, recipient, messages); + } } return await Promise.all(messages.map(message => MessagingMessages.pack(message, user, { diff --git a/src/server/api/stream/channels/messaging.ts b/src/server/api/stream/channels/messaging.ts index 1e5e94c1c8..8456871e6a 100644 --- a/src/server/api/stream/channels/messaging.ts +++ b/src/server/api/stream/channels/messaging.ts @@ -1,7 +1,8 @@ import autobind from 'autobind-decorator'; -import { readUserMessagingMessage, readGroupMessagingMessage } from '../../common/read-messaging-message'; +import { readUserMessagingMessage, readGroupMessagingMessage, deliverReadActivity } from '../../common/read-messaging-message'; import Channel from '../channel'; -import { UserGroupJoinings } from '../../../../models'; +import { UserGroupJoinings, Users, MessagingMessages } from '../../../../models'; +import { User, ILocalUser, IRemoteUser } from '../../../../models/entities/user'; export default class extends Channel { public readonly chName = 'messaging'; @@ -9,11 +10,13 @@ export default class extends Channel { public static requireCredential = true; private otherpartyId: string | null; + private otherparty?: User; private groupId: string | null; @autobind public async init(params: any) { this.otherpartyId = params.otherparty as string; + this.otherparty = await Users.findOne({ id: this.otherpartyId }); this.groupId = params.group as string; // Check joining @@ -44,6 +47,13 @@ export default class extends Channel { case 'read': if (this.otherpartyId) { readUserMessagingMessage(this.user!.id, this.otherpartyId, [body.id]); + + // リモートユーザーからのメッセージだったら既読配信 + if (Users.isLocalUser(this.user!) && Users.isRemoteUser(this.otherparty!)) { + MessagingMessages.findOne(body.id).then(message => { + if (message) deliverReadActivity(this.user as ILocalUser, this.otherparty as IRemoteUser, message); + }); + } } else if (this.groupId) { readGroupMessagingMessage(this.user!.id, this.groupId, [body.id]); } |