Altnick implementation, initial stuff for handler
This commit is contained in:
parent
9efbee9c6a
commit
e4e78a167f
3 changed files with 59 additions and 19 deletions
|
@ -2,8 +2,8 @@ defmodule Nulform do
|
||||||
|
|
||||||
def run() do
|
def run() do
|
||||||
connection = spawn Nulform.Connection, :run, []
|
connection = spawn Nulform.Connection, :run, []
|
||||||
connection <- {:nulform, :connect, 'irc.quakenet.org', 6667, "Nulform",
|
connection <- {:nulform, :connect, 'irc.quakenet.org', 6667, "Nicd",
|
||||||
nil, "nulform", "␀form"}
|
"kummitus", "nulform", "␀form"}
|
||||||
|
|
||||||
IO.puts("Sent message")
|
IO.puts("Sent message")
|
||||||
receive do
|
receive do
|
||||||
|
|
|
@ -1,31 +1,37 @@
|
||||||
defmodule Nulform.Connection do
|
defmodule Nulform.Connection do
|
||||||
@moduledoc """
|
@moduledoc """
|
||||||
Connection is a module to handle a single IRC connection to an IRC server.
|
Connection is a module to handle a single IRC connection to an IRC
|
||||||
|
server.
|
||||||
|
|
||||||
|
Connection automatically handles using an altnick (but only one) and
|
||||||
|
responding to pings.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def run() do
|
def run() do
|
||||||
run nil, nil, nil, nil, nil, nil, nil
|
run nil, nil, nil, nil, nil, nil, nil, nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def run(sock, host, port, nick, altnick, username, realname) do
|
def run(sock, handler, host, port, nick, altnick, username, realname) do
|
||||||
receive do
|
receive do
|
||||||
{:nulform, :connect, host, port, nick, altnick, username, realname} ->
|
{:nulform, :connect, host, port, nick, altnick, username, realname} ->
|
||||||
{:ok, sock} = connect host, port
|
{:ok, sock} = connect host, port
|
||||||
|
|
||||||
|
# TODO: Do we need to delay here on some networks?
|
||||||
|
send sock, "NICK " <> nick
|
||||||
|
send sock, "USER " <> username <> " 8 * :" <> realname
|
||||||
|
|
||||||
|
{:nulform, :set_parent, handler} ->
|
||||||
|
nil
|
||||||
|
|
||||||
|
{:nulform, :msg_out, msg} ->
|
||||||
|
send sock, msg
|
||||||
|
|
||||||
{:tcp, sock, msg} ->
|
{:tcp, sock, msg} ->
|
||||||
stripped = String.rstrip msg
|
stripped = String.rstrip msg
|
||||||
IO.puts stripped
|
IO.puts stripped
|
||||||
|
tell_handler handler, stripped
|
||||||
|
|
||||||
case stripped do
|
# Handle PING responses
|
||||||
"NOTICE AUTH :*** Looking up your hostname" ->
|
|
||||||
send sock, "NICK " <> nick
|
|
||||||
send sock, "USER " <> username <> " 8 * :" <> realname
|
|
||||||
|
|
||||||
_ ->
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
case String.split stripped, ":" do
|
case String.split stripped, ":" do
|
||||||
["PING " | rest] when is_list rest ->
|
["PING " | rest] when is_list rest ->
|
||||||
concat_list = fn
|
concat_list = fn
|
||||||
|
@ -39,14 +45,25 @@ defmodule Nulform.Connection do
|
||||||
|
|
||||||
send sock, "PONG :" <> concat_list.(concat_list, rest, ":")
|
send sock, "PONG :" <> concat_list.(concat_list, rest, ":")
|
||||||
|
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
end
|
end
|
||||||
|
|
||||||
tuple when is_tuple(tuple) and elem(tuple, 0) == :nulform -> Nulform.Utils.hn(tuple)
|
# Change to altnick when nick is already in use
|
||||||
|
# TODO: May not work on all networks
|
||||||
|
# We change the altnick to avoid an infinite loop
|
||||||
|
# TODO: New altnick is predictable, no seeding
|
||||||
|
case String.split stripped do
|
||||||
|
[_, "433" | _] ->
|
||||||
|
send sock, "NICK " <> altnick
|
||||||
|
uniqid = to_binary :random.uniform(9999)
|
||||||
|
altnick = String.slice(altnick, 0, 10) <> "-" <> uniqid
|
||||||
|
_ ->
|
||||||
|
end
|
||||||
|
|
||||||
|
tuple when is_tuple(tuple) and elem(tuple, 0) == :nulform -> Nulform.Utils.hn tuple
|
||||||
end
|
end
|
||||||
|
|
||||||
run sock, host, port, nick, altnick, username, realname
|
run sock, handler, host, port, nick, altnick, username, realname
|
||||||
end
|
end
|
||||||
|
|
||||||
defp connect(host, port) do
|
defp connect(host, port) do
|
||||||
|
@ -55,8 +72,20 @@ defmodule Nulform.Connection do
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
def send(sock, msg) do
|
defp disconnect(sock) do
|
||||||
|
:gen_tcp.close sock
|
||||||
|
end
|
||||||
|
|
||||||
|
defp send(sock, msg) do
|
||||||
:ok = :gen_tcp.send sock, msg <> "\r\n"
|
:ok = :gen_tcp.send sock, msg <> "\r\n"
|
||||||
IO.puts("<- " <> msg)
|
IO.puts("<- " <> msg)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp tell_handler(handler, msg) when is_pid handler do
|
||||||
|
handler <- {:nulform, :msg_in, msg}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp tell_handler(_, msg) do
|
||||||
|
nil
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
11
lib/nulform/handler.ex
Normal file
11
lib/nulform/handler.ex
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
defmodule Nulform.Handler do
|
||||||
|
@moduledoc """
|
||||||
|
A handler manages plugins for a connection or other IRC message source.
|
||||||
|
It takes in messages from the IRC server and relays them to plugins. It
|
||||||
|
also starts up the plugins and manages their lifetime.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def run() do
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue