Browse Source

Implement !star for users (earwig/earwigbot#55)

pull/10/merge
Ben Kurtovic 8 years ago
parent
commit
f91a3af5dc
1 changed files with 56 additions and 11 deletions
  1. +56
    -11
      commands/stars.py

+ 56
- 11
commands/stars.py View File

@@ -29,25 +29,56 @@ class Stars(Command):
"""Get the number of stargazers for a given GitHub repository."""
name = "stars"
commands = ["stars", "stargazers"]
API_URL = "https://api.github.com/repos/{repo}"
API_REPOS = "https://api.github.com/repos/{repo}"
API_USERS = "https://api.github.com/users/{user}/repos"
EXAMPLE = "!stars earwig/earwigbot"

def process(self, data):
if not data.args:
msg = "Which repository should I look up? Example: \x0306{0}\x0F."
msg = "Which GitHub repository or user should I look up? Example: \x0306{0}\x0F."
self.reply(data, msg.format(self.EXAMPLE))
return

repo = data.args[0]
info = self.get_repo(repo)
if info is None:
arg = data.args[0]
if "/" in arg:
self.handle_repo(data, arg)
else:
self.handle_user(data, arg)

def handle_repo(self, data, arg):
"""Handle !stars <user>/<repo>."""
repo = self.get_repo(arg)
if repo is None:
self.reply(data, "Repository not found. Is it private?")
return

count = int(repo["stargazers_count"])
plural = "" if count == 1 else "s"

msg = "\x0303{0}\x0F has \x02{1}\x0F stargazer{2}: {3}"
self.reply(data, msg.format(
repo["full_name"], count, plural, repo["html_url"]))

def handle_user(self, data, arg):
"""Handle !stars <user>."""
repos = self.get_user_repos(arg)
if repos is None:
self.reply(data, "User not found.")
return

star_count = sum(repo["stargazers_count"] for repo in repos)
star_plural = "" if star_count == 1 else "s"
repo_plural = "" if len(repos) == 1 else "s"
if len(repos) > 0:
name = repos[0]["owner"]["login"]
url = repos[0]["owner"]["html_url"]
else:
count = int(info["stargazers_count"])
plural = "" if count == 1 else "s"
msg = "\x0303{0}\x0F has \x02{1}\x0F stargazer{2}: {3}"
self.reply(data, msg.format(
info["full_name"], count, plural, info["html_url"]))
name = arg
url = "https://github.com/{0}".format(name)

msg = "\x0303{0}\x0F has \x02{1}\x0F stargazer{2} across {3} repo{4}: {5}"
self.reply(data, msg.format(
name, star_count, star_plural, len(repos), repo_plural, url))

def get_repo(self, repo):
"""Return the API JSON dump for a given repository.
@@ -55,10 +86,24 @@ class Stars(Command):
Return None if the repo doesn't exist or is private.
"""
try:
query = urlopen(self.API_URL.format(repo=repo)).read()
query = urlopen(self.API_REPOS.format(repo=repo)).read()
except HTTPError:
return None
res = loads(query)
if res and "id" in res and not res["private"]:
return res
return None

def get_user_repos(self, user):
"""Return the API JSON dump for a given user's repositories.

Return None if the user doesn't exist.
"""
try:
query = urlopen(self.API_USERS.format(user=user)).read()
except HTTPError:
return None
res = loads(query)
if res and isinstance(res, list):
return res
return None

Loading…
Cancel
Save