# A simple chat server user manager.
# Implements CheezyChat's user database and chat
# message broadcaster.
# Copyright 2004 by Rocco Caputo.  Free software.
# Same terms as Perl itself.  Have fun!

package ChatUser;

use warnings;
use strict;

use POE::Kernel;

my %nick_to_id;
my %id_to_nick;

sub logout {
  my ($class, $id) = @_;
  ChatUser->emote($id, "has left.");
  my $nick = delete $id_to_nick{$id};
  return unless defined $nick;
  delete $nick_to_id{$nick};
}

sub login {
  my ($class, $id, $nick) = @_;
  $nick_to_id{$nick} = $id;
  $id_to_nick{$id} = $nick;
  ChatUser->emote($id, "has arrived.");
}

sub is_on {
  my ($class, $id) = @_;
  return exists $nick_to_id{$id};
}

sub get_users {
  return sort keys %nick_to_id;
}

sub broadcast {
  my ($class, $id, $message) = @_;
  foreach (values %nick_to_id) {
    $poe_kernel->post($_, "hear", $message);
  }
}

sub say {
  my ($class, $id, $message) = @_;
  my $nick = $id_to_nick{$id};
  return unless defined $nick;
  ChatUser->broadcast($id, "<$nick> $message");
}

sub emote {
  my ($class, $id, $message) = @_;
  my $nick = $id_to_nick{$id};
  return unless defined $nick;
  ChatUser->broadcast($id, "$nick $message");
}

1;
