#
# простой irc client.
#
irc.server.node(name, addr, port, user, fd) type;
irc.server(name, addr, port, user)
{
node = new irc.server.node(name, addr, port, user, 0);
return node;
connect(node)
{
node.fd = posix.net.connect(node.addr, node.port);
std.echo("fd: ", string(node.fd));
if ( node.fd )
return true;
return false;
}
send(node, data)
{
crlf = new[2];
crlf[0] = 13;
crlf[1] = 10;
msg = data + crlf;
posix.io.write(node.fd, msg, sizeof(msg));
}
recv(node)
return posix.io.read(node.fd, 100);
login(node)
{
send(node, "NICK " + node.user.nick);
send(node, "USER " + node.user.nick +
" none none :" + node.user.nick);
}
}
irc.user.node(nick) type;
irc.user(nick)
return new irc.user.node(nick);
irc.channel.node(server, name) type;
irc.channel(server, name)
{
return new irc.channel.node(server, name);
join(channel)
irc.server.send(channel.server, "JOIN " + channel.name);
part(channel)
irc.server.send(channel.server, "PART " + channel.name);
say(channel, text)
irc.server.send(channel.server, "PRIVMSG " +
channel.name + " :" + text);
}
irc.client.node(user, server, channels) type;
irc.client(nickname, sname, addr, port)
{
client = new irc.client.node(null, null, null);
client.user = new irc.user(nickname);
client.server =
new irc.server(sname, addr, port, client.user);
client.channels = new std.list();
return client;
join(client, name)
{
if ( match(client, name) )
return false;
channel = new irc.channel(client.server, name);
irc.channel.join(channel);
std.list.add(client.channels, channel);
return true;
}
connect(client)
{
if ( !irc.server.connect(client.server) )
return false;
irc.server.login(client.server);
return true;
}
say(client, channel, text)
{
c = match(client, channel);
if ( c == null )
return false;
irc.channel.say(c, text);
return true;
}
match(client, name)
{
iter = new std.list.iter(client.channels);
while ( !std.list.iter.end(iter) )
if ( std.list.iter.get(iter).name == name )
return std.list.iter.get(iter);
}
}
main() agent
{
client = new irc.client("tswttt",
"wenet", "78.108.81.133", 6667);
if ( !irc.client.connect(client) )
oops("failed to connect to " + client.server.addr);
std.echo("joined");
irc.client.join(client, "#ripland");
irc.client.say(client, "#ripland", "hello \o/");
while ( 1 )
irc.server.recv(client.server);
oops(reason)
{
std.echo("oops: " + reason);
posix.sys.halt(0);
}
}
# vim:syntax=edge