diff --git a/README.rst b/README.rst index 0fda07b..e62d772 100644 --- a/README.rst +++ b/README.rst @@ -19,18 +19,38 @@ This is going to be awesome, and modeled after the excellent github2 module. Usage ----- -Hmm.. :: + >>> from convore.client import ConvoreClient + >>> convore = ConvoreClient('username', 'password') + + >>> groups = convore.groups() + >>> groups + [>> topics = groups[0].topics() + >>> topics + [>> len(topics) + 14 - >>> from convore import Convore - >>> convore = Convore('username', 'password') - - >>> convore.groups - [, ...] - - convore.groups[id] ? - - convore.groups.create(name, decription=None, slug=None) + >>> messages = topics[0].messages() + >>> messages + [>> new_topic = groups[0].topics.create(name="New Topic") + >>> new_topic + >> new_topic.messages.create(message="The first message") + >>> new_topic.messages.create(message="The 2nd one") + >>> len(new_topic.messages()) + 2 + + >>> convore.groups['292'] + >> convore.groups.create(name, decription=None, slug=None) + (group creation doesn't work at this moment..) diff --git a/convore/client.py b/convore/client.py new file mode 100644 index 0000000..b3ccf8a --- /dev/null +++ b/convore/client.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- +''' +Copyringt 2011 Kenichi Sato +''' + +import urllib +import urllib2 +import json + +from group import ConvoreGroups +from topic import ConvoreTopics +from live import ConvoreLiveMessage + +URL_PREFIX = "https://convore.com/api/" +#debug=100 +debug=0 + +class ConvoreError(Exception): + pass + +class ConvoreAuthError(Exception): + pass + +class ConvoreClient(object): + + def __init__(self, username, password): + auth_handler = urllib2.HTTPBasicAuthHandler() + auth_handler.add_password(realm='Convore', + uri=URL_PREFIX, + user=username, + passwd=password) + self.openr = urllib2.build_opener(auth_handler, + urllib2.HTTPCookieProcessor(), + urllib2.HTTPSHandler(debug)) + + self.groups = ConvoreGroups(self) + self.topics = ConvoreTopics(self) + + def _make_request(self, command, params=None): + url = URL_PREFIX + command + if params: + data = urllib.urlencode(params) + else: + data = None + headers = {} + try: + f = self.openr.open(urllib2.Request(url = URL_PREFIX + command, + data=data, + headers=headers)) + response = json.load(f) + if 'error' in response: + raise ConvoreError(response['error']) + return response + + except urllib2.HTTPError as e: + if e.code == 401: + raise ConvoreAuthError() + else: + raise + + def verify(self): + self._make_request(command="account/verify.json") + + + def live(self, group_id=None, cursor=None, topic_id=None): + data = {} + if group_id: + data['group_id'] = group_id + if cursor: + data['cursor'] = cursor + if topic_id: + data['topic_id'] = topic_id + response = self._make_request(command="live") + messages = [] + for m in response['messages']: + messages.append(ConvoreLiveMessage(m)) + return messages + + +if __name__ == '__main__': + import sys + try: + username, password = sys.argv[1:3] + except: + print "usage: python %s username password" % sys.argv[0] + sys.exit(1) + + client = ConvoreClient(username, password) + #client.verify() + + groups = client.groups() + print groups + + #group = client.groups.create(name="MyTestGroup", description="desc", slug="the group") + #print repr(group) + + # for group in groups: + # if "test" in group.slug: + # break + + #print group + # print repr(group) + + # topic = group.topics.create(name="Topic One") + # print repr(topic) + + # topics = group.topics() + # print topics + + # topic = client.topics[topics[-1].id] + # print topic + # print repr(topic) + + # topic.messages.create(message="Wow, I'm the first") + # topic.messages.create(message="Hmm, I must be the second") + + # messages = topic.messages() + # print messages + + #for message in client.live(): + # print message + diff --git a/convore/group.py b/convore/group.py new file mode 100644 index 0000000..f45a190 --- /dev/null +++ b/convore/group.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +''' +Copyringt 2011 Kenichi Sato +''' + +from user import ConvoreUser +from topic import ConvoreTopics +from datetime import datetime + +class ConvoreGroups(object): + def __init__(self, client): + self.client = client + + def __call__(self): + response = self.client._make_request(command="groups.json") + groups = [] + for g in response['groups']: + group = ConvoreGroup(g, self.client) + groups.append(group) + return groups + + def __getitem__(self, group_id): + response = self.client._make_request(command="groups/%s.json" % group_id) + return ConvoreGroup(response['group'], self.client) + + def create(self, name, description=None, slug=None): + params = {'name': name} + if description: + params['description'] = description + if slug: + params['slug'] = slug + print params + response = self.client._make_request(command="groups/create.json", + params=params) + return ConvoreGroup(response['group'], self.client) + + +class ConvoreGroup(object): + def __init__(self, g, client): + self.members_count = g['members_count'] + self.name = g['name'] + self.creator = ConvoreUser(g['creator']) + self.url = g['url'] + self.slug = g['slug'] + self.date_latest_message = datetime.utcfromtimestamp(g['date_latest_message']) + self.date_created = datetime.utcfromtimestamp(g['date_created']) + self.topics_count = g['topics_count'] if 'topics_count' in g else None + self.unread = g['unread'] if 'unread' in g else None + self.id = g['id'] + + self.client = client + self.topics = ConvoreTopics(self.client, self.id) + + def leave(self): + params = {'group_id': self.id} + response = self.client._make_request(command="groups/%s/leave.json" % self.id, + params=params) + print response + + def __str__(self): + return "" % self.id + + def __repr__(self): + return "" + +if __name__ == "__main__": + g = {"date_latest_message": 1297661354.6135991, + "topics_count": 16, + "members_count": 643, + "name": "Python", + "creator": {"username": "fdrake", + "url": "/users/fdrake/", + "id": "886", + "img": "https://convore2.s3.amazonaws.com/userpics/886/1297277206.jpg"}, + "url": "/python/", + "date_created": 1297306311.4270909, + "unread": 0, + "id": "292", + "slug": "python" + } + + group = ConvoreGroup(g, None) + print group + print repr(group) diff --git a/convore/live.py b/convore/live.py new file mode 100644 index 0000000..390135b --- /dev/null +++ b/convore/live.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +''' +Copyringt 2011 Kenichi Sato +''' + +from user import ConvoreUser +from datetime import datetime + +class ConvoreLiveMessage(object): + def __init__(self, m): + self.kind = m['kind'] + self.group_ids = m['group_ids'] + self.user = ConvoreUser(m['user']) + self._ts = datetime.utcfromtimestamp(m['_ts']) + self._id = m['_id'] + + def __str__(self): + return "" % self._id + + def __repr__(self): + return ",".join(map(str,( + self.kind, + self.group_ids, + self.user, + self._ts, + self._id, + ))) + + +if __name__ == "__main__": + m = {"kind": "logout", + "group_ids": [292], + "user": {"username": "ksato9700", + "url": "/users/ksato9700/", + "id": 8849, + "img": "https://convore2.s3.amazonaws.com/userpics/8849/1297620465.jpg"}, + "_ts": 1297638926.453522, + "_id": "2415aa7c-37c7-11e0-a4f2-4040006c4e80" + } + + message = ConvoreLiveMessage(m) + print message + print repr(message) diff --git a/convore/message.py b/convore/message.py new file mode 100644 index 0000000..03deb19 --- /dev/null +++ b/convore/message.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +''' +Copyringt 2011 Kenichi Sato +''' + +from user import ConvoreUser +from datetime import datetime + +class ConvoreMessages(object): + def __init__(self, client, topic_id): + self.client = client + self.topic_id = topic_id + + def __call__(self): + response = self.client._make_request(command="topics/%s/messages.json" % self.topic_id) + messages = [] + for m in response['messages']: + message = ConvoreMessage(m) + messages.append(message) + return messages + + def create(self, message): + params = { + 'message': message, + 'topic_id': self.topic_id + } + response = self.client._make_request(command="topics/%s/messages/create.json" % self.topic_id, + params=params) + return ConvoreMessage(response['message']) + +class ConvoreMessage(object): + def __init__(self, m): + self.date_created = datetime.utcfromtimestamp(m['date_created']) + self.message = m['message'] + self.user = ConvoreUser(m['user']) + self.id = m['id'] + + def __str__(self): + return "" % self.id + + def __repr__(self): + return "" diff --git a/convore/topic.py b/convore/topic.py new file mode 100644 index 0000000..fef28c9 --- /dev/null +++ b/convore/topic.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +''' +Copyringt 2011 Kenichi Sato +''' + +from user import ConvoreUser +from message import ConvoreMessages +from datetime import datetime + +class ConvoreTopics(object): + def __init__(self, client, group_id=None): + self.client = client + self.group_id = group_id + + def __call__(self): + response = self.client._make_request(command="groups/%s/topics.json" % self.group_id) + topics = [] + for t in response['topics']: + topic = ConvoreTopic(t, self.client) + topics.append(topic) + return topics + + def __getitem__(self, topic_id): + response = self.client._make_request(command="topics/%s.json" % topic_id) + return ConvoreTopic(response['topic'], self.client) + + def create(self, name): + if self.group_id == None: + raise RuntimeError("topics should be created with group_id") + + params = { + 'name': name, + 'group_id': self.group_id + } + response = self.client._make_request(command="groups/%s/topics/create.json" % self.group_id, + params=params) + return ConvoreTopic(response['topic'], self.client) + +class ConvoreTopic(object): + def __init__(self, t, client): + self.name = t['name'] + self.creator = ConvoreUser(t['creator']) + self.url = t['url'] + self.slug = t['slug'] + self.date_latest_message = datetime.utcfromtimestamp(t['date_latest_message']) + self.date_created = datetime.utcfromtimestamp(t['date_created']) + self.message_count = t['message_count'] if 'message_count' in t else None + self.unread = t['unread'] if 'unread' in t else None + self.id = t['id'] + + self.client = client + self.messages = ConvoreMessages(self.client, self.id) + + def __str__(self): + return "" % self.id + + def __repr__(self): + return "" diff --git a/convore/user.py b/convore/user.py new file mode 100644 index 0000000..c5dc232 --- /dev/null +++ b/convore/user.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +""" +Copyringt 2011 Kenichi Sato +""" + +from datetime import datetime + +class ConvoreUser(object): + def __init__(self, u): + self.username = u['username'] + self.url = u['url'] + self.id = u['id'] + self.img = u['img'] + + def __str__(self): + return "" % self.id + + def __repr__ (self): + return ",".join(map(str,( + self.username, + self.url, + self.id, + self.img))) + +if __name__ == "__main__": + u = {"username": "ksato9700", + "url": "/users/ksato9700/", + "id": 8849, + "img": "https://convore2.s3.amazonaws.com/userpics/8849/1297620465.jpg"} + + user = ConvoreUser(u) + print user + print repr(user)