summaryrefslogtreecommitdiff
path: root/lib/plugins/say.ex
diff options
context:
space:
mode:
authorJordan Bracco <href@random.sh>2022-12-20 02:19:42 +0000
committerJordan Bracco <href@random.sh>2022-12-20 19:29:41 +0100
commit9958e90eb5eb5a2cc171c40860745e95a96bd429 (patch)
treeb49cdb1d0041b9c0a81a14950d38c0203896f527 /lib/plugins/say.ex
parentRename to Nola (diff)
Actually do not prefix folders with nola_ refs T77
Diffstat (limited to 'lib/plugins/say.ex')
-rw-r--r--lib/plugins/say.ex73
1 files changed, 73 insertions, 0 deletions
diff --git a/lib/plugins/say.ex b/lib/plugins/say.ex
new file mode 100644
index 0000000..91ffacc
--- /dev/null
+++ b/lib/plugins/say.ex
@@ -0,0 +1,73 @@
+defmodule Nola.Plugins.Say do
+
+ def irc_doc do
+ """
+ # say
+
+ Say something...
+
+ * **!say `<channel>` `<text>`** say something on `channel`
+ * **!asay `<channel>` `<text>`** same but anonymously
+
+ You must be a member of the channel.
+ """
+ end
+
+ def start_link() do
+ GenServer.start_link(__MODULE__, [], name: __MODULE__)
+ end
+
+ def init([]) do
+ regopts = [type: __MODULE__]
+ {:ok, _} = Registry.register(IRC.PubSub, "trigger:say", regopts)
+ {:ok, _} = Registry.register(IRC.PubSub, "trigger:asay", regopts)
+ {:ok, _} = Registry.register(IRC.PubSub, "messages:private", regopts)
+ {:ok, nil}
+ end
+
+ def handle_info({:irc, :trigger, "say", m = %{trigger: %{type: :bang, args: [target | text]}}}, state) do
+ text = Enum.join(text, " ")
+ say_for(m.account, target, text, true)
+ {:noreply, state}
+ end
+
+ def handle_info({:irc, :trigger, "asay", m = %{trigger: %{type: :bang, args: [target | text]}}}, state) do
+ text = Enum.join(text, " ")
+ say_for(m.account, target, text, false)
+ {:noreply, state}
+ end
+
+ def handle_info({:irc, :text, m = %{text: "say "<>rest}}, state) do
+ case String.split(rest, " ", parts: 2) do
+ [target, text] -> say_for(m.account, target, text, true)
+ _ -> nil
+ end
+ {:noreply, state}
+ end
+
+ def handle_info({:irc, :text, m = %{text: "asay "<>rest}}, state) do
+ case String.split(rest, " ", parts: 2) do
+ [target, text] -> say_for(m.account, target, text, false)
+ _ -> nil
+ end
+ {:noreply, state}
+ end
+
+ def handle_info(_, state) do
+ {:noreply, state}
+ end
+
+ defp say_for(account, target, text, with_nick?) do
+ for {net, chan} <- IRC.Membership.of_account(account) do
+ chan2 = String.replace(chan, "#", "")
+ if (target == "#{net}/#{chan}" || target == "#{net}/#{chan2}" || target == chan || target == chan2) do
+ if with_nick? do
+ IRC.send_message_as(account, net, chan, text)
+ else
+ IRC.Connection.broadcast_message(net, chan, text)
+ end
+ end
+ end
+ end
+
+end