Merge pull request #637 from cristianmiranda/github2
[modules] GitHub unread notifications module with modular reason support
This commit is contained in:
commit
590d92102e
1 changed files with 64 additions and 22 deletions
|
@ -1,6 +1,9 @@
|
||||||
# pylint: disable=C0111,R0903
|
# pylint: disable=C0111,R0903
|
||||||
|
|
||||||
"""Displays the unread GitHub notifications for a GitHub user
|
"""
|
||||||
|
Displays the unread GitHub notifications count for a GitHub user using the following reasons:
|
||||||
|
|
||||||
|
* https://developer.github.com/v3/activity/notifications/#notification-reasons
|
||||||
|
|
||||||
Requires the following library:
|
Requires the following library:
|
||||||
* requests
|
* requests
|
||||||
|
@ -8,8 +11,11 @@ Requires the following library:
|
||||||
Parameters:
|
Parameters:
|
||||||
* github.token: GitHub user access token, the token needs to have the 'notifications' scope.
|
* github.token: GitHub user access token, the token needs to have the 'notifications' scope.
|
||||||
* github.interval: Interval in minutes between updates, default is 5.
|
* github.interval: Interval in minutes between updates, default is 5.
|
||||||
|
* github.reasons: Comma separated reasons to be parsed (e.g.: github.reasons=mention,team_mention,review_requested)
|
||||||
|
|
||||||
contributed by `yvesh <https://github.com/yvesh>`_ - many thanks!
|
contributed by:
|
||||||
|
* v1 - `yvesh <https://github.com/yvesh>`_ - many thanks!
|
||||||
|
* v2 - `cristianmiranda <https://github.com/cristianmiranda>`_ - many thanks!
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import shutil
|
import shutil
|
||||||
|
@ -20,6 +26,8 @@ import core.widget
|
||||||
import core.decorators
|
import core.decorators
|
||||||
import core.input
|
import core.input
|
||||||
|
|
||||||
|
import util.format
|
||||||
|
|
||||||
|
|
||||||
class Module(core.module.Module):
|
class Module(core.module.Module):
|
||||||
@core.decorators.every(minutes=5)
|
@core.decorators.every(minutes=5)
|
||||||
|
@ -27,11 +35,17 @@ class Module(core.module.Module):
|
||||||
super().__init__(config, theme, core.widget.Widget(self.github))
|
super().__init__(config, theme, core.widget.Widget(self.github))
|
||||||
|
|
||||||
self.__count = 0
|
self.__count = 0
|
||||||
|
self.__label = ""
|
||||||
self.__requests = requests.Session()
|
self.__requests = requests.Session()
|
||||||
self.__requests.headers.update(
|
self.__requests.headers.update(
|
||||||
{"Authorization": "token {}".format(self.parameter("token", ""))}
|
{"Authorization": "token {}".format(self.parameter("token", ""))}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.__reasons = []
|
||||||
|
reasons = self.parameter("reasons", "")
|
||||||
|
if reasons:
|
||||||
|
self.__reasons = util.format.aslist(reasons)
|
||||||
|
|
||||||
cmd = "xdg-open"
|
cmd = "xdg-open"
|
||||||
if not shutil.which(cmd):
|
if not shutil.which(cmd):
|
||||||
cmd = "x-www-browser"
|
cmd = "x-www-browser"
|
||||||
|
@ -41,33 +55,61 @@ class Module(core.module.Module):
|
||||||
button=core.input.LEFT_MOUSE,
|
button=core.input.LEFT_MOUSE,
|
||||||
cmd="{} https://github.com/notifications".format(cmd),
|
cmd="{} https://github.com/notifications".format(cmd),
|
||||||
)
|
)
|
||||||
core.input.register(self, button=core.input.RIGHT_MOUSE, cmd=self.update)
|
|
||||||
|
|
||||||
def github(self, _):
|
def github(self, _):
|
||||||
return str(self.__count)
|
return str(self.__label)
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
try:
|
try:
|
||||||
self.__count = 0
|
|
||||||
url = "https://api.github.com/notifications"
|
url = "https://api.github.com/notifications"
|
||||||
while True:
|
|
||||||
notifications = self.__requests.get(url)
|
notifications = self.__requests.get(url)
|
||||||
self.__count += len(
|
|
||||||
|
total = self.__getTotalUnreadNotificationsCount(notifications)
|
||||||
|
self.__count = total
|
||||||
|
self.__label = str(total)
|
||||||
|
|
||||||
|
counts = []
|
||||||
|
if len(self.__reasons) > 0:
|
||||||
|
for reason in self.__reasons:
|
||||||
|
unread = self.__getUnreadNotificationsCountByReason(
|
||||||
|
notifications, reason
|
||||||
|
)
|
||||||
|
counts.append(str(unread))
|
||||||
|
|
||||||
|
self.__label += " - "
|
||||||
|
self.__label += "/".join(counts)
|
||||||
|
|
||||||
|
except Exception as err:
|
||||||
|
print(err)
|
||||||
|
self.__label = "n/a"
|
||||||
|
|
||||||
|
def __getUnreadNotificationsCountByReason(self, notifications, reason):
|
||||||
|
return len(
|
||||||
list(
|
list(
|
||||||
filter(
|
filter(
|
||||||
lambda notification: notification["unread"],
|
lambda notification: notification["unread"]
|
||||||
|
and notification["reason"] == reason,
|
||||||
notifications.json(),
|
notifications.json(),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
next_link = notifications.links.get("next")
|
|
||||||
if next_link is not None:
|
|
||||||
url = next_link.get("url")
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
|
|
||||||
except Exception:
|
def __getTotalUnreadNotificationsCount(self, notifications):
|
||||||
self.__count = "n/a"
|
return len(
|
||||||
|
list(
|
||||||
|
filter(
|
||||||
|
lambda notification: notification["unread"], notifications.json()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def state(self, widget):
|
||||||
|
state = []
|
||||||
|
|
||||||
|
if self.__count > 0:
|
||||||
|
state.append("warning")
|
||||||
|
|
||||||
|
return state
|
||||||
|
|
||||||
|
|
||||||
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
|
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
|
||||||
|
|
Loading…
Reference in a new issue