diff --git a/convore/api.py b/convore/api.py index 5b5cfbc..e3eb169 100644 --- a/convore/api.py +++ b/convore/api.py @@ -102,27 +102,26 @@ class Groups(SyncedList): return [g for g in self.data if g.joined] - def get(self, key): r = get('groups', key) - - group = models.Group() - group.import_from_api(deserialize(r.content)['group']) + group = self._create_group_from_api(deserialize(r.content)['group']) return group def sync(self): - self.data = [] r = get('groups') for _group in deserialize(r.content)['groups']: - - group = models.Group() - group.import_from_api(_group) - group.joined = True - group.topics = Topics(group) + group = self._create_group_from_api(_group) self.data.append(group) + def _create_group_from_api(self, _group): + group = models.Group() + group.import_from_api(_group) + group.joined = True + group.topics = Topics(group) + return group + class Topics(SyncedList): @@ -137,24 +136,24 @@ class Topics(SyncedList): def get(self, key): r = get('topics', key) - - topic = models.Topic() - topic.import_from_api(deserialize(r.content)['topic']) + topic = self._create_topic_from_api(deserialize(r.content)['topic']) return topic def sync(self): - self.data = [] r = get('groups', self.group.id, 'topics') for _topic in deserialize(r.content)['topics']: - - topic = models.Topic() - topic.import_from_api(_topic) - topic.messages = Messages(topic) - topic.group = self.group + topic = self._create_topic_from_api(_topic) self.data.append(topic) + def _create_topic_from_api(self, _topic): + topic = models.Topic() + topic.import_from_api(_topic) + topic.messages = Messages(topic) + topic.group = self.group + return topic + def create(self, name): params = {'topic_id': self.group.id, 'name': name} r = post(params ,'groups', self.group.id, 'topics', 'create') @@ -175,13 +174,6 @@ class Messages(SyncedList): def list(self): return self.data - def get(self, key): - r = get('topics', key) - - topic = models.Topic() - topic.import_from_api(deserialize(r.content)['topic']) - return topic - def sync(self): self.data = [] diff --git a/convore/core.py b/convore/core.py index f81f5db..a45c7da 100644 --- a/convore/core.py +++ b/convore/core.py @@ -12,6 +12,7 @@ from convore.packages.anyjson import deserialize import api +import models __title__ = 'convore' @@ -25,6 +26,13 @@ __docformat__ = 'restructuredtext' __all__ = ('Convore',) +LIVE_TYPES = { + 'read': models.Read, + 'message': models.Message, + 'topic': models.Topic, + 'login': models.Login, + 'logout': models.Logout, +} class Convore(object): """The main Convore interface object.""" @@ -44,8 +52,31 @@ class Convore(object): def live(self, cursor=None): params= {} + next_cursor = None + + live_messages = list() if cursor <> None: params['cursor'] = cursor r = api.get('live', params=params) - return deserialize(r.content) + + try: + for data in deserialize(r.content)['messages']: + class_ = LIVE_TYPES[data['kind']] + message = class_() + message.import_from_api(data) + if data['kind'] == 'read': + group = self.groups.get(data['group_id']) + message.topic = group.topics.get(data['topic_id']) + elif data['kind'] == 'topic': + message.group = self.groups.get(data['group_id']) + elif data['kind'] == 'message': + group = self.groups.get(data['group']) + message.topic = group.topics.get(data['topic']['id']) + + live_messages.append({'kind': data['kind'], + 'message': message}) + next_cursor = data['_id'] + except KeyError: + pass + return (live_messages, next_cursor) diff --git a/convore/models.py b/convore/models.py index 3ec00df..b45b93a 100644 --- a/convore/models.py +++ b/convore/models.py @@ -84,10 +84,10 @@ class Group(object): _user.import_from_api(friend) self.friends.append(_user) - def __repr__(self): return '' % (self.slug) + class Topic(object): """Convore topic object""" @@ -142,8 +142,6 @@ class Message(object): self.user.import_from_api(data.get('user', None)) - - class Category(object): def __init__(self): self.groups_count = None @@ -159,3 +157,46 @@ class Category(object): self.groups_count = d.get('groups_count', None) self.slug = d.get('slug', None) self.name = d.get('name', None) + + +class Read(object): + def __init__(self): + self.topic = None + self.when = None + self.user = None + + def import_from_api(self, data): + """Constructs object from deserialized API Response.""" + self.when = datetime.utcfromtimestamp( + data.get('_ts', None) + ) + self.user = User() + self.user.import_from_api(data.get('user', None)) + + +class Login(object): + def __init__(self): + self.when = None + self.user = None + + def import_from_api(self, data): + """Constructs object from deserialized API Response.""" + self.when = datetime.utcfromtimestamp( + data.get('_ts', None) + ) + self.user = User() + self.user.import_from_api(data.get('user', None)) + + +class Logout(object): + def __init__(self): + self.when = None + self.user = None + + def import_from_api(self, data): + """Constructs object from deserialized API Response.""" + self.when = datetime.utcfromtimestamp( + data.get('_ts', None) + ) + self.user = User() + self.user.import_from_api(data.get('user', None))