#! perl sub do_help { my ($board, $who, $npc) = @_; $who->reply ($npc, "Help for $board\n" ."List of commands:\n\n" ."- list\n" ."- write \n" ."- remove \n" ); } sub do_write { my ($board, $msg, $who, $npc) = @_; if ($msg =~ /\S/) { CFBoard::write ($board, $who->name, $msg); $who->reply ($npc, "Added entry."); } else { $who->reply ($npc, "Usage: write \n"); } 1 } sub do_list { my ($board, $who, $npc) = @_; my $cont = CFBoard::get ($board); if (@{$cont || []}) { $who->message ("$board content:", cf::NDI_BROWN | cf::NDI_UNIQUE); my $idx = 0; for (@$cont) { $who->message ("<$idx> $_->[0]: $_->[1]", cf::NDI_BROWN | cf::NDI_UNIQUE); $idx++; } } else { $who->message ("$board is empty.", cf::NDI_BROWN | cf::NDI_UNIQUE); } 1 } sub do_remove { my ($board, $idx, $who, $npc) = @_; my $entry = CFBoard::get_idx ($board, $idx); unless (defined $entry) { $who->reply ($npc, "No such entry."); return 1; } if ($entry->[0] eq $who->name or $who->flag (cf::FLAG_WIZ)) { my $e = CFBoard::remove_idx ($board, $idx); $who->reply ($npc, "Removed entry $idx ($e->[0]: $e->[1])."); } else { $who->reply ($npc, "Access denied."); } 1 } # this is the main command interface for the IPO NPC cf::register_script_function "board::command" => sub { my ($who, $msg, $npc) = @_; my $board = $npc->name; if ($msg =~ /^list$/i) { do_list ($board, $who, $npc); } elsif ($msg =~ /^write (.+)$/i) { do_write ($board, $1, $who, $npc); } elsif ($msg =~ /^remove (\d+)$/i) { do_remove ($board, $1, $who, $npc); } else { do_help ($board, $who, $npc); } 1 }; cf::register_attachment messageboard => on_apply => sub { my ($npc, $who) = @_; $who->reply ($npc, "Hello, i'm a talking board, 'say help' to get help"); do_list ($npc->name, $who, $npc); cf::override; }, ; package CFBoard; use POSIX qw/strftime/; use CFDB; my $BOARDDB = CFDB->new (db_file => cf::localdir . "/crossfireboard.perl"); sub get { my ($board) = @_; $BOARDDB->get ($board); } sub get_idx { my ($board, $idx) = @_; $board = $BOARDDB->get ($board); return $board->[$idx]; } sub remove_idx { my ($boardname, $idx) = @_; my $board = $BOARDDB->get ($boardname); my $e = splice @$board, $idx, 1; $BOARDDB->set ($boardname, $board); $e } sub clear { my ($board) = @_; $BOARDDB->clear ($board); } sub write { my ($board, $from, $message) = @_; my $boardentrys = $BOARDDB->get ($board); push @$boardentrys, [$from, $message]; $BOARDDB->set ($board, $boardentrys); } 1;