From 9e9d378bf1301d4c3fcde08543be1014c71a87cd Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 2 Apr 2020 22:17:17 +0900
Subject: [PATCH] feat(streaming): Add emoji added event

---
 src/client/init.ts                          | 5 +++++
 src/server/api/endpoints/admin/emoji/add.ts | 5 +++++
 src/server/api/stream/index.ts              | 9 +++++++++
 src/services/stream.ts                      | 5 +++++
 4 files changed, 24 insertions(+)

diff --git a/src/client/init.ts b/src/client/init.ts
index 73e02145d5..c226f29b30 100644
--- a/src/client/init.ts
+++ b/src/client/init.ts
@@ -237,6 +237,11 @@ os.init(async () => {
 	// マウント
 	app.$mount('#app');
 
+	os.stream.on('emojiAdded', data => {
+		// TODO
+		//store.commit('instance/set', );
+	});
+
 	if (store.getters.isSignedIn) {
 		const main = os.stream.useSharedConnection('main');
 
diff --git a/src/server/api/endpoints/admin/emoji/add.ts b/src/server/api/endpoints/admin/emoji/add.ts
index f56303b32f..77e29cfb2a 100644
--- a/src/server/api/endpoints/admin/emoji/add.ts
+++ b/src/server/api/endpoints/admin/emoji/add.ts
@@ -7,6 +7,7 @@ import { insertModerationLog } from '../../../../../services/insert-moderation-l
 import { ApiError } from '../../../error';
 import { ID } from '../../../../../misc/cafy-id';
 import rndstr from 'rndstr';
+import { publishBroadcastStream } from '../../../../../services/stream';
 
 export const meta = {
 	desc: {
@@ -53,6 +54,10 @@ export default define(meta, async (ps, me) => {
 
 	await getConnection().queryResultCache!.remove(['meta_emojis']);
 
+	publishBroadcastStream('emojiAdded', {
+		emoji: await Emojis.pack(emoji.id)
+	});
+
 	insertModerationLog(me, 'addEmoji', {
 		emojiId: emoji.id
 	});
diff --git a/src/server/api/stream/index.ts b/src/server/api/stream/index.ts
index 2781d14bd9..b7cefcf5ab 100644
--- a/src/server/api/stream/index.ts
+++ b/src/server/api/stream/index.ts
@@ -39,6 +39,10 @@ export default class Connection {
 
 		this.wsConnection.on('message', this.onWsConnectionMessage);
 
+		this.subscriber.on('broadcast', async ({ type, body }) => {
+			this.onBroadcastMessage(type, body);
+		});
+
 		if (this.user) {
 			this.updateFollowing();
 			this.followingClock = setInterval(this.updateFollowing, 5000);
@@ -72,6 +76,11 @@ export default class Connection {
 		}
 	}
 
+	@autobind
+	private onBroadcastMessage(type: string, body: any) {
+		this.sendMessageToWs(type, body);
+	}
+
 	/**
 	 * APIリクエスト要求時
 	 */
diff --git a/src/services/stream.ts b/src/services/stream.ts
index 269aed56b9..ec43c6ff2c 100644
--- a/src/services/stream.ts
+++ b/src/services/stream.ts
@@ -19,6 +19,10 @@ class Publisher {
 		}));
 	}
 
+	public publishBroadcastStream = (type: string, value?: any): void => {
+		this.publish('broadcast', type, typeof value === 'undefined' ? null : value);
+	}
+
 	public publishMainStream = (userId: User['id'], type: string, value?: any): void => {
 		this.publish(`mainStream:${userId}`, type, typeof value === 'undefined' ? null : value);
 	}
@@ -75,6 +79,7 @@ const publisher = new Publisher();
 
 export default publisher;
 
+export const publishBroadcastStream = publisher.publishBroadcastStream;
 export const publishMainStream = publisher.publishMainStream;
 export const publishDriveStream = publisher.publishDriveStream;
 export const publishNoteStream = publisher.publishNoteStream;