1 | #! perl |
1 | #! perl |
2 | #CONVERSION: NONE |
|
|
3 | |
2 | |
4 | sub do_help { |
3 | sub do_help { |
5 | my ($board, $who, $npc) = @_; |
4 | my ($board, $who, $npc) = @_; |
6 | $who->reply ($npc, |
5 | $who->reply ($npc, |
7 | "Help for $board\n" |
6 | "Help for $board\n" |
… | |
… | |
13 | } |
12 | } |
14 | |
13 | |
15 | sub do_write { |
14 | sub do_write { |
16 | my ($board, $msg, $who, $npc) = @_; |
15 | my ($board, $msg, $who, $npc) = @_; |
17 | if ($msg =~ /\S/) { |
16 | if ($msg =~ /\S/) { |
18 | CFBoard::write ($board, $who->name, $msg); |
17 | CFBoard::put_entry ($board, $who->name, $msg); |
19 | $who->reply ($npc, "Added entry."); |
18 | $who->reply ($npc, "Added entry."); |
20 | } else { |
19 | } else { |
21 | $who->reply ($npc, "Usage: write <message>\n"); |
20 | $who->reply ($npc, "Usage: write <message>\n"); |
22 | } |
21 | } |
23 | 1 |
22 | 1 |
… | |
… | |
25 | |
24 | |
26 | sub do_list { |
25 | sub do_list { |
27 | my ($board, $who, $npc) = @_; |
26 | my ($board, $who, $npc) = @_; |
28 | my $cont = CFBoard::get ($board); |
27 | my $cont = CFBoard::get ($board); |
29 | if (@{$cont || []}) { |
28 | if (@{$cont || []}) { |
30 | $who->message ("$board content:", cf::NDI_BROWN | cf::NDI_UNIQUE); |
29 | $who->reply ($npc, "$board content:"); |
31 | my $idx = 0; |
30 | my $idx = 0; |
32 | for (@$cont) { |
31 | for (@$cont) { |
33 | $who->message ("<$idx> $_->[0]: $_->[1]", cf::NDI_BROWN | cf::NDI_UNIQUE); |
32 | $who->reply ($npc, "<$idx> $_->[0]: $_->[1]"); |
34 | $idx++; |
33 | $idx++; |
35 | } |
34 | } |
36 | } else { |
35 | } else { |
37 | $who->message ("$board is empty.", cf::NDI_BROWN | cf::NDI_UNIQUE); |
36 | $who->reply ($npc, "$board is empty."); |
38 | } |
37 | } |
39 | 1 |
38 | 1 |
40 | } |
39 | } |
41 | |
40 | |
42 | sub do_remove { |
41 | sub do_remove { |
43 | my ($board, $idx, $who, $npc) = @_; |
42 | my ($board, $idx, $who, $npc) = @_; |
44 | |
43 | |
45 | my $entry = CFBoard::get_idx ($board, $idx); |
44 | my $entry = CFBoard::get_entry ($board, $idx); |
46 | unless (defined $entry) { |
45 | unless (defined $entry) { |
47 | $who->reply ($npc, "No such entry."); |
46 | $who->reply ($npc, "No such entry."); |
48 | return 1; |
47 | return 1; |
49 | } |
48 | } |
50 | |
49 | |
51 | if ($entry->[0] eq $who->name or $who->flag (cf::FLAG_WIZ)) { |
50 | if ($entry->[0] eq $who->name or $who->flag (cf::FLAG_WIZ)) { |
52 | my $e = CFBoard::remove_idx ($board, $idx); |
51 | my $e = CFBoard::remove_entry ($board, $idx); |
53 | $who->reply ($npc, "Removed entry $idx ($e->[0]: $e->[1])."); |
52 | $who->reply ($npc, "Removed entry $idx ($e->[0]: $e->[1])."); |
54 | } else { |
53 | } else { |
55 | $who->reply ($npc, "Access denied."); |
54 | $who->reply ($npc, "Access denied."); |
56 | } |
55 | } |
57 | |
56 | |
… | |
… | |
74 | } |
73 | } |
75 | |
74 | |
76 | 1 |
75 | 1 |
77 | }; |
76 | }; |
78 | |
77 | |
79 | sub on_apply { |
78 | cf::register_attachment board => |
|
|
79 | on_apply => sub { |
80 | my ($ev, $npc, $who) = @_; |
80 | my ($npc, $who) = @_; |
81 | $who->reply ($npc, "Hello, i'm a talking board, 'say help' to get help"); |
81 | $who->reply ($npc, "Hello, i'm a talking board, 'say help' to get help"); |
82 | do_list ($npc->name, $who, $npc); |
82 | do_list ($npc->name, $who, $npc); |
83 | 1; |
83 | cf::override; |
84 | } |
84 | }, |
|
|
85 | ; |
85 | |
86 | |
86 | package CFBoard; |
87 | package CFBoard; |
|
|
88 | |
87 | use POSIX qw/strftime/; |
89 | use POSIX qw/strftime/; |
88 | use CFDB; |
90 | use CFDB; |
89 | |
91 | |
90 | my $BOARDDB = CFDB->new (db_file => cf::localdir . "/crossfireboard.perl"); |
92 | my $BOARDDB = cf::db_get "board"; |
91 | |
93 | |
92 | sub get { |
94 | sub get { |
93 | my ($board) = @_; |
95 | my ($board) = @_; |
94 | $BOARDDB->get ($board); |
96 | |
|
|
97 | $BOARDDB->{"msg_$board"} ||= [] |
95 | } |
98 | } |
96 | |
99 | |
97 | sub get_idx { |
100 | sub get_entry { |
98 | my ($board, $idx) = @_; |
101 | my ($board, $idx) = @_; |
99 | $board = $BOARDDB->get ($board); |
102 | |
100 | return $board->[$idx]; |
103 | $BOARDDB->{"msg_$board"}[$idx] |
101 | } |
104 | } |
102 | |
105 | |
103 | sub remove_idx { |
106 | sub remove_entry { |
104 | my ($boardname, $idx) = @_; |
107 | my ($board, $idx) = @_; |
105 | my $board = $BOARDDB->get ($boardname); |
108 | |
106 | my $e = splice @$board, $idx, 1; |
109 | my $entry = splice @{ $BOARDDB->{"msg_$board"} ||= [] }, $idx, 1; |
107 | $BOARDDB->set ($boardname, $board); |
110 | cf::db_dirty; |
108 | $e |
111 | $entry |
109 | } |
112 | } |
110 | |
113 | |
111 | sub clear { |
114 | sub clear { |
112 | my ($board) = @_; |
115 | my ($board) = @_; |
113 | $BOARDDB->clear ($board); |
116 | |
|
|
117 | delete $BOARDDB->{"msg_$board"}; |
|
|
118 | cf::db_dirty; |
114 | } |
119 | } |
115 | |
120 | |
116 | sub write { |
121 | sub put_entry { |
117 | my ($board, $from, $message) = @_; |
122 | my ($board, $from, $message) = @_; |
118 | my $boardentrys = $BOARDDB->get ($board); |
123 | |
|
|
124 | my $entries = $BOARDDB->{"msg_$board"} ||= []; |
119 | push @$boardentrys, [$from, $message]; |
125 | push @$entries, [$from, $message]; |
120 | $BOARDDB->set ($board, $boardentrys); |
126 | cf::db_dirty; |
121 | } |
127 | } |
122 | |
128 | |
123 | 1; |
129 | 1; |