|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- # -*- coding: utf-8 -*-
-
- import time
-
- import requests
-
- from ..exceptions import ZKillboardError
-
- __all__ = ["ZKillboard"]
-
- class ZKillboard:
- """EVE API module for zKillboard."""
- _MAX_RATE = 0.5
-
- def __init__(self, session, logger):
- self._session = session
- self._logger = logger
- self._debug = logger.debug
-
- self._base_url = "https://zkillboard.com/api"
- self._last_query = 0
-
- def query(self, *args):
- """Make an API query using the given arguments."""
- query = "/" + "".join(str(arg) + "/" for arg in args)
- url = self._base_url + query
- delta = self._MAX_RATE - (time.time() - self._last_query)
- if delta > 0:
- self._debug("[GET] [wait %.2fs] %s", delta, query)
- time.sleep(delta)
- else:
- self._debug("[GET] %s", query)
-
- try:
- try:
- resp = self._session.get(url, timeout=10)
- except requests.ConnectionError:
- self._logger.warn("zKillboard API query failed, retrying once")
- time.sleep(self._MAX_RATE)
- resp = self._session.get(url, timeout=10)
- resp.raise_for_status()
- result = resp.json() if resp.content else None
- except (requests.RequestException, ValueError):
- self._logger.exception("zKillboard API query failed")
- raise ZKillboardError()
-
- self._last_query = time.time()
- return result
-
- def iter_killmails(self, *args):
- """Return an iterator over killmails using the given API arguments.
-
- Automagically follows pagination as far as possible. (Be careful.)
- """
- page = 1
- while True:
- if page > 1:
- result = self.query(*args, "page", page)
- else:
- result = self.query(*args)
-
- if result:
- yield from result
- page += 1
- else:
- break
|