__init__.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # pylint: disable=missing-module-docstring
  3. import sys
  4. from os import listdir
  5. from os.path import realpath, dirname, join, isdir
  6. from collections import defaultdict
  7. from searx.utils import load_module
  8. answerers_dir = dirname(realpath(__file__))
  9. def load_answerers():
  10. answerers = [] # pylint: disable=redefined-outer-name
  11. for filename in listdir(answerers_dir):
  12. if not isdir(join(answerers_dir, filename)) or filename.startswith('_'):
  13. continue
  14. module = load_module('answerer.py', join(answerers_dir, filename))
  15. if not hasattr(module, 'keywords') or not isinstance(module.keywords, tuple) or not module.keywords:
  16. sys.exit(2)
  17. answerers.append(module)
  18. return answerers
  19. def get_answerers_by_keywords(answerers): # pylint:disable=redefined-outer-name
  20. by_keyword = defaultdict(list)
  21. for answerer in answerers:
  22. for keyword in answerer.keywords:
  23. for keyword in answerer.keywords:
  24. by_keyword[keyword].append(answerer.answer)
  25. return by_keyword
  26. def ask(query):
  27. results = []
  28. query_parts = list(filter(None, query.query.split()))
  29. if not query_parts or query_parts[0] not in answerers_by_keywords:
  30. return results
  31. for answerer in answerers_by_keywords[query_parts[0]]:
  32. result = answerer(query)
  33. if result:
  34. results.append(result)
  35. return results
  36. answerers = load_answerers()
  37. answerers_by_keywords = get_answerers_by_keywords(answerers)