changeset 860:1c886affb375

mod_pubsub_github: Receive Github web hooks (generated on pushes to a repository) and forward to a local pubsub node
author Matthew Wild <mwild1@gmail.com>
date Thu, 22 Nov 2012 00:02:28 -0500
parents 9922e8cdf4a4
children 1b34c8e46ffb f88381a39c56
files mod_pubsub_github/mod_pubsub_github.lua
diffstat 1 files changed, 50 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pubsub_github/mod_pubsub_github.lua	Thu Nov 22 00:02:28 2012 -0500
@@ -0,0 +1,50 @@
+module:depends("http");
+
+local st = require "util.stanza";
+local json = require "util.json";
+local formdecode = require "net.http".formdecode;
+
+local pubsub_service = module:depends("pubsub").service;
+local node = module:get_option("github_node", "github");
+
+function handle_POST(event)
+	local data = json.decode(formdecode(event.request.body).payload);
+	if not data then
+		return "Invalid JSON. From you of all people...";
+	end
+	
+	for _, commit in ipairs(data.commits) do
+		local ok, err = pubsub_service:publish(node, true, data.repository.name,
+			st.stanza("item", { id = data.repository.name, xmlns = "http://jabber.org/protocol/pubsub" })
+			:tag("entry", { xmlns = "http://www.w3.org/2005/Atom" })
+				:tag("id"):text(commit.id):up()
+				:tag("title"):text(commit.message):up()
+				:tag("link", { rel = "alternate", href = commit.url }):up()
+				:tag("published"):text(commit.timestamp):up()
+				:tag("author")
+					:tag("name"):text(commit.author.name):up()
+					:tag("email"):text(commit.author.email):up()
+					:up()
+		);
+	end
+	
+	module:log("debug", "Handled POST: \n%s\n", tostring(event.request.body));
+	return "Thank you Github!";
+end
+
+module:provides("http", {
+	route = {
+		POST = handle_POST;
+	};
+});
+
+function module.load()
+	if not pubsub_service.nodes[node] then
+		local ok, err = pubsub_service:create(node, true);
+		if not ok then
+			module:log("error", "Error creating node: %s", err);
+		else
+			module:log("debug", "Node %q created", node);
+		end
+	end
+end