Mercurial > prosody-modules
annotate mod_slack_webhooks/mod_slack_webhooks.lua @ 3147:82689acd1294
mod_slack_webhooks: Forward info about clicked button to hook
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 03 Jun 2018 02:02:56 +0200 |
parents | 662423cea3f4 |
children | 8c7b8b2c3237 |
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); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
93 local headers = { |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
94 ["Content-Type"] = "application/json", |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
95 }; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
96 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
|
97 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
98 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
99 module:hook("message/bare", check_message, 10); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
100 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
101 local function route_post(f) |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
102 return function(event, path) |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
103 local bare_room = jid.join(path, module.host); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
104 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
|
105 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
|
106 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
|
107 return 404; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
108 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
109 -- Check secret? |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
110 return f(event, path) |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
111 end |
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 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
114 local function handle_post(event, path) |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
115 local mod_muc = host_session.muc; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
116 local request = event.request; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
117 local headers = request.headers; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
118 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
119 local body_type = headers.content_type; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
120 local post_body; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
121 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
|
122 post_body = formdecode(request.body); |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
123 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
|
124 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
|
125 if not post_body then |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
126 return 420; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
127 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
128 else |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
129 return 422; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
130 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
131 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
|
132 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
|
133 local from_nick = default_from_nick; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
134 if post_body["username"] then |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
135 from_nick = post_body["username"]; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
136 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
137 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
|
138 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
|
139 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
|
140 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
|
141 |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
142 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
|
143 -- luacheck: ignore 631 |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
144 -- 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
|
145 |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
146 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
|
147 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
|
148 local buttons = {}; |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
149 local button_name; |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
150 for _, action in ipairs(attachment.actions) do |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
151 if type(attachment.text) == "string" then |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
152 buttons.label = attachment.text; |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
153 end |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
154 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
|
155 if not button_name then |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
156 button_name = action.name; |
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 button_name == action.name then |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
159 local button = { |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
160 value = action.value; |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
161 }; |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
162 if type(action.text) == "string" then |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
163 button.label = action.text; |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
164 end |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
165 table.insert(buttons, button); |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
166 end |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
167 end |
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 if button_name then |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
170 message:add_direct_child(dataform.new({ |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
171 { |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
172 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
|
173 value = button_ns, |
3146
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
174 }, |
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 = "callback_id", |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
177 value = attachment.callback_id, |
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 = "button_name", |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
181 value = button_name, |
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 = "list-single", name = "buttons", |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
185 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
|
186 options = buttons; |
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 }):form()); |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
189 break; |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
190 end |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
191 end |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
192 end |
662423cea3f4
mod_slack_webhooks: Add support for buttons
Kim Alvefur <zash@zash.se>
parents:
3097
diff
changeset
|
193 end |
3000
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
194 dest_room:broadcast_message(message, true); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
195 return 201; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
196 end |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
197 |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
198 module:provides("http", { |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
199 default_path = listen_path; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
200 route = { |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
201 ["POST /*"] = route_post(handle_post); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
202 OPTIONS = function(e) |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
203 local headers = e.response.headers; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
204 headers.allow = "POST"; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
205 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
|
206 return 200; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
207 end; |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
208 } |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
209 }); |
02fc3b64cbb7
Initial commit of mod_slack_webhooks.
Nathan Whitehorn <nwhitehorn@physics.ucla.edu>
parents:
diff
changeset
|
210 |