diff options
author | href <href@random.sh> | 2021-09-03 04:04:21 +0200 |
---|---|---|
committer | href <href@random.sh> | 2021-09-03 04:04:21 +0200 |
commit | 5399fc818cf821c75f9f19fd00bf7905ba7fe7e3 (patch) | |
tree | 00408724f9778cc7323b1459782a762626d39b6a /lib/irc/connection.ex | |
parent | assets.. (diff) |
various fixes, web client wip, pubsub events
Diffstat (limited to 'lib/irc/connection.ex')
-rw-r--r-- | lib/irc/connection.ex | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/lib/irc/connection.ex b/lib/irc/connection.ex index e856114..eff5930 100644 --- a/lib/irc/connection.ex +++ b/lib/irc/connection.ex @@ -165,6 +165,10 @@ defmodule IRC.Connection do end end + def update_connection(connection) do + :dets.insert(dets(), to_tuple(connection)) + end + def start_link(conn) do GenServer.start_link(__MODULE__, [conn], name: {:global, conn.id}) end @@ -275,12 +279,12 @@ defmodule IRC.Connection do def handle_info({:received, text, sender, chan}, state) do reply_fun = fn(text) -> irc_reply(state, {chan, sender}, text) end account = IRC.Account.lookup(sender) - message = %IRC.Message{text: text, network: network(state), account: account, sender: sender, channel: chan, replyfun: reply_fun, trigger: extract_trigger(text)} + message = %IRC.Message{at: NaiveDateTime.utc_now(), text: text, network: network(state), account: account, sender: sender, channel: chan, replyfun: reply_fun, trigger: extract_trigger(text)} message = case IRC.UserTrack.messaged(message) do :ok -> message {:ok, message} -> message end - publish(message, ["message:#{chan}", "#{message.network}/#{chan}:message"]) + publish(message, ["#{message.network}/#{chan}:messages"]) {:noreply, state} end @@ -293,7 +297,7 @@ defmodule IRC.Connection do :ok -> message {:ok, message} -> message end - publish(message, ["message:private"]) + publish(message, ["messages:private", "#{message.network}/#{account.id}:messages"]) {:noreply, state} end @@ -336,8 +340,8 @@ defmodule IRC.Connection do {:noreply, state} end - def handle_info({:quit, _reason, sender}, state) do - IRC.UserTrack.quitted(sender) + def handle_info({:quit, reason, sender}, state) do + IRC.UserTrack.quitted(sender, reason) {:noreply, state} end @@ -378,18 +382,32 @@ defmodule IRC.Connection do def publish(pub), do: publish(pub, []) def publish(m = %IRC.Message{trigger: nil}, keys) do - dispatch(["message"] ++ keys, {:irc, :text, m}) + dispatch(["messages"] ++ keys, {:irc, :text, m}) end def publish(m = %IRC.Message{trigger: t = %IRC.Trigger{trigger: trigger}}, keys) do dispatch(["triggers", "#{m.network}/#{m.channel}:triggers", "trigger:"<>trigger], {:irc, :trigger, trigger, m}) end + def publish_event(net, event = %{type: _}) when is_binary(net) do + event = event + |> Map.put(:at, NaiveDateTime.utc_now()) + |> Map.put(:network, net) + dispatch("#{net}:events", {:irc, :event, event}) + end + def publish_event({net, chan}, event = %{type: type}) do + event = event + |> Map.put(:at, NaiveDateTime.utc_now()) + |> Map.put(:network, net) + |> Map.put(:channel, chan) + dispatch("#{net}/#{chan}:events", {:irc, :event, event}) + end + def dispatch(keys, content, sub \\ IRC.PubSub) def dispatch(key, content, sub) when is_binary(key), do: dispatch([key], content, sub) def dispatch(keys, content, sub) when is_list(keys) do - IO.puts "dispatching to #{inspect({sub,keys})} --> #{inspect content}" + Logger.debug("dispatch #{inspect keys} = #{inspect content}") for key <- keys do spawn(fn() -> Registry.dispatch(sub, key, fn h -> for {pid, _} <- h, do: send(pid, content) @@ -419,13 +437,15 @@ defmodule IRC.Connection do # irc_reply(ExIRC.Client pid, {channel or nick, ExIRC.Sender}, binary | replies # replies :: {:kick, reason} | {:kick, nick, reason} | {:mode, mode, nick} - defp irc_reply(%{client: client, network: network}, {target, _}, text) when is_binary(text) or is_list(text) do + defp irc_reply(state = %{client: client, network: network}, {target, _}, text) when is_binary(text) or is_list(text) do lines = IRC.splitlong(text) |> Enum.map(fn(x) -> if(is_list(x), do: x, else: String.split(x, "\n")) end) |> List.flatten() - for line <- lines do + outputs = for line <- lines do ExIRC.Client.msg(client, :privmsg, target, line) + {:irc, :out, %IRC.Message{network: network, channel: target, text: line, sender: %ExIRC.SenderInfo{nick: state.conn.nick}, at: NaiveDateTime.utc_now()}} end + for f <- outputs, do: dispatch(["irc:outputs", "#{network}/#{target}:outputs"], f) case :global.whereis_name({LSG.TelegramRoom, network, target}) do pid when is_pid(pid) -> send(pid, {:raw, text}) _ -> :ok |