Browse Source

SteamLeaderboards: added get_iter

pull/41/head
Rossen Georgiev 9 years ago
parent
commit
d28acd77ff
  1. 31
      steam/client/builtins/misc.py

31
steam/client/builtins/misc.py

@ -2,19 +2,13 @@
Various features that don't have a category Various features that don't have a category
""" """
import logging import logging
import sys
from eventemitter import EventEmitter from eventemitter import EventEmitter
from steam.core.msg import MsgProto, get_um from steam.core.msg import MsgProto, get_um
from steam.enums import EResult, ELeaderboardDataRequest, ELeaderboardSortMethod, ELeaderboardDisplayType from steam.enums import EResult, ELeaderboardDataRequest, ELeaderboardSortMethod, ELeaderboardDisplayType
from steam.enums.emsg import EMsg from steam.enums.emsg import EMsg
from steam.util import WeakRefKeyDict from steam.util import WeakRefKeyDict, _range, chunks
from steam.util.throttle import ConstantRateLimit from steam.util.throttle import ConstantRateLimit
if sys.version_info < (3,):
_range = xrange
else:
_range = range
class Misc(object): class Misc(object):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -262,14 +256,29 @@ class SteamLeaderboard(object):
return [entries[i] for i in _range(0, len(entries), step)] return [entries[i] for i in _range(0, len(entries), step)]
def __iter__(self): def get_iter(self, times, seconds, chunk_size=2000):
"""Make a iterator over the entries
See :class:`steam.util.throttle.ConstantRateLimit` for `times` and `seconds` parameters.
:param chunk_size: number of entries per request
:type chunk_size: :class:`int`
:returns: generator object
:rtype: :class:`generator`
The iterator essentially buffers `chuck_size` number of entries, and ensures
we are not sending messages too fast.
For example, the `__iter__` method on this class uses `get_iter(1, 1, 2000)`
"""
def entry_generator(): def entry_generator():
with ConstantRateLimit(1, 1, use_gevent=True) as r: with ConstantRateLimit(times, seconds, use_gevent=True) as r:
for i in _range(0, len(self), 500): for entries in chunks(self, chunk_size):
entries = self[i:i+500]
if not entries: if not entries:
raise StopIteration raise StopIteration
for entry in entries: for entry in entries:
yield entry yield entry
r.wait() r.wait()
return entry_generator() return entry_generator()
def __iter__(self):
return self.get_iter(1, 1, 2000)

Loading…
Cancel
Save