summaryrefslogtreecommitdiff
path: root/lib/lsg_irc/tell_plugin.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/lsg_irc/tell_plugin.ex')
-rw-r--r--lib/lsg_irc/tell_plugin.ex55
1 files changed, 34 insertions, 21 deletions
diff --git a/lib/lsg_irc/tell_plugin.ex b/lib/lsg_irc/tell_plugin.ex
index a683b43..2c9e3c8 100644
--- a/lib/lsg_irc/tell_plugin.ex
+++ b/lib/lsg_irc/tell_plugin.ex
@@ -16,6 +16,10 @@ defmodule LSG.IRC.TellPlugin do
(LSG.data_path() <> "/tell.dets") |> String.to_charlist()
end
+ def tell(m, target, message) do
+ GenServer.cast(__MODULE__, {:tell, m, target, message})
+ end
+
def init([]) do
regopts = [plugin: __MODULE__]
{:ok, _} = Registry.register(IRC.PubSub, "account", regopts)
@@ -24,27 +28,13 @@ defmodule LSG.IRC.TellPlugin do
{:ok, %{dets: dets}}
end
- def handle_info({:irc, :trigger, "tell", m = %IRC.Message{trigger: %IRC.Trigger{type: :bang, args: [nick_target | message]}}}, state) do
- target = IRC.Account.find_always_by_nick(m.network, m.channel, nick_target)
- message = Enum.join(message, " ")
- with \
- {:target, %IRC.Account{} = target} <- {:target, target},
- {:same, false} <- {:same, target.id == m.account.id},
- target_user = IRC.UserTrack.find_by_account(m.network, target),
- target_nick = if(target_user, do: target_user.nick, else: target.name),
- present? = if(target_user, do: Map.has_key?(target_user.last_active, m.channel)),
- {:absent, true, _} <- {:absent, !present?, target_nick},
- {:message, message} <- {:message, message}
- do
- obj = { {m.network, m.channel, target.id}, m.account.id, message, NaiveDateTime.utc_now()}
- :dets.insert(state.dets, obj)
- m.replyfun.("will tell to #{target_nick}")
- else
- {:same, _} -> m.replyfun.("are you so stupid that you need a bot to tell yourself things ?")
- {:target, _} -> m.replyfun.("#{nick_target} unknown")
- {:absent, _, nick} -> m.replyfun.("#{nick} is here, tell yourself!")
- {:message, _} -> m.replyfun.("can't tell without a message")
- end
+ def handle_cast({:tell, m, target, message}, state) do
+ do_tell(state, m, target, message)
+ {:noreply, state}
+ end
+
+ def handle_info({:irc, :trigger, "tell", m = %IRC.Message{trigger: %IRC.Trigger{type: :bang, args: [target | message]}}}, state) do
+ do_tell(state, m, target, message)
{:noreply, state}
end
@@ -90,4 +80,27 @@ defmodule LSG.IRC.TellPlugin do
:ok
end
+ defp do_tell(state, m, nick_target, message) do
+ target = IRC.Account.find_always_by_nick(m.network, m.channel, nick_target)
+ message = Enum.join(message, " ")
+ with \
+ {:target, %IRC.Account{} = target} <- {:target, target},
+ {:same, false} <- {:same, target.id == m.account.id},
+ target_user = IRC.UserTrack.find_by_account(m.network, target),
+ target_nick = if(target_user, do: target_user.nick, else: target.name),
+ present? = if(target_user, do: Map.has_key?(target_user.last_active, m.channel)),
+ {:absent, true, _} <- {:absent, !present?, target_nick},
+ {:message, message} <- {:message, message}
+ do
+ obj = { {m.network, m.channel, target.id}, m.account.id, message, NaiveDateTime.utc_now()}
+ :dets.insert(state.dets, obj)
+ m.replyfun.("will tell to #{target_nick}")
+ else
+ {:same, _} -> m.replyfun.("are you so stupid that you need a bot to tell yourself things ?")
+ {:target, _} -> m.replyfun.("#{nick_target} unknown")
+ {:absent, _, nick} -> m.replyfun.("#{nick} is here, tell yourself!")
+ {:message, _} -> m.replyfun.("can't tell without a message")
+ end
+ end
+
end