OSDN Git Service

Added api wrapper method
authorHirotaka Kawata <info@techno-st.net>
Tue, 13 Jul 2010 19:09:24 +0000 (04:09 +0900)
committerHirotaka Kawata <info@techno-st.net>
Tue, 13 Jul 2010 19:09:24 +0000 (04:09 +0900)
gwit/iconstore.py
gwit/listsselection.py
gwit/main.py
gwit/statusdetail.py
gwit/timeline.py
gwit/twitterapi.py
gwit/userselection.py

index 5b730af..23d7b49 100644 (file)
@@ -116,7 +116,13 @@ class NewIcon(threading.Thread):
     def run(self):
         # Icon Data Get (if can get semaphore or block)
         self.semaphore.acquire()
-        ico = urllib2.urlopen(self.user.profile_image_url).read()
+        for i in range(3):
+            try:
+                ico = urllib2.urlopen(self.user.profile_image_url).read()
+                break
+            except:
+                ico = None
+                print >>sys.stderr, "[Error] %d: IconStore %s" % (i, e)
         self.semaphore.release()
         
         # Get pixbuf
index e0c5acc..97d1afd 100644 (file)
@@ -52,10 +52,10 @@ class ListsView(gtk.ScrolledWindow):
     # Load Lists index
     def load(self):
         if self.memberships:
-            data = self.twitter.api.lists_memberships(self.user, cursor = self._cursor)
+            data = self.twitter.api_wrapper(self.twitter.api.lists_memberships, self.user, cursor = self._cursor)
             lists = data["lists"]
         else:
-            data = self.twitter.api.lists_subscriptions(self.user, cursor = self._cursor)
+            data = self.twitter.api_wrapper(self.twitter.api.lists_subscriptions, self.user, cursor = self._cursor)
             lists = data["lists"]
             
             # get all my lists if first load
@@ -63,7 +63,7 @@ class ListsView(gtk.ScrolledWindow):
                 c = -1
                 mylists = list()
                 while c != 0:
-                    mydata = self.twitter.api.lists_index(self.user, cursor = c)
+                    mydata = self.twitter.api_wrapper(self.twitter.api.lists_index, self.user, cursor = c)
                     mylists.extend(mydata["lists"])
                     c = int(mydata["next_cursor"])
                 lists[0:0] = mylists
index cac92fa..c548aca 100644 (file)
@@ -533,7 +533,7 @@ class Main:
     # Retweet menu clicked
     def on_menuitem_retweet_activate(self, memuitem):
         status = self.get_selected_status()
-        self.twitter.api.status_retweet(status.id)
+        self.twitter.api_wrapper(self.twitter.api.status_retweet, status.id)
         
     # Retweet with comment menu clicked
     def on_menuitem_reteet_with_comment_activate(self, memuitem):
@@ -559,12 +559,12 @@ class Main:
     # favorite
     def on_menuitem_fav_activate(self, menuitem):
         status = self.get_selected_status()
-        self.twitter.api.favorite_create(status.id)
+        self.twitter.api_wrapper(self.twitter.api.favorite_create, status.id)
     
     # Destroy status
     def on_menuitem_destroy_activate(self, menuitem):
         status = self.get_selected_status()
-        self.twitter.api.status_destroy(status.id)
+        self.twitter.api_wrapper(self.twitter.api.status_destroy, status.id)
     
     ########################################
     # Timeline menu Event
index 2198cb3..825833c 100644 (file)
@@ -69,5 +69,7 @@ class StatusDetail(gtk.VPaned):
                      s.user.id))
                 i = s.in_reply_to_status_id
             else:
-                statuses = self.twitter.api.user_timeline(s.in_reply_to_user_id, count = 200, max_id = i)
+                statuses = self.twitter.api_wrapper(
+                    self.twitter.api.user_timeline,
+                    s.in_reply_to_user_id, count = 200, max_id = i)
                 self.twitter.add_statuses(statuses)
index 76051f7..3840f95 100644 (file)
@@ -230,7 +230,7 @@ class Timeline:
         # replace no entity & -> &amp;
         text = self._replace_amp(text)
         
-        if status.user.id in self.twitter.followers:
+        if status.user.id in self.twitter.followers or self.twitter.followers == None:
             # Bold screen_name if follower
             tmpl = "<b>%s</b>\n%s"
         else:
index 3f3bad7..ccc2b0b 100644 (file)
@@ -35,8 +35,8 @@ class TwitterAPI():
     
     def get_following_followers(self):
         # Get followers
