From be82ffd6f3b6f6708b3d405e68033b0db16f855f Mon Sep 17 00:00:00 2001 From: Jordan Bracco Date: Wed, 1 Sep 2021 12:11:11 +0200 Subject: Commit ircbot fork --- lib/exirc/client.ex | 62 ++++++++++++++++++++++++++++++++---------------- lib/exirc/sender_info.ex | 4 +++- lib/exirc/utils.ex | 2 +- lib/exirc/who.ex | 9 ++++--- 4 files changed, 52 insertions(+), 25 deletions(-) (limited to 'lib') diff --git a/lib/exirc/client.ex b/lib/exirc/client.ex index 7588f81..b345ff2 100644 --- a/lib/exirc/client.ex +++ b/lib/exirc/client.ex @@ -24,9 +24,11 @@ defmodule ExIRC.Client do ssl?: false, connected?: false, logged_on?: false, - autoping: true, + autoping: true, + conn_server: nil, channel_prefixes: "", - network: "", + network: nil, + configured_network: nil, user_prefixes: "", login_time: "", channels: [], @@ -291,7 +293,9 @@ defmodule ExIRC.Client do channels: Channels.to_proplist(state.channels), network: state.network, login_time: state.login_time, - debug?: state.debug?, + debug?: state.debug?, + network: network(state), + conn_server: server(state), event_handlers: state.event_handlers] end @@ -307,6 +311,7 @@ defmodule ExIRC.Client do autoping = Keyword.get(options, :autoping, true) debug = Keyword.get(options, :debug, false) owner = Keyword.fetch!(options, :owner) + configured_network = Keyword.get(options, :network) # Add event handlers handlers = Keyword.get(options, :event_handlers, []) @@ -319,6 +324,7 @@ defmodule ExIRC.Client do logged_on?: false, debug?: debug, channels: ExIRC.Channels.init(), + configured_network: configured_network, owner: {owner, ref}}} end @doc """ @@ -352,7 +358,7 @@ defmodule ExIRC.Client do case Transport.connect(state, String.to_charlist(server), port, [:list, {:packet, :line}, {:keepalive, true}] ++ options) do {:ok, socket} -> send_event {:connected, server, port}, state - {:reply, :ok, %{state | connected?: true, server: server, port: port, socket: socket}} + {:reply, :ok, %{state | connected?: true, conn_server: server, port: port, socket: socket}} error -> {:reply, error, state} end @@ -364,6 +370,7 @@ defmodule ExIRC.Client do def handle_call(_, _from, %ClientState{connected?: false} = state), do: {:reply, {:error, :not_connected}, state} # Handle call to login to the connected IRC server def handle_call({:logon, pass, nick, user, name}, _from, %ClientState{logged_on?: false} = state) do + IO.puts("SENDING LOGON - #{inspect {pass,nick,user,name}}") Transport.send state, pass!(pass) Transport.send state, nick!(nick) Transport.send state, user!(user, name) @@ -479,7 +486,7 @@ defmodule ExIRC.Client do Handle messages from the TCP socket connection. """ # Handles the client's socket connection 'closed' event - def handle_info({:tcp_closed, _socket}, %ClientState{server: server, port: port} = state) do + def handle_info({:tcp_closed, _socket}, %ClientState{conn_server: server, port: port} = state) do info "Connection to #{server}:#{port} closed!" send_event :disconnected, state new_state = %{state | @@ -498,7 +505,7 @@ defmodule ExIRC.Client do handle_info({:tcp_closed, socket}, state) end # Handles any TCP errors in the client's socket connection - def handle_info({:tcp_error, socket, reason}, %ClientState{server: server, port: port} = state) do + def handle_info({:tcp_error, socket, reason}, %ClientState{conn_server: server, port: port} = state) do error "TCP error in connection to #{server}:#{port}:\r\n#{reason}\r\nClient connection closed." new_state = %{state | socket: nil, @@ -577,7 +584,9 @@ defmodule ExIRC.Client do # Called when the server sends it's current capabilities def handle_data(%ExIRC.Message{cmd: @rpl_isupport} = msg, state) do if state.debug?, do: debug "RECEIVING SERVER CAPABILITIES" - {:noreply, Utils.isup(msg.args, state)} + new_state = Utils.isup(msg.args, state) + send_event {:isup, network(new_state)}, new_state + {:noreply, new_state} end # Called when the client enters a channel @@ -591,7 +600,7 @@ defmodule ExIRC.Client do end # Called when another user joins a channel the client is in def handle_data(%ExIRC.Message{nick: user_nick, cmd: "JOIN", host: host, user: user} = msg, state) do - sender = %SenderInfo{nick: user_nick, host: host, user: user} + sender = %SenderInfo{nick: user_nick, host: host, user: user, conn_server: server(state), network: network(state)} channel = msg.args |> List.first |> String.trim if state.debug?, do: debug "ANOTHER USER JOINED A CHANNEL: #{channel} - #{user_nick}" channels = Channels.user_join(state.channels, channel, user_nick) @@ -693,9 +702,9 @@ defmodule ExIRC.Client do server_operator? = String.contains?(mode, "*") voiced? = String.contains?(mode, "+") - nick = %{nick: nick, user: user, name: name, server: server, hops: hop, admin?: admin?, + nick = %{nick: nick, user: user, name: name, conn_server: server, hops: hop, admin?: admin?, away?: away?, founder?: founder?, half_operator?: half_operator?, - operator?: operator?, server_operator?: server_operator?, voiced?: voiced? + operator?: operator?, server_operator?: server_operator?, voiced?: voiced?, host: host } buffer = Map.get(state.who_buffers, channel, []) @@ -706,7 +715,12 @@ defmodule ExIRC.Client do buffer = state |> Map.get(:who_buffers) |> Map.get(channel) - |> Enum.map(fn user -> struct(ExIRC.Who, user) end) + |> Enum.map(fn user -> + user = user + |> Map.put(:conn_server, server(state)) + |> Map.put(:network, network(state)) + struct(ExIRC.Who, user) + end) send_event {:who, channel, buffer}, state {:noreply, %ClientState{state | who_buffers: Map.delete(state.who_buffers, channel)}} @@ -779,7 +793,7 @@ defmodule ExIRC.Client do end # Called when someone else in our channel leaves def handle_data(%ExIRC.Message{cmd: "PART", nick: from, host: host, user: user} = msg, state) do - sender = %SenderInfo{nick: from, host: host, user: user} + sender = %SenderInfo{nick: from, host: host, user: user, conn_server: server(state), network: network(state)} channel = msg.args |> List.first |> String.trim if state.debug?, do: debug "#{from} LEFT A CHANNEL: #{channel}" channels = Channels.user_part(state.channels, channel, from) @@ -788,7 +802,7 @@ defmodule ExIRC.Client do {:noreply, new_state} end def handle_data(%ExIRC.Message{cmd: "QUIT", nick: from, host: host, user: user} = msg, state) do - sender = %SenderInfo{nick: from, host: host, user: user} + sender = %SenderInfo{nick: from, host: host, user: user, conn_server: server(state), network: network(state)} reason = msg.args |> List.first if state.debug?, do: debug "#{from} QUIT" channels = Channels.user_quit(state.channels, from) @@ -811,7 +825,7 @@ defmodule ExIRC.Client do end # Called when we are invited to a channel def handle_data(%ExIRC.Message{cmd: "INVITE", args: [nick, channel], nick: by, host: host, user: user} = msg, %ClientState{nick: nick} = state) do - sender = %SenderInfo{nick: by, host: host, user: user} + sender = %SenderInfo{nick: by, host: host, user: user, conn_server: server(state), network: network(state)} if state.debug?, do: debug "RECEIVED AN INVITE: #{msg.args |> Enum.join(" ")}" send_event {:invited, sender, channel}, state {:noreply, state} @@ -820,7 +834,7 @@ defmodule ExIRC.Client do def handle_data(%ExIRC.Message{cmd: "KICK", args: [channel, nick, reason], nick: by, host: host, user: user} = _msg, %ClientState{nick: nick} = state) do - sender = %SenderInfo{nick: by, host: host, user: user} + sender = %SenderInfo{nick: by, host: host, user: user, conn_server: server(state), network: network(state)} if state.debug?, do: debug "WE WERE KICKED FROM #{channel} BY #{by}" send_event {:kicked, sender, channel, reason}, state {:noreply, state} @@ -829,21 +843,21 @@ defmodule ExIRC.Client do def handle_data(%ExIRC.Message{cmd: "KICK", args: [channel, nick, reason], nick: by, host: host, user: user} = _msg, state) do - sender = %SenderInfo{nick: by, host: host, user: user} + sender = %SenderInfo{nick: by, host: host, user: user, conn_server: server(state), network: network(state)} if state.debug?, do: debug "#{nick} WAS KICKED FROM #{channel} BY #{by}" send_event {:kicked, nick, sender, channel, reason}, state {:noreply, state} end # Called when someone sends us a message def handle_data(%ExIRC.Message{nick: from, cmd: "PRIVMSG", args: [nick, message], host: host, user: user} = _msg, %ClientState{nick: nick} = state) do - sender = %SenderInfo{nick: from, host: host, user: user} + sender = %SenderInfo{nick: from, host: host, user: user, conn_server: server(state), network: network(state)} if state.debug?, do: debug "#{from} SENT US #{message}" send_event {:received, message, sender}, state {:noreply, state} end # Called when someone sends a message to a channel we're in, or a list of users def handle_data(%ExIRC.Message{nick: from, cmd: "PRIVMSG", args: [to, message], host: host, user: user} = _msg, %ClientState{nick: nick} = state) do - sender = %SenderInfo{nick: from, host: host, user: user} + sender = %SenderInfo{nick: from, host: host, user: user, conn_server: server(state), network: network(state)} if state.debug?, do: debug "#{from} SENT #{message} TO #{to}" send_event {:received, message, sender, to}, state # If we were mentioned, fire that event as well @@ -852,7 +866,7 @@ defmodule ExIRC.Client do end # Called when someone uses ACTION, i.e. `/me dies` def handle_data(%ExIRC.Message{nick: from, cmd: "ACTION", args: [channel, message], host: host, user: user} = _msg, state) do - sender = %SenderInfo{nick: from, host: host, user: user} + sender = %SenderInfo{nick: from, host: host, user: user, conn_server: server(state), network: network(state)} if state.debug?, do: debug "* #{from} #{message} in #{channel}" send_event {:me, message, sender, channel}, state {:noreply, state} @@ -863,7 +877,7 @@ defmodule ExIRC.Client do sender = %SenderInfo{nick: from, host: host, - user: user} + user: user, conn_server: server(state), network: network(state)} if String.contains?(message, "identify") do if state.debug?, do: debug("* Told to identify by #{from}: #{message}") @@ -914,4 +928,12 @@ defmodule ExIRC.Client do IO.puts(IO.ANSI.green() <> msg <> IO.ANSI.reset()) end + defp server(state) do + "#{state.server}:#{state.port}" + end + + defp network(state) do + state.configured_network || state.network || server(state) + end + end diff --git a/lib/exirc/sender_info.ex b/lib/exirc/sender_info.ex index eda901b..4117314 100644 --- a/lib/exirc/sender_info.ex +++ b/lib/exirc/sender_info.ex @@ -4,5 +4,7 @@ defmodule ExIRC.SenderInfo do """ defstruct nick: nil, host: nil, - user: nil + user: nil, + conn_server: nil, + network: nil end diff --git a/lib/exirc/utils.ex b/lib/exirc/utils.ex index 428379d..b913a88 100644 --- a/lib/exirc/utils.ex +++ b/lib/exirc/utils.ex @@ -135,7 +135,7 @@ defmodule ExIRC.Utils do %{state | channel_prefixes: prefixes} end defp isup_param("NETWORK=" <> network, state) do - %{state | network: network} + %{state | network: String.downcase(network)} end defp isup_param("PREFIX=" <> user_prefixes, state) do prefixes = Regex.run(~r/\((.*)\)(.*)/, user_prefixes, capture: :all_but_first) diff --git a/lib/exirc/who.ex b/lib/exirc/who.ex index 583717f..c07f1af 100644 --- a/lib/exirc/who.ex +++ b/lib/exirc/who.ex @@ -7,11 +7,14 @@ defmodule ExIRC.Who do half_operator?: nil, hops: nil, name: nil, - nickname: nil, + nick: nil, operator?: nil, - server: nil, + server: nil, + conn_server: nil, + network: nil, server_operator?: nil, user: nil, - voiced?: nil + voiced?: nil, + host: nil ] end -- cgit v1.2.3