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 | # 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
		
		Reference in a new issue