def handleGetExistingPurchasesResponse(self, event): print(event, event.type, event.code) if (event.type == SUCCESS_RESPONSE): purchases = self.getPurchases(event) tart.send('existingPurchasesResponse', purchases=purchases) elif (event.type == FAILURE_RESPONSE): self.handleErrorResponse(event)
def onSendComment(self, source, text): res = self.sess.postComment(source, text) text = text.replace('*', '') if (res == True): tart.send('commentPosted', result="true", comment=text) return tart.send('commentPosted', result="false", comment="")
def send_flags_message(self): allowed = bbmsp_is_access_allowed() access = self.get_access_code() profile = bbmsp_can_show_profile_box() invite = bbmsp_can_send_bbm_invite() tart.send('bbmFlags', allowed=allowed, access=access, profile=profile, invite=invite)
def onGetGlobalStream(self): from adn.adn import Adn app = Adn() self.stream = app.globalStream() validStream = True for item in self.stream['data']: if 'html' in item: item['html'] = item['html'].replace("<br>", "<br/>") validStream = True else: validStream = False if validStream: tart.send('receivedGlobalStream', stream=self.stream) import tempfile temp_dir = tempfile.gettempdir() import os for the_file in os.listdir(temp_dir): filepath = os.path.join(temp_dir, the_file) try: if os.path.isfile(filepath): os.unlink(filepath) except Exception as e: print(e) self.getAvatarImages() else: self.onGetGlobalStream()
def onParseFeed(self, snaps): print("Parsing snaps...") for snap in snaps: if 'media' not in snap: snap['media'] = '' if snap['countdown'] != '': snap['countdown'] = int(snap['countdown']) print("MEDIA TYPE NUMBER", snap['media_type']) snap['time'] = self.prettyDate(snap['sent'] // 1000) if snap['media_type'] == 0: snap['media'] = 'picture' elif snap['media_type'] in [1, 2]: snap['media'] = 'video' if snap['recipient'] == '': # Snap recieved snap['type'] = 'Recieved' # recieved == 1 else: snap['user'] = snap['recipient'] print(snap['opened']) if snap['opened'] == 1: snap['type'] = 'Opened' # sent == 2 snap['media'] = 'sent' else: snap['type'] = 'Sent' # sent == 2 snap['media'] = 'sent' if snap['media_type'] != '': if int(snap['media_type']) >= 3: # Notifications snap['type'] = 'Notification' # notif == 3 for result in sorted(snaps, key=itemgetter('type')): tart.send('snapsReceived', snap=result)
def onUiReady(self): # need to defer sending this, for now, until the event loop has started tart.send('restoreSettings', **self.settings) # install BPS event handler for vkb events, which for now reports # "keyboardState" events with boolean property "visible" vkb_handler.VkbHandler(self.bps_dispatcher)
def onCopyComment(self, comment, poster): soup = BeautifulSoup(comment) from tart import clipboard c = clipboard.Clipboard() mimeType = 'text/plain' c.insert(mimeType, str(soup.text)) tart.send('commentCopied', poster=poster)
def onParseFeed(self, updates): snaps = [] for item in updates['snaps']: snap = { 'url': item['id'], 'media_id': self.testEmpty(item, 'c_id'), 'media_type': self.testEmpty(item, 'm'), # >3 Friend Request 'time': self.testEmpty(item,'t'), 'sender': self.testEmpty(item, 'sn'), 'recipient': self.testEmpty(item, 'rp'), 'status': item['st'], # Sent, Delivered, Opened, Screenshotted 'sent': item['sts'], 'opened': item['ts'] } if snap['media_type'] == 0: snap['media'] = 'image' elif snap['media_type'] in [1, 2]: snap['media'] = 'video' if snap['recipient'] == '': # Snap recieved snap['type'] = '1' # recieved == 1 else: snap['type'] = '2' # sent == 2 if snap['media_type'] >= 3: # Notifications snap['type'] = '3' # notif == 3 snaps.append(snap) for result in sorted(snaps, key=itemgetter('type')): tart.send('snapsRecieved', snap=result)
def onCopy(self, data): from tart import clipboard c = clipboard.Clipboard() mimeType = "text/plain" c.insert(mimeType, articleLink) tart.send("copyResult", text=data + " copied to clipboard!")
def run(self): while True: # wait for some time or for someone to signal us try: msg = self.queue.get(timeout=self.CHECK_PERIOD) except queue.Empty: pass else: print('got', msg) if msg is None: break # process msg, if any changed = [] for target in os.listdir(self.folder): if not target.endswith('.qml'): # print('ignoring', target) continue if re.match(self.CLONE_PAT, target): # print('ignoring', target) continue tpath = os.path.join(self.folder, target) stat = os.stat(tpath) signature = (stat.st_mtime, stat.st_size) if signature != self._prev_sigs.get(target): print('sig', target, signature) self._prev_sigs[target] = signature changed.append(target) if changed: print('files changed: {}'.format(', '.join(sorted(changed)))) path = self.clone_target() tart.send('fileChanged', path=path)
def handle_event(self, bps_event): '''Handle BPS events for bbmsp domain''' # print('domain', domain, 'bbm_domain', bbmsp_get_domain()) event = self.make_event(bps_event) if event.is_reg_state_event(): # TODO: build the code into the event somehow (can you # retrieve it from the event?) self.prev_access = code = self.get_access_code() tart.send('bbmAccess', state=code, text=self.REG_STATE_NAMES.get(code, '?unrecognized?')) # tart.send('bbmAccessTest', state=code, # text=self.REG_STATE_NAMES.get(code, '?unrecognized?')) else: code = self.get_access_code() if code != self.prev_access: self.prev_access = code tart.send('bbmAccess', state=code, text=self.REG_STATE_NAMES.get(code, '?unrecognized?')) # tart.send('bbmAccessTest', state=code, # text=self.REG_STATE_NAMES.get(code, '?unrecognized?')) fake_event = BbmEvent(0, BBMSP_REGISTRATION, BBMSP_SP_EVENT_ACCESS_CHANGED, None, fake=True) self.fsm.execute(fake_event) if event.is_user_profile_event(): self.check_user_profile_event(event) self.fsm.execute(event)
def onFillList(self): print("Getting list of users....") gd = gitDate() results = gd.calculateCompatibility(self.personalData) print("List Received!!") for result in results: tart.send('datesReceived', result=result)
def parseFeed(self, feed): print('parsing', feed.feed.title, feed.updated) self.state['last_published'] = time.mktime(feed.updated_parsed) self.state['last_checked'] = time.time() url = self.state['site_url'] = feed.feed.link tart.send('siteUrl', url=url) print('found entries:', len(feed.entries)) count = 0 for item in feed.entries: # ignore ones we've already seen if item.link in self.entries: print('ignoring, known', item.link) continue count += 1 imagepath = self.addImage(item) tags = {x.term for x in item.tags} - {'Uncategorized'} entry = { 'url': item.link, 'title': item.title, 'pubtime': time.mktime(item.published_parsed), 'image': imagepath, 'summary': item.summary.split('Filed under')[0].strip(), 'tags': ', '.join(sorted(tags)), } self.addEntry(entry) self.entries[entry['url']] = entry return count
def parse_loop_feiertage(self, termine): results = [] for start_ende in termine.readlines(): if start_ende.startswith('SUMMARY:'): summary = start_ende[8:-1] if summary != 'Volkstrauertag': summary = summary.replace('ue', 'ü') summary = summary.replace('ae', 'ä') summary = summary.replace('oe', 'ö') results.append(summary) #date of the holiday if start_ende.startswith('DTSTART;VALUE=DATE:'): datum_start = start_ende[19:27] ds = datum_start[6:8] ms = datum_start[4:6] ys = datum_start[0:4] #set day of the week with datetime.weekday() tag = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"][date(int(ys), int(ms), int(ds)).weekday()] datum = '{0}, {1}.{2}.{3}'.format(tag, ds, ms, ys) results.append(datum) #Send the final list to QMLs "onGetPythonList" function via BB-Tart tart.send("getPythonList", liste=results)
def parse_ferien(self, jahr, bundesland): results = [] with open('app/native/assets/data/{0}/ferien/Ferien_{1}_{2}.ics'.format(jahr, bundesland, jahr)) as termine: for start_ende in termine.readlines(): #holiday names are found at SUMMARY and is parsed here if start_ende.startswith('SUMMARY:'): summary = start_ende[8:-1] summary = summary.replace('ue', 'ü') summary = summary[:len(summary)-len(bundesland)] results.append(summary) #start and end of the holidays parsed if start_ende.startswith('DTSTART;VALUE=DATE:'): datum_start = start_ende[19:27] ds = datum_start[6:8] ms = datum_start[4:6] ys = datum_start[0:4] if start_ende.startswith('DTEND;VALUE=DATE:'): datum_ende = start_ende[17:25] de = datum_ende[6:8] me = datum_ende[4:6] ye = datum_ende[0:4] datum = '{0}.{1}.{2} - {3}.{4}.{5}'.format(ds, ms, ys, de, me, ye) results.append(datum) #Send the final list to QMLs "onGetPythonList" function via BB-Tart tart.send('getPythonList', liste=results)
def handlePurchaseResponse(self, event): print(event, event.type, event.code) if (event.type == SUCCESS_RESPONSE): purchases = self.getPurchases(event) if len(purchases): tart.send('purchaseResponse', purchases=purchases) elif (event.type == FAILURE_RESPONSE): self.handleErrorResponse(event)
def onLogout(self): self.sess.logout() try: os.remove(self.COOKIE) except OSError: tart.send('logoutResult', text="logged out successfully!") tart.send('logoutResult', text="logged out successfully!")
def onDeleteArticle(self, hnid): conn = sqlite3.connect("data/favourites.db") hnid = str(hnid) cursor = conn.cursor() cursor.execute("DELETE FROM articles WHERE hnid=?", (hnid,) ) conn.commit() tart.send('deleteResult', text="Article removed from favourites", itemToRemove=selected)
def onGetProfile(self, username): info = self.sess.getProfile(username) print(info) if (info == False): os.remove(self.COOKIE) tart.send('logoutResult', text="Unable to get profile, forcing logout...") return tart.send('profileRetrieved', email=info[2], about=info[1])
def onFillList(self): gd = gitDate() print(self.personalData) results = gd.calculateCompatibility(self.personalData) print("List Received!!") print(results) for result in results: tart.send("datesReceived", result=result)
def onCopyHTML(self, content, meta): print(content) print(meta) soup = BeautifulSoup(content) from tart import clipboard c = clipboard.Clipboard() mimeType = 'text/plain' c.insert(mimeType, str(soup.text)) tart.send('contentCopied', meta=meta)
def onGetProfile(self, username): info = self.sess.getProfile(username) print(info) if (info == False): os.remove(self.COOKIE) tart.send('logoutResult', text="Unable to get profile, forcing logout...") return tart.send('profileRetrieved', email=info[3], about=info[2])
def onRequestImage(self, source): data = self.session.getMedia(source) imageURI = os.getcwd() + '/data/' + source + '.jpeg' if data != None: f = open('data/' + source + '.jpeg', 'wb') f.write(data) print("image written") f.close() tart.send('snapData', imageSource=imageURI)
def onUiReady(self): # These need to be absolute paths for the C++ approach (app.composeEmail) # but for some reason not when we're directly invoking via Python. self.paths = [ # os.path.abspath('shared/misc/testfile.txt'), # os.path.abspath('/accounts/1000/shared/camera/IMG_00000043.png'), os.path.abspath('sharewith/pim/testfile.txt'), ] tart.send('filePathUpdated', paths=self.paths)
def __init__(self, dispatcher): # must call this only once, apparently (see native sample) rc = paymentservice_request_events(0) if rc == FAILURE_RESPONSE: tart.send('paymentsDisabled') raise BbmError('cannot use payment service, try restart') print('paymentservice_request_events(0), rc', rc) dispatcher.add_handler(paymentservice_get_domain(), self.handle_event) self.prev_access = -1
def onRefreshFeed(self, url=URLFEED): try: feed = feedparser.parse(url) if feed.status == 200: count = self.parseFeed(feed) if not count: tart.send('noEntriesFound') except Exception as ex: tart.send('pyError', traceback=traceback.format_exc())
def onFakeNew(self): entry = { 'url': '', 'title': 'A faked entry', 'pubtime': time.time(), 'image': '', 'summary': 'This entry was faked', 'tags': 'Faked,Totally', } tart.send('entryAdded', entry=entry)
def onDeleteArticle(self, hnid, selected): conn = sqlite3.connect("data/favourites.db") hnid = str(hnid) cursor = conn.cursor() cursor.execute("DELETE FROM articles WHERE hnid=?", (hnid, )) conn.commit() tart.send('deleteResult', text="Article removed from favourites", itemToRemove=selected)
def onLogin(self, username=None, password=None): self.settings['username'] = username self.settings['password'] = password self.session = Snappy(username, password) self.settings['login'] = self.session.authenticated if self.settings['login']: self.settings['authToken'] = self.session.authToken tart.send('loginResult', value=self.settings['login']) self.onSaveSettings(self.settings)
def onRequestPage(self, source='news'): resp = urlopen(URL.format(source)) body = resp.read().decode('utf-8') soup = BeautifulSoup(body) stories = [] for item in soup.find_all('td', class_='title'): if item.a is not None: stories.append((item.a.string, item.a['href'])) tart.send('addStories', stories=stories)
def onDeleteCache(self): print("PYTHON DELETING CACHE") workingDir = os.getcwd() + '/data/cache/' cursor = self.conn.cursor() print("Dropping favourites table") cursor.execute("""DROP TABLE IF EXISTS articles""") cursor.execute("""CREATE TABLE IF NOT EXISTS articles (title text, articleURL text, saveTime text, poster text, numComments text, isAsk text, domain text, points text, hnid text PRIMARY KEY) """) tart.send('cacheDeleted', text="Cache cleared!")
def onLogin(self, username=None, password=None): if username == None: self.session = Snappy(self.settings['username'], self.settings['password'], self.settings['authToken']) else: self.session = Snappy(username, password) if self.session.authenticated: self.onRequestFeed() # now we request the feed self.settings['username'] = username self.settings['password'] = password self.settings['authToken'] = self.session.authToken self.settings['login'] = '******' tart.send('loginResult', value=self.session.authenticated)
def onLoadFavourites(self): conn = sqlite3.connect("data/favourites.db") cursor = conn.cursor() cursor.execute("""CREATE TABLE IF NOT EXISTS articles (title text, articleURL text, saveTime text, poster text, numComments text, isAsk text, domain text, points text, hnid text PRIMARY KEY) """) cursor.execute('SELECT * FROM articles') results = readerutils.get_rowdicts(cursor) tart.send('fillList', results=results)
def searchRoutine(self, startIndex, source): print("Searching for: " + str(source)) try: result = self.sess.getSearchStories(startIndex, source) if result == []: tart.send( 'searchError', text= "<b><span style='color:#f99925'>No results found!</span></b>" ) return for res in result: tart.send('addSearchStories', story=res) except requests.exceptions.ConnectionError: tart.send( 'searchError', text= "<b><span style='color:#f99925'>Error getting stories</span></b>\nCheck your connection and try again!" ) except SocketError: tart.send( 'searchError', text= "<b><span style='color:#f99925'>Error getting stories</span></b>\nCheck your connection and try again!" )
def storyRoutine(self, source, sentBy): # try: stories, moreLink = self.sess.getStories(source) # except requests.exceptions.ConnectionError: # tart.send('{0}ListError'.format(sentBy), # text="<b><span style='color:#f99925'>Error getting stories</span></b>\nCheck your connection and try again!") # return # except IndexError: # print("Expired link?") # tart.send('{0}ListError'.format(sentBy), # text="<b><span style='color:#f99925'>Link expired</span></b>\nPlease refresh the page") # return print(stories) for story in stories: tart.send('add{0}Stories'.format(sentBy), story=story, moreLink=moreLink, sentTo=sentBy) if (source == 'news'): tart.send('addCoverStories', stories=stories)
def onLogin(self, username=None, password=None): if self.settings['login'] == 'true': session = Snappy(self.settings['username'], self.settings['password']) else: self.settings['username'] = username self.settings['password'] = password self.onSaveSettings(self.settings) session = Snappy(username, password) self.settings['login'] = session.authenticated if session.authenticated == True: self.settings['login'] = '******' tart.send('loginResult', value='true') else: self.settings['login'] = '******' tart.send('loginResult', value='false') self.onSaveSettings(self.settings)
def onSaveArticle(self, article): conn = sqlite3.connect("data/favourites.db") print(article) article = tuple(article) cursor = conn.cursor() cursor.execute("""CREATE TABLE IF NOT EXISTS articles (title text, articleURL text, saveTime text, poster text, numComments text, isAsk text, domain text, points text, hnid text PRIMARY KEY) """) # insert to table try: cursor.execute("INSERT INTO articles VALUES (?,?,?,?,?,?,?,?,?)", article) print("Article saved!") # save data to database conn.commit() tart.send('saveResult', text="Article successfully favourited") except sqlite3.IntegrityError: print("Article already saved!") tart.send('saveResult', text="Article already favourited")
def __init__(self, uuid, dispatcher): self.uuid = uuid self.fsm = StateMachine(stateOrigin=self, onStateChanged=self.onStateChanged, debug=True) # must call this only once, apparently (see native sample) rc = bbmsp_request_events(0) if rc == BBMSP_FAILURE: tart.send('bbmDisabled') raise BbmError('cannot use BBM, try restart') print('bbmsp_request_events(0), rc', rc) self.status = None self.status_message = None self.personal_message = None self.prev_access = -1 dispatcher.add_handler(bbmsp_get_domain(), self.handle_event) self.send_flags_message()
def handle_event(self, bps_event): '''Handle BPS events for bbmsp domain''' # print('domain', domain, 'bbm_domain', bbmsp_get_domain()) event = self.make_event(bps_event) if event.is_reg_state_event(): # TODO: build the code into the event somehow (can you # retrieve it from the event?) self.prev_access = code = self.get_access_code() tart.send('bbmAccess', state=code, text=self.REG_STATE_NAMES.get(code, '?unrecognized?')) # tart.send('bbmAccessTest', state=code, # text=self.REG_STATE_NAMES.get(code, '?unrecognized?')) else: code = self.get_access_code() if code != self.prev_access: self.prev_access = code tart.send('bbmAccess', state=code, text=self.REG_STATE_NAMES.get( code, '?unrecognized?')) # tart.send('bbmAccessTest', state=code, # text=self.REG_STATE_NAMES.get(code, '?unrecognized?')) fake_event = BbmEvent(0, BBMSP_REGISTRATION, BBMSP_SP_EVENT_ACCESS_CHANGED, None, fake=True) self.fsm.execute(fake_event) if event.is_user_profile_event(): self.check_user_profile_event(event) self.fsm.execute(event)
def onSaveProfile(self, username, email, about): res = False try: res = self.sess.postProfile(username, email, about) except: tart.send( 'profileSaved', text="Unable to update profile, check connection and try again" ) if (res == True): tart.send('profileSaved', text="Profile updated!") else: tart.send( 'profileSaved', text="Unable to update profile, check connection and try again" )
def handle_event(self, event): '''Handle BPS events for our domain''' code = bps.bps_event_get_code(event) if code in self.KB_STATE_CODES: tart.send('keyboardState', visible=(code == bps.VIRTUALKEYBOARD_EVENT_VISIBLE))
def onManualExit(self): '''Sent when the app is exiting, so we can save state etc. Override in subclasses as required.''' tart.send('continueExit')
def js(self, text): '''send to JavaScript for evaluation''' tart.send('evalJavascript', text=text)
def onRequestLogin(self, username, password): result = self.sess.login(username, password) tart.send('loginResult', result=result)
def commentsRoutine(self, source, askPost): print("source sent:" + source) try: text, comments = self.sess.getComments( source, askPost, self.settings['legacyFetch']) if (text != ""): text = readerutils.textReplace(text) tart.send('addText', text=text, hnid=source) if (comments == []): tart.send('commentError', text="No comments, check back later!", hnid=source) for comment in comments: comment['text'] = readerutils.textReplace(comment['text']) comment['barColour'] = "#" + \ readerutils.getColour(comment["indent"] // 40) tart.send('addComments', comment=comment, hnid=source) except requests.exceptions.ConnectionError: print("ERROR GETTING COMMENTS") tart.send('addText', text='', hnid=source) tart.send( 'commentError', text= "<b><span style='color:#f99925'>Error getting comments</span></b>\nCheck your connection and try again!", hnid=source) except SocketError: print("ERROR GETTING COMMENTS") tart.send('addText', text='', hnid=source) tart.send( 'commentError', text= "<b><span style='color:#f99925'>Error getting comments</span></b>\nCheck your connection and try again!", hnid=source)
def onCopy(self, articleLink): from tart import clipboard c = clipboard.Clipboard() mimeType = 'text/plain' c.insert(mimeType, articleLink) tart.send('copyResult', text=articleLink + " copied to clipboard!")
def onUiReady(self): print("UI READY!!") tart.send('restoreSettings', **self.settings) self.onRequestPage("news", "news")
def onPostStory(self, title, url, text): res = self.sess.postStory(title, url, text) if (res == True): tart.send('storyPosted', result='true') else: tart.send('storyPosted', result='false')