summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorMeiMei <30769358+mei23@users.noreply.github.com>2019-12-15 03:37:19 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2019-12-15 03:37:19 +0900
commit3e85aad80a882abc764c13a0fc40e3333bb61c4b (patch)
treec4ef1a407e5a714dda25cb907bc4d40acb89ec26 /src/server
parentFix #5637 (#5638) (diff)
downloadsharkey-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.ts21
-rw-r--r--src/server/api/endpoints/messaging/messages.ts9
-rw-r--r--src/server/api/stream/channels/messaging.ts14
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]);
}