47 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			47 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | from os import listdir | ||
|  | from os.path import realpath, dirname, join, isdir | ||
|  | from searx.utils import load_module | ||
|  | from collections import defaultdict | ||
|  | 
 | ||
|  | 
 | ||
|  | answerers_dir = dirname(realpath(__file__)) | ||
|  | 
 | ||
|  | 
 | ||
|  | def load_answerers(): | ||
|  |     answerers = [] | ||
|  |     for filename in listdir(answerers_dir): | ||
|  |         if not isdir(join(answerers_dir, filename)): | ||
|  |             continue | ||
|  |         module = load_module('answerer.py', join(answerers_dir, filename)) | ||
|  |         if not hasattr(module, 'keywords') or not isinstance(module.keywords, tuple) or not len(module.keywords): | ||
|  |             exit(2) | ||
|  |         answerers.append(module) | ||
|  |     return answerers | ||
|  | 
 | ||
|  | 
 | ||
|  | def get_answerers_by_keywords(answerers): | ||
|  |     by_keyword = defaultdict(list) | ||
|  |     for answerer in answerers: | ||
|  |         for keyword in answerer.keywords: | ||
|  |             for keyword in answerer.keywords: | ||
|  |                 by_keyword[keyword].append(answerer.answer) | ||
|  |     return by_keyword | ||
|  | 
 | ||
|  | 
 | ||
|  | def ask(query): | ||
|  |     results = [] | ||
|  |     query_parts = filter(None, query.query.split()) | ||
|  | 
 | ||
|  |     if query_parts[0] not in answerers_by_keywords: | ||
|  |         return results | ||
|  | 
 | ||
|  |     for answerer in answerers_by_keywords[query_parts[0]]: | ||
|  |         result = answerer(query) | ||
|  |         if result: | ||
|  |             results.append(result) | ||
|  |     return results | ||
|  | 
 | ||
|  | 
 | ||
|  | answerers = load_answerers() | ||
|  | answerers_by_keywords = get_answerers_by_keywords(answerers) |