package Irc; use strict; use warnings; use Carp; use IO::Socket; sub new { my $class = shift; my $server = shift; my $self = { SERVER => $server, MYSOCKET => undef, }; my $closure = sub { my $field = shift; if (@_) { $self->{$field} = shift; } return $self->{$field}; }; bless ($closure, $class); return $closure; } # a public getter for the SERVER variable sub server { &{ $_[0] }("SERVER") } # a private getter/setter for the SOCKET variable sub socket { caller(0) eq __PACKAGE__ || confess "socket is a private method"; &{ $_[0] }( "MYSOCKET", @_[1..$#_] ); } # log on sub connect { my $self = shift; my $socket = IO::Socket::INET->new( $self->server() ); $self->socket($socket); } # logoff sub disconnect { my $self = shift; my $sock = $self->socket; print $sock "exit\r"; close $sock; } # send (and automatically append \r) sub send { my $self = shift; my $text = shift; my $sock = $self->socket; print $text . "\n"; print $sock $text . "\r"; } # receive something from the server sub read { my $self = shift; my $sock = $self->socket; PINGPONG: while (<$sock>) { print "$_"; # break after receiving PING if (/^PING :(.+)\r$/) { $self->send("PONG :$1"); last PINGPONG; } # break after receiving MOTD if (/ 376/) { last PINGPONG; } } } 1; #### #!/usr/bin/perl use strict; use warnings; use Irc; my $session = Irc->new("localhost:6667"); $session->connect(); $session->send("nick whatever"); $session->read(); $session->send("user whatever ignored v1.0 :perl hack"); $session->read(); $session->send("join #room1"); # now keep on reading until receiving the special logoff code ;) $session->read(); $session->disconnect();