commands.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. """
  2. Дополнительные компоненты для рабоыт плагина commands.
  3. Функции для получения отображения и поиска по сипску комадн.
  4. Author: Milinuri Nirvalen
  5. Ver: 1.3 (7)
  6. """
  7. from chiori import Chio
  8. import re
  9. import random
  10. from typing import Optional
  11. from typing import Dict
  12. from collections import defaultdict
  13. Plugins = Dict[str, dict]
  14. def gen_lib(app: Chio) -> Plugins:
  15. """Собирает словарь с данными о плагинах
  16. Args:
  17. app (Chio): Экзмепляр бота
  18. Returns:
  19. dict: словарь с данными о плагинах
  20. """
  21. plugins_lib = {}
  22. for ap in app.plugins:
  23. # if ap.filename == 'main':
  24. # plugins_lib[ap.pid] = ap.__dict__
  25. # else:
  26. plugins_lib[ap.pid+":"+ap.filename] = ap.__dict__
  27. return plugins_lib
  28. # Джижок поиска по командам
  29. # =========================
  30. def _get_mathes(k: str, v: dict, pattern: str) -> set[str]:
  31. mathes = set()
  32. if re.findall(pattern, k):
  33. mathes.add("pid")
  34. if re.findall(pattern, v.get("name", "None")):
  35. mathes.add("name")
  36. if re.findall(pattern, v.get("desc", "None")):
  37. mathes.add("desc")
  38. for x in v["check_funcs"]:
  39. if re.findall(pattern, x):
  40. mathes.add("ch-f")
  41. for p in v["routers"].values():
  42. if re.findall(pattern, p.get("usage", "None") or "None"):
  43. mathes.add("usage")
  44. for x in p["check_func"]:
  45. # TODO: выпилить эти проверяющие функции
  46. if re.findall(pattern, list(x)[0]):
  47. mathes.add("cmd_ch-f")
  48. for x in p["else_func"]:
  49. if re.findall(pattern, list(x)[0]):
  50. mathes.add("cmd_else-f")
  51. for x in p["cmds"]:
  52. if re.findall(pattern, x):
  53. mathes.add("cmd")
  54. return mathes
  55. def search(lib: Plugins, pattern: str) -> str:
  56. grouped_res = defaultdict(set)
  57. for k, v in lib.items():
  58. mathes = _get_mathes(k, v, pattern)
  59. if len(mathes) > 0:
  60. grouped_res[", ".join(mathes)].add(k)
  61. text = f'🔎 результаты поиска "{pattern}":'
  62. for k, v in grouped_res.items():
  63. text += f"\n\n 🔶 {k} ({len(v)}):"
  64. for n in v:
  65. p = lib[n]
  66. # decor level
  67. if p.get("admins"):
  68. level = "🔥"
  69. elif p["commands"] > 3:
  70. level = "📦"
  71. else:
  72. level = ''
  73. text += f'\n-- {level} [{n}] {p.get("name")}'
  74. return text
  75. def get_pid(lib: Plugins, pattern: str) -> list:
  76. res = []
  77. for k, v in lib.items():
  78. if re.findall(pattern, k):
  79. res.append(k)
  80. elif re.findall(pattern, v["name"]):
  81. res.append(k)
  82. return res
  83. # Получение данных из списка команд
  84. # =================================
  85. def get_all_commands(lib: Plugins) -> list[dict]:
  86. res = []
  87. for p in lib.values():
  88. for v in p["routers"].values():
  89. res.append(v)
  90. return res
  91. def get_all_names(lib: Plugins) -> dict[str]:
  92. res = {}
  93. for x in get_all_commands(lib):
  94. for n in x["cmds"]:
  95. res[n] = x
  96. return res
  97. def get_random_cmd(lib: Plugins, commands: Optional[list]=None):
  98. if commands is None:
  99. commands = get_all_commands(lib)
  100. return random.choice(commands)