website.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from __future__ import annotations
  2. import os
  3. import requests
  4. from datetime import datetime
  5. from flask import send_from_directory, redirect
  6. from ...image.copy_images import secure_filename
  7. from ...cookies import get_cookies_dir
  8. from ...errors import VersionNotFoundError
  9. from ...constants import STATIC_URL, DIST_DIR
  10. from ... import version
  11. def redirect_home():
  12. return redirect('/chat')
  13. def render(filename = "chat"):
  14. is_live = True
  15. if os.path.exists(DIST_DIR):
  16. is_live = False
  17. path = os.path.abspath(os.path.join(os.path.dirname(DIST_DIR), (filename + ("" if "." in filename else ".html"))))
  18. return send_from_directory(os.path.dirname(path), os.path.basename(path))
  19. try:
  20. latest_version = version.utils.latest_version
  21. except VersionNotFoundError:
  22. latest_version = version.utils.current_version
  23. today = datetime.today().strftime('%Y-%m-%d')
  24. cache_dir = os.path.join(get_cookies_dir(), ".gui_cache")
  25. cache_file = os.path.join(cache_dir, f"{today}.{secure_filename(f'{filename}.{version.utils.current_version}-{latest_version}')}{'.live' if is_live else ''}.html")
  26. if not os.path.exists(cache_file):
  27. os.makedirs(cache_dir, exist_ok=True)
  28. html = requests.get(f"{STATIC_URL}{filename}.html").text
  29. if is_live:
  30. html = html.replace("../dist/", f"dist/")
  31. html = html.replace("\"dist/", f"\"{STATIC_URL}dist/")
  32. with open(cache_file, 'w', encoding='utf-8') as f:
  33. f.write(html)
  34. return send_from_directory(os.path.abspath(cache_dir), os.path.basename(cache_file))
  35. class Website:
  36. def __init__(self, app) -> None:
  37. self.app = app
  38. self.routes = {
  39. '/': {
  40. 'function': self._index,
  41. 'methods': ['GET', 'POST']
  42. },
  43. '/chat/': {
  44. 'function': self._chat,
  45. 'methods': ['GET', 'POST']
  46. },
  47. '/qrcode.html': {
  48. 'function': self._qrcode,
  49. 'methods': ['GET', 'POST']
  50. },
  51. '/background.html': {
  52. 'function': self._background,
  53. 'methods': ['GET', 'POST']
  54. },
  55. '/chat/<conversation_id>': {
  56. 'function': self._chat,
  57. 'methods': ['GET', 'POST']
  58. },
  59. '/media/': {
  60. 'function': redirect_home,
  61. 'methods': ['GET', 'POST']
  62. },
  63. '/dist/<path:name>': {
  64. 'function': self._dist,
  65. 'methods': ['GET']
  66. },
  67. }
  68. def _index(self, filename = "index"):
  69. return render(filename)
  70. def _qrcode(self, filename = "qrcode"):
  71. return render(filename)
  72. def _background(self, filename = "background"):
  73. return render(filename)
  74. def _chat(self, filename = "chat"):
  75. filename = "chat/index" if filename == 'chat' else secure_filename(filename)
  76. return render(filename)
  77. def _dist(self, name: str):
  78. return send_from_directory(os.path.abspath(DIST_DIR), name)