mirror of
				https://codeberg.org/yeentown/barkey.git
				synced 2025-10-26 19:14:12 +00:00 
			
		
		
		
	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 | ||||
| # 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; | ||||
| 
 | ||||
| 	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 { 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 })))); | ||||
| 	} | ||||
| }); | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue