1package My::Chat;
2
3my @messages;
4my %users;
5
6sub join {
7  my $self = shift;
8  my $class = ref($self) || $self;
9  my $nick = shift      or die "User cannot join chat anonymously\n";
10  !exists $users{$nick} or die "User '$nick' is already in chatroom. Choose another nick\n";
11  $users{$nick} = time;
12  my $messages = shift || 10;
13  bless {
14    _nick        => $nick,
15    _users       => \%users,
16    _messages    => \@messages,
17    _lastmessage => ($#messages > $messages ? $#messages - $messages : -1),
18  } => $class;
19}
20
21sub get {
22  my $self = shift;
23  my $nick = $self->{_nick};
24  my @mess = grep {exists $users{$_->[0]} && $_->[0] ne $nick} @messages[($self->{_lastmessage}+1)..$#messages];
25  $self->{_lastmessage} = $#messages;
26  [@mess];
27}
28
29sub send {
30  push @messages, [shift->{_nick} => shift, time];
31  splice(@messages, 0, -12); # we'll keep only last 12 messages
32}
33
34sub whois { shift->{_users} }
35
36sub quit { my $self = shift; delete $self->{_users}->{$self->{_nick}} }
37
38sub DESTROY { shift->quit }
39
401;
41