bigboard r7415 - trunk/bigboard/stocks/twitter



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]