A corporation manager and dashboard for EVE Online
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 

67 líneas
1.9 KiB

  1. # -*- coding: utf-8 -*-
  2. import time
  3. import requests
  4. from ..exceptions import ZKillboardError
  5. __all__ = ["ZKillboard"]
  6. class ZKillboard:
  7. """EVE API module for zKillboard."""
  8. _MAX_RATE = 0.5
  9. def __init__(self, session, logger):
  10. self._session = session
  11. self._logger = logger
  12. self._debug = logger.debug
  13. self._base_url = "https://zkillboard.com/api"
  14. self._last_query = 0
  15. def query(self, *args):
  16. """Make an API query using the given arguments."""
  17. query = "/" + "".join(str(arg) + "/" for arg in args)
  18. url = self._base_url + query
  19. delta = self._MAX_RATE - (time.time() - self._last_query)
  20. if delta > 0:
  21. self._debug("[GET] [wait %.2fs] %s", delta, query)
  22. time.sleep(delta)
  23. else:
  24. self._debug("[GET] %s", query)
  25. try:
  26. try:
  27. resp = self._session.get(url, timeout=10)
  28. except requests.ConnectionError:
  29. self._logger.warn("zKillboard API query failed, retrying once")
  30. time.sleep(self._MAX_RATE)
  31. resp = self._session.get(url, timeout=10)
  32. resp.raise_for_status()
  33. result = resp.json() if resp.content else None
  34. except (requests.RequestException, ValueError):
  35. self._logger.exception("zKillboard API query failed")
  36. raise ZKillboardError()
  37. self._last_query = time.time()
  38. return result
  39. def iter_killmails(self, *args):
  40. """Return an iterator over killmails using the given API arguments.
  41. Automagically follows pagination as far as possible. (Be careful.)
  42. """
  43. page = 1
  44. while True:
  45. if page > 1:
  46. result = self.query(*args, "page", page)
  47. else:
  48. result = self.query(*args)
  49. if result:
  50. yield from result
  51. page += 1
  52. else:
  53. break