summaryrefslogtreecommitdiff
path: root/src/server/api/stream/channels
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2021-02-21 12:26:49 +0900
committersyuilo <syuilotan@yahoo.co.jp>2021-02-21 12:26:49 +0900
commit78a963fe334caae564424c6458a8565da957c8be (patch)
tree2751939ed79ccb39213b94a102dc90253b1b4ac6 /src/server/api/stream/channels
parentタイムラインを特定の日付にジャンプする機能 (diff)
downloadsharkey-78a963fe334caae564424c6458a8565da957c8be.tar.gz
sharkey-78a963fe334caae564424c6458a8565da957c8be.tar.bz2
sharkey-78a963fe334caae564424c6458a8565da957c8be.zip
Messagingの入力中インジケータを実装
Diffstat (limited to 'src/server/api/stream/channels')
-rw-r--r--src/server/api/stream/channels/messaging.ts47
1 files changed, 44 insertions, 3 deletions
diff --git a/src/server/api/stream/channels/messaging.ts b/src/server/api/stream/channels/messaging.ts
index 8456871e6a..7279da3ece 100644
--- a/src/server/api/stream/channels/messaging.ts
+++ b/src/server/api/stream/channels/messaging.ts
@@ -12,6 +12,9 @@ export default class extends Channel {
private otherpartyId: string | null;
private otherparty?: User;
private groupId: string | null;
+ private subCh: string;
+ private typers: Record<User['id'], Date> = {};
+ private emitTypersIntervalId: ReturnType<typeof setInterval>;
@autobind
public async init(params: any) {
@@ -31,14 +34,28 @@ export default class extends Channel {
}
}
- const subCh = this.otherpartyId
+ this.emitTypersIntervalId = setInterval(this.emitTypers, 5000);
+
+ this.subCh = this.otherpartyId
? `messagingStream:${this.user!.id}-${this.otherpartyId}`
: `messagingStream:${this.groupId}`;
// Subscribe messaging stream
- this.subscriber.on(subCh, data => {
+ this.subscriber.on(this.subCh, this.onEvent);
+ }
+
+ @autobind
+ private onEvent(data: any) {
+ if (data.type === 'typing') {
+ const id = data.body;
+ const begin = this.typers[id] == null;
+ this.typers[id] = new Date();
+ if (begin) {
+ this.emitTypers();
+ }
+ } else {
this.send(data);
- });
+ }
}
@autobind
@@ -60,4 +77,28 @@ export default class extends Channel {
break;
}
}
+
+ @autobind
+ private async emitTypers() {
+ const now = new Date();
+
+ // Remove not typing users
+ for (const [userId, date] of Object.entries(this.typers)) {
+ if (now.getTime() - date.getTime() > 5000) delete this.typers[userId];
+ }
+
+ const users = await Users.packMany(Object.keys(this.typers), null, { detail: false });
+
+ this.send({
+ type: 'typers',
+ body: users,
+ });
+ }
+
+ @autobind
+ public dispose() {
+ this.subscriber.off(this.subCh, this.onEvent);
+
+ clearInterval(this.emitTypersIntervalId);
+ }
}