Added error handling when API calls timeout

This commit is contained in:
Anna 2010-05-04 14:32:43 -04:00
parent 6044fa27d2
commit f37246f30b
3 changed files with 66 additions and 32 deletions

View File

@ -4,6 +4,7 @@ import re
import gtk
from threading import Thread,RLock
from twitter import Api
from urllib2 import HTTPError,URLError
class SafeApi(Api):
''' This is just a Twitter API with an RLock for multi-threaded access '''
@ -28,7 +29,7 @@ class GetTweets(Thread):
def run(self):
with self.api.lock:
try:
# username/Home entries need to load the appropriate Home feed
if self.list_name == self.username + '/Home':
statuses = self.api.GetHomeTimeline(count=self.num_entries)
@ -57,6 +58,9 @@ class GetTweets(Thread):
else:
statuses = results_to_statuses(self.api.Search(self.list_name, rpp=self.num_entries))
except HTTPError,URLError:
statuses = None
gtk.gdk.threads_enter()
try:
self.pane.update_window(statuses)
@ -79,7 +83,10 @@ class GetSingleTweet(Thread):
def run(self):
statuses = []
with self.api.lock:
try:
statuses.append(self.api.GetStatus(self.single_tweet))
except HTTPError,URLError:
statuses = None
gtk.gdk.threads_enter()
try:
@ -107,7 +114,7 @@ class GetFollowing(Thread):
with self.api.lock:
relationship = self.api.ShowFriendships(target_screen_name=screen_name)
following = relationship.source.following
except HTTPError:
except HTTPError,URLError:
following = false
self.pane.set_following(following)
@ -131,7 +138,7 @@ class GetVerified(Thread):
with self.api.lock:
user = self.api.GetUser(screen_name)
verified = user.verified
except HTTPError:
except HTTPError,URLError:
verified = false
self.pane.set_verified(verified)

View File

@ -4,7 +4,7 @@
import sys, ConfigParser, os, re, optparse, shelve
import gtk, gtk.glade, gobject
from urllib2 import HTTPError
from urllib2 import HTTPError,URLError
from twitterwidgets import TweetPane
import apithreads
@ -189,7 +189,13 @@ class MyTwitter():
text = self.update_entry.get_text()
self.update_entry.set_text("")
with self.api.lock:
try:
self.api.PostUpdate(text, in_reply_to_status_id=self.reply_id)
except HTTPError,URLError:
self.update_status_bar('Failed to post tweet')
self.reply_id = None
return
self.reply_id = None
self.update_status_bar('Tweet Posted')
@ -226,7 +232,10 @@ class MyTwitter():
def on_retweet(self, widget, data):
with self.api.lock:
try:
self.api.PostRetweet(data['id'])
except HTTPError,URLError:
self.update_status_bar('Failed to retweet')
def on_reply_to(self, widget, data):
@ -360,11 +369,19 @@ class MyTwitter():
user_name = re.sub('^user: ', '', current_pane.get_list_name())
if current_pane.get_following():
with self.api.lock:
try:
self.api.DestroyFriendship(user_name)
except HTTPError,URLError:
self.update_status_bar('Failed to unfollow user.')
return
current_pane.set_following(False)
else:
with self.api.lock:
try:
self.api.CreateFriendship(user_name)
except HTTPError,URLError:
self.update_status_bar('Failed to follow user.')
return
current_pane.set_following(True)
self.update_follow_button(current_pane)

View File

@ -35,6 +35,8 @@ class TweetPane(gtk.ScrolledWindow):
self.tab_label = CloseTabLabel(self.list_name)
self.error_message = gtk.Label('Failed to load tweet(s)')
# These handle determining which tweets are unread
self.last_tweet_read = None
self.latest_tweet = None
@ -52,6 +54,8 @@ class TweetPane(gtk.ScrolledWindow):
viewport = gtk.Viewport()
# Build us some labels...
tweet_box.pack_start(self.error_message)
for i in range(0, self.num_entries):
self.tweets.append(TweetBox())
tweet_box.pack_start(self.tweets[i], expand=False)
@ -73,11 +77,17 @@ class TweetPane(gtk.ScrolledWindow):
self.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS)
self.show_all()
self.error_message.hide()
for tweet in self.tweets:
tweet.hide()
def update_window(self, statuses):
if statuses is None:
self.error_message.show()
for i in range(0, self.num_entries):
self.tweets[i].hide()
if self.updated_once is False:
self.updated_once = True