diff --git a/doc/changelog.md b/doc/changelog.md index 950b403d..238a08dc 100644 --- a/doc/changelog.md +++ b/doc/changelog.md @@ -2,6 +2,7 @@ ## changes in this version +* When displaying tweets or direct messages, a new field has been added to show the date when the item has been posted to Twitter. * Added support for deleting direct messages by using the new Twitter API methods. * When quoting a retweet, the quote will be made to the original tweet instead of the retweet. * If the sent direct messages buffer is hidden, TWBlue should keep loading everything as expected. ([#246](https://github.com/manuelcortez/TWBlue/issues/246)) diff --git a/src/controller/mainController.py b/src/controller/mainController.py index 12f993c6..17e20ae6 100644 --- a/src/controller/mainController.py +++ b/src/controller/mainController.py @@ -4,6 +4,7 @@ system = platform.system() import application import requests import youtube_utils +import arrow if system == "Windows": from update import updater from wxUI import (view, dialogs, commonMessageDialogs, sysTrayIcon) @@ -792,14 +793,17 @@ class Controller(object): def view_item(self, *args, **kwargs): buffer = self.get_current_buffer() - if buffer.type == "baseBuffer" or buffer.type == "favourites_timeline" or buffer.type == "list" or buffer.type == "search": - tweet, tweetsList = buffer.get_full_tweet() - msg = messages.viewTweet(tweet, tweetsList) - elif buffer.type == "account" or buffer.type == "empty": + if buffer.type == "account" or buffer.type == "empty": return - elif buffer.name == "sent_tweets": + elif buffer.type == "baseBuffer" or buffer.type == "favourites_timeline" or buffer.type == "list" or buffer.type == "search": tweet, tweetsList = buffer.get_full_tweet() - msg = messages.viewTweet(tweet, tweetsList) + msg = messages.viewTweet(tweet, tweetsList, utc_offset=buffer.session.db["utc_offset"]) + elif buffer.type == "dm": + non_tweet = buffer.get_formatted_message() + item = buffer.get_right_tweet() + original_date = arrow.get(item["created_timestamp"][:-3]) + date = original_date.replace(seconds=buffer.session.db["utc_offset"]).format(_(u"MMM D, YYYY. H:m"), locale=languageHandler.getLanguage()) + msg = messages.viewTweet(non_tweet, [], False, date=date) else: non_tweet = buffer.get_formatted_message() msg = messages.viewTweet(non_tweet, [], False) diff --git a/src/controller/messages.py b/src/controller/messages.py index 5cda8c0a..d423764f 100644 --- a/src/controller/messages.py +++ b/src/controller/messages.py @@ -2,6 +2,8 @@ import re import platform import attach +import arrow +import languageHandler system = platform.system() import widgetUtils import output @@ -193,7 +195,7 @@ class dm(basicTweet): c.show_menu("dm") class viewTweet(basicTweet): - def __init__(self, tweet, tweetList, is_tweet=True): + def __init__(self, tweet, tweetList, is_tweet=True, utc_offset=0, date=""): """ This represents a tweet displayer. However it could be used for showing something wich is not a tweet, like a direct message or an event. param tweet: A dictionary that represents a full tweet or a string for non-tweets. param tweetList: If is_tweet is set to True, this could be a list of quoted tweets. @@ -229,6 +231,8 @@ class viewTweet(basicTweet): favs_count = str(tweet["favorite_count"]) # Gets the client from where this tweet was made. source = str(re.sub(r"(?s)<.*?>", "", tweet["source"].encode("utf-8"))) + original_date = arrow.get(tweet["created_at"], "ddd MMM DD H:m:s Z YYYY", locale="en") + date = original_date.replace(seconds=utc_offset).format(_(u"MMM D, YYYY. H:m"), locale=languageHandler.getLanguage()) if text == "": if tweet.has_key("message"): value = "message" @@ -250,13 +254,13 @@ class viewTweet(basicTweet): for z in tweet["retweeted_status"]["extended_entities"]["media"]: if z.has_key("ext_alt_text") and z["ext_alt_text"] != None: image_description.append(z["ext_alt_text"]) - self.message = message.viewTweet(text, rt_count, favs_count, source.decode("utf-8")) + self.message = message.viewTweet(text, rt_count, favs_count, source.decode("utf-8"), date) self.message.set_title(len(text)) [self.message.set_image_description(i) for i in image_description] else: self.title = _(u"View item") text = tweet - self.message = message.viewNonTweet(text) + self.message = message.viewNonTweet(text, date) widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck) widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate) if self.contain_urls() == True: diff --git a/src/wxUI/dialogs/message.py b/src/wxUI/dialogs/message.py index d570344b..c22cebfc 100644 --- a/src/wxUI/dialogs/message.py +++ b/src/wxUI/dialogs/message.py @@ -298,7 +298,7 @@ class viewTweet(widgetUtils.BaseDialog): def set_title(self, lenght): self.SetTitle(_(u"Tweet - %i characters ") % (lenght,)) - def __init__(self, text, rt_count, favs_count,source, *args, **kwargs): + def __init__(self, text, rt_count, favs_count, source, date="", *args, **kwargs): super(viewTweet, self).__init__(None, size=(850,850)) panel = wx.Panel(self) label = wx.StaticText(panel, -1, _(u"Tweet")) @@ -339,11 +339,21 @@ class viewTweet(widgetUtils.BaseDialog): sourceBox = wx.BoxSizer(wx.HORIZONTAL) sourceBox.Add(sourceLabel, 0, wx.ALL, 5) sourceBox.Add(sourceTweet, 0, wx.ALL, 5) + dateLabel = wx.StaticText(panel, -1, _(u"Date: ")) + dateTweet = wx.TextCtrl(panel, -1, date, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + dc = wx.WindowDC(dateTweet) + dc.SetFont(dateTweet.GetFont()) + (x, y) = dc.GetTextExtent("0"*100) + dateTweet.SetSize((x, y)) + dateBox = wx.BoxSizer(wx.HORIZONTAL) + dateBox.Add(dateLabel, 0, wx.ALL, 5) + dateBox.Add(dateTweet, 0, wx.ALL, 5) infoBox = wx.BoxSizer(wx.HORIZONTAL) infoBox.Add(rtBox, 0, wx.ALL, 5) infoBox.Add(favsBox, 0, wx.ALL, 5) infoBox.Add(sourceBox, 0, wx.ALL, 5) mainBox.Add(infoBox, 0, wx.ALL, 5) + mainBox.Add(dateBox, 0, wx.ALL, 5) self.spellcheck = wx.Button(panel, -1, _("Check &spelling..."), size=wx.DefaultSize) self.unshortenButton = wx.Button(panel, -1, _(u"&Expand URL"), size=wx.DefaultSize) self.unshortenButton.Disable() @@ -390,7 +400,7 @@ class viewTweet(widgetUtils.BaseDialog): class viewNonTweet(widgetUtils.BaseDialog): - def __init__(self, text, *args, **kwargs): + def __init__(self, text, date="", *args, **kwargs): super(viewNonTweet, self).__init__(None, size=(850,850)) self.SetTitle(_(u"View")) panel = wx.Panel(self) @@ -406,6 +416,17 @@ class viewNonTweet(widgetUtils.BaseDialog): textBox.Add(self.text, 1, wx.EXPAND, 5) mainBox = wx.BoxSizer(wx.VERTICAL) mainBox.Add(textBox, 0, wx.ALL, 5) + if date != "": + dateLabel = wx.StaticText(panel, -1, _(u"Date: ")) + date = wx.TextCtrl(panel, -1, date, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + dc = wx.WindowDC(date) + dc.SetFont(date.GetFont()) + (x, y) = dc.GetTextExtent("0"*100) + date.SetSize((x, y)) + dateBox = wx.BoxSizer(wx.HORIZONTAL) + dateBox.Add(dateLabel, 0, wx.ALL, 5) + dateBox.Add(date, 0, wx.ALL, 5) + mainBox.Add(dateBox, 0, wx.ALL, 5) self.spellcheck = wx.Button(panel, -1, _("Check &spelling..."), size=wx.DefaultSize) self.unshortenButton = wx.Button(panel, -1, _(u"&Expand URL"), size=wx.DefaultSize) self.unshortenButton.Disable()