-        self.followers.update([int(i) for i in self.api.followers_ids()])
-        self.following.update([int(i) for i in self.api.friends_ids()])
+        self.followers.update([int(i) for i in self.api_wrapper(self.api.followers_ids)])
+        self.following.update([int(i) for i in self.api_wrapper(self.api.friends_ids)])
     
     def create_timeline(self, method, interval, counts, args = (), kwargs = {}):
         # Add New Timeline Thread
@@ -74,12 +74,42 @@ class TwitterAPI():
     def get_statuses(self, ids):
         return tuple(self.statuses[i] for i in sorted(tuple(ids), reverse=True))
     
+    def api_wrapper(self, method, *args, **kwargs):
+        for i in range(3):
+            try:
+                response = None
+                response = method(*args, **kwargs)
+                break
+            except urllib2.HTTPError, e:
+                if e.code == 400:
+                    print >>sys.stderr, "[Error] Rate Limitting %s (%s)" % (e, method.func_name)
+                    break
+                elif e.code == 403:
+                    print >>sys.stderr, "[Error] Access Denied %s (%s)" % (e, method.func_name)
+                    break
+                elif e.code == 404:
+                    print >>sys.stderr, "[Error] Not Found %s (%s)" % (e, method.func_name)
+                    break
+                
+                if i >= 3:
+                    self.on_twitterapi_error(self, e)
+                print >>sys.stderr, "[Error] %d: TwitterAPI %s (%s)" % (i, e, method.func_name)
+                time.sleep(5)
+            except socket.timeout:
+                print >>sys.stderr, "[Error] %d: TwitterAPI timeout (%s)" % (i, method.func_name)
+            except Exception, e:
+                print >>sys.stderr, "[Error] %d: TwitterAPI %s (%s)" % (i, e, method.func_name)
+        
+        return response
+    
     def status_update(self, status, reply_to = None, footer = ""):
         if reply_to != None:
-            self.api.status_update(status, in_reply_to_status_id = reply_to)
+            self.api_wrapper(self.api.status_update, status, in_reply_to_status_id = reply_to)
         else:
             if footer != "": status = u"%s %s" % (status, footer)
-            self.api.status_update(status)
+            self.api_wrapper(self.api.status_update, status)
+    
+    def on_twitterapi_error(self, method, e): pass
 
 # Timeline Thread
 class TimelineThread(threading.Thread):
@@ -151,21 +181,21 @@ class TimelineThread(threading.Thread):
     
     def refresh_timeline(self):
         for i in range(3):
-            statuses = None
-            
             try:
+                statuses = None
                 # Get Timeline
                 statuses = self.api_method(*self.args, **self.kwargs)
                 self.on_timeline_refresh()
                 break
-            except urllib2.HTTPError, e:
-                print "[Error] TwitterAPI %s (%s)" % (e, self.api_method.func_name)
-                self.on_twitterapi_error(self, e)
+            except urllib2.HTTPError, e:                
+                if i >= 3:
+                    self.on_twitterapi_error(self, e)
+                print >>sys.stderr, "[Error] %d: TwitterAPI %s (%s)" % (i, e, self.api_method.func_name)
                 time.sleep(5)
             except socket.timeout:
-                print "[Error] TwitterAPI timeout (%s)" % (self.api_method.func_name)
+                print >>sys.stderr, "[Error] %d: TwitterAPI timeout (%s)" % (i, self.api_method.func_name)
             except Exception, e:
-                print "[Error] TwitterAPI %s (%s)" % (e, self.api_method.func_name)
+                print >>sys.stderr, "[Error] %d: TwitterAPI %s (%s)" % (i, e, self.api_method.func_name)
         
         return statuses
     
@@ -196,4 +226,3 @@ class TimelineThread(threading.Thread):
     
     def on_timeline_refresh(self): pass
     def reloadEventHandler(self): pass
-    def on_twitterapi_error(self, timeline, e): pass
index 0a420e8..de2dc94 100644 (file)
@@ -219,12 +219,12 @@ class UserSelection(gtk.VBox):
         follow = button.get_active()
         
         if follow:
-            self.twitter.api.friends_create(uid)
+            self.twitter.api_wrapper(self.twitter.api.friends_create, uid)
             button.set_image(gtk.image_new_from_stock("gtk-apply", gtk.ICON_SIZE_BUTTON))
             button.set_label("Following")
             self.twitter.following.add(uid)
         else:
-            self.twitter.api.friends_destroy(uid)
+            self.twitter.api_wrapper(self.twitter.api.friends_destroy, uid)
             button.set_image(gtk.image_new_from_stock("gtk-add", gtk.ICON_SIZE_BUTTON))
             button.set_label("Follow")
             self.twitter.following.remove(uid)