mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2024-11-26 12:53:12 -06:00
Merge branch 'next-gen' of github.com:manuelcortez/TWBlue into next-gen
This commit is contained in:
commit
e7b72112cf
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
## changes in this version
|
## 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))
|
* 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))
|
* 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))
|
* 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))
|
||||||
|
@ -49,3 +49,5 @@ braille_reporting = boolean(default=True)
|
|||||||
speech_reporting = boolean(default=True)
|
speech_reporting = boolean(default=True)
|
||||||
|
|
||||||
[filters]
|
[filters]
|
||||||
|
|
||||||
|
[user-aliases]
|
@ -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.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_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.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.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.remove_from_list, self.view.removeFromList)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.update_buffer, self.view.update_buffer)
|
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)
|
users = utils.get_all_users(tweet, buff.session)
|
||||||
u = userActionsController.userActionsController(buff, users, "report")
|
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):
|
def post_tweet(self, event=None):
|
||||||
buffer = self.get_best_buffer()
|
buffer = self.get_best_buffer()
|
||||||
buffer.post_status()
|
buffer.post_status()
|
||||||
@ -1244,7 +1265,8 @@ class Controller(object):
|
|||||||
keymap = {}
|
keymap = {}
|
||||||
for i in config.keymap["keymap"]:
|
for i in config.keymap["keymap"]:
|
||||||
if hasattr(self, i):
|
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
|
return keymap
|
||||||
|
|
||||||
def register_invisible_keyboard_shorcuts(self, keymap):
|
def register_invisible_keyboard_shorcuts(self, keymap):
|
||||||
|
Binary file not shown.
@ -6,7 +6,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: TW Blue 0.85\n"
|
"Project-Id-Version: TW Blue 0.85\n"
|
||||||
"POT-Creation-Date: 2019-03-17 13:34+Hora estndar romance\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 <admin@maniyax.ru>\n"
|
"Last-Translator: Artem Plaksin <admin@maniyax.ru>\n"
|
||||||
"Language-Team: Alexander Jaszyn <a.jaszyn@ya.ru>\n"
|
"Language-Team: Alexander Jaszyn <a.jaszyn@ya.ru>\n"
|
||||||
"Language: ru\n"
|
"Language: ru\n"
|
||||||
@ -14,7 +14,7 @@ msgstr ""
|
|||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Generated-By: pygettext.py 1.5\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"
|
"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"
|
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||||
"X-Poedit-SourceCharset: UTF-8\n"
|
"X-Poedit-SourceCharset: UTF-8\n"
|
||||||
@ -208,14 +208,12 @@ msgstr ""
|
|||||||
"личных сообщений вместо этого."
|
"личных сообщений вместо этого."
|
||||||
|
|
||||||
#: ../src\controller\buffers\twitterBuffers.py:983
|
#: ../src\controller\buffers\twitterBuffers.py:983
|
||||||
#, fuzzy
|
|
||||||
msgid "{0} new followers."
|
msgid "{0} new followers."
|
||||||
msgstr "Новый читатель."
|
msgstr "{0} новых читателей."
|
||||||
|
|
||||||
#: ../src\controller\buffers\twitterBuffers.py:1266
|
#: ../src\controller\buffers\twitterBuffers.py:1266
|
||||||
#, fuzzy
|
|
||||||
msgid "This action is not supported in the buffer, yet."
|
msgid "This action is not supported in the buffer, yet."
|
||||||
msgstr "Это действие не поддерживается в данном буфере"
|
msgstr "Это действие пока не поддерживается в буфере."
|
||||||
|
|
||||||
#: ../src\controller\mainController.py:273
|
#: ../src\controller\mainController.py:273
|
||||||
msgid "Ready"
|
msgid "Ready"
|
||||||
@ -314,9 +312,8 @@ msgid "Select the user"
|
|||||||
msgstr "Выберите пользователя"
|
msgstr "Выберите пользователя"
|
||||||
|
|
||||||
#: ../src\controller\mainController.py:809 ../src\controller\messages.py:236
|
#: ../src\controller\mainController.py:809 ../src\controller\messages.py:236
|
||||||
#, fuzzy
|
|
||||||
msgid "MMM D, YYYY. H:m"
|
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
|
#: ../src\controller\mainController.py:934
|
||||||
msgid "Conversation with {0}"
|
msgid "Conversation with {0}"
|
||||||
@ -1702,9 +1699,8 @@ msgid "Opens the global settings dialogue"
|
|||||||
msgstr "Открыть основные настройки"
|
msgstr "Открыть основные настройки"
|
||||||
|
|
||||||
#: ../src\keystrokeEditor\constants.py:54
|
#: ../src\keystrokeEditor\constants.py:54
|
||||||
#, fuzzy
|
|
||||||
msgid "Opens the list manager"
|
msgid "Opens the list manager"
|
||||||
msgstr "Менеджер Списков"
|
msgstr "Открывает менеджер списков"
|
||||||
|
|
||||||
#: ../src\keystrokeEditor\constants.py:55
|
#: ../src\keystrokeEditor\constants.py:55
|
||||||
msgid "Opens the account settings dialogue"
|
msgid "Opens the account settings dialogue"
|
||||||
|
@ -430,9 +430,25 @@ class Session(base.baseSession):
|
|||||||
users = self.db["users"]
|
users = self.db["users"]
|
||||||
users[user.id_str] = user
|
users[user.id_str] = user
|
||||||
self.db["users"] = users
|
self.db["users"] = users
|
||||||
|
user.name = self.get_user_alias(user)
|
||||||
return user
|
return user
|
||||||
else:
|
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):
|
def get_user_by_screen_name(self, screen_name):
|
||||||
""" Returns an user identifier associated with a screen_name.
|
""" Returns an user identifier associated with a screen_name.
|
||||||
|
@ -48,3 +48,36 @@ class selectUserDialog(baseDialog.BaseWXDialog):
|
|||||||
def get_user(self):
|
def get_user(self):
|
||||||
return self.cb.GetValue()
|
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())
|
||||||
|
|
||||||
|
@ -43,6 +43,7 @@ class mainFrame(wx.Frame):
|
|||||||
self.follow = user.Append(wx.ID_ANY, _(u"&Actions..."))
|
self.follow = user.Append(wx.ID_ANY, _(u"&Actions..."))
|
||||||
self.timeline = user.Append(wx.ID_ANY, _(u"&View timeline..."))
|
self.timeline = user.Append(wx.ID_ANY, _(u"&View timeline..."))
|
||||||
self.dm = user.Append(wx.ID_ANY, _(u"Direct me&ssage"))
|
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.addToList = user.Append(wx.ID_ANY, _(u"&Add to list"))
|
||||||
self.removeFromList = user.Append(wx.ID_ANY, _(u"R&emove from list"))
|
self.removeFromList = user.Append(wx.ID_ANY, _(u"R&emove from list"))
|
||||||
self.viewLists = user.Append(wx.ID_ANY, _(u"&View lists"))
|
self.viewLists = user.Append(wx.ID_ANY, _(u"&View lists"))
|
||||||
|
Loading…
Reference in New Issue
Block a user