From 7019ddbfc7c2f71a7b76cba03ff141b97e9fdcd4 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Sat, 6 Oct 2018 16:03:18 +0900 Subject: [PATCH 1/7] external user recommendation --- .config/example.yml | 7 ++ src/config/types.ts | 6 + .../api/endpoints/users/recommendation.ts | 106 ++++++++++++------ 3 files changed, 84 insertions(+), 35 deletions(-) diff --git a/.config/example.yml b/.config/example.yml index ebad17183..0f38e593b 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -159,3 +159,10 @@ drive: # Summaly proxy # summalyProxy: "http://example.com" + +# User recommendation +user_recommendation: + external: true + engine: http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}} + timeout: 300000 + diff --git a/src/config/types.ts b/src/config/types.ts index 003185acc..5c7b8260d 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -96,6 +96,12 @@ export type Source = { google_maps_api_key: string; clusterLimit?: number; + + user_recommendation: { + external: boolean; + engine: string; + timeout: number; + }; }; /** diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts index e0a5cb9e3..b0ad75caa 100644 --- a/src/server/api/endpoints/users/recommendation.ts +++ b/src/server/api/endpoints/users/recommendation.ts @@ -3,6 +3,9 @@ import $ from 'cafy'; import User, { pack, ILocalUser } from '../../../../models/user'; import { getFriendIds } from '../../common/get-friends'; import Mute from '../../../../models/mute'; +import * as request from 'request' +import { ILocalUser } from '../../../../models/user' +import config from '../../../../config' export const meta = { desc: { @@ -15,44 +18,77 @@ export const meta = { }; export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => { - // Get 'limit' parameter - const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit); - if (limitErr) return rej('invalid limit param'); + var external = config.user_recommendation.external - // Get 'offset' parameter - const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset); - if (offsetErr) return rej('invalid offset param'); - - // ID list of the user itself and other users who the user follows - const followingIds = await getFriendIds(me._id); - - // ミュートしているユーザーを取得 - const mutedUserIds = (await Mute.find({ - muterId: me._id - })).map(m => m.muteeId); - - const users = await User - .find({ - _id: { - $nin: followingIds.concat(mutedUserIds) + if (external) { + var userName = me.username + var hostName = config.hostname + var limit = params.limit + var offset = params.offset + var timeout = config.user_recommendation.timeout + var engine = config.user_recommendation.engine + var url + url = engine + url = url.replace('{{host}}', hostName) + url = url.replace('{{user}}', userName) + url = url.replace('{{limit}}', limit) + url = url.replace('{{offset}}', offset) + request( + { + url: url, + timeout: timeout, + json: true, + followRedirect: true, + followAllRedirects: true }, - isLocked: false, - $or: [{ - lastUsedAt: { - $gte: new Date(Date.now() - ms('7days')) + function (error: any, response: any, body: any) { + if (!error && response.statusCode == 200) { + res(body) + } else { + res([]) } - }, { - host: null - }] - }, { - limit: limit, - skip: offset, - sort: { - followersCount: -1 } - }); + ) + } else { + // Get 'limit' parameter + const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit); + if (limitErr) return rej('invalid limit param'); - // Serialize - res(await Promise.all(users.map(async user => - await pack(user, me, { detail: true })))); + // Get 'offset' parameter + const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset); + if (offsetErr) return rej('invalid offset param'); + + // ID list of the user itself and other users who the user follows + const followingIds = await getFriendIds(me._id); + + // ミュートしているユーザーを取得 + const mutedUserIds = (await Mute.find({ + muterId: me._id + })).map(m => m.muteeId); + + const users = await User + .find({ + _id: { + $nin: followingIds.concat(mutedUserIds) + }, + isLocked: false, + $or: [{ + lastUsedAt: { + $gte: new Date(Date.now() - ms('7days')) + } + }, { + host: null + }] + }, { + limit: limit, + skip: offset, + sort: { + followersCount: -1 + } + }); + + // Serialize + res(await Promise.all(users.map(async user => + await pack(user, me, { detail: true })))); + } }); From 3bc7e1e35cc0dbb16b6e7c3716787e621fde97ba Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Sat, 6 Oct 2018 16:31:21 +0900 Subject: [PATCH 2/7] remove follow buttons in the friends-maker component/widget --- src/client/app/desktop/views/components/friends-maker.vue | 1 - src/client/app/desktop/views/widgets/users.vue | 1 - 2 files changed, 2 deletions(-) diff --git a/src/client/app/desktop/views/components/friends-maker.vue b/src/client/app/desktop/views/components/friends-maker.vue index 4e8a212b0..d64890fdb 100644 --- a/src/client/app/desktop/views/components/friends-maker.vue +++ b/src/client/app/desktop/views/components/friends-maker.vue @@ -8,7 +8,6 @@ {{ user | userName }}

