def profile(self, name, retry=False): if self.profile_current_user.lower() == name.lower() and not retry: return False # Button if not retry: self.profile_pending = True name = self.settings.get_username(name) self.profile_current_user = name self.gui.load_button.show(lang.profile_loading % lang.name(name), None) # Make sure to stop when aborted if not self.profile_pending: return False # Wait until send/delete etc. is completed if self.any_status(ST_DELETE, ST_SEND, ST_CONNECT) \ or not self.status(ST_LOGIN_COMPLETE) \ or name.lower() in self.follow_pending \ or name.lower() in self.block_pending: gobject.timeout_add(50, self.profile, name, True) return False # View if self.gui.mode != MODE_PROFILE: self.profile_mode = self.gui.mode self.gui.profile.load_state = HTML_LOADING self.gui.profile.start() self.gui.text.remove_auto_complete(True) gobject.idle_add(self.gui.set_mode, MODE_PROFILE) gobject.idle_add(self.gui.on_mode) api.Profile(self, name, self.show_profile)
def is_protected(self, user): if hasattr(user, 'protected') and user.protected: return ('<span class="protected" title="' \ + lang.html_protected + '"></span>') \ % lang.name(user.screen_name) else: return ''
def show_profile(self, user, friend, tweets): if not self.profile_pending: return False self.gui.load_button.show(lang.profile_close % \ lang.name(user.screen_name), None) self.profile_current_user = user.screen_name self.gui.profile.load_state = HTML_LOADED self.gui.profile.history_level = 0 self.gui.profile.render(user, friend, tweets) gobject.idle_add(self.gui.show_input)
def show_favorite_error(self, mode, name): dialog.MessageDialog(self, MESSAGE_ERROR, lang.error_favorite_on % lang.name(name) \ if mode else lang.error_favorite_off \ % lang.name(name), lang.error_title)
def show_profile_warning(self, name): dialog.MessageDialog(self, MESSAGE_WARNING, lang.profile_warning % lang.name(name), lang.warning_title)
def show_profile_error(self, name): dialog.MessageDialog(self, MESSAGE_ERROR, lang.profile_error % lang.name(name), lang.error_title)
def enter_password(self): self.main.api_temp_password = None dialog.PasswordDialog(self, lang.password_title, lang.password_question % \ lang.name(self.main.username))
def update_status(self, once=False): if self.text.has_typed and not self.mode == MODE_PROFILE: pass elif self.main.status(ST_RECONNECT): wait = self.main.refresh_timeout - \ (gmtime() - self.main.reconnect_time) if wait < 60: self.set_status(lang.status_reconnect_seconds % wait) elif wait < 105: self.set_status(lang.status_reconnect_minute) else: self.set_status( lang.status_reconnect_minutes % math.ceil(wait / 60.0)) elif self.main.status(ST_HISTORY): if self.tweet.load_history_id != HTML_UNSET_ID: state = lang.status_load_history elif self.message.load_history_id != HTML_UNSET_ID: state = lang.status_load_message_history else: state = lang.status_load_history self.set_status(state) elif self.main.status(ST_CONNECT): self.set_status(lang.status_connecting % self.main.username) elif self.main.status(ST_LOGIN_ERROR): self.set_status(lang.status_error) elif not self.main.status(ST_LOGIN_SUCCESSFUL): self.set_status(lang.status_logout) elif self.main.any_status(ST_SEND, ST_DELETE): pass elif self.mode == MODE_PROFILE \ and self.profile.load_state == HTML_LOADING: self.set_status(lang.status_profile \ % lang.name(self.main.profile_current_user)) elif self.main.status(ST_UPDATE): self.set_multi_button(False, None, False, True) self.set_status(lang.status_update) elif self.main.refresh_time == UNSET_TIMEOUT \ or (self.mode == MODE_MESSAGES \ and self.message.load_state == HTML_LOADING) \ or (self.mode == MODE_TWEETS \ and self.tweet.load_state == HTML_LOADING): self.set_status(lang.status_connected) elif (not self.text.is_typing or not self.text.has_focus \ or self.mode == MODE_PROFILE) and not self.main.status(ST_SEND): wait = self.main.refresh_timeout - \ (gmtime() - self.main.refresh_time) if wait < 0: wait = 0 if wait == 0: self.set_multi_button(False, None, False, True) self.set_status(lang.status_update) elif wait == 1: self.set_status(lang.status_one_second) else: if wait < 60: self.set_status(lang.status_seconds % wait) elif wait < 105: self.set_status(lang.status_minute) else: self.set_status( lang.status_minutes % math.ceil(wait / 60.0)) if once: return False else: return True
def format_username(self, at_char, user): return ('<a href="user:%s:http://twitter.com/%s" title="' \ + lang.html_at + '">%s%s</a>') \ % (user, user, lang.name(user), at_char, user)
def render_item(self, num, item, img): user, formatted = item.sender, self.parser.parse(item.text) # Spacers -------------------------------------------------------------- mentioned = item.recipient_screen_name != self.main.username if num > 0: next_highlight = self.items[num + 1][0].recipient_screen_name \ != self.main.username if num < len(self.items) \ - 1 else False force = self.last_recipient != item.recipient_screen_name self.renderitems.insert(0, self.insert_spacer(item, user, False, mentioned, next_highlight, force = force, message = True)) self.last_mentioned = mentioned self.last_name = user.screen_name self.last_recipient = item.recipient_screen_name # Avatar --------------------------------------------------------------- self.is_new_avatar(num) has_avatar = (num < len(self.items) - 1 and (user.screen_name != \ self.items[num + 1][0].sender.screen_name \ or self.new_avatar)) \ or num == len(self.items) - 1 or self.new_timeline avatar, text_class = self.get_avatar(has_avatar, user, num, img) # Background ----------------------------------------------------------- cls = 'oldtweet' if item.id <= self.new_items_id else 'tweet' if item.recipient_screen_name.lower() != self.main.username.lower(): mode = lang.message_to name = item.recipient_screen_name reply = 'display: none;' cls = 'messageold' if item.id <= self.new_items_id \ else 'message' username = item.recipient_screen_name toid = item.recipient.id ltype = 'rprofile' else: mode = lang.message_from name = user.screen_name reply = HTML_UNSET_TEXT toid = user.id username = user.screen_name ltype = 'profile' # HTML Snippet --------------------------------------------------------- html = ''' <div class="viewitem %s" id="%d"><div class="avatar">%s</div> <div class="actions"> <div class="doretweet" style="''' + reply \ + '''"><a href="qmessage:%s:%d:%d" title="''' \ + (lang.html_reply % user.screen_name) + '''"></a> </div> </div> <div class="''' + text_class + '''"> <div> <span class="name"><b>''' + mode \ + ''' <a href="''' + ltype \ + ''':%d:http://twitter.com/%s" title="''' \ + lang.html_profile \ + '''">%s</a></b></span>''' \ + self.is_protected(user) \ + '''%s</div> <div id="time_%d" class="time" title="''' + \ self.absolute_time(item.created_at, True) + '''">%s</div> </div> </div>''' # Insert values html = html % ( cls, num, avatar, # Actions user.screen_name, toid, num, # Text num, username, lang.name(username), name, formatted.html.replace('\n', '<br/>'), # Time num, self.relative_time(item.created_at)) # Return the HTML string return html
def render_item(self, num, item, img): # Check for new style retweet retweeted = False retweet = HTML_UNSET_TEXT if hasattr(item, 'retweeted_status'): tweet = item.retweeted_status retweeted = True # Retweet Info retweet = '<a href="user:%s:http://twitter.com/%s" title="''' \ + (self.relative_time(item.created_at)) + '">' \ + lang.html_in_retweet + '</a>' retweet = retweet % (item.user.screen_name, item.user.screen_name, item.user.screen_name) else: tweet = item # Get User and Text user, formatted = tweet.user, self.parser.parse(tweet.text) # Spacers -------------------------------------------------------------- highlight = self.main.username.lower() in \ [i.lower() for i in formatted.users] mentioned = hasattr(tweet, 'is_mentioned') and tweet.is_mentioned if mentioned: highlight = False if num > 0: self.renderitems.insert(0, self.insert_spacer(item, user, highlight, mentioned)) self.last_name = user.screen_name self.last_highlight = highlight self.last_mentioned = mentioned # Is this tweet a reply? if tweet.in_reply_to_screen_name and tweet.in_reply_to_status_id: reply = ('<a href="status:http://twitter.com/%s/statuses/%d" ' + \ 'title="' + lang.html_in_reply_view + '">' + \ lang.html_in_reply + '</a>') \ % (tweet.in_reply_to_screen_name, tweet.in_reply_to_status_id, tweet.in_reply_to_screen_name) else: reply = HTML_UNSET_TEXT # Avatar --------------------------------------------------------------- self.is_new_avatar(num) has_avatar = (num < len(self.items) - 1 and \ (user.screen_name != self.get_screen_name(num + 1) \ or self.new_avatar)) \ or num == len(self.items) - 1 or self.new_timeline avatar, text_class = self.get_avatar(has_avatar, user, num, img) # Background ----------------------------------------------------------- if mentioned: clas = 'mentionedold' if item.id <= self.new_items_id \ else 'mentioned' elif item.id <= self.new_items_id: clas = 'highlightold' if highlight else 'oldtweet' else: clas = 'highlight' if highlight else 'tweet' # Source --------------------------------------------------------------- if tweet.source != 'web': if hasattr(tweet, 'source_url') \ and tweet.source_url != HTML_UNSET_TEXT: if tweet.source_url == '/devices': tweet.source_url = 'http://twitter.com/devices' by_user = lang.html_by \ % ('<a href="source:%s" title="%s">%s</a>' \ % (tweet.source_url, tweet.source_url, tweet.source)) else: by_user = lang.html_by % tweet.source else: by_user = HTML_UNSET_TEXT # Favorite ------------------------------------------------------------- if tweet.favorited: favorite = '''<div id="fav_''' + str(num) + '''" class="undofav"> <a href="unfav:%s:%d" title="''' + \ lang.html_unfavorite + '''"> </a></div>''' else: favorite = '''<div id="fav_''' + str(num) + '''" class="dofav"> <a href="fav:%s:%d" title="''' + \ lang.html_favorite + '''"> </a></div>''' # HTML Snippet --------------------------------------------------------- html = ''' <div class="viewitem %s" id="%d"><div class="avatar">%s</div> <div class="actions"> <div class="blocker"></div> <div class="doreply"> <a href="qreply:%s:%d:%d" title="''' + \ (lang.html_reply % user.screen_name) + \ '''"> </a></div>''' + favorite + ''' </div> <div class="''' + text_class + '''"> %s%s</div> <div class="time"> <a id="time_%d" href="status:http://twitter.com/%s/statuses/%d" title="''' + \ self.absolute_time(tweet.created_at) + '''">%s</a> ''' + by_user + '''</div> <div class="reply">%s</div> <div class="reply">%s</div> </div> <div class="clearfloat"></div> </div>''' # Avatar and Name name = '<div><span class="name">' + \ ('<b>RT</b> ' if retweeted else HTML_UNSET_TEXT) + \ '<b><a href="profile:%d:http://twitter.com/%s" title="' + \ lang.html_profile + '">%s</a></b></span>' + \ self.is_protected(user) name = name % (num, user.screen_name, lang.name(user.screen_name), user.screen_name) # Insert values html = html % ( clas, num, avatar, # Actions user.screen_name, tweet.id, num, user.screen_name, tweet.id, # Text name, formatted.html.replace('\n', '<br/>'), # Time num, user.screen_name, tweet.id, self.relative_time(tweet.created_at), reply, retweet) # Return the HTML string return html
def create_menu(self, menu, item, item_id, link, full, user): # User Options if user is not None: if link in ('profile', 'avatar'): reply = 'reply:%s:%d:%d' % (user, item_id, HTML_UNSET_ID) self.add_menu_link(menu, lang.context_reply % menu_escape(user), self.context_link, reply, item) else: reply = 'reply:%s:%d:%d' % (user, UNSET_ID_NUM, HTML_UNSET_ID) self.add_menu_link(menu, lang.context_tweet % menu_escape(user), self.context_link, reply) # Message if user.lower() != self.main.username.lower(): self.add_menu_separator(menu) if link == 'user': user_id = UNSET_ID_NUM else: user_id = self.get_user(item).id message = 'message:%s:%d:%d' % (user, user_id, HTML_UNSET_ID) self.add_menu_link(menu, lang.context_message \ % menu_escape(user), self.context_link, message) # Source elif link == 'source': source = self.get_source(item) self.add_menu_link(menu, lang.context_source \ % lang.name(menu_escape(source)), self.context_link, full) else: # Copy Tweet self.add_menu_link(menu, lang.context_copy_tweet, self.copy_tweet, None, item) self.add_menu_separator(menu) # RT old name = self.get_screen_name(item) full = 'retweet:%s' % RETWEET_OLD self.add_menu_link(menu, lang.context_retweet_old % menu_escape(name), self.context_link, full, item) # RT New if name.lower() != self.main.username.lower() \ and not self.get_protected(item): full = 'retweet:%s' % RETWEET_NEW self.add_menu_link(menu, lang.context_retweet_new % menu_escape(name), self.context_link, full, item) # Edit / Delete if name.lower() == self.main.username.lower(): self.add_menu_separator(menu) full = 'edit:%d' % item_id self.add_menu_link(menu, lang.context_edit_tweet, self.context_link, full, item) full = 'delete:t:%d' % item_id self.add_menu_link(menu, lang.context_delete_tweet, self.context_link, full, item)