From 103b62719e2898f6220d00acf04e1993c276820c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Cort=C3=A9z?= Date: Sun, 1 Feb 2015 21:13:18 -0600 Subject: [PATCH] Trending topics support has been added --- src/controller/buffersController.py | 49 +++++++++++++++++++++++++++++ src/controller/mainController.py | 16 ++++++++++ src/controller/trendingTopics.py | 45 ++++++++++++++++++++++++++ src/sessionmanager/session.py | 1 + src/widgetUtils/wxUtils.py | 1 + src/wxUI/buffers/__init__.py | 1 + src/wxUI/buffers/trends.py | 24 ++++++++++++++ src/wxUI/dialogs/__init__.py | 2 +- src/wxUI/dialogs/trends.py | 46 +++++++++++++++++++++++++++ src/wxUI/view.py | 19 +++++++++++ 10 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 src/controller/trendingTopics.py create mode 100644 src/wxUI/buffers/trends.py create mode 100644 src/wxUI/dialogs/trends.py diff --git a/src/controller/buffersController.py b/src/controller/buffersController.py index c465b221..7e098ffb 100644 --- a/src/controller/buffersController.py +++ b/src/controller/buffersController.py @@ -439,3 +439,52 @@ class searchPeopleBufferController(searchBufferController): self.put_items_on_list(number_of_items) if number_of_items > 0: self.session.sound.play("search_updated.ogg") + +class trendsBufferController(bufferController): + def __init__(self, parent, name, session, account, trendsFor, *args, **kwargs): + super(trendsBufferController, self).__init__(parent=parent, session=session) + self.trendsFor = trendsFor + self.session = session + self.account = account + self.invisible = True + self.buffer = buffers.trendsPanel(parent, name) + self.buffer.account = account + self.type = self.buffer.type + self.bind_events() + self.sound = "trends_updated.ogg" + self.trends = [] + self.name = name + self.buffer.name = name + self.compose_function = self.compose_function_ + self.get_formatted_message = self.get_message + + def start_stream(self): + data = self.session.twitter.twitter.get_place_trends(id=self.trendsFor) + if not hasattr(self, "name"): + self.name = data[0]["locations"][0]["name"] + self.trends = data[0]["trends"] + self.put_items_on_the_list() + self.session.sound.play(self.sound) + + def put_items_on_the_list(self): + selected_item = self.buffer.list.get_selected() + self.buffer.list.clear() + for i in self.trends: + tweet = self.compose_function(i) + self.buffer.list.insert_item(False, *tweet) + self.buffer.list.select_item(selected_item) + + def compose_function_(self, trend): + return [trend["name"]] + + def bind_events(self): + log.debug("Binding events...") + self.buffer.list.list.Bind(wx.EVT_CHAR_HOOK, self.get_event) +# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.post_tweet, self.buffer.tweet) +# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.retweet, self.buffer.retweet) +# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.direct_message, self.buffer.dm) +# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.reply, self.buffer.reply) + + def get_message(self): + return self.compose_function(self.trends[self.buffer.list.get_selected()])[0] + diff --git a/src/controller/mainController.py b/src/controller/mainController.py index 2eb3b579..33ed12de 100644 --- a/src/controller/mainController.py +++ b/src/controller/mainController.py @@ -24,6 +24,7 @@ if platform.system() == "Windows": import keystrokeEditor from keyboard_handler.wx_handler import WXKeyboardHandler import userActionsController +import trendingTopics log = logging.getLogger("mainController") @@ -96,6 +97,7 @@ class Controller(object): pub.subscribe(self.create_new_buffer, "create-new-buffer") widgetUtils.connect_event(self.view, widgetUtils.MENU, self.show_hide, menuitem=self.view.show_hide) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.search, menuitem=self.view.menuitem_search) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.get_trending_topics, menuitem=self.view.trends) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.learn_sounds, menuitem=self.view.sounds_tutorial) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.accountConfiguration, menuitem=self.view.account_settings) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.configuration, menuitem=self.view.prefs) @@ -473,6 +475,19 @@ class Controller(object): def toggle_autoread(self): pass + def get_trending_topics(self, *args, **kwargs): + buff = self.get_best_buffer() + trends = trendingTopics.trendingTopicsController(buff.session) + if trends.dialog.get_response() == widgetUtils.OK: + woeid = trends.get_woeid() + buffer = buffersController.trendsBufferController(self.view.nb, "%s_tt" % (woeid,), buff.session, buff.account, woeid) + self.buffers.append(buffer) + self.view.insert_buffer(buffer.buffer, name=_(u"Trending topics for %s") % (trends.get_string()), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"])) + buffer.start_stream() + timer = RepeatingTimer(300, buffer.start_stream) + timer.start() + buffer.session.settings["other_buffers"]["trending_topic_buffers"].append(woeid) + def skip_buffer(self, forward=True): buff = self.get_current_buffer() if buff.invisible == False: @@ -626,6 +641,7 @@ class Controller(object): def audio(self, *args, **kwargs): self.get_current_buffer().audio() + def volume_down(self, *args, **kwargs): self.get_current_buffer().volume_down() diff --git a/src/controller/trendingTopics.py b/src/controller/trendingTopics.py new file mode 100644 index 00000000..102aa227 --- /dev/null +++ b/src/controller/trendingTopics.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +from wxUI.dialogs import trends +import widgetUtils + +class trendingTopicsController(object): + def __init__(self, session): + super(trendingTopicsController, self).__init__() + self.countries = {} + self.cities = {} + self.dialog = trends.trendingTopicsDialog() + self.information = session.twitter.twitter.get_available_trends() + self.split_information() + widgetUtils.connect_event(self.dialog.country, widgetUtils.RADIOBUTTON, self.get_places) + widgetUtils.connect_event(self.dialog.city, widgetUtils.RADIOBUTTON, self.get_places) + self.get_places() + + def split_information(self): + for i in self.information: + if i["placeType"]["name"] == "Country": + self.countries[i["name"]] = i["woeid"] + else: + self.cities[i["name"]] = i["woeid"] + + def get_places(self, event=None): + values = [] + if self.dialog.get_active() == "country": + for i in self.information: + if i["placeType"]["name"] == "Country": + values.append(i["name"]) + elif self.dialog.get_active() == "city": + for i in self.information: + if i["placeType"]["name"] != "Country": + values.append(i["name"]) + self.dialog.set(values) + + def get_woeid(self): + selected = self.dialog.get_item() + if self.dialog.get_active() == "country": + woeid = self.countries[selected] + else: + woeid = self.cities[selected] + return woeid + + def get_string(self): + return self.dialog.get_item() \ No newline at end of file diff --git a/src/sessionmanager/session.py b/src/sessionmanager/session.py index 994452e2..29a33dd1 100644 --- a/src/sessionmanager/session.py +++ b/src/sessionmanager/session.py @@ -13,6 +13,7 @@ from twitter import utils from twython import TwythonError, TwythonRateLimitError, TwythonAuthError from config_utils import Configuration, ConfigurationResetException from mysc.thread_utils import stream_threaded +from pubsub import pub log = logging.getLogger("sessionmanager.session") sessions = {} diff --git a/src/widgetUtils/wxUtils.py b/src/widgetUtils/wxUtils.py index 0680b083..465b5af4 100644 --- a/src/widgetUtils/wxUtils.py +++ b/src/widgetUtils/wxUtils.py @@ -24,6 +24,7 @@ MENU = wx.EVT_MENU KEYPRESS = wx.EVT_CHAR_HOOK KEYUP = wx.EVT_KEY_UP NOTEBOOK_PAGE_CHANGED = wx.EVT_TREEBOOK_PAGE_CHANGED +RADIOBUTTON = wx.EVT_RADIOBUTTON def exit_application(): """ Closes the current window cleanly. """ wx.GetApp().ExitMainLoop() diff --git a/src/wxUI/buffers/__init__.py b/src/wxUI/buffers/__init__.py index cc75e842..2380f3a9 100644 --- a/src/wxUI/buffers/__init__.py +++ b/src/wxUI/buffers/__init__.py @@ -6,5 +6,6 @@ from favourites import favsPanel from lists import listPanel from panels import accountPanel, emptyPanel from people import peoplePanel +from trends import trendsPanel from tweet_searches import searchPanel from user_searches import searchUsersPanel \ No newline at end of file diff --git a/src/wxUI/buffers/trends.py b/src/wxUI/buffers/trends.py new file mode 100644 index 00000000..9eb70a65 --- /dev/null +++ b/src/wxUI/buffers/trends.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +import wx +from multiplatform_widgets import widgets + +class trendsPanel(wx.Panel): + def create_list(self): + """ Returns the list for put the tweets here.""" + self.list = widgets.list(self, _(u"Trending topic"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL|wx.LC_VRULES) + self.list.set_windows_size(0, 30) + self.list.set_size() + + def __init__(self, parent, name): + super(trendsPanel, self).__init__(parent) + self.type = "trends" + self.sizer = wx.BoxSizer(wx.VERTICAL) + self.create_list() + self.tweet = wx.Button(self, -1, _(u"Tweet")) + self.tweetTrendBtn = wx.Button(self, -1, _(u"Tweet about this trend")) + btnSizer = wx.BoxSizer(wx.HORIZONTAL) + btnSizer.Add(self.tweet, 0, wx.ALL, 5) + btnSizer.Add(self.tweetTrendBtn, 0, wx.ALL, 5) + self.sizer.Add(btnSizer, 0, wx.ALL, 5) + self.sizer.Add(self.list.list, 0, wx.ALL, 5) + self.SetSizer(self.sizer) diff --git a/src/wxUI/dialogs/__init__.py b/src/wxUI/dialogs/__init__.py index d1e585a3..f9de3bea 100644 --- a/src/wxUI/dialogs/__init__.py +++ b/src/wxUI/dialogs/__init__.py @@ -1 +1 @@ -import baseDialog, configuration, lists, message, search, show_user, update_profile, urlList +import baseDialog, trends, configuration, lists, message, search, show_user, update_profile, urlList diff --git a/src/wxUI/dialogs/trends.py b/src/wxUI/dialogs/trends.py new file mode 100644 index 00000000..76275ec9 --- /dev/null +++ b/src/wxUI/dialogs/trends.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +import baseDialog +import wx + +class trendingTopicsDialog(baseDialog.BaseWXDialog): + def __init__(self): + super(trendingTopicsDialog, self).__init__(None, -1) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + self.SetTitle(_(u"View trending topics")) + label = wx.StaticText(panel, -1, _(u"Trending topics by")) + sizer.Add(label, 0, wx.ALL, 5) + self.country = wx.RadioButton(panel, -1, _(u"Country"), style=wx.RB_GROUP) + self.city = wx.RadioButton(panel, -1, _(u"City")) + radioSizer = wx.BoxSizer(wx.HORIZONTAL) + radioSizer.Add(label, 0, wx.ALL, 5) + radioSizer.Add(self.country, 0, wx.ALL, 5) + radioSizer.Add(self.city, 0, wx.ALL, 5) + sizer.Add(radioSizer, 0, wx.ALL, 5) + label = wx.StaticText(panel, -1, _(u"Location")) + self.location = wx.ListBox(panel, -1, choices=[], style=wx.CB_READONLY) + locationBox = wx.BoxSizer(wx.HORIZONTAL) + locationBox.Add(label, 0, wx.ALL, 5) + locationBox.Add(self.location, 0, wx.ALL, 5) + sizer.Add(locationBox, 0, wx.ALL, 5) + ok = wx.Button(panel, wx.ID_OK, _(u"OK")) + ok.SetDefault() + 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(btnsizer, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) + + def get_active(self): + if self.country.GetValue() == True: + return "country" + else: + return "city" + + def get_item(self): + return self.location.GetStringSelection() + + def set(self, values): + self.location.Set(values) \ No newline at end of file diff --git a/src/wxUI/view.py b/src/wxUI/view.py index 15b0a90d..e25859c0 100644 --- a/src/wxUI/view.py +++ b/src/wxUI/view.py @@ -12,9 +12,12 @@ class mainFrame(wx.Frame): # Application menu app = wx.Menu() self.updateProfile = app.Append(wx.NewId(), _(u"&Update profile")) + self.updateProfile.Enable(False) self.show_hide = app.Append(wx.NewId(), _(u"&Hide window")) self.menuitem_search = app.Append(wx.NewId(), _(u"&Search")) + self.trends = app.Append(wx.NewId(), _(u"View &trending topics")) self.lists = app.Append(wx.NewId(), _(u"&Lists manager")) + self.lists.Enable(True) self.sounds_tutorial = app.Append(wx.NewId(), _(u"Sounds &tutorial")) self.keystroke_editor = app.Append(wx.NewId(), _(u"&Edit keystrokes")) self.account_settings = app.Append(wx.NewId(), _(u"Account se&ttings")) @@ -42,27 +45,43 @@ class mainFrame(wx.Frame): self.unblock = user.Append(wx.NewId(), _(u"Unb&lock")) self.dm = user.Append(wx.NewId(), _(u"Direct me&ssage")) self.addToList = user.Append(wx.NewId(), _(u"&Add to list")) + self.addToList.Enable(False) self.removeFromList = user.Append(wx.NewId(), _(u"R&emove from list")) + self.removeFromList.Enable(False) self.viewLists = user.Append(wx.NewId(), _(u"&View lists")) + self.viewLists.Enable(False) self.details = user.Append(wx.NewId(), _(u"Show user &profile")) + self.details.Enable(False) self.timeline = user.Append(wx.NewId(), _(u"&Timeline")) + self.timeline.Enable(False) self.favs = user.Append(wx.NewId(), _(u"V&iew favourites")) + self.favs.Enable(False) # buffer menu buffer = wx.Menu() self.mute = buffer.Append(wx.NewId(), _(u"&Mute")) + self.mute.Enable(False) self.autoread = buffer.Append(wx.NewId(), _(u"&Autoread tweets for this buffer")) + self.autoread.Enable(False) self.clear = buffer.Append(wx.NewId(), _(u"&Clear buffer")) + self.clear.Enable(False) self.deleteTl = buffer.Append(wx.NewId(), _(u"&Remove buffer")) + self.deleteTl.Enable(False) # Help Menu help = wx.Menu() self.doc = help.Append(-1, _(u"&Documentation")) + self.doc.Enable(False) self.changelog = help.Append(wx.NewId(), _(u"&What's new in this version?")) + self.changelog.Enable(False) self.check_for_updates = help.Append(wx.NewId(), _(u"&Check for updates")) + self.check_for_updates.Enable(False) self.reportError = help.Append(wx.NewId(), _(u"&Report an error")) + self.reportError.Enable(False) self.visit_website = help.Append(-1, _(u"TW Blue &website")) + self.visit_website.Enable(False) self.about = help.Append(-1, _(u"About &TW Blue")) + self.about.Enable(False) # Add all to the menu Bar menuBar.Append(app, _(u"&Application"))