#! 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::put_entry ($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->reply ($npc, "$board content:"); my $idx = 0; for (@$cont) { $who->reply ($npc, "<$idx> $_->[0]: $_->[1]"); $idx++; } } else { $who->reply ($npc, "$board is empty."); } 1 } sub do_remove { my ($board, $idx, $who, $npc) = @_; my $entry = CFBoard::get_entry ($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_entry ($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 board => 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 = cf::db_get "board"; sub get { my ($board) = @_; $BOARDDB->{"msg_$board"} ||= [] } sub get_entry { my ($board, $idx) = @_; $BOARDDB->{"msg_$board"}[$idx] } sub remove_entry { my ($board, $idx) = @_; my $entry = splice @{ $BOARDDB->{"msg_$board"} ||= [] }, $idx, 1; cf::db_dirty; $entry } sub clear { my ($board) = @_; delete $BOARDDB->{"msg_$board"}; cf::db_dirty; } sub put_entry { my ($board, $from, $message) = @_; my $entries = $BOARDDB->{"msg_$board"} ||= []; push @$entries, [$from, $message]; cf::db_dirty; } 1;