示例#1
0
    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)
示例#2
0
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()