diff options
| author | こぴなたみぽ <Syuilotan@yahoo.co.jp> | 2017-06-15 04:52:33 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-06-15 04:52:33 +0900 |
| commit | cb4b120548a53700bca8baf52bfe42fe8e5f95ef (patch) | |
| tree | b0e4116756c0a9d6b7a06f4a5012fc91b6b5bc75 /src/api | |
| parent | chore(package): update @types/mongodb to version 2.2.4 (diff) | |
| parent | Merge pull request #552 from syuilo/greenkeeper/@types/node-7.0.31 (diff) | |
| download | misskey-cb4b120548a53700bca8baf52bfe42fe8e5f95ef.tar.gz misskey-cb4b120548a53700bca8baf52bfe42fe8e5f95ef.tar.bz2 misskey-cb4b120548a53700bca8baf52bfe42fe8e5f95ef.zip | |
Merge branch 'master' into greenkeeper/@types/mongodb-2.2.4
Diffstat (limited to 'src/api')
| -rw-r--r-- | src/api/common/read-messaging-message.ts | 64 | ||||
| -rw-r--r-- | src/api/endpoints/messaging/messages.ts | 31 | ||||
| -rw-r--r-- | src/api/endpoints/messaging/messages/create.ts | 4 | ||||
| -rw-r--r-- | src/api/endpoints/meta.ts | 10 | ||||
| -rw-r--r-- | src/api/endpoints/users/search.ts | 2 | ||||
| -rw-r--r-- | src/api/models/messaging-message.ts | 5 | ||||
| -rw-r--r-- | src/api/stream/messaging.ts | 42 | ||||
| -rw-r--r-- | src/api/stream/server.ts | 20 | ||||
| -rw-r--r-- | src/api/streaming.ts | 6 |
9 files changed, 112 insertions, 72 deletions
diff --git a/src/api/common/read-messaging-message.ts b/src/api/common/read-messaging-message.ts new file mode 100644 index 0000000000..3257ec8b07 --- /dev/null +++ b/src/api/common/read-messaging-message.ts @@ -0,0 +1,64 @@ +import * as mongo from 'mongodb'; +import Message from '../models/messaging-message'; +import { IMessagingMessage as IMessage } from '../models/messaging-message'; +import publishUserStream from '../event'; +import { publishMessagingStream } from '../event'; + +/** + * Mark as read message(s) + */ +export default ( + user: string | mongo.ObjectID, + otherparty: string | mongo.ObjectID, + message: string | string[] | IMessage | IMessage[] | mongo.ObjectID | mongo.ObjectID[] +) => new Promise<any>(async (resolve, reject) => { + + const userId = mongo.ObjectID.prototype.isPrototypeOf(user) + ? user + : new mongo.ObjectID(user); + + const otherpartyId = mongo.ObjectID.prototype.isPrototypeOf(otherparty) + ? otherparty + : new mongo.ObjectID(otherparty); + + const ids: mongo.ObjectID[] = Array.isArray(message) + ? mongo.ObjectID.prototype.isPrototypeOf(message[0]) + ? (message as mongo.ObjectID[]) + : typeof message[0] === 'string' + ? (message as string[]).map(m => new mongo.ObjectID(m)) + : (message as IMessage[]).map(m => m._id) + : mongo.ObjectID.prototype.isPrototypeOf(message) + ? [(message as mongo.ObjectID)] + : typeof message === 'string' + ? [new mongo.ObjectID(message)] + : [(message as IMessage)._id]; + + // Update documents + await Message.update({ + _id: { $in: ids }, + user_id: otherpartyId, + recipient_id: userId, + is_read: false + }, { + $set: { + is_read: true + } + }, { + multi: true + }); + + // Publish event + publishMessagingStream(otherpartyId, userId, 'read', ids.map(id => id.toString())); + + // Calc count of my unread messages + const count = await Message + .count({ + recipient_id: userId, + is_read: false + }); + + if (count == 0) { + // 全ての(いままで未読だった)自分宛てのメッセージを(これで)読みましたよというイベントを発行 + publishUserStream(userId, 'read_all_messaging_messages'); + } +}); diff --git a/src/api/endpoints/messaging/messages.ts b/src/api/endpoints/messaging/messages.ts index b3a5c57f6c..7b270924eb 100644 --- a/src/api/endpoints/messaging/messages.ts +++ b/src/api/endpoints/messaging/messages.ts @@ -5,8 +5,7 @@ import $ from 'cafy'; import Message from '../../models/messaging-message'; import User from '../../models/user'; import serialize from '../../serializers/messaging-message'; -import publishUserStream from '../../event'; -import { publishMessagingStream } from '../../event'; +import read from '../../common/read-messaging-message'; /** * Get messages @@ -98,32 +97,6 @@ module.exports = (params, user) => new Promise(async (res, rej) => { // Mark as read all if (markAsRead) { - const ids = messages - .filter(m => m.is_read == false) - .filter(m => m.recipient_id.equals(user._id)) - .map(m => m._id); - - // Update documents - await Message.update({ - _id: { $in: ids } - }, { - $set: { is_read: true } - }, { - multi: true - }); - - // Publish event - publishMessagingStream(recipient._id, user._id, 'read', ids.map(id => id.toString())); - - const count = await Message - .count({ - recipient_id: user._id, - is_read: false - }); - - if (count == 0) { - // 全ての(いままで未読だった)メッセージを(これで)読みましたよというイベントを発行 - publishUserStream(user._id, 'read_all_messaging_messages'); - } + read(user._id, recipient._id, messages); } }); diff --git a/src/api/endpoints/messaging/messages/create.ts b/src/api/endpoints/messaging/messages/create.ts index 05f9cda4cb..8af55d850c 100644 --- a/src/api/endpoints/messaging/messages/create.ts +++ b/src/api/endpoints/messaging/messages/create.ts @@ -93,13 +93,13 @@ module.exports = (params, user) => new Promise(async (res, rej) => { publishMessagingStream(message.recipient_id, message.user_id, 'message', messageObj); publishUserStream(message.recipient_id, 'messaging_message', messageObj); - // 5秒経っても(今回作成した)メッセージが既読にならなかったら「未読のメッセージがありますよ」イベントを発行する + // 3秒経っても(今回作成した)メッセージが既読にならなかったら「未読のメッセージがありますよ」イベントを発行する setTimeout(async () => { const freshMessage = await Message.findOne({ _id: message._id }, { is_read: true }); if (!freshMessage.is_read) { publishUserStream(message.recipient_id, 'unread_messaging_message', messageObj); } - }, 5000); + }, 3000); // Register to search database if (message.text && config.elasticsearch.enable) { diff --git a/src/api/endpoints/meta.ts b/src/api/endpoints/meta.ts index 98f812abd5..a3f1d50329 100644 --- a/src/api/endpoints/meta.ts +++ b/src/api/endpoints/meta.ts @@ -1,6 +1,7 @@ /** * Module dependencies */ +import * as os from 'os'; import version from '../../version'; import config from '../../conf'; @@ -41,6 +42,13 @@ module.exports = (params) => new Promise(async (res, rej) => { res({ maintainer: config.maintainer, version: version, - secure: config.https.enable + secure: config.https.enable, + machine: os.hostname(), + os: os.platform(), + node: process.version, + cpu: { + model: os.cpus()[0].model, + cores: os.cpus().length + } }); }); diff --git a/src/api/endpoints/users/search.ts b/src/api/endpoints/users/search.ts index a3f2fb796d..73a5db47e2 100644 --- a/src/api/endpoints/users/search.ts +++ b/src/api/endpoints/users/search.ts @@ -42,7 +42,7 @@ async function byNative(res, rej, me, query, offset, max) { const users = await User .find({ $or: [{ - username_lower: new RegExp(escapedQuery.toLowerCase()) + username_lower: new RegExp(escapedQuery.replace('@', '').toLowerCase()) }, { name: new RegExp(escapedQuery) }] diff --git a/src/api/models/messaging-message.ts b/src/api/models/messaging-message.ts index 81aee2cab8..18afa57e44 100644 --- a/src/api/models/messaging-message.ts +++ b/src/api/models/messaging-message.ts @@ -1,7 +1,12 @@ +import * as mongo from 'mongodb'; import db from '../../db/mongodb'; export default db.get('messaging_messages') as any; // fuck type definition +export interface IMessagingMessage { + _id: mongo.ObjectID; +} + export function isValidText(text: string): boolean { return text.length <= 1000 && text.trim() != ''; } diff --git a/src/api/stream/messaging.ts b/src/api/stream/messaging.ts index 71bf7a34c6..3f505cfafa 100644 --- a/src/api/stream/messaging.ts +++ b/src/api/stream/messaging.ts @@ -1,8 +1,6 @@ -import * as mongodb from 'mongodb'; import * as websocket from 'websocket'; import * as redis from 'redis'; -import Message from '../models/messaging-message'; -import { publishMessagingStream } from '../event'; +import read from '../common/read-messaging-message'; export default function messagingStream(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient, user: any): void { const otherparty = request.resourceURL.query.otherparty; @@ -18,42 +16,8 @@ export default function messagingStream(request: websocket.request, connection: switch (msg.type) { case 'read': - if (!msg.id) { - return; - } - - const id = new mongodb.ObjectID(msg.id); - - // Fetch message - // SELECT _id, user_id, is_read - const message = await Message.findOne({ - _id: id, - recipient_id: user._id - }, { - fields: { - _id: true, - user_id: true, - is_read: true - } - }); - - if (message == null) { - return; - } - - if (message.is_read) { - return; - } - - // Update documents - await Message.update({ - _id: id - }, { - $set: { is_read: true } - }); - - // Publish event - publishMessagingStream(message.user_id, user._id, 'read', id.toString()); + if (!msg.id) return; + read(user._id, otherparty, msg.id); break; } }); diff --git a/src/api/stream/server.ts b/src/api/stream/server.ts new file mode 100644 index 0000000000..6de5337499 --- /dev/null +++ b/src/api/stream/server.ts @@ -0,0 +1,20 @@ +import * as websocket from 'websocket'; +import Xev from 'xev'; + +const ev = new Xev(); + +export default function homeStream(request: websocket.request, connection: websocket.connection): void { + const onStats = stats => { + connection.send(JSON.stringify({ + type: 'stats', + body: stats + })); + }; + + ev.addListener('stats', onStats); + + connection.on('close', () => { + console.log('yooo'); + ev.removeListener('stats', onStats); + }); +} diff --git a/src/api/streaming.ts b/src/api/streaming.ts index e1d79481d3..c71132100c 100644 --- a/src/api/streaming.ts +++ b/src/api/streaming.ts @@ -8,6 +8,7 @@ import isNativeToken from './common/is-native-token'; import homeStream from './stream/home'; import messagingStream from './stream/messaging'; +import serverStream from './stream/server'; module.exports = (server: http.Server) => { /** @@ -20,6 +21,11 @@ module.exports = (server: http.Server) => { ws.on('request', async (request) => { const connection = request.accept(); + if (request.resourceURL.pathname === '/server') { + serverStream(request, connection); + return; + } + const user = await authenticate(connection, request.resourceURL.query.i); if (user == null) { |