summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Bracco <href@random.sh>2021-09-01 12:11:11 +0200
committerJordan Bracco <href@random.sh>2021-09-01 12:11:11 +0200
commitbe82ffd6f3b6f6708b3d405e68033b0db16f855f (patch)
tree52140cb4d6d51c7b70f8f4842bda2bb3b38232ab
parentFix a parens warning and indentation (diff)
Commit ircbot fork
-rw-r--r--lib/exirc/client.ex62
-rw-r--r--lib/exirc/sender_info.ex4
-rw-r--r--lib/exirc/utils.ex2
-rw-r--r--lib/exirc/who.ex9
4 files changed, 52 insertions, 25 deletions
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