website.py 2.9 KB

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