summaryrefslogtreecommitdiff
path: root/src/api
diff options
context:
space:
mode:
authorこぴなたみぽ <Syuilotan@yahoo.co.jp>2017-06-15 04:52:33 +0900
committerGitHub <noreply@github.com>2017-06-15 04:52:33 +0900
commitcb4b120548a53700bca8baf52bfe42fe8e5f95ef (patch)
treeb0e4116756c0a9d6b7a06f4a5012fc91b6b5bc75 /src/api
parentchore(package): update @types/mongodb to version 2.2.4 (diff)
parentMerge pull request #552 from syuilo/greenkeeper/@types/node-7.0.31 (diff)
downloadmisskey-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.ts64
-rw-r--r--src/api/endpoints/messaging/messages.ts31
-rw-r--r--src/api/endpoints/messaging/messages/create.ts4
-rw-r--r--src/api/endpoints/meta.ts10
-rw-r--r--src/api/endpoints/users/search.ts2
-rw-r--r--src/api/models/messaging-message.ts5
-rw-r--r--src/api/stream/messaging.ts42
-rw-r--r--src/api/stream/server.ts20
-rw-r--r--src/api/streaming.ts6
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) {