A corporation manager and dashboard for EVE Online
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

102 lines
3.2 KiB

  1. # -*- coding: utf-8 -*-
  2. from urllib.parse import urlencode
  3. import requests
  4. from ..exceptions import EVEAPIError
  5. __all__ = ["EVESwaggerInterface"]
  6. class _ESIQueryBuilder:
  7. """Stores an ESI query that is being built by the client."""
  8. def __init__(self, esi, token):
  9. self._esi = esi
  10. self._token = token
  11. self._path = "/"
  12. def __getattr__(self, item):
  13. self._path += item + "/"
  14. return self
  15. def __call__(self, item):
  16. self._path += item + "/"
  17. return self
  18. def get(self):
  19. """Do an HTTP GET request for the built query."""
  20. return self._esi.get(self._path, self._token)
  21. def post(self, **kwargs):
  22. """Do an HTTP POST request for the built query."""
  23. return self._esi.post(self._path, self._token, data=kwargs)
  24. def put(self, **kwargs):
  25. """Do an HTTP PUT request for the built query."""
  26. return self._esi.put(self._path, self._token, data=kwargs)
  27. def delete(self):
  28. """Do an HTTP DELETE request for the built query."""
  29. return self._esi.delete(self._path, self._token)
  30. class EVESwaggerInterface:
  31. """EVE API module for the EVE Swagger Interface (ESI).
  32. There are two equivalent ways to use this interface:
  33. data = esi.get("/v3/characters/{char_id}/".format(char_id=char_id), token)
  34. data = esi(token).v3.characters(char_id).get()
  35. For more complex requests:
  36. data = esi.post("/v1/universe/names/", token, {"ids": [entity_id]})
  37. data = esi(token).v1.universe.names.post(ids=[entity_id]})
  38. """
  39. def __init__(self, session):
  40. self._session = session
  41. self._base_url = "https://esi.tech.ccp.is"
  42. self._data_source = "tranquility"
  43. def __call__(self, token):
  44. return _ESIQueryBuilder(self, token)
  45. def _do(self, query, data, token, method):
  46. """Execute a query using a token with the given session method.
  47. Return the JSON result, if any. Raise EVEAPIError for any errors.
  48. """
  49. ... # cache requests
  50. params = {"datasource": self._data_source}
  51. headers = {
  52. "Accept": "application/json",
  53. "Authorization": "Bearer " + token
  54. }
  55. url = self._base_url + query + "?" + urlencode(params)
  56. try:
  57. resp = method(url, json=data or None, timeout=10, headers=headers)
  58. resp.raise_for_status()
  59. return resp.json() if resp.content else None
  60. except (requests.RequestException, ValueError) as exc:
  61. raise EVEAPIError(str(exc))
  62. def get(self, query, token):
  63. """Do an HTTP GET request for a query using a token."""
  64. return self._do(query, None, token, self._session.get)
  65. def post(self, query, token, data=None):
  66. """Do an HTTP POST request for a query using a token."""
  67. return self._do(query, data, token, self._session.post)
  68. def put(self, query, token, data=None):
  69. """Do an HTTP PUT request for a query using a token."""
  70. return self._do(query, data, token, self._session.put)
  71. def delete(self, query, token):
  72. """Do an HTTP DELETE request for a query using a token."""
  73. return self._do(query, None, token, self._session.delete)