2016-12-28 23:49:51 +01:00
|
|
|
import * as websocket from 'websocket';
|
|
|
|
import * as redis from 'redis';
|
2017-03-20 05:54:59 +01:00
|
|
|
import * as debug from 'debug';
|
|
|
|
|
2018-03-29 13:32:18 +02:00
|
|
|
import User from '../../../models/user';
|
|
|
|
import Mute from '../../../models/mute';
|
2018-04-07 19:30:37 +02:00
|
|
|
import { pack as packNote } from '../../../models/note';
|
2017-10-30 14:12:10 +01:00
|
|
|
import readNotification from '../common/read-notification';
|
2017-03-20 05:54:59 +01:00
|
|
|
|
|
|
|
const log = debug('misskey');
|
2016-12-28 23:49:51 +01:00
|
|
|
|
2017-12-21 23:26:23 +01:00
|
|
|
export default async function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient, user: any) {
|
2016-12-28 23:49:51 +01:00
|
|
|
// Subscribe Home stream channel
|
|
|
|
subscriber.subscribe(`misskey:user-stream:${user._id}`);
|
2017-03-20 05:54:59 +01:00
|
|
|
|
2017-12-21 23:26:23 +01:00
|
|
|
const mute = await Mute.find({
|
2018-03-29 07:48:47 +02:00
|
|
|
muterId: user._id,
|
|
|
|
deletedAt: { $exists: false }
|
2017-12-21 23:26:23 +01:00
|
|
|
});
|
2018-03-29 07:48:47 +02:00
|
|
|
const mutedUserIds = mute.map(m => m.muteeId.toString());
|
2017-12-21 23:26:23 +01:00
|
|
|
|
2017-03-20 05:54:59 +01:00
|
|
|
subscriber.on('message', async (channel, data) => {
|
|
|
|
switch (channel.split(':')[1]) {
|
|
|
|
case 'user-stream':
|
2017-12-21 23:26:23 +01:00
|
|
|
try {
|
|
|
|
const x = JSON.parse(data);
|
|
|
|
|
2018-04-07 19:30:37 +02:00
|
|
|
if (x.type == 'note') {
|
2018-03-29 07:48:47 +02:00
|
|
|
if (mutedUserIds.indexOf(x.body.userId) != -1) {
|
2017-12-21 23:26:23 +01:00
|
|
|
return;
|
|
|
|
}
|
2018-03-29 07:48:47 +02:00
|
|
|
if (x.body.reply != null && mutedUserIds.indexOf(x.body.reply.userId) != -1) {
|
2017-12-21 23:26:23 +01:00
|
|
|
return;
|
|
|
|
}
|
2018-04-07 19:30:37 +02:00
|
|
|
if (x.body.renote != null && mutedUserIds.indexOf(x.body.renote.userId) != -1) {
|
2017-12-21 23:26:23 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
} else if (x.type == 'notification') {
|
2018-03-29 07:48:47 +02:00
|
|
|
if (mutedUserIds.indexOf(x.body.userId) != -1) {
|
2017-12-21 23:26:23 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
connection.send(data);
|
|
|
|
} catch (e) {
|
|
|
|
connection.send(data);
|
|
|
|
}
|
2017-03-20 05:54:59 +01:00
|
|
|
break;
|
2018-04-07 19:30:37 +02:00
|
|
|
case 'note-stream':
|
|
|
|
const noteId = channel.split(':')[2];
|
|
|
|
log(`RECEIVED: ${noteId} ${data} by @${user.username}`);
|
|
|
|
const note = await packNote(noteId, user, {
|
2017-03-20 05:54:59 +01:00
|
|
|
detail: true
|
|
|
|
});
|
|
|
|
connection.send(JSON.stringify({
|
2018-04-07 19:30:37 +02:00
|
|
|
type: 'note-updated',
|
2017-03-20 05:54:59 +01:00
|
|
|
body: {
|
2018-04-07 19:30:37 +02:00
|
|
|
note: note
|
2017-03-20 05:54:59 +01:00
|
|
|
}
|
|
|
|
}));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
connection.on('message', data => {
|
|
|
|
const msg = JSON.parse(data.utf8Data);
|
|
|
|
|
|
|
|
switch (msg.type) {
|
2018-03-03 06:42:25 +01:00
|
|
|
case 'api':
|
|
|
|
// TODO
|
|
|
|
break;
|
|
|
|
|
2017-08-30 10:45:23 +02:00
|
|
|
case 'alive':
|
|
|
|
// Update lastUsedAt
|
|
|
|
User.update({ _id: user._id }, {
|
|
|
|
$set: {
|
2018-04-07 20:58:11 +02:00
|
|
|
'lastUsedAt': new Date()
|
2017-08-30 10:45:23 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
break;
|
|
|
|
|
2017-10-30 14:12:10 +01:00
|
|
|
case 'read_notification':
|
|
|
|
if (!msg.id) return;
|
|
|
|
readNotification(user._id, msg.id);
|
|
|
|
break;
|
|
|
|
|
2017-03-20 05:54:59 +01:00
|
|
|
case 'capture':
|
2017-03-20 11:10:13 +01:00
|
|
|
if (!msg.id) return;
|
2018-04-07 19:30:37 +02:00
|
|
|
const noteId = msg.id;
|
|
|
|
log(`CAPTURE: ${noteId} by @${user.username}`);
|
|
|
|
subscriber.subscribe(`misskey:note-stream:${noteId}`);
|
2017-03-20 05:54:59 +01:00
|
|
|
break;
|
|
|
|
}
|
2016-12-28 23:49:51 +01:00
|
|
|
});
|
|
|
|
}
|