def write_error(self, status_code, **kwargs):
     try:
         stats.request(str(get_ip(self.request)))
     except:
         error("Errored while handling request IP -- still served...")
     self.render("pages/error.html",
                 message=httplib.responses[status_code],
                 error=status_code)
 def get(self):
     try:
         req_resp = stats.request(str(get_ip(self.request)))
         say("Received STATS request (" + req_resp + ")")
     except:
         error("Errored while handling request IP -- still served...")
     self.render("pages/stats.html",
                 countries=stats.top_countries(),
                 last_restart=stats.time(),
                 devices=stats.unique_devices(),
                 total_requests=stats.requests,
                 requests_per_second=stats.requests_per_second())
Esempio n. 3
0
def write_tweet(account, tweet, data, overwrite=True):
    if (not overwrite) and os.path.exists(
            "database/" + str(account) + "/tweets/" + str(tweet) + ".json"
    ):  # if tweet already written and overwrite = false, do not write to file
        return False
    if not is_account(account):
        error("Cannot write tweet to an account that does not exist!",
              detail="Tweet = " + str(tweet) + ", account = " + str(account) +
              ".")
        return
    if not os.path.isdir("database/" + str(account) + "/tweets"):
        os.mkdir("database/" + str(account) + "/tweets")
    with open("database/" + str(account) + "/tweets/" + str(tweet) + ".json",
              "w") as tweet_file:
        json.dump(data, tweet_file)
        return True
    def get(self):
        try:
            req_resp = stats.request(str(get_ip(self.request)))
        except:
            error("Errored while handling request IP -- still served...")
        say("Received INDEX request (" + req_resp + ")")
        flash = flashes.get_latest_flashes(1)[0]
        flash['text'] = tornado.escape.xhtml_unescape(flash['text'])
        time = str(flash['time'])

        if isinstance(flash['time'], basestring):
            time = arrow.Arrow.strptime(
                flash['time'], "%a %b %d %H:%M:%S +0000 %Y").humanize()
        elif isinstance(flash['time'], datetime.datetime):
            time = arrow.get(flash['time']).humanize()
        self.render("pages/index.html", flash=flash, time=time)
Esempio n. 5
0
def _push_notification_to_subscribers(subscriptions, data):
    userio.say("Sending notification to " + str(subscriptions.count()) +
               " subscribers in a new thread...")
    for subscription in subscriptions:
        try:
            webpush(
                subscription_info=subscription,
                data=data,
                vapid_private_key=configuration.
                get_vapid_public_private_key_pair()[1],
                vapid_claims=VAPID_CLAIMS,
                #gcm_key=configuration.get_gcm_key(),
            )
        except Exception as e:
            userio.error("    ...unable to send notification: " + str(e))
            db.subscriptions.remove(subscription)
            userio.say("    ...removed subscription!")
    userio.ok("Finished sending notification.")
    thread.exit()
Esempio n. 6
0
def full_pass(account):
    if not databasehandler.is_account(account):
        error("Cannot scan account that doesn't exist!",
              detail="Offending account is " + str(account))
    else:
        # pull all the tweet ids from the database
        archived_ids = databasehandler.get_tweets(account)

        # pull all the tweets from Twitter
        available_tweets = twitterhandler.get_all_tweets(account)
        available_ids = [tweet["id"] for tweet in available_tweets]

        deleted_candidates = [
            idz for idz in archived_ids if int(idz) not in available_ids
        ]

        ok("Found " + str(len(deleted_candidates)) + " deletion candidates...")

        deleted = []
        for candidate in deleted_candidates:
            if not twitterhandler.does_status_exist(candidate):
                ok("Tweet " + str(candidate) + " has been deleted!")
                deleted.append(candidate)
        ok("Found " + str(len(deleted)) + " deleted tweets!")

        # also write the new tweets to the database
        pushed = 0
        for tweet in available_tweets:
            if databasehandler.write_tweet(account,
                                           tweet["id"],
                                           tweet,
                                           overwrite=False):
                pushed += 1

        # and mark the deleted tweets as deleted
        for tweet_id in deleted:
            tweet = databasehandler.get_tweet(account, tweet_id)
            tweet["deleted"] = True
            databasehandler.write_tweet(account, tweet_id, tweet)

        ok("Also pushed " + str(pushed) + " new tweets to the database.")

        return deleted
Esempio n. 7
0
 def on_status(self, status):
     try:
         say("Detected flash...")
         if configuration.is_following(status.user.screen_name):
             say("...from a relevant source!")
             url = None
             if 'urls' in status.entities and len(
                     status.entities['urls']) > 0:
                 url = status.entities['urls'][0]["expanded_url"]
             flash = generate_flash(
                 status.text, url,
                 configuration.get_name(status.user.screen_name), status.id,
                 status.created_at,
                 configuration.get_channel(status.user.screen_name))
             push_flash(flash)
             ok("Detected and pushed flash: " + str(flash))
         else:
             say("...from an irrelevant source.")
     except Exception as e:
         error("Encountered an exception while processing a flash: " +
               str(e))
     return True
Esempio n. 8
0
 def get(self):
     try:
         req_resp = stats.request(str(get_ip(self.request)))
     except:
         error("Errored while handling request IP -- still served...")
     say("Received INDEX request (" + req_resp + ")")
     alerts = flashes.get_latest_flashes(3)
     for flash in alerts:
         flash['text'] = tornado.escape.xhtml_unescape(flash['text'])
         if isinstance(flash['time'],
                       basestring) and "+0000" in flash['time']:
             flash['time'] = arrow.Arrow.strptime(
                 flash['time'], "%a %b %d %H:%M:%S +0000 %Y").humanize()
         if isinstance(flash['time'], datetime.datetime):
             flash['time'] = arrow.get(flash['time']).humanize()
     self.render("pages/index.html",
                 flashes=alerts,
                 countries=stats.top_countries(),
                 last_restart=stats.time(),
                 devices=stats.unique_devices(),
                 total_requests=stats.requests,
                 requests_per_second=str(stats.requests_per_second())[:5])
 def get(self):
     try:
         req_resp = stats.request(str(get_ip(self.request)))
         say("Received API request (" + req_resp + ")")
     except:
         error("Errored while handling request IP -- still served...")
     self.set_header("Content-Type", "application/json")
     latest = -1
     try:
         latest = int(self.get_argument('latest'))
     except:
         pass  # no latest flash specified
     data = {
         "server":
         "LibreNews Central",
         "channels": [k[2] for k in configuration.get_accounts()],
         "latest": [
             flash for flash in flashes.get_latest_flashes(25)
             if int(flash['id']) > int(latest)
         ]
     }
     self.write(
         unicode(json.dumps(data, sort_keys=True, separators=(',', ':'))))
 def get(self):
     try:
         stats.request(str(get_ip(self.request)))
     except:
         error("Errored while handling request IP -- still served...")
     self.render("pages/error.html", message="Page not found", error="404")
Esempio n. 11
0
 def on_error(self, status):
     error("Encountered an error while processing a status: " + str(status))
     if status == 420:
         # returning False in on_data disconnects the stream
         return False
     return True