@{{ user | acct }}

-

%i18n:@empty%

diff --git a/src/client/app/desktop/views/widgets/users.vue b/src/client/app/desktop/views/widgets/users.vue index 28c6372b6..7501e96d9 100644 --- a/src/client/app/desktop/views/widgets/users.vue +++ b/src/client/app/desktop/views/widgets/users.vue @@ -13,7 +13,6 @@ {{ _user | userName }}

@{{ _user | acct }}

-

%i18n:@no-one%

From 04650464f302d566362e49e16a33aaf4a03232af Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Sat, 6 Oct 2018 16:34:52 +0900 Subject: [PATCH 3/7] debug --- src/server/api/endpoints/users/recommendation.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts index b0ad75caa..4f90335be 100644 --- a/src/server/api/endpoints/users/recommendation.ts +++ b/src/server/api/endpoints/users/recommendation.ts @@ -4,7 +4,6 @@ import User, { pack, ILocalUser } from '../../../../models/user'; import { getFriendIds } from '../../common/get-friends'; import Mute from '../../../../models/mute'; import * as request from 'request' -import { ILocalUser } from '../../../../models/user' import config from '../../../../config' export const meta = { From 2e39106c4bb2d9a7d1a50a116b4e88402e6ba601 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Sat, 6 Oct 2018 17:19:41 +0900 Subject: [PATCH 4/7] better config handling --- src/server/api/endpoints/users/recommendation.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts index 4f90335be..95d75ac48 100644 --- a/src/server/api/endpoints/users/recommendation.ts +++ b/src/server/api/endpoints/users/recommendation.ts @@ -17,9 +17,7 @@ export const meta = { }; export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => { - var external = config.user_recommendation.external - - if (external) { + if (config.user_recommendation && config.user_recommendation.external) { var userName = me.username var hostName = config.hostname var limit = params.limit From 9f064d76d9d3fb3721cfae3468964feb8b899805 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Sat, 6 Oct 2018 17:21:27 +0900 Subject: [PATCH 5/7] better readable code --- src/server/api/endpoints/users/recommendation.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts index 95d75ac48..c25da9edc 100644 --- a/src/server/api/endpoints/users/recommendation.ts +++ b/src/server/api/endpoints/users/recommendation.ts @@ -24,12 +24,11 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => var offset = params.offset var timeout = config.user_recommendation.timeout var engine = config.user_recommendation.engine - var url - url = engine - url = url.replace('{{host}}', hostName) - url = url.replace('{{user}}', userName) - url = url.replace('{{limit}}', limit) - url = url.replace('{{offset}}', offset) + const url = engine + .replace('{{host}}', hostName) + .replace('{{user}}', userName) + .replace('{{limit}}', limit) + .replace('{{offset}}', offset) request( { url: url, From 96d961ee8092d4cbe6eeecb9a5a2ea9500464e3d Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Sat, 6 Oct 2018 17:23:32 +0900 Subject: [PATCH 6/7] better readable code --- src/server/api/endpoints/users/recommendation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts index c25da9edc..d903c8f1f 100644 --- a/src/server/api/endpoints/users/recommendation.ts +++ b/src/server/api/endpoints/users/recommendation.ts @@ -37,7 +37,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => followRedirect: true, followAllRedirects: true }, - function (error: any, response: any, body: any) { + (error: any, response: any, body: any) => { if (!error && response.statusCode == 200) { res(body) } else { From 2b7782ba03c59ee18f3f74479710272bf0564852 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Sat, 6 Oct 2018 17:38:57 +0900 Subject: [PATCH 7/7] replace var by const --- src/server/api/endpoints/users/recommendation.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts index d903c8f1f..6538a303b 100644 --- a/src/server/api/endpoints/users/recommendation.ts +++ b/src/server/api/endpoints/users/recommendation.ts @@ -18,12 +18,12 @@ export const meta = { export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => { if (config.user_recommendation && config.user_recommendation.external) { - var userName = me.username - var hostName = config.hostname - var limit = params.limit - var offset = params.offset - var timeout = config.user_recommendation.timeout - var engine = config.user_recommendation.engine + const userName = me.username + const hostName = config.hostname + const limit = params.limit + const offset = params.offset + const timeout = config.user_recommendation.timeout + const engine = config.user_recommendation.engine const url = engine .replace('{{host}}', hostName) .replace('{{user}}', userName)