bigboard r7415 - trunk/bigboard/stocks/twitter
- From: marinaz svn gnome org
- To: svn-commits-list gnome org
- Subject: bigboard r7415 - trunk/bigboard/stocks/twitter
- Date: Fri, 4 Jul 2008 08:03:10 +0000 (UTC)
Author: marinaz
Date: Fri Jul 4 08:03:10 2008
New Revision: 7415
URL: http://svn.gnome.org/viewvc/bigboard?rev=7415&view=rev
Log:
Add a polling task that gets friends' updates. Display three latest updates in the stock and provide a slideout that has additional details.
Modified:
trunk/bigboard/stocks/twitter/TwitterStock.py
trunk/bigboard/stocks/twitter/stock.css
Modified: trunk/bigboard/stocks/twitter/TwitterStock.py
==============================================================================
--- trunk/bigboard/stocks/twitter/TwitterStock.py (original)
+++ trunk/bigboard/stocks/twitter/TwitterStock.py Fri Jul 4 08:03:10 2008
@@ -1,14 +1,16 @@
-import logging, dbus
+import logging, dbus, threading, gobject, time, gtk
import urllib
import hippo
import twyt.twitter as twyt
import twyt.data as twyt_data
from bigboard.stock import Stock
+from bigboard.slideout import Slideout
import bigboard.accounts_dialog as accounts_dialog
import bigboard.libbig.gutil as gutil
from bigboard.libbig.logutil import log_except
import bigboard.libbig as libbig
from bigboard.libbig.http import AsyncHTTPFetcherWithAuth
+from bigboard.big_widgets import PrelightingCanvasBox, CanvasVBox, CanvasHBox, Header, CanvasURLImage
_logger = logging.getLogger('bigboard.stocks.TwitterStock')
@@ -19,6 +21,54 @@
TWITTER_STATUS_MAX_LENGTH = 140
+FRIENDS_UPDATES_LIMIT = 3
+
+def make_update_string(result, details):
+ string = ""
+ try:
+ if details:
+ utc = time.mktime(time.strptime(
+ "%s UTC" % result.created_at, "%a %b %d %H:%M:%S +0000 %Y %Z"))
+ stamp = time.strftime("%a %b %d %H:%M:%S %Y", time.localtime(utc))
+
+ string = "%s (%s via %s)" % (result.text, stamp, result.source)
+ else:
+ string = "%s" % (result.text)
+ except AttributeError, e:
+ _logger.debug("AttributeError when parsing result %s" % e)
+
+ return string
+
+class UpdateSlideout(Slideout):
+ def __init__(self, result):
+ super(UpdateSlideout, self).__init__()
+ vbox = CanvasVBox(border_color=0x0000000ff, spacing=4, box_width=320)
+ self.get_root().append(vbox)
+ self.__header = Header(topborder=False)
+ # TODO: for some reason, specifying an additional class with the color did not set the color
+ text = hippo.CanvasText(classes='header', color=0x00AABBFF, text=result.user.screen_name, xalign=hippo.ALIGNMENT_START, padding=2)
+ self.__header.append(text, hippo.PACK_EXPAND)
+ vbox.append(self.__header)
+
+ self.id = result.id
+
+ hbox = CanvasHBox(spacing=4)
+
+ image = CanvasURLImage(result.user.profile_image_url, padding=2)
+ status = hippo.CanvasText(text=make_update_string(result, True), xalign=hippo.ALIGNMENT_START,
+ size_mode=hippo.CANVAS_SIZE_WRAP_WORD, padding=2)
+ hbox.append(image)
+ hbox.append(status, hippo.PACK_EXPAND)
+ vbox.append(hbox)
+
+class CheckTwitterTask(libbig.polling.Task):
+ def __init__(self, twitter_stock):
+ libbig.polling.Task.__init__(self, 1000 * 120, initial_interval=0)
+ self.__twitter_stock = twitter_stock
+
+ def do_periodic_task(self):
+ self.__twitter_stock.do_periodic_updates()
+
class TwitterStock(Stock):
def __init__(self, *args, **kwargs):
@@ -39,11 +89,18 @@
self._add_more_button(self.__on_more_button)
+ self.__friends_updates_box = hippo.CanvasBox(orientation=hippo.ORIENTATION_VERTICAL)
+
+ self.__slideout = None
+ self.__last_slideout_event_time = None
+
self.__twitter = twyt.Twitter()
self.__twitter.set_user_agent("gnome")
self.__fetcher = AsyncHTTPFetcherWithAuth()
+ self.__check_twitter_task = CheckTwitterTask(self)
+
# even though the account system can theoretically return multiple Twitter accounts, this stock
# only supports one -- the last one that was added
self.__twitter_account = None
@@ -158,11 +215,50 @@
self.__box.append(self.__twitter_status_counter_text)
self.__box.append(self.__twitter_status_input)
- self.__twitter.set_auth(username, password)
- answer = self.__twitter.status_friends_timeline()
- results = twyt_data.StatusList(answer)
- for result in results:
- _logger.debug("%s" % result)
+ self.__box.append(self.__friends_updates_box)
+
+ loading = hippo.CanvasText(text="Loading friends' updates...",
+ size_mode=hippo.CANVAS_SIZE_WRAP_WORD, classes="info")
+ self.__friends_updates_box.append(loading)
+
+ self.__check_twitter_task.start()
+
+ def do_periodic_updates(self):
+ t = threading.Thread(target=self.__get_friends_updates,
+ kwargs={"username": self.__twitter_account.GetUsername(), "password": self.__twitter_account.GetPassword()},
+ name="Twitter Updates Request")
+ t.setDaemon(True)
+ t.start()
+
+ def __get_friends_updates(self, username, password):
+ self.__twitter.set_auth(username, password)
+ answer = self.__twitter.status_friends_timeline()
+ # _logger.debug("got answer from Twitter %s" % answer)
+ results = twyt_data.StatusList(answer)
+ # _logger.debug("number of results: %s" % str(len(results)))
+ gobject.idle_add(self.__process_friends_updates, results, username, password)
+
+ def __process_friends_updates(self, results, username, password):
+ if self.__same_credentials(username, password):
+ self.__friends_updates_box.remove_all()
+ i = 0
+ for result in results:
+ if i >= FRIENDS_UPDATES_LIMIT: break
+
+ box = PrelightingCanvasBox(orientation=hippo.ORIENTATION_VERTICAL)
+
+ box.connect("button-press-event", self.create_update_slideout, result)
+ self.__friends_updates_box.append(box)
+ name = hippo.CanvasText(text=result.user.screen_name, xalign=hippo.ALIGNMENT_START, classes="friend-name")
+ status = hippo.CanvasText(text=make_update_string(result, False), xalign=hippo.ALIGNMENT_START,
+ size_mode=hippo.CANVAS_SIZE_WRAP_WORD)
+ box.append(name) # hippo.PACK_FLOAT_LEFT)
+ box.append(status)
+ i += 1
+
+ _logger.debug("%s" % result)
+ else:
+ _logger.debug("the credentials changed while we were getting friends updates from Twitter")
def __on_twitter_status_response(self, url, data, username, password):
_logger.debug("Twitter status update went fine")
@@ -182,6 +278,7 @@
return self.__twitter_account and self.__twitter_account.GetUsername() == username and self.__twitter_account.GetPassword() == password
def __add_login_button(self, failed_to_login = False):
+ self.__check_twitter_task.stop()
self.__box.remove_all()
if failed_to_login:
error = hippo.CanvasText(text=FAILED_TO_LOGIN_STRING, size_mode=hippo.CANVAS_SIZE_WRAP_WORD, classes="error")
@@ -201,5 +298,23 @@
url = "http://twitter.com"
libbig.show_url(url)
-
+ def create_update_slideout(self, widget, hippo_event, result):
+ if self.__slideout and self.__slideout.id == result.id and self.__last_slideout_event_time == gtk.get_current_event_time():
+ self.__slideout = None
+ return
+ self.__slideout = UpdateSlideout(result)
+ def on_slideout_close(s, action_taken):
+ self.__last_slideout_event_time = gtk.get_current_event_time()
+ if action_taken:
+ self._panel.action_taken()
+ s.destroy()
+ self._set_active(False)
+ self._set_active(True)
+ self.__slideout.connect('close', on_slideout_close)
+ y = widget.get_context().translate_to_screen(widget)[1]
+ if not self.__slideout.slideout_from(204, y):
+ self.__slideout.destroy()
+ self.__slideout = None
+ self._set_active(False)
+ return
Modified: trunk/bigboard/stocks/twitter/stock.css
==============================================================================
--- trunk/bigboard/stocks/twitter/stock.css (original)
+++ trunk/bigboard/stocks/twitter/stock.css Fri Jul 4 08:03:10 2008
@@ -1,4 +1,4 @@
-.info {
+.info, .friend-name {
color: #00AABB;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]