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.
 
 
 
 
 

62 lines
1.7 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. resp = self._session.get(url, timeout=10)
  27. resp.raise_for_status()
  28. result = resp.json() if resp.content else None
  29. except (requests.RequestException, ValueError):
  30. self._logger.exception("zKillboard API query failed")
  31. raise ZKillboardError()
  32. self._last_query = time.time()
  33. return result
  34. def iter_killmails(self, *args):
  35. """Return an iterator over killmails using the given API arguments.
  36. Automagically follows pagination as far as possible. (Be careful.)
  37. """
  38. page = 1
  39. while True:
  40. if page > 1:
  41. result = self.query(*args, "page", page)
  42. else:
  43. result = self.query(*args)
  44. if result:
  45. yield from result
  46. page += 1
  47. else:
  48. break