Software /
code /
prosody-modules
Annotate
mod_slack_webhooks/mod_slack_webhooks.lua @ 3342:3aa5419e3576
mod_bob: Add this new module.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Fri, 28 Sep 2018 16:12:18 +0200 |
parent | 3148:8c7b8b2c3237 |
child | 3443:284d8c18060e |
rev | line source |
---|---|
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
1 -- Allow Slack-style incoming and outgoing hooks to MUC rooms |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
2 -- Based on mod_muc_intercom and mod_post_msg |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
3 -- Copyright 2016-2017 Nathan Whitehorn <nwhitehorn@physics.ucla.edu> |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
4 -- |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
5 -- This file is MIT/X11 licensed. |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
6 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
7 module:depends"http" |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
8 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
9 local host_session = prosody.hosts[module.host]; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
10 local msg = require "util.stanza".message; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
11 local jid = require "util.jid"; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
12 local now = require "util.datetime".datetime; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
13 local json = require "util.json" |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
14 local formdecode = require "net.http".formdecode; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
15 local http = require "net.http"; |
3146
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
16 local dataform = require "util.dataforms"; |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
17 |
3093
7ed0589eff3c
mod_slack_webhooks: Rename variables no avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3092
diff
changeset
|
18 local function get_room_from_jid(mod_muc, room_jid) |
3071
b6cac9d72255
mod_slack_webhooks: Use the correct MUC API
Kim Alvefur <zash@zash.se>
parents:
3000
diff
changeset
|
19 if mod_muc.get_room_from_jid then |
3093
7ed0589eff3c
mod_slack_webhooks: Rename variables no avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3092
diff
changeset
|
20 return mod_muc.get_room_from_jid(room_jid); |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
21 elseif mod_muc.rooms then |
3093
7ed0589eff3c
mod_slack_webhooks: Rename variables no avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3092
diff
changeset
|
22 return mod_muc.rooms[room_jid]; -- COMPAT 0.9, 0.10 |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
23 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
24 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
25 |
3147
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
26 local button_ns = "xmpp:prosody.im/community/mod_slack_webhooks#buttons"; |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
27 local routing = module:get_option("outgoing_webhook_routing") or {}; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
28 local listen_path = module:get_option("incoming_webhook_path") or "/webhook"; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
29 local default_from_nick = module:get_option("incoming_webhook_default_nick") or "Bot"; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
30 |
3092
0f63e999d0e4
mod_slack_webhooks: Remove unused locals [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3071
diff
changeset
|
31 function postcallback(_, code) |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
32 module:log("debug", "HTTP result %d", code) |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
33 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
34 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
35 function check_message(data) |
3092
0f63e999d0e4
mod_slack_webhooks: Remove unused locals [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3071
diff
changeset
|
36 local stanza = data.stanza; |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
37 local mod_muc = host_session.muc; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
38 if not mod_muc then return; end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
39 |
3071
b6cac9d72255
mod_slack_webhooks: Use the correct MUC API
Kim Alvefur <zash@zash.se>
parents:
3000
diff
changeset
|
40 local this_room = get_room_from_jid(mod_muc, stanza.attr.to); |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
41 if not this_room then return; end -- no such room |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
42 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
43 local from_room_jid = this_room._jid_nick[stanza.attr.from]; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
44 if not from_room_jid then return; end -- no such nick |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
45 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
46 local from_room, from_host, from_nick = jid.split(from_room_jid); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
47 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
48 local body = stanza:get_child("body"); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
49 if not body then return; end -- No body, like topic changes |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
50 body = body and body:get_text(); -- I feel like I want to do `or ""` there :/ |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
51 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
52 if not routing[from_room] then |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
53 return; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
54 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
55 |
3094
39d714abbc2b
mod_slack_webhooks: Split long line to improve readability [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3093
diff
changeset
|
56 local json_out = { |
39d714abbc2b
mod_slack_webhooks: Split long line to improve readability [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3093
diff
changeset
|
57 channel_name = from_room, |
39d714abbc2b
mod_slack_webhooks: Split long line to improve readability [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3093
diff
changeset
|
58 timestamp = now(), |
39d714abbc2b
mod_slack_webhooks: Split long line to improve readability [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3093
diff
changeset
|
59 text = body, |
39d714abbc2b
mod_slack_webhooks: Split long line to improve readability [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3093
diff
changeset
|
60 team_domain = from_host, |
39d714abbc2b
mod_slack_webhooks: Split long line to improve readability [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3093
diff
changeset
|
61 user_name = from_nick, |
39d714abbc2b
mod_slack_webhooks: Split long line to improve readability [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3093
diff
changeset
|
62 }; |
3147
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
63 |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
64 local form = stanza:get_child("x", "jabber:x:form"); |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
65 if form and form.attr.type == "submit" then |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
66 local callback_id, button_name, button_value; |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
67 for field in form:childtags("field") do |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
68 if field.attr.var == "callback_id" then |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
69 button_name = field:get_child_text("text"); |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
70 elseif field.attr.var == "button_name" then |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
71 button_name = field:get_child_text("text"); |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
72 elseif field.attr.var ~= "FORM_TYPE" or field:get_child_text("text") ~= button_ns then |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
73 callback_id, button_name, button_value = nil, nil, nil; |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
74 break; |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
75 end |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
76 end |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
77 if callback_id and button_name and button_value then |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
78 json_out.callback_id = callback_id; |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
79 json_out.actions = { |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
80 { type = "button", name = button_name, value = button_value } |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
81 }; |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
82 end |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
83 end |
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
84 |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
85 local stanzaid = stanza:get_child("id"); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
86 if stanzaid and string.sub(stanzaid,1,string.len("webhookbot"))=="webhookbot" then |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
87 json_out["bot_id"] = "webhookbot"; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
88 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
89 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
90 json_out = json.encode(json_out) |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
91 local url = routing[from_room]; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
92 module:log("debug", "message from %s in %s to %s", from_nick, from_room, url); |
3148
8c7b8b2c3237
mod_slack_webhooks: Add a special webhook target for debugging
Kim Alvefur <zash@zash.se>
parents:
3147
diff
changeset
|
93 if url == "DEBUG" then |
8c7b8b2c3237
mod_slack_webhooks: Add a special webhook target for debugging
Kim Alvefur <zash@zash.se>
parents:
3147
diff
changeset
|
94 module:log("debug", "json_out = %s", json_out); |
8c7b8b2c3237
mod_slack_webhooks: Add a special webhook target for debugging
Kim Alvefur <zash@zash.se>
parents:
3147
diff
changeset
|
95 return; |
8c7b8b2c3237
mod_slack_webhooks: Add a special webhook target for debugging
Kim Alvefur <zash@zash.se>
parents:
3147
diff
changeset
|
96 end |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
97 local headers = { |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
98 ["Content-Type"] = "application/json", |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
99 }; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
100 http.request(url, { method = "POST", body = json_out, headers = headers }, postcallback) |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
101 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
102 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
103 module:hook("message/bare", check_message, 10); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
104 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
105 local function route_post(f) |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
106 return function(event, path) |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
107 local bare_room = jid.join(path, module.host); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
108 local mod_muc = host_session.muc; |
3071
b6cac9d72255
mod_slack_webhooks: Use the correct MUC API
Kim Alvefur <zash@zash.se>
parents:
3000
diff
changeset
|
109 if not get_room_from_jid(mod_muc, bare_room) then |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
110 module:log("warn", "mod_slack_webhook: invalid JID: %s", bare_room); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
111 return 404; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
112 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
113 -- Check secret? |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
114 return f(event, path) |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
115 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
116 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
117 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
118 local function handle_post(event, path) |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
119 local mod_muc = host_session.muc; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
120 local request = event.request; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
121 local headers = request.headers; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
122 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
123 local body_type = headers.content_type; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
124 local post_body; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
125 if body_type == "application/x-www-form-urlencoded" then |
3096
420391fd56e5
mod_slack_webhooks: Fix handling of form-urlencoded
Kim Alvefur <zash@zash.se>
parents:
3095
diff
changeset
|
126 post_body = formdecode(request.body); |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
127 elseif body_type == "application/json" then |
3097
c7f4e3987ed0
mod_slack_webhooks: Fix error handling for JSON parsing
Kim Alvefur <zash@zash.se>
parents:
3096
diff
changeset
|
128 post_body = json.decode(request.body) |
c7f4e3987ed0
mod_slack_webhooks: Fix error handling for JSON parsing
Kim Alvefur <zash@zash.se>
parents:
3096
diff
changeset
|
129 if not post_body then |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
130 return 420; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
131 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
132 else |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
133 return 422; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
134 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
135 local bare_room = jid.join(path, module.host); |
3071
b6cac9d72255
mod_slack_webhooks: Use the correct MUC API
Kim Alvefur <zash@zash.se>
parents:
3000
diff
changeset
|
136 local dest_room = get_room_from_jid(mod_muc, bare_room); |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
137 local from_nick = default_from_nick; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
138 if post_body["username"] then |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
139 from_nick = post_body["username"]; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
140 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
141 local sender = jid.join(path, module.host, from_nick); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
142 module:log("debug", "message to %s from %s", bare_room, sender); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
143 module:log("debug", "body: %s", post_body["text"]); |
3095
3a6a48b83b4f
mod_slack_webhooks: Reduce scope of variable
Kim Alvefur <zash@zash.se>
parents:
3094
diff
changeset
|
144 local message = msg({ to = bare_room, from = sender, type = "groupchat", id="webhookbot" .. now()},post_body["text"]); |
3146
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
145 |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
146 if type(post_body["attachments"]) == "table" then -- Buttons? |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
147 -- luacheck: ignore 631 |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
148 -- defensive against JSON having whatever data in it, enjoy |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
149 |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
150 for _, attachment in ipairs(post_body["attachments"]) do |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
151 if type(attachment) == "table" and type(attachment.actions) == "table" and type(attachment.callback_id) == "string" then |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
152 local buttons = {}; |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
153 local button_name; |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
154 for _, action in ipairs(attachment.actions) do |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
155 if type(attachment.text) == "string" then |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
156 buttons.label = attachment.text; |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
157 end |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
158 if type(action) == "table" and action.type == "button" and type(action.name) == "string" and type(action.value) == "string" then |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
159 if not button_name then |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
160 button_name = action.name; |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
161 end |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
162 if button_name == action.name then |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
163 local button = { |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
164 value = action.value; |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
165 }; |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
166 if type(action.text) == "string" then |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
167 button.label = action.text; |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
168 end |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
169 table.insert(buttons, button); |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
170 end |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
171 end |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
172 end |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
173 if button_name then |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
174 message:add_direct_child(dataform.new({ |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
175 { |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
176 type = "hidden", name = "FORM_TYPE", |
3147
82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
Kim Alvefur <zash@zash.se>
parents:
3146
diff
changeset
|
177 value = button_ns, |
3146
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
178 }, |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
179 { |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
180 type = "hidden", name = "callback_id", |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
181 value = attachment.callback_id, |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
182 }, |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
183 { |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
184 type = "hidden", name = "button_name", |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
185 value = button_name, |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
186 }, |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
187 { |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
188 type = "list-single", name = "buttons", |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
189 value = "", -- FIXME util.dataforms can't do options without a value |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
190 options = buttons; |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
191 } |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
192 }):form()); |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
193 break; |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
194 end |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
195 end |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
196 end |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
197 end |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
198 dest_room:broadcast_message(message, true); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
199 return 201; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
200 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
201 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
202 module:provides("http", { |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
203 default_path = listen_path; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
204 route = { |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
205 ["POST /*"] = route_post(handle_post); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
206 OPTIONS = function(e) |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
207 local headers = e.response.headers; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
208 headers.allow = "POST"; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
209 headers.accept = "application/x-www-form-urlencoded, application/json"; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
210 return 200; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
211 end; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
212 } |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
213 }); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
214 |