From 5e51086cdd6635c9905112af48972d0ef2203806 Mon Sep 17 00:00:00 2001 From: jesopo Date: Mon, 24 Jun 2019 15:20:29 +0100 Subject: [PATCH] Fix typos, missed imports, wrong namespaces, etc --- modules/webhooks/__init__.py | 24 +++-- modules/webhooks/github.py | 180 ++++++++++------------------------- 2 files changed, 66 insertions(+), 138 deletions(-) diff --git a/modules/webhooks/__init__.py b/modules/webhooks/__init__.py index 5b840470..3f9e0c86 100644 --- a/modules/webhooks/__init__.py +++ b/modules/webhooks/__init__.py @@ -1,5 +1,8 @@ +import itertools, json from src import ModuleManager, utils -from . import github +from . import colors, github + +FORM_ENCODED = "application/x-www-form-urlencoded" @utils.export("channelset", {"setting": "git-prevent-highlight", "help": "Enable/disable preventing highlights", @@ -15,22 +18,22 @@ class Module(ModuleManager.BaseModule): self._github = github.GitHub() @utils.hook("api.post.github") - def github_webhook(self, event): + def _api_github_webhook(self, event): return self._webhook("github", "GitHub", self._github, event["data"], event["headers"]) def _webhook(self, webhook_type, webhook_name, handler, payload_str, headers): - payload = event["data"].decode("utf8") - if event["headers"]["Content-Type"] == FORM_ENCODED: + payload = payload_str.decode("utf8") + if headers["Content-Type"] == FORM_ENCODED: payload = urllib.parse.unquote(urllib.parse.parse_qs(payload)[ "payload"][0]) data = json.loads(payload) - full_name, repo_username, report_name, organisation = handler.names( + full_name, repo_username, repo_name, organisation = handler.names( data, headers) branch = handler.branch(data, headers) - event, event_action = handler.event(data, headers) + current_event, event_action = handler.event(data, headers) hooks = self.bot.database.channel_settings.find_by_setting( "%s-hooks" % webhook_type) @@ -46,6 +49,8 @@ class Module(ModuleManager.BaseModule): found_hook = hooked_repos[repo_username] elif organisation and organisation in hooked_repos: found_hook = hooked_repos[organisation] + else: + continue repo_hooked = True server = self.bot.get_server_by_id(server_id) @@ -57,8 +62,7 @@ class Module(ModuleManager.BaseModule): events = [] for hooked_event in found_hook["events"]: - events.append(EVENT_CATEGORIES.get(hooked_event, - [hooked_event])) + events.append(handler.event_categories(hooked_event)) events = list(itertools.chain(*events)) channel = server.channels.get(channel_name) @@ -72,7 +76,7 @@ class Module(ModuleManager.BaseModule): else: return {"state": "success", "deliveries": 0} - outputs = handler.webhook(data, headers) + outputs = handler.webhook(full_name, current_event, data, headers) if outputs: for server, channel in targets: @@ -83,7 +87,7 @@ class Module(ModuleManager.BaseModule): for output in outputs: output = "(%s) %s" % ( - utils.irc.color(source, COLOR_REPO), output) + utils.irc.color(source, colors.COLOR_REPO), output) if channel.get_setting("git-prevent-highlight", False): output = self._prevent_highlight(server, channel, diff --git a/modules/webhooks/github.py b/modules/webhooks/github.py index 42587da1..3314049d 100644 --- a/modules/webhooks/github.py +++ b/modules/webhooks/github.py @@ -1,7 +1,6 @@ #--depends-on-github from src import ModuleManager, utils - -FORM_ENCODED = "application/x-www-form-urlencoded" +from . import colors COMMIT_URL = "https://github.com/%s/commit/%s" COMMIT_RANGE_URL = "https://github.com/%s/compare/%s...%s" @@ -93,7 +92,7 @@ class GitHub(object): organisation = None if "organization" in data: organisation = data["organization"]["login"] - return full_name, repo_username, repo_name, oraganisation + return full_name, repo_username, repo_name, organisation def branch(self, data, headers): if "ref" in data: @@ -107,115 +106,40 @@ class GitHub(object): event_action = "%s/%s" % (event, data["action"]) return event, event_action - def webhook(self, data, headers): - github_event = headers["X-GitHub-Event"] - - full_name = None - repo_username = None - repo_name = None - if "repository" in data: - full_name = data["repository"]["full_name"] - repo_username, repo_name = full_name.split("/", 1) - - organisation = None - if "organization" in data: - organisation = data["organization"]["login"] - - event_action = None - if "action" in data: - event_action = "%s/%s" % (github_event, data["action"]) - - branch = None - if "ref" in data: - _, _, branch = data["ref"].rpartition("/") - - hooks = self.bot.database.channel_settings.find_by_setting( - "github-hooks") - targets = [] - - repo_hooked = False - for server_id, channel_name, hooked_repos in hooks: - found_hook = None - if full_name and full_name in hooked_repos: - found_hook = hooked_repos[full_name] - elif repo_username and repo_username in hooked_repos: - found_hook = hooked_repos[repo_username] - elif organisation and organisation in hooked_repos: - found_hook = hooked_repos[organisation] - - if found_hook: - repo_hooked = True - server = self.bot.get_server_by_id(server_id) - if server and channel_name in server.channels: - if (branch and - found_hook["branches"] and - not branch in found_hook["branches"]): - continue - - github_events = [] - for hooked_event in found_hook["events"]: - github_events.append(EVENT_CATEGORIES.get( - hooked_event, [hooked_event])) - github_events = list(itertools.chain(*github_events)) - - channel = server.channels.get(channel_name) - if (github_event in github_events or - (event_action and event_action in github_events)): - targets.append([server, channel]) - - if not targets: - if not repo_hooked: - return None - else: - return {"state": "success", "deliveries": 0} - - outputs = None - if github_event == "push": - outputs = self.push(full_name, data) - elif github_event == "commit_comment": - outputs = self.commit_comment(full_name, data) - elif github_event == "pull_request": - outputs = self.pull_request(full_name, data) - elif github_event == "pull_request_review": - outputs = self.pull_request_review(full_name, data) - elif github_event == "pull_request_review_comment": - outputs = self.pull_request_review_comment(full_name, data) - elif github_event == "issue_comment": - outputs = self.issue_comment(full_name, data) - elif github_event == "issues": - outputs = self.issues(full_name, data) - elif github_event == "create": - outputs = self.create(full_name, data) - elif github_event == "delete": - outputs = self.delete(full_name, data) - elif github_event == "release": - outputs = self.release(full_name, data) - elif github_event == "check_run": - outputs = self.check_run(data) - elif github_event == "fork": - outputs = self.fork(full_name, data) - elif github_event == "ping": - outputs = self.ping(data) - elif github_event == "membership": - outputs = self.membership(organisation, data) - elif github_event == "watch": - outputs = self.watch(data) - return outputs - - def _prevent_highlight(self, server, channel, s): - for user in channel.users: - if len(user.nickname) == 1: - # if we don't ignore 1-letter nicknames, the below while loop - # will fire indefininitely. - continue - - regex = re.compile(r"(.)\b(%s)(%s)" % ( - re.escape(user.nickname[0]), re.escape(user.nickname[1:])), - re.I) - s = regex.sub("\\1\\2\u200c\\3", s) - - return s + def event_categories(self, event): + return EVENT_CATEGORIES.get(event, [event]) + def webhook(self, full_name, event, data, headers): + if event == "push": + return self.push(full_name, data) + elif event == "commit_comment": + return self.commit_comment(full_name, data) + elif event == "pull_request": + return self.pull_request(full_name, data) + elif event == "pull_request_review": + return self.pull_request_review(full_name, data) + elif event == "pull_request_review_comment": + return self.pull_request_review_comment(full_name, data) + elif event == "issue_comment": + return self.issue_comment(full_name, data) + elif event == "issues": + return self.issues(full_name, data) + elif event == "create": + return self.create(full_name, data) + elif event == "delete": + return self.delete(full_name, data) + elif event == "release": + return self.release(full_name, data) + elif event == "check_run": + return self.check_run(data) + elif event == "fork": + return self.fork(full_name, data) + elif event == "ping": + return self.ping(data) + elif event == "membership": + return self.membership(organisation, data) + elif event == "watch": + return self.watch(data) def _short_url(self, url): try: page = utils.http.request("https://git.io", method="POST", @@ -235,9 +159,9 @@ class GitHub(object): def _change_count(self, n, symbol, color): return utils.irc.color("%s%d" % (symbol, n), color)+utils.irc.bold("") def _added(self, n): - return self._change_count(n, "+", COLOR_POSITIVE) + return self._change_count(n, "+", colors.COLOR_POSITIVE) def _removed(self, n): - return self._change_count(n, "-", COLOR_NEGATIVE) + return self._change_count(n, "-", colors.COLOR_NEGATIVE) def _modified(self, n): return self._change_count(n, "~", utils.consts.PURPLE) @@ -250,7 +174,7 @@ class GitHub(object): def push(self, full_name, data): outputs = [] branch = data["ref"].split("/", 2)[2] - branch = utils.irc.color(branch, COLOR_BRANCH) + branch = utils.irc.color(branch, colors.COLOR_BRANCH) author = utils.irc.bold(data["pusher"]["name"]) forced = "" @@ -263,7 +187,7 @@ class GitHub(object): elif len(data["commits"]) <= 3: for commit in data["commits"]: hash = commit["id"] - hash_colored = utils.irc.color(self._short_hash(hash), COLOR_ID) + hash_colored = utils.irc.color(self._short_hash(hash), colors.COLOR_ID) message = commit["message"].split("\n")[0].strip() url = self._short_url(COMMIT_URL % (full_name, hash)) @@ -291,11 +215,11 @@ class GitHub(object): def pull_request(self, full_name, data): number = utils.irc.color("#%s" % data["pull_request"]["number"], - COLOR_ID) + colors.COLOR_ID) action = data["action"] action_desc = "%s %s" % (action, number) branch = data["pull_request"]["base"]["ref"] - colored_branch = utils.irc.color(branch, COLOR_BRANCH) + colored_branch = utils.irc.color(branch, colors.COLOR_BRANCH) if action == "opened": action_desc = "requested %s merge into %s" % (number, @@ -303,11 +227,11 @@ class GitHub(object): elif action == "closed": if data["pull_request"]["merged"]: action_desc = "%s %s into %s" % ( - utils.irc.color("merged", COLOR_POSITIVE), number, + utils.irc.color("merged", colors.COLOR_POSITIVE), number, colored_branch) else: action_desc = "%s %s" % ( - utils.irc.color("closed", COLOR_NEGATIVE), number) + utils.irc.color("closed", colors.COLOR_NEGATIVE), number) elif action == "ready_for_review": action_desc = "marked %s ready for review" % number elif action == "synchronize": @@ -331,7 +255,7 @@ class GitHub(object): return [] number = utils.irc.color("#%s" % data["pull_request"]["number"], - COLOR_ID) + colors.COLOR_ID) action = data["action"] pr_title = data["pull_request"]["title"] reviewer = utils.irc.bold(data["sender"]["login"]) @@ -350,7 +274,7 @@ class GitHub(object): def pull_request_review_comment(self, full_name, data): number = utils.irc.color("#%s" % data["pull_request"]["number"], - COLOR_ID) + colors.COLOR_ID) action = data["action"] pr_title = data["pull_request"]["title"] sender = utils.irc.bold(data["sender"]["login"]) @@ -359,7 +283,7 @@ class GitHub(object): (sender, COMMENT_ACTIONS[action], number, pr_title, url)] def issues(self, full_name, data): - number = utils.irc.color("#%s" % data["issue"]["number"], COLOR_ID) + number = utils.irc.color("#%s" % data["issue"]["number"], colors.COLOR_ID) action = data["action"] issue_title = data["issue"]["title"] author = utils.irc.bold(data["sender"]["login"]) @@ -372,7 +296,7 @@ class GitHub(object): if data["changes"]["body"]["from"] == data["comment"]["body"]: return - number = utils.irc.color("#%s" % data["issue"]["number"], COLOR_ID) + number = utils.irc.color("#%s" % data["issue"]["number"], colors.COLOR_ID) action = data["action"] issue_title = data["issue"]["title"] type = "PR" if "pull_request" in data["issue"] else "issue" @@ -384,7 +308,7 @@ class GitHub(object): def create(self, full_name, data): ref = data["ref"] - ref_color = utils.irc.color(ref, COLOR_BRANCH) + ref_color = utils.irc.color(ref, colors.COLOR_BRANCH) type = data["ref_type"] sender = utils.irc.bold(data["sender"]["login"]) url = self._short_url(CREATE_URL % (full_name, ref)) @@ -392,7 +316,7 @@ class GitHub(object): def delete(self, full_name, data): ref = data["ref"] - ref_color = utils.irc.color(ref, COLOR_BRANCH) + ref_color = utils.irc.color(ref, colors.COLOR_BRANCH) type = data["ref_type"] sender = utils.irc.bold(data["sender"]["login"]) return ["%s deleted a %s: %s" % (sender, type, ref_color)] @@ -433,11 +357,11 @@ class GitHub(object): status_str = utils.irc.bold("started") elif status == "completed": conclusion = data["check_run"]["conclusion"] - conclusion_color = COLOR_POSITIVE + conclusion_color = colors.COLOR_POSITIVE if conclusion in CHECK_RUN_FAILURES: - conclusion_color = COLOR_NEGATIVE + conclusion_color = colors.COLOR_NEGATIVE if conclusion == "neutral": - conclusion_color = COLOR_NEUTRAL + conclusion_color = colors.COLOR_NEUTRAL status_str = utils.irc.color( CHECK_RUN_CONCLUSION[conclusion], conclusion_color)