A corporation manager and dashboard for EVE Online
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 

100 lignes
3.1 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. params = {"datasource": self._data_source}
  50. headers = {
  51. "Accept": "application/json",
  52. "Authorization": "Bearer " + token
  53. }
  54. url = self._base_url + query + "?" + urlencode(params)
  55. try:
  56. resp = method(url, json=data or None, timeout=10, headers=headers)
  57. resp.raise_for_status()
  58. return resp.json() if resp.content else None
  59. except (requests.RequestException, ValueError) as exc:
  60. raise EVEAPIError(str(exc))
  61. def get(self, query, token):
  62. """Do an HTTP GET request for a query using a token."""
  63. return self._do(query, None, token, self._session.get)
  64. def post(self, query, token, data=None):
  65. """Do an HTTP POST request for a query using a token."""
  66. return self._do(query, data, token, self._session.post)
  67. def put(self, query, token, data=None):
  68. """Do an HTTP PUT request for a query using a token."""
  69. return self._do(query, data, token, self._session.put)
  70. def delete(self, query, token):
  71. """Do an HTTP DELETE request for a query using a token."""
  72. return self._do(query, None, token, self._session.delete)