def show(self, event, package, distro): if distro is None or distro.lower() == 'all': distro = 'all' else: if self._release_cache is None: self._release_cache = json_webservice( u'http://dde.debian.net/dde/q/udd/packages', { 'list': '', 't': 'json', })['r'] releases = self._release_cache if distro not in releases: candidates = [x for x in releases if distro in x] if len(candidates) == 1: distro = candidates[0] else: event.addresponse(u"Sorry, I don't know about %(distro)s. " u"How about one of: %(releases)s?", { 'distro': distro, 'releases': human_join( x.startswith('prio-') and x[5:] or x for x in releases ),}) return result = json_webservice( u'http://dde.debian.net/dde/q/udd/packages/%s/%s' % (distro, package), {'t': 'json'}) result = result['r'] if not result: event.addresponse(u"Sorry, I couldn't find anything of that name. " u"Is it a binary package?") return event.addresponse(u'%(package)s %(version)s: %(description)s', result)
def _geonames_lookup(self, place): search = json_webservice('http://ws.geonames.org/searchJSON', {'q': place, 'maxRows': 1, 'username': '******'}) if search['totalResultsCount'] == 0: return None city = search['geonames'][0] timezone = json_webservice('http://ws.geonames.org/timezoneJSON', {'lat': city['lat'], 'lng': city['lng'], 'username': '******'}) if 'timezoneId' in timezone: return gettz(timezone['timezoneId']) if 'rawOffset' in timezone: offset = timezone['rawOffset'] return tzoffset('UTC%s%s' % (offset>=0 and '+' or '', offset), offset*3600)
def twitchRandom(self, event): summary = json_webservice('https://api.twitch.tv/kraken/streams/summary') maxchannel = summary['channels'] randomnum = randint(1, maxchannel) query = json_webservice('https://api.twitch.tv/kraken/streams?limit=1&offset=%d' % randomnum) stream = query['streams'].pop() message = u'Random Stream found. Number: %s/%s' % \ (randomnum, maxchannel) event.addresponse(message, address=False, processed=True) self.broadcasterInfo(event, stream['channel']['name'])
def _translate (self, event, phrase, src_lang, dest_lang): params = { 'v': '1.0', 'q': phrase, 'langpair': src_lang + '|' + dest_lang, } if self.api_key: params['key'] = self.api_key headers = {'referer': self.referer} response = json_webservice( 'http://ajax.googleapis.com/ajax/services/language/translate', params, headers) if response['responseStatus'] == 200: translated = unicode(decode_htmlentities( response['responseData']['translatedText'])) return (translated, src_lang or response['responseData']['detectedSourceLanguage']) else: errors = { 'invalid translation language pair': u"I don't know that language", 'invalid text': u"there's not much to go on", 'could not reliably detect source language': u"I'm not sure what language that was", } msg = errors.get(response['responseDetails'], response['responseDetails']) raise TranslationException(msg)
def search(self, event, term, distro, arch): distro = distro and distro.lower() or self.distro arch = arch and arch.lower() or self.arch distro = distro + u'-' + arch if distro == u'all-all': distro = u'all' result = json_webservice( u'http://dde.debian.net/dde/q/aptfile/byfile/%s/%s' % (distro, quote(term)), {'t': 'json'}) result = result['r'] if result: if isinstance(result[0], list): bypkg = map(lambda x: (x[-1], u'/'.join(x[:-1])), result) numpackages = len(bypkg) packages = defaultdict(list) for p, arch in bypkg: packages[p].append(arch) packages = map(lambda i: u'%s [%s]' % (i[0], u', '.join(i[1])), packages.iteritems()) else: numpackages = len(result) packages = result event.addresponse(u'Found %(num)i packages: %(names)s', { 'num': numpackages, 'names': human_join(packages), }) else: event.addresponse(u'No packages found')
def remote_update(self, service, id): status = json_webservice('%sstatuses/show/%s.json' % (service['endpoint'], id)) return { 'screen_name': status['user']['screen_name'], 'text': decode_htmlentities(status['text']) }
def _google_api_search(self, query, resultsize="large", country=None): params = {"v": "1.0", "q": query, "rsz": resultsize} if country is not None: params["gl"] = country if self.api_key: params["key"] = self.api_key headers = {"referer": self.referer} return json_webservice("http://ajax.googleapis.com/ajax/services/search/web", params, headers)
def _ddg_api_search(self, query, resultsize="large", country=None): params = { 'q': query, 't': 'ibid', 'format': 'json', } if country is not None: params['gl'] = country return json_webservice('https://api.duckduckgo.com', params)
def lookup(self, event, bug_number): bug_number = int(bug_number) try: result = json_webservice( u'http://dde.debian.net/dde/q/bts/bynumber/%i' % bug_number, {'t': 'json'}) except HTTPError, e: if e.code == 400: event.addresponse( u"Sorry, but I can't find a bug of that number.") return else: raise
def _google_api_search(self, query, resultsize="large", country=None): params = { 'v': '1.0', 'q': query, 'rsz': resultsize, } if country is not None: params['gl'] = country if self.api_key: params['key'] = self.api_key headers = {'referer': self.referer} return json_webservice('http://ajax.googleapis.com/ajax/services/search/web', params, headers)
def updateTwitch(self): try: new_data = json_webservice('https://api.twitch.tv/kraken/streams?channel=' + self.name) if new_data['streams']: broadcaster_data = new_data['streams'].pop() channel = broadcaster_data['channel'] self.live = True self.game = broadcaster_data['game'] self.title = channel['status'] self.viewers = broadcaster_data['viewers'] self.liveurl = channel['url'] except Exception, e: return False
def updateHitbox(self): try: new_data = json_webservice('http://api.hitbox.tv/media/live/' + self.name) if new_data['livestream']: media = new_data['livestream'].pop() if media['media_is_live'] == u'1': self.live = True self.game = media['category_name'] self.title = media['media_status'] self.viewers = media['media_views'] self.liveurl = media['channel']['channel_link'] except Exception, e: return False
def updateHitbox(self): try: new_data = json_webservice('http://api.hitbox.tv/media/live/' + ','.join(self.broadcasters.keys())) for media in new_data['livestream']: if media['media_is_live'] == u'1': login = media['media_name'] broadcaster = self.getBroadcasterByName(login) broadcaster.live = True broadcaster.game = media['category_name'] broadcaster.title = media['media_status'] broadcaster.viewers = media['media_views'] broadcaster.liveurl = media['channel']['channel_link'] except Exception, e: return False
def updateTwitch(self): try: new_data = json_webservice('https://api.twitch.tv/kraken/streams?channel=' + ','.join(self.broadcasters.keys())) for broadcaster_data in new_data['streams']: channel = broadcaster_data['channel'] login = channel['name'] broadcaster = self.getBroadcasterByName(login) broadcaster.live = True broadcaster.game = broadcaster_data['game'] broadcaster.title = channel['status'] broadcaster.viewers = broadcaster_data['viewers'] broadcaster.liveurl = channel['url'] except Exception, e: return False
def search(self, event, package, search): package = package.lower() if search is not None: search = search.lower() result = json_webservice( u'http://dde.debian.net/dde/q/bts/bypackage/%s' % package, {'t': 'json'}) bugs = result['r'] if not bugs: event.addresponse(u"Sorry, I couldn't find any open bugs on %s", package) return severities = { 'critical': 4, 'grave': 3, 'serious': 2, 'important': 1, 'normal': 0, 'minor': -1, 'wishlist': -2, } buglist = [] for b in bugs.itervalues(): if search and search not in b['subject'].lower(): continue tags = b['tags'] if b['pending'] != 'pending': tags.append(b['pending']) if tags: tags = ', ' + ', '.join(b['tags']) else: tags = '' body = '%s [%s%s]' % (b['subject'], b['severity'], tags) sev = 0 - severities.get(b['severity'], 0) buglist.append((b['bug_num'], sev, body)) buglist.sort() if not buglist: event.addresponse(u"Sorry, I couldn't find any open bugs matching " u"your query") return event.addresponse( u'Found %(count)i matching %(plural)s: %(bugs)s', { 'count': len(buglist), 'plural': plural(len(buglist), u'bug', u'bugs'), 'bugs': ', '.join('%i: %s' % (b[0], b[2]) for b in buglist) })
def search(self, event, package, search): package = package.lower() if search is not None: search = search.lower() result = json_webservice( u'http://dde.debian.net/dde/q/bts/bypackage/%s' % package, {'t': 'json'}) bugs = result['r'] if not bugs: event.addresponse(u"Sorry, I couldn't find any open bugs on %s", package) return severities = { 'critical': 4, 'grave': 3, 'serious': 2, 'important': 1, 'normal': 0, 'minor': -1, 'wishlist': -2, } buglist = [] for b in bugs.itervalues(): if search and search not in b['subject'].lower(): continue tags = b['tags'] if b['pending'] != 'pending': tags.append(b['pending']) if tags: tags = ', ' + ', '.join(b['tags']) else: tags = '' body = '%s [%s%s]' % (b['subject'], b['severity'], tags) sev = 0 - severities.get(b['severity'], 0) buglist.append((b['bug_num'], sev, body)) buglist.sort() if not buglist: event.addresponse(u"Sorry, I couldn't find any open bugs matching " u"your query") return event.addresponse(u'Found %(count)i matching %(plural)s: %(bugs)s', { 'count': len(buglist), 'plural': plural(len(buglist), u'bug', u'bugs'), 'bugs': ', '.join('%i: %s' % (b[0], b[2]) for b in buglist) })
def search(self, event, term): terms = re.split(r'(?u)[\s/?]', term) result = json_webservice( u'http://debtags.debian.net/dde/q/axi/cquery/%s' % u'/'.join(terms), {'t': 'json'}) result = result['r'] if not result['pkgs']: event.addresponse(u"Sorry, I couldn't find anything relevant. " u"Try being less specific?") return event.addresponse(u"Packages: %(packages)s. " u"Not there? Try these terms: %(suggested)s", { 'packages': human_join(pkg[1] for pkg in result['pkgs']), 'suggested': human_join(result['sugg']), })
def remote_latest(self, service, user): if service['api'] == 'twitter': # Twitter ommits retweets in the JSON and XML results: statuses = generic_webservice( '%sstatuses/user_timeline.rss' % service['endpoint'], { 'screen_name': user, 'count': 1 }) tree = ElementTree.fromstring(statuses) latest = tree.find('.//item') if latest is None: if tree.find('.//error'): log.info('Twitter user_latest returned: %s', tree.findtext('.//error')) raise self.NoTweetsException(user) return { 'text': latest.findtext('description').split(': ', 1)[1], 'ago': ago(datetime.utcnow() - parse_timestamp(latest.findtext('pubDate'))), 'url': latest.findtext('guid'), } elif service['api'] == 'laconica': statuses = json_webservice( '%sstatuses/user_timeline/%s.json' % (service['endpoint'], user.encode('utf-8')), {'count': 1}) if not statuses: raise self.NoTweetsException(user) latest = statuses[0] url = '%s/notice/%i' % (service['endpoint'].split( '/api/', 1)[0], latest['id']) return { 'text': decode_htmlentities(latest['text']), 'ago': ago(datetime.utcnow() - parse_timestamp(latest['created_at'])), 'url': url, }
def remote_latest(self, service, user): if service['api'] == 'twitter': # Twitter ommits retweets in the JSON and XML results: statuses = generic_webservice( '%sstatuses/user_timeline/%s.atom' % (service['endpoint'], user.encode('utf-8')), {'count': 1}) tree = ElementTree.fromstring(statuses) latest = tree.find('{http://www.w3.org/2005/Atom}entry') if latest is None: raise self.NoTweetsException(user) return { 'text': latest.findtext('{http://www.w3.org/2005/Atom}content').split( ': ', 1)[1], 'ago': ago(datetime.utcnow() - parse_timestamp( latest.findtext('{http://www.w3.org/2005/Atom}published')) ), 'url': [ x for x in latest.getiterator( '{http://www.w3.org/2005/Atom}link') if x.get('type') == 'text/html' ][0].get('href'), } elif service['api'] == 'laconica': statuses = json_webservice( '%sstatuses/user_timeline/%s.json' % (service['endpoint'], user.encode('utf-8')), {'count': 1}) if not statuses: raise self.NoTweetsException(user) latest = statuses[0] url = '%s/notice/%i' % (service['endpoint'].split( '/api/', 1)[0], latest['id']) return { 'text': decode_htmlentities(latest['text']), 'ago': ago(datetime.utcnow() - parse_timestamp(latest['created_at'])), 'url': url, }
def remote_latest(self, service, user): if service['api'] == 'twitter': # Twitter ommits retweets in the JSON and XML results: statuses = generic_webservice('%sstatuses/user_timeline.rss' % service['endpoint'], { 'screen_name': user, 'count': 1 }) tree = ElementTree.fromstring(statuses) latest = tree.find('.//item') if latest is None: if tree.find('.//error'): log.info('Twitter user_latest returned: %s', tree.findtext('.//error')) raise self.NoTweetsException(user) return { 'text': latest.findtext('description') .split(': ', 1)[1], 'ago': ago(datetime.utcnow() - parse_timestamp( latest.findtext('pubDate'))), 'url': latest.findtext('guid'), } elif service['api'] == 'laconica': statuses = json_webservice('%sstatuses/user_timeline/%s.json' % (service['endpoint'], user.encode('utf-8')), {'count': 1}) if not statuses: raise self.NoTweetsException(user) latest = statuses[0] url = '%s/notice/%i' % (service['endpoint'].split('/api/', 1)[0], latest['id']) return { 'text': decode_htmlentities(latest['text']), 'ago': ago(datetime.utcnow() - parse_timestamp(latest['created_at'])), 'url': url, }
def remote_latest(self, service, user): if service['api'] == 'twitter': # Twitter ommits retweets in the JSON and XML results: statuses = generic_webservice('%sstatuses/user_timeline/%s.atom' % (service['endpoint'], user.encode('utf-8')), {'count': 1}) tree = ElementTree.fromstring(statuses) latest = tree.find('{http://www.w3.org/2005/Atom}entry') if latest is None: raise self.NoTweetsException(user) return { 'text': latest.findtext('{http://www.w3.org/2005/Atom}content') .split(': ', 1)[1], 'ago': ago(datetime.utcnow() - parse_timestamp( latest.findtext('{http://www.w3.org/2005/Atom}published'))), 'url': [x for x in latest.getiterator('{http://www.w3.org/2005/Atom}link') if x.get('type') == 'text/html' ][0].get('href'), } elif service['api'] == 'laconica': statuses = json_webservice('%sstatuses/user_timeline/%s.json' % (service['endpoint'], user.encode('utf-8')), {'count': 1}) if not statuses: raise self.NoTweetsException(user) latest = statuses[0] url = '%s/notice/%i' % (service['endpoint'].split('/api/', 1)[0], latest['id']) return { 'text': decode_htmlentities(latest['text']), 'ago': ago(datetime.utcnow() - parse_timestamp(latest['created_at'])), 'url': url, }
def getJsonFromUrl(self, url): return json_webservice(url)
def remote_update(self, service, id): status = json_webservice('%sstatuses/show/%s.json' % (service['endpoint'], id)) return {'screen_name': status['user']['screen_name'], 'text': decode_htmlentities(status['text'])}
def get_place_data(self, place, num): return json_webservice('http://ws.geonames.org/searchJSON', {'q': place, 'maxRows': num, 'username': '******'})