main.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import asyncio
  2. import json
  3. import os
  4. import re
  5. from typing import TypedDict, List, Dict, Any
  6. import httpx
  7. from fastapi import FastAPI
  8. from fastapi.middleware.cors import CORSMiddleware
  9. app = FastAPI()
  10. origins = [
  11. "http://drafter.cadel.me",
  12. "https://drafter.cadel.me",
  13. "http://localhost",
  14. "http://localhost:1234",
  15. ]
  16. app.add_middleware(
  17. CORSMiddleware,
  18. allow_origins=origins,
  19. allow_credentials=True,
  20. allow_methods=["*"],
  21. allow_headers=["*"],
  22. )
  23. def discover_sets():
  24. # find all set directories
  25. sets = []
  26. for root, dirs, files in os.walk("data/sets"):
  27. for dir in dirs:
  28. sets.append(dir)
  29. return sets
  30. @app.get("/sets")
  31. def read_sets():
  32. sets = discover_sets()
  33. return {"sets": sets}
  34. @app.get("/sets/{set_name}/cards")
  35. def read_item(set_name: str):
  36. if set_name not in discover_sets():
  37. return {"error": "Set not found"}
  38. card_data_path = os.path.join("data", "sets", set_name, "card-data.json")
  39. with open(card_data_path) as f:
  40. card_data = json.load(f)
  41. return {"data": card_data}
  42. @app.get("/sets/{set_name}/ratings")
  43. def read_item(set_name: str):
  44. if set_name not in discover_sets():
  45. return {"error": "Set not found"}
  46. card_ratings_path = os.path.join("data", "sets", set_name, "card-ratings-all.json")
  47. with open(card_ratings_path) as f:
  48. card_data = json.load(f)
  49. return {"data": card_data}
  50. @app.get("/sets/{set_name}")
  51. def read_item(set_name: str):
  52. if set_name not in discover_sets():
  53. return {"error": "Set not found"}
  54. card_data_path = os.path.join("data", "sets", set_name, "card-data.json")
  55. with open(card_data_path) as f:
  56. card_data = json.load(f)
  57. card_ratings_path = os.path.join("data", "sets", set_name, "card-ratings-all.json")
  58. with open(card_ratings_path) as f:
  59. ratings_data = json.load(f)
  60. return {"code": set_name, "data": {"cards": card_data, "ratings": ratings_data}}
  61. USER_ID_REGEX = r'user_history\/(.*)\?'
  62. class DraftMeta(TypedDict):
  63. expansion: str
  64. format: str
  65. timestamp: str
  66. draft_id: str
  67. async def get_drafts_from_17lands(user_id: str) -> List[DraftMeta]:
  68. url = f"https://www.17lands.com/user/data/{user_id}"
  69. drafts = []
  70. async with httpx.AsyncClient() as client:
  71. res = await client.get(
  72. url,
  73. headers={
  74. "Accept": "application/json"
  75. }
  76. )
  77. print(res)
  78. json_res = res.json()
  79. for draft in json_res["drafts"]:
  80. drafts.append({
  81. "expansion": draft["expansion"],
  82. "format": draft["format"],
  83. "timestamp": draft["first_event_server_time"],
  84. "draft_id": draft["id"],
  85. })
  86. return drafts
  87. async def get_draft_data(draft_id:str, client: httpx.AsyncClient):
  88. url = f"https://www.17lands.com/data/draft?draft_id={draft_id}"
  89. res = await client.get(
  90. url,
  91. headers={
  92. "Accept": "application/json"
  93. }
  94. )
  95. print(res)
  96. print(res.text)
  97. print(res.json())
  98. return res.json()["picks"]
  99. async def get_all_draft_data(draft_ids: List[str]) -> Dict[str, Any]:
  100. async with httpx.AsyncClient() as client:
  101. tasks = [get_draft_data(draft_id, client) for draft_id in draft_ids]
  102. results = await asyncio.gather(*tasks)
  103. return {
  104. draft_id: {"picks": result["picks"]}
  105. for draft_id, result in zip(draft_ids, results)
  106. }
  107. @app.get("/drafts")
  108. async def read_item(history: str):
  109. user_id = re.search(USER_ID_REGEX, history).group(1)
  110. all_drafts = await get_drafts_from_17lands(user_id)
  111. all_draft_data = await get_all_draft_data([draft["draft_id"] for draft in all_drafts])
  112. drafts = [
  113. {
  114. "set_code" : draft["expansion"],
  115. "format" : draft["format"],
  116. "timestamp" : draft["timestamp"],
  117. "draft_data" : all_draft_data[draft["draft_id"]],
  118. }
  119. for draft in all_drafts
  120. ]
  121. print(drafts)
  122. return {"drafts":drafts}