mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2024-11-23 19:48:09 -06:00
240 lines
10 KiB
Python
240 lines
10 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
import utils
|
||
|
import re
|
||
|
import htmlentitydefs
|
||
|
import datetime
|
||
|
import time
|
||
|
import output
|
||
|
import gettext, paths, locale, gettext_windows
|
||
|
import config, languageHandler
|
||
|
if config.main != None:
|
||
|
languageHandler.setLanguage(config.main["general"]["language"])
|
||
|
else:
|
||
|
languageHandler.setLanguage("system")
|
||
|
import platform
|
||
|
system = platform.system()
|
||
|
|
||
|
def prettydate(d):
|
||
|
""" Converts a string to the relative time."""
|
||
|
diff = datetime.datetime.utcnow() - d
|
||
|
s = diff.seconds
|
||
|
if diff.days > 7 and diff.days < 14:
|
||
|
return _(u"About a week ago")
|
||
|
elif diff.days > 14 and diff.days < 31:
|
||
|
return _(u"About {} weeks ago").format(diff.days/7)
|
||
|
elif diff.days > 31 and diff.days <= 62:
|
||
|
return _(u"A month ago")
|
||
|
elif diff.days >62 and diff.days <= 365:
|
||
|
return _(u"About {} months ago").format(diff.days/30)
|
||
|
elif diff.days > 365 and diff.days <= 730:
|
||
|
return _(u"About a year ago")
|
||
|
elif diff.days > 730:
|
||
|
return _(u"About {} years ago").format(diff.days/365)
|
||
|
elif diff.days == 1:
|
||
|
return _(u"About 1 day ago")
|
||
|
elif diff.days > 1:
|
||
|
return _(u"About {} days ago").format(diff.days)
|
||
|
elif s <= 1:
|
||
|
return _(u"just now")
|
||
|
elif s < 60:
|
||
|
return _(u"{} seconds ago").format(s)
|
||
|
elif s < 120:
|
||
|
return _(u"1 minute ago")
|
||
|
elif s < 3600:
|
||
|
return _(u"{} minutes ago").format(s/60)
|
||
|
elif s < 7200:
|
||
|
return _(u"About 1 hour ago")
|
||
|
else:
|
||
|
return _(u"About {} hours ago").format(s/3600)
|
||
|
|
||
|
# Months, days, short_months and short_days are used to translate the string that Twitter gives to us with the date and time.
|
||
|
months = {
|
||
|
"January": _(u"January"),
|
||
|
"February": _(u"February"),
|
||
|
"March": _(u"March"),
|
||
|
"April": _(u"April"),
|
||
|
"May": _(u"May"),
|
||
|
"June": _(u"June"),
|
||
|
"July": _(u"July"),
|
||
|
"August": _(u"August"),
|
||
|
"September": _(u"September"),
|
||
|
"October": _(u"October"),
|
||
|
"November": _(u"November"),
|
||
|
"December": _(u"December"),
|
||
|
}
|
||
|
|
||
|
days = {"Sunday": _(u"Sunday"),
|
||
|
"Monday": _(u"Monday"),
|
||
|
"Tuesday": _(u"Tuesday"),
|
||
|
"Wednesday": _(u"Wednesday"),
|
||
|
"Thursday": _(u"Thursday"),
|
||
|
"Friday": _(u"Friday"),
|
||
|
"Saturday": _(u"Saturday")}
|
||
|
|
||
|
short_days = {
|
||
|
"Sun": _(u"sun"),
|
||
|
"Mon": _(u"mon"),
|
||
|
"Tue": _(u"tue"),
|
||
|
"Wed": _(u"wed"),
|
||
|
"Thu": _(u"thu"),
|
||
|
"Fri": _(u"fri"),
|
||
|
"Sat": _(u"sat")
|
||
|
}
|
||
|
|
||
|
short_months = {
|
||
|
"Jan": _(u"jan"),
|
||
|
"Feb": _(u"feb"),
|
||
|
"Mar": _(u"mar"),
|
||
|
"Apr": _(u"apr"),
|
||
|
"May": _(u"may"),
|
||
|
"Jun": _(u"jun"),
|
||
|
"Jul": _(u"jul"),
|
||
|
"Aug": _(u"aug"),
|
||
|
"Sep": _(u"sep"),
|
||
|
"Oct": _(u"oct"),
|
||
|
"Nov": _(u"nov"),
|
||
|
"Dec": _(u"dec")}
|
||
|
|
||
|
def StripChars(s):
|
||
|
"""Converts any html entities in s to their unicode-decoded equivalents and returns a string."""
|
||
|
entity_re = re.compile(r"&(#\d+|\w+);")
|
||
|
def matchFunc(match):
|
||
|
"""Nested function to handle a match object.
|
||
|
If we match &blah; and it's not found, &blah; will be returned.
|
||
|
if we match #\d+, unichr(digits) will be returned.
|
||
|
Else, a unicode string will be returned."""
|
||
|
if match.group(1).startswith('#'): return unichr(int(match.group(1)[1:]))
|
||
|
replacement = htmlentitydefs.entitydefs.get(match.group(1), "&%s;" % match.group(1))
|
||
|
return replacement.decode('iso-8859-1')
|
||
|
return unicode(entity_re.sub(matchFunc, s))
|
||
|
|
||
|
def translate(string):
|
||
|
""" Changes the days in English for the current language. Needed for Windows."""
|
||
|
if system != "Windows": return string
|
||
|
else:
|
||
|
global months, days
|
||
|
for d in months:
|
||
|
string = string.replace(d, months[d])
|
||
|
for d in days:
|
||
|
string = string.replace(d, days[d])
|
||
|
return string
|
||
|
|
||
|
def translate_short(string):
|
||
|
""" Changes the English date from Twitter to a local date and time. Needed for datetime on Linux."""
|
||
|
if system != "Linux": return string
|
||
|
else:
|
||
|
# if 1 == 1:
|
||
|
global short_months, short_days
|
||
|
for d in short_months:
|
||
|
string = string.replace(d, short_months[d])
|
||
|
for d in short_days:
|
||
|
string = string.replace(d, short_days[d])
|
||
|
return string
|
||
|
|
||
|
chars = "abcdefghijklmnopqrstuvwxyz"
|
||
|
|
||
|
def compose_tweet(tweet, db):
|
||
|
""" It receives a tweet and returns a list with the user, text for the tweet or message, date and the client where user is."""
|
||
|
# original_date = datetime.datetime.strptime(translate_short(tweet["created_at"]).encode("utf-8"), "%a %b %d %H:%M:%S +0000 %Y")
|
||
|
original_date = datetime.datetime.strptime(tweet["created_at"], "%a %b %d %H:%M:%S +0000 %Y")
|
||
|
# else:
|
||
|
# original_date = datetime.datetime.strptime(tweet["created_at"], '%a %b %d %H:%M:%S +0000 %Y')
|
||
|
date = original_date-datetime.timedelta(seconds=-db.settings["utc_offset"])
|
||
|
if config.main["general"]["relative_times"] == True:
|
||
|
ts = prettydate(original_date)
|
||
|
else:
|
||
|
# ts = translate(datetime.datetime.strftime(date, _("%A, %B %d, %Y at %I:%M:%S %p".encode("utf-8"))).decode("utf-8"))
|
||
|
ts = translate(datetime.datetime.strftime(date, _("%A, %B %d, %Y at %I:%M:%S %p")))
|
||
|
# ts = tweet["created_at"]
|
||
|
text = StripChars(tweet["text"])
|
||
|
if tweet.has_key("sender"):
|
||
|
source = "DM"
|
||
|
if db.settings["user_name"] == tweet["sender"]["screen_name"]: user = _(u"Dm to %s ") % (tweet["recipient"]["name"],)
|
||
|
else: user = tweet["sender"]["name"]
|
||
|
elif tweet.has_key("user"):
|
||
|
user = tweet["user"]["name"]
|
||
|
source = re.sub(r"(?s)<.*?>", " ", tweet["source"])
|
||
|
try: text = "rt @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], StripChars(tweet["retweeted_status"]["text"]))
|
||
|
except KeyError: text = "%s" % (StripChars(tweet["text"]))
|
||
|
if text[-1] in chars: text=text+"."
|
||
|
urls = utils.find_urls_in_text(text)
|
||
|
for url in range(0, len(urls)):
|
||
|
try: text = text.replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"])
|
||
|
except IndexError: pass
|
||
|
tweet["text"] = text
|
||
|
return [user+", ", tweet["text"], ts+", ", source]
|
||
|
|
||
|
def compose_followers_list(tweet, db):
|
||
|
# original_date = datetime.datetime.strptime(translate_short(tweet["created_at"]).encode("utf-8"), '%a %b %d %H:%M:%S +0000 %Y')
|
||
|
original_date = datetime.datetime.strptime(tweet["created_at"], '%a %b %d %H:%M:%S +0000 %Y')
|
||
|
date = original_date-datetime.timedelta(seconds=-db.settings["utc_offset"])
|
||
|
if config.main["general"]["relative_times"] == True:
|
||
|
ts = prettydate(original_date)
|
||
|
else:
|
||
|
ts = translate(datetime.datetime.strftime(date, _(u"%A, %B %d, %Y at %I:%M:%S %p")))
|
||
|
# ts = tweet["created_at"]
|
||
|
if tweet.has_key("status"):
|
||
|
if len(tweet["status"]) > 4:
|
||
|
# original_date2 = datetime.datetime.strptime(translate_short(tweet["status"]["created_at"]).encode("utf-8"), '%a %b %d %H:%M:%S +0000 %Y')
|
||
|
original_date2 = datetime.datetime.strptime(tweet["status"]["created_at"], '%a %b %d %H:%M:%S +0000 %Y')
|
||
|
date2 = original_date2-datetime.timedelta(seconds=-db.settings["utc_offset"])
|
||
|
if config.main["general"]["relative_times"]:
|
||
|
ts2 = prettydate(original_date2)
|
||
|
else:
|
||
|
ts2 = translate(datetime.datetime.strftime(date2, _(u"%A, %B %d, %Y at %I:%M:%S %p")))
|
||
|
else:
|
||
|
ts2 = _("Unavailable")
|
||
|
return [_(u"%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined Twitter on %s") % (tweet["name"], tweet["screen_name"], tweet["followers_count"], tweet["friends_count"], tweet["statuses_count"], ts2, ts)]
|
||
|
|
||
|
def compose_event(data, username):
|
||
|
if data["event"] == "block":
|
||
|
event = _("You've blocked %s") % (data["target"]["name"])
|
||
|
elif data["event"] == "unblock":
|
||
|
event = _(u"You've unblocked %s") % (data["target"]["name"])
|
||
|
elif data["event"] == "follow":
|
||
|
if data["target"]["screen_name"] == username:
|
||
|
event = _(u"%s(@%s) has followed you") % (data["source"]["name"], data["source"]["screen_name"])
|
||
|
elif data["source"]["screen_name"] == username:
|
||
|
event = _(u"You've followed %s(@%s)") % (data["target"]["name"], data["target"]["screen_name"])
|
||
|
elif data["event"] == "unfollow":
|
||
|
event = _(u"You've unfollowed %s (@%s)") % (data["target"]["name"], data["target"]["screen_name"])
|
||
|
elif data["event"] == "favorite":
|
||
|
if data["source"]["screen_name"] == username:
|
||
|
event = _(u"You've added to favourites: %s, %s") % (data["target"]["name"], data["target_object"]["text"])
|
||
|
else:
|
||
|
event = _(u"%s(@%s) has marked as favorite: %s") % (data["source"]["name"], data["source"]["screen_name"], data["target_object"]["text"])
|
||
|
elif data["event"] == "unfavorite":
|
||
|
if data["source"]["screen_name"] == username: event = _(u"You've removed from favourites: %s, %s") % (data["target"]["name"], data["target_object"]["text"])
|
||
|
else: event = _(u"%s(@%s) has removed from favourites: %s") % (data["source"]["name"], data["source"]["screen_name"], data["target_object"]["text"])
|
||
|
elif data["event"] == "list_created":
|
||
|
event = _(u"You've created the list %s") % (data["target_object"]["name"])
|
||
|
elif data["event"] == "list_destroyed":
|
||
|
event = _("You've deleted the list %s") % (data["target_object"]["name"])
|
||
|
elif data["event"] == "list_updated":
|
||
|
event = _("You've updated the list %s") % (data["target_object"]["name"])
|
||
|
elif data["event"] == "list_member_added":
|
||
|
if data["source"]["screen_name"] == username: event = _(u"You've added %s(@%s) to the list %s") % (data["target"]["name"], data["target"]["screen_name"], data["target_object"]["name"])
|
||
|
else: event = _(u"%s(@%s) has added you to the list %s") % (data["source"]["name"], data["source"]["screen_name"], data["target_object"]["name"])
|
||
|
elif data["event"] == "list_member_removed":
|
||
|
if data["source"]["screen_name"] == username: event = _(u"You'be removed %s(@%s) from the list %s") % (data["target"]["name"], data["target"]["screen_name"], data["target_object"]["name"])
|
||
|
else: event = _(u"%s(@%s) has removed you from the list %s") % (data["source"]["name"], data["source"]["screen_name"], data["target_object"]["name"])
|
||
|
elif data["event"] == "list_user_subscribed":
|
||
|
if data["source"]["screen_name"] == username: event = _(u"You've subscribed to the list %s, which is owned by %s(@%s)") % (data["target_object"]["name"], data["target"]["name"], data["target"]["screen_name"])
|
||
|
else: event = _(u"%s(@%s) has suscribed you to the list %s") % (data["source"]["name"], data["source"]["screen_name"], data["target_object"]["name"])
|
||
|
elif data["event"] == "list_user_unsubscribed":
|
||
|
if data["source"]["screen_name"] == username: event = _(u"You've unsubscribed from the list %s, which is owned by %s(@%s)") % (data["target_object"]["name"], data["target"]["name"], data["target"]["screen_name"])
|
||
|
else: event = _("You've been unsubscribed from the list %s, which is owned by %s(@%s)") % (data["target_object"]["name"], data["source"]["name"], data["source"]["screen_name"])
|
||
|
else: event = _("Unknown")
|
||
|
# output.speak(event)
|
||
|
return [time.strftime("%I:%M %p"), event]
|
||
|
|
||
|
def compose_list(list):
|
||
|
name = list["name"]
|
||
|
if list["description"] == None: description = _(u"No description available")
|
||
|
else: description = list["description"]
|
||
|
user = list["user"]["name"]
|
||
|
members = str(list["member_count"])
|
||
|
if list["mode"] == "private": status = _(u"private")
|
||
|
else: status = _(u"public")
|
||
|
return [name, description, user, members, status]
|