Mercurial > prosody-modules
comparison mod_slack_webhooks/mod_slack_webhooks.lua @ 3146:662423cea3f4
mod_slack_webhooks: Add support for buttons
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 03 Jun 2018 02:02:51 +0200 |
parents | c7f4e3987ed0 |
children | 82689acd1294 |
comparison
equal
deleted
inserted
replaced
3145:a3afab416271 | 3146:662423cea3f4 |
---|---|
11 local jid = require "util.jid"; | 11 local jid = require "util.jid"; |
12 local now = require "util.datetime".datetime; | 12 local now = require "util.datetime".datetime; |
13 local json = require "util.json" | 13 local json = require "util.json" |
14 local formdecode = require "net.http".formdecode; | 14 local formdecode = require "net.http".formdecode; |
15 local http = require "net.http"; | 15 local http = require "net.http"; |
16 local dataform = require "util.dataforms"; | |
16 | 17 |
17 local function get_room_from_jid(mod_muc, room_jid) | 18 local function get_room_from_jid(mod_muc, room_jid) |
18 if mod_muc.get_room_from_jid then | 19 if mod_muc.get_room_from_jid then |
19 return mod_muc.get_room_from_jid(room_jid); | 20 return mod_muc.get_room_from_jid(room_jid); |
20 elseif mod_muc.rooms then | 21 elseif mod_muc.rooms then |
112 end | 113 end |
113 local sender = jid.join(path, module.host, from_nick); | 114 local sender = jid.join(path, module.host, from_nick); |
114 module:log("debug", "message to %s from %s", bare_room, sender); | 115 module:log("debug", "message to %s from %s", bare_room, sender); |
115 module:log("debug", "body: %s", post_body["text"]); | 116 module:log("debug", "body: %s", post_body["text"]); |
116 local message = msg({ to = bare_room, from = sender, type = "groupchat", id="webhookbot" .. now()},post_body["text"]); | 117 local message = msg({ to = bare_room, from = sender, type = "groupchat", id="webhookbot" .. now()},post_body["text"]); |
118 | |
119 if type(post_body["attachments"]) == "table" then -- Buttons? | |
120 -- luacheck: ignore 631 | |
121 -- defensive against JSON having whatever data in it, enjoy | |
122 | |
123 for _, attachment in ipairs(post_body["attachments"]) do | |
124 if type(attachment) == "table" and type(attachment.actions) == "table" and type(attachment.callback_id) == "string" then | |
125 local buttons = {}; | |
126 local button_name; | |
127 for _, action in ipairs(attachment.actions) do | |
128 if type(attachment.text) == "string" then | |
129 buttons.label = attachment.text; | |
130 end | |
131 if type(action) == "table" and action.type == "button" and type(action.name) == "string" and type(action.value) == "string" then | |
132 if not button_name then | |
133 button_name = action.name; | |
134 end | |
135 if button_name == action.name then | |
136 local button = { | |
137 value = action.value; | |
138 }; | |
139 if type(action.text) == "string" then | |
140 button.label = action.text; | |
141 end | |
142 table.insert(buttons, button); | |
143 end | |
144 end | |
145 end | |
146 if button_name then | |
147 message:add_direct_child(dataform.new({ | |
148 { | |
149 type = "hidden", name = "FORM_TYPE", | |
150 value = "xmpp:prosody.im/community/mod_slack_webhooks#buttons", | |
151 }, | |
152 { | |
153 type = "hidden", name = "callback_id", | |
154 value = attachment.callback_id, | |
155 }, | |
156 { | |
157 type = "hidden", name = "button_name", | |
158 value = button_name, | |
159 }, | |
160 { | |
161 type = "list-single", name = "buttons", | |
162 value = "", -- FIXME util.dataforms can't do options without a value | |
163 options = buttons; | |
164 } | |
165 }):form()); | |
166 break; | |
167 end | |
168 end | |
169 end | |
170 end | |
117 dest_room:broadcast_message(message, true); | 171 dest_room:broadcast_message(message, true); |
118 return 201; | 172 return 201; |
119 end | 173 end |
120 | 174 |
121 module:provides("http", { | 175 module:provides("http", { |