From d5ac0db67b6df624459f78ed5ceaef24aeb68217 Mon Sep 17 00:00:00 2001 From: zstanecic Date: Mon, 5 Jul 2021 16:04:19 +0200 Subject: [PATCH 1/7] updated the russian localization. --- src/locales/ru/LC_MESSAGES/twblue.mo | Bin 64532 -> 64832 bytes src/locales/ru/LC_MESSAGES/twblue.po | 16 ++++++---------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/locales/ru/LC_MESSAGES/twblue.mo b/src/locales/ru/LC_MESSAGES/twblue.mo index fea14909653734e74743bff51784cb10098faec1..ab4e62681a302c26df510a503233c0e837e6f3a6 100644 GIT binary patch delta 15536 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 delta 15405 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 Dro3=i diff --git a/src/locales/ru/LC_MESSAGES/twblue.po b/src/locales/ru/LC_MESSAGES/twblue.po index ee83c122..4b041800 100644 --- a/src/locales/ru/LC_MESSAGES/twblue.po +++ b/src/locales/ru/LC_MESSAGES/twblue.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: TW Blue 0.85\n" "POT-Creation-Date: 2019-03-17 13:34+Hora estndar romance\n" -"PO-Revision-Date: 2020-10-23 14:30+0300\n" +"PO-Revision-Date: 2021-07-05 16:03+0200\n" "Last-Translator: Artem Plaksin \n" "Language-Team: Alexander Jaszyn \n" "Language: ru\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 1.8.8\n" +"X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Poedit-SourceCharset: UTF-8\n" @@ -208,14 +208,12 @@ msgstr "" "личных сообщений вместо этого." #: ../src\controller\buffers\twitterBuffers.py:983 -#, fuzzy msgid "{0} new followers." -msgstr "Новый читатель." +msgstr "{0} новых читателей." #: ../src\controller\buffers\twitterBuffers.py:1266 -#, fuzzy msgid "This action is not supported in the buffer, yet." -msgstr "Это действие не поддерживается в данном буфере" +msgstr "Это действие пока не поддерживается в буфере." #: ../src\controller\mainController.py:273 msgid "Ready" @@ -314,9 +312,8 @@ msgid "Select the user" msgstr "Выберите пользователя" #: ../src\controller\mainController.py:809 ../src\controller\messages.py:236 -#, fuzzy msgid "MMM D, YYYY. H:m" -msgstr "dddd, MMMM D, YYYY H:m:s" +msgstr "MMM D, YYYY. H:m" #: ../src\controller\mainController.py:934 msgid "Conversation with {0}" @@ -1702,9 +1699,8 @@ msgid "Opens the global settings dialogue" msgstr "Открыть основные настройки" #: ../src\keystrokeEditor\constants.py:54 -#, fuzzy msgid "Opens the list manager" -msgstr "Менеджер Списков" +msgstr "Открывает менеджер списков" #: ../src\keystrokeEditor\constants.py:55 msgid "Opens the account settings dialogue" From 877c90948278ecaac57014bf77c285a2f36a08e5 Mon Sep 17 00:00:00 2001 From: Manuel Cortez Date: Tue, 6 Jul 2021 13:56:56 -0500 Subject: [PATCH 2/7] Added user-aliases section on session configs --- src/Conf.defaults | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Conf.defaults b/src/Conf.defaults index 80b28db6..a723b767 100644 --- a/src/Conf.defaults +++ b/src/Conf.defaults @@ -49,3 +49,5 @@ braille_reporting = boolean(default=True) speech_reporting = boolean(default=True) [filters] + +[user-aliases] \ No newline at end of file From de12dadac2035e3298425d2281b85e02d8f636d2 Mon Sep 17 00:00:00 2001 From: Manuel Cortez Date: Tue, 6 Jul 2021 13:58:13 -0500 Subject: [PATCH 3/7] Added GUI for user alias addition --- src/controller/mainController.py | 21 ++++++++++++++++++++ src/wxUI/dialogs/utils.py | 33 ++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/controller/mainController.py b/src/controller/mainController.py index 4cc72170..fa689661 100644 --- a/src/controller/mainController.py +++ b/src/controller/mainController.py @@ -185,6 +185,7 @@ class Controller(object): widgetUtils.connect_event(self.view, widgetUtils.MENU, self.report_error, self.view.reportError) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_documentation, self.view.doc) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_changelog, self.view.changelog) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.add_alias, self.view.addAlias) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.add_to_list, self.view.addToList) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.remove_from_list, self.view.removeFromList) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.update_buffer, self.view.update_buffer) @@ -754,6 +755,26 @@ class Controller(object): users = utils.get_all_users(tweet, buff.session) u = userActionsController.userActionsController(buff, users, "report") + def add_alias(self, *args, **kwargs): + buff = self.get_best_buffer() + if not hasattr(buff, "get_right_tweet"): return + tweet = buff.get_right_tweet() + if buff.type == "people": + users = [tweet.screen_name] + elif buff.type == "dm": + users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] + else: + users = utils.get_all_users(tweet, buff.session) + dlg = dialogs.utils.addAliasDialog(_("Add an user alias"), users) + if dlg.get_response() == widgetUtils.OK: + user, alias = dlg.get_user() + if user == "" or alias == "": + return + user_id = buff.session.get_user_by_screen_name(user) + buff.session.settings["user-aliases"][str(user_id)] = alias + buff.session.settings.write() + output.speak(_("Alias has been set correctly for {}.").format(user)) + def post_tweet(self, event=None): buffer = self.get_best_buffer() buffer.post_status() diff --git a/src/wxUI/dialogs/utils.py b/src/wxUI/dialogs/utils.py index 8335d61d..6f308685 100644 --- a/src/wxUI/dialogs/utils.py +++ b/src/wxUI/dialogs/utils.py @@ -48,3 +48,36 @@ class selectUserDialog(baseDialog.BaseWXDialog): def get_user(self): return self.cb.GetValue() +class addAliasDialog(baseDialog.BaseWXDialog): + def __init__(self, title, users): + super(addAliasDialog, self).__init__(parent=None, id=wx.ID_ANY, title=title) + panel = wx.Panel(self) + userSizer = wx.BoxSizer() + self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0], size=wx.DefaultSize) + self.cb.SetFocus() + self.autocompletion = wx.Button(panel, -1, _(u"&Autocomplete users")) + userSizer.Add(wx.StaticText(panel, -1, _(u"User")), 0, wx.ALL, 5) + userSizer.Add(self.cb, 0, wx.ALL, 5) + userSizer.Add(self.autocompletion, 0, wx.ALL, 5) + aliasSizer = wx.BoxSizer(wx.HORIZONTAL) + aliasLabel = wx.StaticText(panel, wx.ID_ANY, _("Alias")) + self.alias = wx.TextCtrl(panel, wx.ID_ANY) + aliasSizer.Add(aliasLabel, 0, wx.ALL, 5) + aliasSizer.Add(self.alias, 0, wx.ALL, 5) + sizer = wx.BoxSizer(wx.VERTICAL) + ok = wx.Button(panel, wx.ID_OK, _(u"OK")) + ok.SetDefault() +# ok.Bind(wx.EVT_BUTTON, self.onok) + cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) + btnsizer = wx.BoxSizer() + btnsizer.Add(ok, 0, wx.ALL, 5) + btnsizer.Add(cancel, 0, wx.ALL, 5) + sizer.Add(userSizer, 0, wx.ALL, 5) + sizer.Add(aliasSizer, 0, wx.ALL, 5) + sizer.Add(btnsizer, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) + + def get_user(self): + return (self.cb.GetValue(), self.alias.GetValue()) + From 07f9afb14e932d2d9e00638d577acd6ec44ecc59 Mon Sep 17 00:00:00 2001 From: Manuel Cortez Date: Tue, 6 Jul 2021 13:58:34 -0500 Subject: [PATCH 4/7] Added option to user menu in the menu bar --- src/wxUI/view.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wxUI/view.py b/src/wxUI/view.py index cef105be..5e5f034b 100644 --- a/src/wxUI/view.py +++ b/src/wxUI/view.py @@ -43,6 +43,7 @@ class mainFrame(wx.Frame): self.follow = user.Append(wx.ID_ANY, _(u"&Actions...")) self.timeline = user.Append(wx.ID_ANY, _(u"&View timeline...")) self.dm = user.Append(wx.ID_ANY, _(u"Direct me&ssage")) + self.addAlias = user.Append(wx.ID_ANY, _("Add a&lias")) self.addToList = user.Append(wx.ID_ANY, _(u"&Add to list")) self.removeFromList = user.Append(wx.ID_ANY, _(u"R&emove from list")) self.viewLists = user.Append(wx.ID_ANY, _(u"&View lists")) From 3688d7548c4dc14c51c63a2031cece3fa449ba3c Mon Sep 17 00:00:00 2001 From: Manuel Cortez Date: Tue, 6 Jul 2021 13:59:34 -0500 Subject: [PATCH 5/7] Check alias before returning any user object --- src/sessions/twitter/session.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/sessions/twitter/session.py b/src/sessions/twitter/session.py index 5b0f46e8..ea0561e2 100644 --- a/src/sessions/twitter/session.py +++ b/src/sessions/twitter/session.py @@ -430,9 +430,25 @@ class Session(base.baseSession): users = self.db["users"] users[user.id_str] = user self.db["users"] = users + user.name = self.get_user_alias(user) return user else: - return self.db["users"][str(id)] + user = self.db["users"][str(id)] + user.name = self.get_user_alias(user) + return user + + def get_user_alias(self, user): + """ Retrieves an alias for the passed user model, if exists. + @ user Tweepy.models.user: An user object. + """ + aliases = self.settings.get("user-aliases") + if aliases == None: + log.error("Aliases are not defined for this config spec.") + return user.name + user_alias = aliases.get(user.id_str) + if user_alias != None: + return user_alias + return user.name def get_user_by_screen_name(self, screen_name): """ Returns an user identifier associated with a screen_name. From 8ff6809f08442ac6b4e57616c02365b27dca0345 Mon Sep 17 00:00:00 2001 From: Manuel Cortez Date: Tue, 6 Jul 2021 16:22:52 -0500 Subject: [PATCH 6/7] Updated changelog --- doc/changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/changelog.md b/doc/changelog.md index c268b795..905e29af 100644 --- a/doc/changelog.md +++ b/doc/changelog.md @@ -2,6 +2,7 @@ ## changes in this version +* Added user aliases to TWBlue. This feature allows you to rename user's display names on Twitter, so the next time you'll read an user it will be announced as you configured. For adding an alias to an user, select the "add alias" option in the user menu, located in the menu bar. This feature works only if you have set display screen names unchecked. ([#389](https://github.com/manuelcortez/TWBlue/pull/389)) * Added a limited version of the Twitter's Streaming API: The Streaming API will work only for tweets, and will receive tweets only by people you follow. Protected users are not possible to be streamed. It is possible that during high tweet traffic, the Stream might get disconnected at times, but TWBlue should be capable of detecting this problem and reconnecting the stream again. ([#385](https://github.com/manuelcortez/TWBlue/pull/385)) * Fixed an issue that made TWBlue to not show a dialog when attempting to show a profile for a suspended user. ([#387](https://github.com/manuelcortez/TWBlue/issues/387)) * Added support for Twitter audio and videos: Tweets which contains audio or videos will be detected as audio items, and you can playback those with the regular command to play audios. ([#384,](https://github.com/manuelcortez/TWBlue/pull/384)) From b74cd9a73d68e29f143e74eec935f4071c2b3d8b Mon Sep 17 00:00:00 2001 From: Manuel Cortez Date: Tue, 6 Jul 2021 17:01:42 -0500 Subject: [PATCH 7/7] Ignore undefined actions in keymaps --- src/controller/mainController.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/controller/mainController.py b/src/controller/mainController.py index fa689661..99f77e28 100644 --- a/src/controller/mainController.py +++ b/src/controller/mainController.py @@ -1265,7 +1265,8 @@ class Controller(object): keymap = {} for i in config.keymap["keymap"]: if hasattr(self, i): - keymap[config.keymap["keymap"][i]] = getattr(self, i) + if config.keymap["keymap"][i] != "": + keymap[config.keymap["keymap"][i]] = getattr(self, i) return keymap def register_invisible_keyboard_shorcuts(self, keymap):