import httplib import urllib import json class APIException(Exception): def __init__(self, response): self.code = response['code'] self.message = response['message'] def __str__(self): return "Code %s: %s" % (self.code, self.message) class PadLite: def __init__(self, apikey, host, port=None, ssl=False): self._apikey = apikey self._host = host self._port = port self._ssl = ssl if self._port is None: if self._ssl: self._port = 443 else: self._port = 80 def _getConnection(self): if self._ssl: return httplib.HTTPSConnection(self._host, self._port) return httplib.HTTPConnection(self._host, self._port) def _apiCall(self, url, **kwargs): conn = self._getConnection() args = dict((k.encode('utf-8'), v.encode('utf-8')) for k,v in kwargs.iteritems() if v is not None) args['apikey'] = self._apikey conn.request('GET', '%s?%s' % (url, urllib.urlencode(args))) resp = conn.getresponse() if resp.status != 200: return None response = json.load(resp) if response['code'] != 0: raise APIException(response) return response['data'] # # API Version 1 # def createGroup(self): return self._apiCall('/api/1/createGroup')['groupID'] def createGroupIfNotExistsFor(self, groupMapper): return self._apiCall('/api/1/createGroupIfNotExistsFor', groupMapper=groupMapper)['groupID'] def deleteGroup(self, groupID): self._apiCall('/api/1/deleteGroup', groupID=groupID) def listPads(self, groupID): return self._apiCall('/api/1/listPads', groupID=groupID)['padIDs'] def createPad(self, padID, text): self._apiCall('/api/1/createPad', padID=padID, text=text) def createGroupPad(self, groupID, padName, text): return self._apiCall('/api/1/createGroupPad', groupID=groupID, padName=padName, text=text)['padID'] def createAuthor(self, name): return self._apiCall('/api/1/createAuthor', name=name)['authorID'] def createAuthorIfNotExistsFor(self, authorMapper, name): return self._apiCall('/api/1/createAuthorIfNotExistsFor', authorMapper=authorMapper, name=name)['authorID'] def listPadsOfAuthor(self, authorID): return self._apiCall('/api/1/listPadsOfAuthor', authorID=authorID)['padIDs'] def createSession(self, groupID, authorID, validUntil): return self._apiCall('/api/1/createSession', groupID=groupID, authorID=authorID, validUntil=validUntil)['sessionID'] def deleteSession(self, sessionID): self._apiCall('/api/1/deleteSession', sessionID=sessionID) def getSessionInfo(self, sessionID): return self._apiCall('/api/1/getSessionInfo', sessionID=sessionID) def listSessionsOfGroup(self, groupID): return self._apiCall('/api/1/listSessionsOfGroup', groupID=groupID) def listSessionsOfAuthor(self, authorID): return self._apiCall('/api/1/listSessionsOfAuthor', authorID=authorID) def getText(self, padID, rev): return self._apiCall('/api/1/getText', padID=padID, rev=rev)['text'] def setText(self, padID, text): self._apiCall('/api/1/setText', padID=padID, text=text) def getHTML(self, padID, rev): return self._apiCall('/api/1/getHTML', padID=padID, rev=rev)['html'] def setHTML(self, padID, html): # currently not working return self._apiCall('/api/1/setHTML', padID=padID, html=html) def getRevisionsCount(self, padID): return self._apiCall('/api/1/getRevisionsCount', padID=padID)['revisions'] def getLastEdited(self, padID): return self._apiCall('/api/1/getLastEdited', padID=padID)['lastEdited'] def deletePad(self, padID): self._apiCall('/api/1/deletePad', padID=padID) def getReadOnlyID(self, padID): return self._apiCall('/api/1/getReadOnlyID', padID=padID)['readOnlyID'] def setPublicStatus(self, padID, publicStatus): if publicStatus: publicStatus = 'true' else: publicStatus = 'false' self._apiCall('/api/1/setPublicStatus', padID=padID, publicStatus=publicStatus) def getPublicStatus(self, padID): return self._apiCall('/api/1/getPublicStatus', padID=padID)['publicStatus'] def setPassword(self, padID, password): self._apiCall('/api/1/setPassword', padID=padID, password=password) def isPasswordProtected(self, padID): return self._apiCall('/api/1/isPasswordProtected', padID=padID)['isPasswordProtected'] def listAuthorsOfPad(self, padID): return self._apiCall('/api/1/listAuthorsOfPad', padID=padID)['authorIDs'] def padUsersCount(self, padID): return self._apiCall('/api/1/padUsersCount', padID=padID)['padUsersCount'] # # API Version 1.1 # def getAuthorName(self, authorID): return self._apiCall('/api/1.1/getAuthorName', authorID=authorID) def padUsers(self, padID): # not working right now return self._apiCall('/api/1.1/padUsers', padID=padID) def sendClientsMessage(self, padID, msg): return self._apiCall('/api/1.1/sendClientsMessage', padID=padID, msg=msg) def listAllGroups(self): return self._apiCall('/api/1.1/listAllGroups')['groupIDs'] # # API Version 1.2 # def checkToken(self): self._apiCall('/api/1.2/checkToken') # # API Version 1.2.1 # def listAllPads(self): return self._apiCall('/api/1.2.1/listAllPads')['padIDs'] # # API Version 1.2.7 # def getChatHistory(self, padID, start=None, end=None): return self._apiCall('/api/1.2.7/getChatHistory', padID=padID, start=start, end=end)['messages'] def getChatHead(self, padID): return self._apiCall('/api/1.2.7/getChatHead', padID=padID)['chatHead'] # # API Version 1.2.8 # def getRevisionChangeset(self, padID, rev): return self._apiCall('/api/1.2.8/getRevisionChangeset', padID=padID, rev=rev)