external user recommendation
This commit is contained in:
		
							parent
							
								
									48e4dc75f4
								
							
						
					
					
						commit
						7019ddbfc7
					
				
					 3 changed files with 84 additions and 35 deletions
				
			
		| 
						 | 
					@ -159,3 +159,10 @@ drive:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Summaly proxy
 | 
					# Summaly proxy
 | 
				
			||||||
# summalyProxy: "http://example.com"
 | 
					# 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -96,6 +96,12 @@ export type Source = {
 | 
				
			||||||
	google_maps_api_key: string;
 | 
						google_maps_api_key: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	clusterLimit?: number;
 | 
						clusterLimit?: number;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						user_recommendation: {
 | 
				
			||||||
 | 
							external: boolean;
 | 
				
			||||||
 | 
							engine: string;
 | 
				
			||||||
 | 
							timeout: number;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,6 +3,9 @@ import $ from 'cafy';
 | 
				
			||||||
import User, { pack, ILocalUser } from '../../../../models/user';
 | 
					import User, { pack, ILocalUser } from '../../../../models/user';
 | 
				
			||||||
import { getFriendIds } from '../../common/get-friends';
 | 
					import { getFriendIds } from '../../common/get-friends';
 | 
				
			||||||
import Mute from '../../../../models/mute';
 | 
					import Mute from '../../../../models/mute';
 | 
				
			||||||
 | 
					import * as request from 'request'
 | 
				
			||||||
 | 
					import { ILocalUser } from '../../../../models/user'
 | 
				
			||||||
 | 
					import config from '../../../../config'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	desc: {
 | 
						desc: {
 | 
				
			||||||
| 
						 | 
					@ -15,44 +18,77 @@ export const meta = {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 | 
					export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
 | 
				
			||||||
	// Get 'limit' parameter
 | 
						var external = config.user_recommendation.external
 | 
				
			||||||
	const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
 | 
					 | 
				
			||||||
	if (limitErr) return rej('invalid limit param');
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Get 'offset' parameter
 | 
						if (external) {
 | 
				
			||||||
	const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset);
 | 
							var userName = me.username
 | 
				
			||||||
	if (offsetErr) return rej('invalid offset param');
 | 
							var hostName = config.hostname
 | 
				
			||||||
 | 
							var limit = params.limit
 | 
				
			||||||
	// ID list of the user itself and other users who the user follows
 | 
							var offset = params.offset
 | 
				
			||||||
	const followingIds = await getFriendIds(me._id);
 | 
							var timeout = config.user_recommendation.timeout
 | 
				
			||||||
 | 
							var engine = config.user_recommendation.engine
 | 
				
			||||||
	// ミュートしているユーザーを取得
 | 
							var url
 | 
				
			||||||
	const mutedUserIds = (await Mute.find({
 | 
							url = engine
 | 
				
			||||||
		muterId: me._id
 | 
							url = url.replace('{{host}}', hostName)
 | 
				
			||||||
	})).map(m => m.muteeId);
 | 
							url = url.replace('{{user}}', userName)
 | 
				
			||||||
 | 
							url = url.replace('{{limit}}', limit)
 | 
				
			||||||
	const users = await User
 | 
							url = url.replace('{{offset}}', offset)
 | 
				
			||||||
		.find({
 | 
							request(
 | 
				
			||||||
			_id: {
 | 
								{
 | 
				
			||||||
				$nin: followingIds.concat(mutedUserIds)
 | 
									url: url,
 | 
				
			||||||
 | 
									timeout: timeout,
 | 
				
			||||||
 | 
									json: true,
 | 
				
			||||||
 | 
									followRedirect: true,
 | 
				
			||||||
 | 
									followAllRedirects: true
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			isLocked: false,
 | 
								function (error: any, response: any, body: any) {
 | 
				
			||||||
			$or: [{
 | 
									if (!error && response.statusCode == 200) {
 | 
				
			||||||
				lastUsedAt: {
 | 
										res(body)
 | 
				
			||||||
					$gte: new Date(Date.now() - ms('7days'))
 | 
									} 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
 | 
							// Get 'offset' parameter
 | 
				
			||||||
	res(await Promise.all(users.map(async user =>
 | 
							const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset);
 | 
				
			||||||
		await pack(user, me, { detail: true }))));
 | 
							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 }))));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue