summaryrefslogtreecommitdiff
path: root/plugins/degesch/slack.lua
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/degesch/slack.lua')
-rw-r--r--plugins/degesch/slack.lua147
1 files changed, 0 insertions, 147 deletions
diff --git a/plugins/degesch/slack.lua b/plugins/degesch/slack.lua
deleted file mode 100644
index dcddb3c..0000000
--- a/plugins/degesch/slack.lua
+++ /dev/null
@@ -1,147 +0,0 @@
---
--- slack.lua: try to fix up UX when using the Slack IRC gateway
---
--- Copyright (c) 2017, Přemysl Eric Janouch <p@janouch.name>
---
--- Permission to use, copy, modify, and/or distribute this software for any
--- purpose with or without fee is hereby granted.
---
--- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
--- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
--- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
--- SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
--- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
--- OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
--- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
---
-
-local servers = {}
-local read_servers = function (v)
- servers = {}
- for name in v:lower ():gmatch "[^,]+" do
- servers[name] = true
- end
-end
-
--- This is a reverse list of Slack's automatic emoji, noseless forms
-local unemojify, emoji, emoji_default = false, {}, {
- heart = "<3",
- broken_heart = "</3",
- sunglasses = "8)",
- anguished = "D:",
- cry = ":'(",
- monkey_face = ":o)",
- kiss = ":*",
- smiley = "=)",
- smile = ":D",
- wink = ";)",
- laughing = ":>",
- neutral_face = ":|",
- open_mouth = ":o",
- angry = ">:(",
- slightly_smiling_face = ":)",
- disappointed = ":(",
- confused = ":/",
- stuck_out_tongue = ":p",
- stuck_out_tongue_winking_eye = ";p",
-}
-local load_emoji = function (extra)
- emoji = {}
- for k, v in pairs (emoji_default) do emoji[k] = v end
- for k, v in extra:gmatch "([^,]+) ([^,]+)" do emoji[k] = v end
-end
-
-degesch.setup_config {
- servers = {
- type = "string_array",
- default = "\"\"",
- comment = "list of server names that are Slack IRC gateways",
- on_change = read_servers
- },
- unemojify = {
- type = "boolean",
- default = "true",
- comment = "convert emoji to normal ASCII emoticons",
- on_change = function (v) unemojify = v end
- },
- extra_emoji = {
- type = "string_array",
- default = "\"grinning :)),joy :'),innocent o:),persevere >_<\"",
- comment = "overrides or extra emoji for unemojify",
- on_change = function (v) load_emoji (v) end
- }
-}
-
--- We can handle external messages about what we've supposedly sent just fine,
--- so let's get rid of that "[username] some message sent from the web UI" crap
-degesch.hook_irc (function (hook, server, line)
- local msg, us = degesch.parse (line), server.user
- if not servers[server.name] or msg.command ~= "PRIVMSG" or not us
- or msg.params[1]:lower () ~= us.nickname:lower () then return line end
-
- -- Taking a shortcut to avoid lengthy message reassembly
- local quoted_nick = us.nickname:gsub ("[%^%$%(%)%%%.%[%]%*%+%-%?]", "%%%0")
- local text = line:match ("^.- PRIVMSG .- :%[" .. quoted_nick .. "%] (.*)$")
- if not text then return line end
- return ":" .. us.nickname .. "!" .. server.irc_user_host .. " PRIVMSG "
- .. msg.prefix:match "^[^!@]*" .. " :" .. text
-end)
-
--- Unfuck emoji and :nick!nick@irc.tinyspeck.com MODE #channel +v nick : active
-degesch.hook_irc (function (hook, server, line)
- if not servers[server.name] then return line end
- if unemojify then
- local start, text = line:match ("^(.- PRIVMSG .- :)(.*)$")
- if start then return start .. text:gsub (":([a-z_]+):", function (name)
- if emoji[name] then return emoji[name] end
- return ":" .. name .. ":"
- end) end
- end
- return line:gsub ("^(:%S+ MODE .+) : .*", "%1")
-end)
-
--- The gateway simply ignores the NAMES command altogether
-degesch.hook_input (function (hook, buffer, input)
- if not buffer.channel or not servers[buffer.server.name]
- or not input:match "^/names%s*$" then return input end
-
- local users = buffer.channel.users
- table.sort (users, function (a, b)
- if a.prefixes > b.prefixes then return true end
- if a.prefixes < b.prefixes then return false end
- return a.user.nickname < b.user.nickname
- end)
-
- local names = "Users on " .. buffer.channel.name .. ":"
- for i, chan_user in ipairs (users) do
- names = names .. " " .. chan_user.prefixes .. chan_user.user.nickname
- end
- buffer:log (names)
-end)
-
-degesch.hook_completion (function (hook, data, word)
- local chan = degesch.current_buffer.channel
- local server = degesch.current_buffer.server
- if not chan or not servers[server.name] then return end
-
- -- In /commands there is typically no desire at all to add the at sign
- if data.location == 1 and data.words[1]:match "^/" then return end
-
- -- Handle both when the at sign is already there and when it is not
- local needle = word:gsub ("^@", ""):lower ()
-
- local t = {}
- local try = function (name)
- if data.location == 0 then name = name .. ":" end
- if name:sub (1, #needle):lower () == needle then
- table.insert (t, "@" .. name)
- end
- end
- for _, chan_user in ipairs (chan.users) do
- try (chan_user.user.nickname)
- end
- for _, special in ipairs { "channel", "here" } do
- try (special)
- end
- return t
-end)