def __init__(self, options): self.options = options self.last_updated = None self.monitor = GitHubMonitor(options.username, options.password) self.tray = self.create_indicator() self.status_menu = None self.status_details_menu = None self.menu = self.create_menu() self.last_events = [] pynotify.init(APPNAME)
class GitHubApplet(object): def __init__(self, options): self.options = options self.last_updated = None self.monitor = GitHubMonitor(options.username, options.password) self.tray = self.create_indicator() self.status_menu = None self.status_details_menu = None self.menu = self.create_menu() self.last_events = [] pynotify.init(APPNAME) def create_indicator(self): pass def set_icon(self, icon): pass def create_menu(self): self.status_menu = gtk.MenuItem('Status: Unknown') self.status_details_menu = gtk.MenuItem('') #item_events = gtk.MenuItem('Last events') #item_events.connect('activate', self.last_events_cb) #item_prefs = gtk.ImageMenuItem(gtk.STOCK_PREFERENCES) #item_prefs.connect('activate', self.preferences_cb) item_quit = gtk.ImageMenuItem(gtk.STOCK_QUIT) item_quit.connect('activate', self.quit_cb) menu = gtk.Menu() menu.append(self.status_menu) menu.append(self.status_details_menu) menu.append(gtk.SeparatorMenuItem()) #menu.append(item_events) #menu.append(gtk.SeparatorMenuItem()) #menu.append(item_prefs) #menu.append(gtk.SeparatorMenuItem()) menu.append(item_quit) return menu def main(self): gtk.timeout_add(500, self.update_status) gtk.timeout_add(500, self.update_events) gtk.main() def last_events_cb(self, *args, **kwargs): pass def preferences_cb(self, *args, **kwargs): pass def quit_cb(self, *args, **kwargs): gtk.main_quit() sys.exit() raise KeyboardInterrupt def update_status(self, *args, **kwargs): status = self.monitor.check_status() if status is not None: service_status = status['message']['status'] details = status['message']['body'] date = status['message']['created_on'] date = dateutil.parser.parse(date) date = date.strftime('%Y-%M-%d %H:%M') title = _('GitHub service status is %(status)s') % {'status': service_status} message = _('%(created_on)s - %(body)s') % {'body': details, 'created_on': date} icon = get_icon_file_path(service_status) self.set_icon(icon) self.notify(title, message, icon) self._set_menu_status(title, message) gtk.timeout_add(self.options.update_time * 1000, self.update_status) def _set_menu_status(self, title, message): LINE_LENGTH = 50 if len(message) > LINE_LENGTH: i = 0 parts = [] while i < len(message): j = min(len(message), i + LINE_LENGTH) if j < len(message): if message[j] != ' ': j = message.find(' ', j) parts.append(message[i:j]) i = j msg = '\n'.join(parts) else: msg = message self.status_menu.get_child().set_text(title) self.status_details_menu.get_child().set_text(msg) def update_events(self, *args, **kwargs): events = self.monitor.check_events() update_menu = False for e in reversed(events): update_menu = True title = _('%(created_at)s - %(type)s') % e data = {'actor': e['actor']['login'], 'object': e['repo']['name']} message = _('%(actor)s on %(object)s') % data icon = self.monitor.get_user_icon(e['actor']) self.notify(title, message, icon) self.last_events.insert(e) if update_menu: self.last_events = self.last_events[:5] gtk.timeout_add(5 * 60 * 1000, self.update_events) def notify(self, title, message, icon): logger.debug('%s - %s' % (title, message.replace('\n', ' '))) n = pynotify.Notification(title, message, icon) n.show()