4 changed files with 102 additions and 0 deletions
@ -0,0 +1,7 @@ |
|||||
|
globalid |
||||
|
======== |
||||
|
|
||||
|
.. automodule:: steam.globalid |
||||
|
:members: |
||||
|
:undoc-members: |
||||
|
:show-inheritance: |
@ -0,0 +1,93 @@ |
|||||
|
import sys |
||||
|
from datetime import datetime, timedelta |
||||
|
|
||||
|
if sys.version_info < (3,): |
||||
|
intBase = long |
||||
|
else: |
||||
|
intBase = int |
||||
|
|
||||
|
|
||||
|
class GlobalID(intBase): |
||||
|
""" |
||||
|
Represents a globally unique identifier within the Steam network. |
||||
|
Guaranteed to be unique across all racks and servers for a given Steam universe. |
||||
|
""" |
||||
|
def __new__(cls, *args, **kwargs): |
||||
|
if len(args) == 1: |
||||
|
return super(GlobalID, cls).__new__(cls, *args) |
||||
|
|
||||
|
gid = GlobalID.new(*args, **kwargs) |
||||
|
return super(GlobalID, cls).__new__(cls, gid) |
||||
|
|
||||
|
@staticmethod |
||||
|
def new(sequence_count, start_time, process_id, box_id): |
||||
|
"""Make new GlobalID |
||||
|
|
||||
|
:param sequence_count: sequence count |
||||
|
:type sequence_count: :class:`int` |
||||
|
:param start_time: start date time of server (must be after 2005-01-01) |
||||
|
:type start_time: :class:`str`, :class:`datetime` |
||||
|
:param process_id: process id |
||||
|
:type process_id: :class:`int` |
||||
|
:param box_id: box id |
||||
|
:type box_id: :class:`int` |
||||
|
:return: Global ID integer |
||||
|
:rtype: :class:`int` |
||||
|
""" |
||||
|
if not isinstance(start_time, datetime): |
||||
|
start_time = datetime.strptime(start_time, '%Y-%m-%d %H:%M:%S') |
||||
|
start_time_seconds = int((start_time - datetime(2005, 1, 1)).total_seconds()) |
||||
|
|
||||
|
return (box_id << 54) | (process_id << 50) | (start_time_seconds << 20) | sequence_count |
||||
|
|
||||
|
def __init__(self, *args, **kwargs): |
||||
|
pass |
||||
|
|
||||
|
def __repr__(self): |
||||
|
return "%s(sequence_count=%s, start_time=%s, process_id=%s, box_id=%s)" % ( |
||||
|
self.__class__.__name__, |
||||
|
self.sequence_count, |
||||
|
repr(str(self.start_time)), |
||||
|
self.process_id, |
||||
|
self.box_id, |
||||
|
) |
||||
|
|
||||
|
@property |
||||
|
def sequence_count(self): |
||||
|
""" |
||||
|
:return: sequence count for GID |
||||
|
:rtype: :class:`int` |
||||
|
""" |
||||
|
return self & 0xFFFFF |
||||
|
|
||||
|
@property |
||||
|
def start_time_seconds(self): |
||||
|
""" |
||||
|
:return: seconds since 2005-01-01 |
||||
|
:rtype: :class:`int` |
||||
|
""" |
||||
|
return (self >> 20) & 0x3FFFFFFF |
||||
|
|
||||
|
@property |
||||
|
def start_time(self): |
||||
|
""" |
||||
|
:return: start time of the server that generated this GID |
||||
|
:rtype: :class:`datetime` |
||||
|
""" |
||||
|
return datetime(2005, 1, 1) + timedelta(seconds=self.start_time_seconds) |
||||
|
|
||||
|
@property |
||||
|
def process_id(self): |
||||
|
""" |
||||
|
:return: process id of server |
||||
|
:rtype: :class:`int` |
||||
|
""" |
||||
|
return (self >> 50) & 0xF |
||||
|
|
||||
|
@property |
||||
|
def box_id(self): |
||||
|
""" |
||||
|
:return: box id of server |
||||
|
:rtype: :class:`int` |
||||
|
""" |
||||
|
return (self >> 54) & 0x3FF |
Loading…
Reference in new issue