aboutsummaryrefslogtreecommitdiff
path: root/modules/travis/__init__.py
blob: 724727c824780f1042217eac748e4f57ea3cad29 (about) (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from src import ModuleManager, utils

class Module(ModuleManager.BaseModule):
    @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)