aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/vk/last_seen.py
diff options
context:
space:
mode:
Diffstat (limited to 'vk/last_seen.py')
-rw-r--r--vk/last_seen.py97
1 files changed, 97 insertions, 0 deletions
diff --git a/vk/last_seen.py b/vk/last_seen.py
new file mode 100644
index 0000000..9f0c650
--- /dev/null
+++ b/vk/last_seen.py
@@ -0,0 +1,97 @@
+# Copyright 2016 Egor Tensin <Egor.Tensin@gmail.com>
+# This file is licensed under the terms of the MIT License.
+# See LICENSE.txt for details.
+
+from collections import OrderedDict
+from collections.abc import MutableMapping
+from datetime import datetime, timezone
+from enum import Enum
+from numbers import Integral, Real
+
+from .platform import Platform
+
+def _parse_time(x):
+ if isinstance(x, datetime):
+ if x.tzinfo is None or x.tzinfo.utcoffset(x) is None:
+ x = x.replace(tzinfo=timezone.utc)
+ return x
+ elif isinstance(x, Real) or isinstance(x, Integral):
+ return datetime.fromtimestamp(x, tz=timezone.utc)
+ else:
+ raise TypeError()
+
+def _parse_platform(x):
+ if x in Platform:
+ return x
+ if isinstance(x, str):
+ return Platform.from_string(x)
+ else:
+ return Platform(x)
+
+class LastSeenField(Enum):
+ TIME = 'time'
+ PLATFORM = 'platform'
+
+ def __str__(self):
+ return self.value
+
+class LastSeen(MutableMapping):
+ @staticmethod
+ def from_api_response(source):
+ instance = LastSeen()
+ for field in LastSeenField:
+ if str(field) in source:
+ instance[field] = source[str(field)]
+ return instance
+
+ def __init__(self, fields=None):
+ if fields is None:
+ fields = OrderedDict()
+ self._fields = fields
+
+ def __getitem__(self, field):
+ return self._fields[field]
+
+ def __setitem__(self, field, value):
+ self._fields[field] = self.parse(field, value)
+
+ def __delitem__(self, field):
+ del self._fields[field]
+
+ def __iter__(self):
+ return iter(self._fields)
+
+ def __len__(self):
+ return len(self._fields)
+
+ @staticmethod
+ def parse(field, value):
+ if field in LastSeen._FIELD_PARSERS:
+ return LastSeen._FIELD_PARSERS[field](value)
+ else:
+ return LastSeen._DEFAULT_FIELD_PARSER(value)
+
+ _FIELD_PARSERS = {
+ LastSeenField.TIME: _parse_time,
+ LastSeenField.PLATFORM: _parse_platform,
+ }
+
+ _DEFAULT_FIELD_PARSER = str
+
+ def has_time(self):
+ return LastSeenField.TIME in self
+
+ def get_time(self):
+ return self[LastSeenField.TIME]
+
+ def set_time(self, t):
+ self[LastSeenField.TIME] = t
+
+ def has_platform(self):
+ return LastSeenField.PLATFORM in self
+
+ def get_platform(self):
+ return self[LastSeenField.PLATFORM]
+
+ def set_platform(self, platform):
+ self[LastSeenField.PLATFORM] = platform