diff options
author | Jordan Bracco <href@random.sh> | 2022-12-20 02:19:42 +0000 |
---|---|---|
committer | Jordan Bracco <href@random.sh> | 2022-12-20 19:29:41 +0100 |
commit | 9958e90eb5eb5a2cc171c40860745e95a96bd429 (patch) | |
tree | b49cdb1d0041b9c0a81a14950d38c0203896f527 /lib/plugins/say.ex | |
parent | Rename 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.ex | 73 |
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 |