package My::Chat;
my @messages;
my %users;
sub join {
my $self = shift;
my $class = ref($self) || $self;
my $nick = shift or die "User cannot join chat anonymously\n";
!exists $users{$nick} or die "User '$nick' is already in chatroom. Choose another nick\n";
$users{$nick} = time;
my $messages = shift || 10;
bless {
_nick => $nick,
_users => \%users,
_messages => \@messages,
_lastmessage => ($#messages > $messages ? $#messages - $messages : -1),
} => $class;
}
sub get {
my $self = shift;
my $nick = $self->{_nick};
my @mess = grep {exists $users{$_->[0]} && $_->[0] ne $nick} @messages[($self->{_lastmessage}+1)..$#messages];
$self->{_lastmessage} = $#messages;
[@mess];
}
sub send {
push @messages, [shift->{_nick} => shift, time];
splice(@messages, 0, -12); # we'll keep only last 12 messages
}
sub whois { shift->{_users} }
sub quit { my $self = shift; delete $self->{_users}->{$self->{_nick}} }
sub DESTROY { shift->quit }
1;