2019-02-07 11:49:42 +00:00
|
|
|
from src import ModuleManager, utils
|
|
|
|
|
|
|
|
class Module(ModuleManager.BaseModule):
|
2019-02-07 14:05:12 +00:00
|
|
|
@utils.hook("received.command.traviswebhook", min_args=1)
|
|
|
|
def travis_webhook(self, event):
|
|
|
|
"""
|
|
|
|
:help: List/add/remove travis webhooks
|
|
|
|
:require_mode: high
|
|
|
|
:permission: githuboverride
|
|
|
|
:usage: list
|
|
|
|
:usage: add <repository>
|
|
|
|
:usage: remove <repository>
|
|
|
|
"""
|
|
|
|
all_hooks = event["target"].get_setting("travis-hooks", {})
|
|
|
|
hook_name = None
|
|
|
|
existing_hook = None
|
|
|
|
if len(event["args_split"]) > 1:
|
|
|
|
hook_name = event["args_split"][1]
|
|
|
|
for existing_hook_name in all_hooks.keys():
|
|
|
|
if existing_hook_name.lower() == hook.lower():
|
|
|
|
existing_hook = existing_hook_name
|
|
|
|
break
|
|
|
|
|
|
|
|
subcommand = event["args_split"][0].lower()
|
|
|
|
if subcommand == "list":
|
|
|
|
event["stdout"].write("Registered web hooks: %s" %
|
|
|
|
", ".join(all_hooks.keys()))
|
|
|
|
elif subcommand == "add":
|
|
|
|
if existing_hook:
|
|
|
|
event["stderr"].write("There's already a hook for %s" %
|
|
|
|
hook_name)
|
|
|
|
return
|
|
|
|
|
|
|
|
all_hooks[hook_name] = {"events", []}
|
|
|
|
event["target"].set_setting("travis-hooks", all_hooks)
|
|
|
|
event["stdout"].write("Added hook for %s" % hook_name)
|
|
|
|
elif subcommand == "remove":
|
|
|
|
if not existing_hook:
|
|
|
|
event["stderr"].write("No hook found for %s" % hook_name)
|
|
|
|
return
|
|
|
|
del all_hooks[existing_hook]
|
|
|
|
if all_hooks:
|
|
|
|
event["target"].set_setting("travis-hooks", all_hooks)
|
|
|
|
else:
|
|
|
|
event["target"].del_setting("travis-hooks")
|
|
|
|
event["stdout"].write("Removed hook for %s" % hook_name)
|
|
|
|
else:
|
|
|
|
event["stderr"].write("Unknown command '%s'" %
|
|
|
|
event["args_split"][0])
|
|
|
|
|
|
|
|
|
2019-02-07 11:49:42 +00:00
|
|
|
@utils.hook("api.post.travis")
|
|
|
|
def webhook(self, event):
|
|
|
|
payload = urllib.parse.unquote(urllib.parse.parse_qs(
|
|
|
|
event["data"].decode("utf8"))[0])
|
|
|
|
data = json.loads(payload)
|
|
|
|
|
|
|
|
repo_fullname = event["data"]["headers"]["Travis-Repo-Slug"]
|
|
|
|
repo_organisation, repo_name = repo_fullname.split("/", 1)
|
|
|
|
|
|
|
|
hooks = self.bot.database.channel_settings.find_by_setting(
|
|
|
|
"travis-hooks")
|
|
|
|
targets = []
|
|
|
|
|
|
|
|
repo_hooked = False
|
|
|
|
for server_id, channel_name, hooked_repos in hooks:
|
|
|
|
found_hook = None
|
|
|
|
if repo_fullname and repo_fullname in hooked_repos:
|
|
|
|
found_hook = hooked_repos[repo_fullname]
|
|
|
|
elif repo_organisation and repo_organisation in hooked_repos:
|
|
|
|
found_hook = hooked_repos[repo_organisation]
|
|
|
|
|
|
|
|
if found_hook:
|
|
|
|
repo_hooked = True
|
|
|
|
server = self.bot.get_server(server_id)
|
|
|
|
if server and channel_name in server.channels:
|
|
|
|
targets.append([server, channel])
|
|
|
|
|
|
|
|
if not targets:
|
|
|
|
return "" if repo_hooked else None
|
|
|
|
|
|
|
|
summary = self._summary(data)
|
|
|
|
|
|
|
|
if summary:
|
|
|
|
for server, channel in targets:
|
|
|
|
output = "(%s) %s" % (repo_fullname, summary)
|
|
|
|
|
|
|
|
hide_prefix = channel.get_setting("travis-hide-prefix",
|
|
|
|
False)
|
|
|
|
self.events.on("send.stdout").call(target=channel,
|
|
|
|
module_name="Travis", server=server, message=output,
|
|
|
|
hide_prefix=hide_prefix)
|
|
|
|
|
|
|
|
return ""
|
|
|
|
|
|
|
|
def _summary(self, data):
|
|
|
|
result_color = utils.consts.RED
|
|
|
|
if data["result"] == 0:
|
|
|
|
result_color = utils.consts.GREEN
|
|
|
|
result = utils.irc.color(data["result_mesasge"], result_color)
|
|
|
|
|
|
|
|
commit = utils.irc.bold(data["commit"][:8])
|
|
|
|
|
|
|
|
type_source = ""
|
|
|
|
if data["type"] == "pull_request":
|
|
|
|
pr_number = data["pull_request_number"]
|
|
|
|
pr = utils.irc.color("PR#%d" % pr_number, utils.consts.LIGHTBLUE)
|
|
|
|
type_source = "%s @%s" % (pr, commit)
|
|
|
|
else:
|
|
|
|
branch = utils.irc.color(data["branch"], utils.consts.LIGHTBLUE)
|
|
|
|
type_source = "%s @%s" % (branch, commit)
|
|
|
|
|
|
|
|
timing = ""
|
|
|
|
if data["finished_at"]:
|
|
|
|
timing = " in %ds" % data["duration"]
|
|
|
|
|
|
|
|
url = self.exports.get("shortlink")(data["build_url"])
|
|
|
|
return "[%s] Build %d %s%s - %s" % (
|
|
|
|
type_source, data["number"], result, timing, url)
|