I've been experimenting with Erlang for a while now, and it's been an experience. I've had a little rougher time with it than most people, but most of the blogs I've been reading are written by exceptional or brilliant programmers, so I'm not too concerned :).
I went ahead and wrote myself a little Erlang IRC bot, as I had a hard time finding one that I could extend that isn't
5 years old and way too big or
doesn't even work when installed using apt-get install (not to mention I couldn't find its source, either).

Here's what I came up with:
-module(bot).
-author("jonathan.roes@gmail.com").
-export([connect/2, loop/1]).
-define(nickname, "jroes-test").
-define(channel, "#jroes-test").
connect(Host, Port) ->
{ok, Sock} = gen_tcp:connect(Host, Port, [{packet, line}]),
gen_tcp:send(Sock, "NICK " ++ ?nickname ++ "\r\n"),
gen_tcp:send(Sock, "USER " ++ ?nickname ++ " blah blah blah blah\r\n"),
loop(Sock).
loop(Sock) ->
receive
{tcp, Sock, Data} ->
io:format("[~w] Received: ~s", [Sock, Data]),
parse_line(Sock, string:tokens(Data, ": ")),
loop(Sock);
quit ->
io:format("[~w] Received quit message, exiting...~n", [Sock]),
gen_tcp:close(Sock),
exit(stopped)
end.
parse_line(Sock, [User,"PRIVMSG",Channel,?nickname|_]) ->
Nick = lists:nth(1, string:tokens(User, "!")),
irc_privmsg(Sock, Channel, "You talkin to me, " ++ Nick ++ "?");
parse_line(Sock, [_,"376"|_]) ->
gen_tcp:send(Sock, "JOIN :" ++ ?channel ++ "\r\n");
parse_line(Sock, ["PING"|Rest]) ->
gen_tcp:send(Sock, "PONG " ++ Rest ++ "\r\n");
parse_line(_, _) ->
0.
irc_privmsg(Sock, To, Message) ->
gen_tcp:send(Sock, "PRIVMSG " ++ To ++ " :" ++ Message ++ "\r\n").
To run and play with:
jroes@halcyon:~/src$ wget http://jroes.net/bot.erl
jroes@halcyon:~/src$ erl
1> c("bot.erl").
{ok,bot}
2> Bot = spawn(bot, connect, ["irc.server.com", 6667]).
3> Bot ! quit.
Next up: Extending it so the code can be changed/added to at runtime, retrieving data from a webservice.