ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/commands.ext
Revision: 1.26
Committed: Fri Mar 2 11:23:17 2007 UTC (17 years, 2 months ago) by pippijn
Branch: MAIN
Changes since 1.25: +14 -0 lines
Log Message:
mapinfo in perl

File Contents

# User Rev Content
1 root 1.1 #! perl
2    
3     use POSIX ();
4    
5     # miscellaneous commands
6    
7     sub rename_to($$$) {
8     my ($ob, $from, $to) = @_;
9    
10 root 1.12 $to =~ /^[a-zA-Z0-9.,=#\/%$!^ ]*$/
11 root 1.1 or return $ob->message ("rename: name must consist only of letters, digits, spaces and a few other things.");
12    
13     127 >= length $to
14     or return $ob->message ("rename: new name must be <= 127 characters.");
15    
16     my $item;
17    
18     if (length $from) {
19     $item = $ob->find_best_object_match ($from)
20     or return $ob->message ("rename: could not find a matching item to rename.");
21     } else {
22     $item = $ob->find_marked_object ()
23     or return $ob->message ("rename: no from name and no marked item found to rename.");
24     }
25    
26     $item->custom_name (length $to ? $to : undef);
27    
28     if (length $to) {
29     $item->custom_name ($to);
30     $ob->message ("Your " . $item->base_name . " will now be called $to.");
31     } else {
32     $item->custom_name (undef);
33     $ob->message ("You stop calling your " . $item->base_name . " with weird names.");
34     }
35    
36     $ob->esrv_update_item (cf::UPD_NAME, $item);
37    
38     1
39     }
40    
41     sub ext::schmorp_irc::users; # HACK: TODO: replace by signal
42    
43     sub who_listing(;$) {
44     my ($privileged) = @_;
45    
46     my ($numwiz, $numafk) = (0, 0);
47     my @pl;
48    
49     foreach my $pl (cf::player::list) {
50 root 1.5 my $ns = $pl->ns or next;
51 root 1.1 my $ob = $pl->ob;
52    
53     next unless $ob->map
54     && ($privileged || !$pl->hidden);
55    
56     $numwiz++ if $ob->flag (cf::FLAG_WIZ);
57 root 1.5 $numafk++ if $ns->afk;
58 root 1.1
59     push @pl, $pl;
60     }
61    
62     (
63     "Total Players in The World. (" . (scalar @pl) . ") -- WIZ($numwiz) AFK($numafk) BOT(0)",
64     (
65     map {
66 root 1.5 my ($pl, $ob, $ns) = ($_, $_->ob, $_->ns);
67 root 1.1
68     "* " . $ob->name . "/" . $ob->level . " " . (length $pl->own_title ? $pl->own_title : "the " . $pl->title)
69     . ($pl->peaceful ? " [peaceful]" : " [HOSTILE]")
70 root 1.5 . ($ns->afk ? " [AFK]" : "")
71 root 1.1 . ($ob->flag (cf::FLAG_WIZ) ? " [WIZ]" : "")
72 root 1.4 . " [" . $pl->ns->version . "]"
73 root 1.18 . " [" . ($pl->peaceful || $privileged ? $ob->map->visible_name : $ob->region->name) . "]"
74 root 1.4 . (sprintf " [rtt %.3fs]", $pl->ns->rtt * 1e-6)
75     . ($privileged ? " " . $pl->ns->host : "")
76 root 1.1 } sort { (lc $a->ob->name) cmp (lc $b->ob->name) } @pl
77     ),
78     eval { "* IRC: " . join ", ", ext::schmorp_irc::users },
79     )
80     }
81    
82     cf::register_command who => sub {
83     my ($ob, $arg) = @_;
84    
85     $ob->speed_left ($ob->speed_left - 0.25);
86    
87     $ob->reply (undef, (join "\n", who_listing $ob->may ("extended_who")), cf::NDI_UNIQUE | cf::NDI_DK_ORANGE);
88    
89     1
90     };
91    
92 pippijn 1.26 cf::register_command mapinfo => sub {
93     my ($ob) = @_;
94    
95     my $map = $ob->map
96     or return;
97     $ob->reply (undef, (sprintf "%s (%s) %s", $map->name, $map->path, $ob->region->longname));
98     $ob->reply (undef, (sprintf "players: %d difficulty: %d size: %d start: %dx%d timeout: %d",
99     $map->players, $map->difficulty, $map->width, $map->height, $map->enter_x, $map->enter_y, $map->timeout))
100     if $ob->flag (cf::FLAG_WIZ);
101     $ob->reply (undef, $map->msg);
102    
103     1
104     };
105    
106 pippijn 1.25 cf::register_command whereami => sub {
107     my ($ob) = @_;
108    
109     my $reg = $ob->region;
110     $ob->reply (undef, (sprintf "You are %s.\n%s", $reg->longname, $reg->msg));
111    
112     1
113     };
114    
115 pippijn 1.23 cf::register_command applymode => sub {
116     my ($ob, $arg) = @_;
117     my @types = ("nochoice", "never", "always");
118     my $mapping = {
119     nochoice => 1,
120     never => 2,
121     always => 3,
122     };
123    
124     my $oldmode = $ob->contr->unapply;
125     my $oldmode_name = $types[$oldmode];
126    
127     return $ob->reply (undef, "applymode is set to $oldmode_name")
128     unless $arg;
129    
130     return $ob->reply (undef, "applymode: Unknown options '$arg', valid options are @types")
131     unless $mapping->{$arg};
132    
133     $ob->contr->unapply ($mapping->{$arg} - 1); # HACK: because of the $mapping->{$arg} check before, where $arg should not be 0
134     # but $arg would be 0 if a user enters an incorrect value
135     $ob->reply (undef, "applymode" . ($oldmode == $ob->contr->unapply ? "" : " now") . " set to " . $types[$ob->contr->unapply]);
136    
137     1
138     };
139    
140     cf::register_command petmode => sub {
141     my ($ob, $arg) = @_;
142     my @types = ("normal", "sad", "defend", "arena");
143     my $mapping = {
144     normal => 1,
145     sad => 2,
146     defend => 3,
147     arena => 4,
148     };
149    
150     my $oldtype = $ob->contr->petmode;
151     my $oldtype_name = $types[$oldtype];
152    
153     return $ob->reply (undef, "petmode is set to $oldtype_name")
154     unless $arg;
155    
156     return $ob->reply (undef, "petmode: Unknown options '$arg', valid options are @types")
157     unless $mapping->{$arg};
158    
159     $ob->contr->petmode ($mapping->{$arg} - 1); # HACK: because of the $mapping->{$arg} check before, where $arg should not be 0
160     # but $arg would be 0 if a user enters an incorrect value
161     $ob->reply (undef, "petmode" . ($oldtype == $ob->contr->petmode ? "" : " now") . " set to " . $types[$ob->contr->petmode]);
162    
163     1
164     };
165    
166 pippijn 1.21 cf::register_command usekeys => sub {
167     my ($ob, $arg) = @_;
168     my @types = ("inventory", "keyrings", "containers");
169     my $mapping = {
170     inventory => 1,
171     keyrings => 2,
172     containers => 3,
173     };
174    
175     my $oldtype = $ob->contr->usekeys;
176     my $oldtype_name = $types[$oldtype];
177    
178     return $ob->reply (undef, "usekeys is set to $oldtype_name")
179     unless $arg;
180    
181 pippijn 1.23 return $ob->reply (undef, "usekeys: Unknown options '$arg', valid options are @types")
182 pippijn 1.21 unless $mapping->{$arg};
183    
184     $ob->contr->usekeys ($mapping->{$arg} - 1); # HACK: because of the $mapping->{$arg} check before, where $arg should not be 0
185     # but $arg would be 0 if a user enters an incorrect value
186     $ob->reply (undef, "usekeys" . ($oldtype == $ob->contr->usekeys ? "" : " now") . " set to " . $types[$ob->contr->usekeys]);
187 pippijn 1.22
188     1
189 pippijn 1.21 };
190    
191 pippijn 1.19 cf::register_command afk => sub {
192     my ($ob, $arg) = @_;
193    
194     $ob->contr->ns->afk ($ob->contr->ns->afk ? 0 : 1);
195     $ob->reply (undef, $ob->contr->ns->afk ? "You are now AFK" : "You are no longer AFK");
196 pippijn 1.22
197     1
198 pippijn 1.19 };
199    
200 pippijn 1.21 cf::register_command sound => sub {
201     my ($ob, $arg) = @_;
202    
203     $ob->contr->ns->sound ($ob->contr->ns->sound ? 0 : 1);
204     $ob->reply (undef, $ob->contr->ns->sound ? "The sounds are enabled." : "Silence is golden...");
205 pippijn 1.22
206     1
207 pippijn 1.21 };
208    
209 pippijn 1.20 cf::register_command brace => sub {
210     my ($ob, $arg) = @_;
211    
212     $ob->contr->braced ($ob->contr->braced ? 0 : 1);
213     $ob->reply (undef, $ob->contr->braced ? "You are braced." : "Not braced.");
214 pippijn 1.22
215     1
216 pippijn 1.20 };
217    
218 pippijn 1.24 cf::register_command 'output-count' => sub {
219     my ($ob, $arg) = @_;
220    
221     return $ob->reply (undef, "Output count is presently " . $ob->contr->outputs_count)
222     unless $arg > 0;
223    
224     $ob->contr->outputs_count ($arg);
225     $ob->reply (undef, "Output count now set to " . $ob->contr->outputs_count);
226    
227     1
228     };
229    
230     cf::register_command 'output-sync' => sub {
231     my ($ob, $arg) = @_;
232    
233     return $ob->reply (undef, "Output sync time is presently " . $ob->contr->outputs_sync)
234     unless $arg > 0;
235    
236     $ob->contr->outputs_sync ($arg);
237     $ob->reply (undef, "Output sync time now set to " . $ob->contr->outputs_sync);
238    
239     1
240     };
241    
242 pippijn 1.20 # XXX: This has a bug. After one sets his wimpy level to 0 and resets it to
243     # some other level (which may also be 0), this does not get echoed,
244     # but it does get set.
245     cf::register_command wimpy => sub {
246     my ($ob, $arg) = @_;
247    
248     my $wimpy = $ob->run_away;
249     return $ob->reply (undef, "Your current wimpy level is $wimpy.")
250     if $arg eq "";
251    
252     return $ob->run_away ($arg) && $ob->reply (undef, "Your new wimpy level is $arg.")
253     if $arg =~ /^\d+$/ and $arg <= 100;
254    
255     $ob->reply (undef, "Incorrect parameters for wimpy: $arg");
256 pippijn 1.22
257     1
258 pippijn 1.20 };
259    
260     cf::register_command peaceful => sub {
261     my ($ob, $arg) = @_;
262    
263     $ob->reply (undef, "You cannot change your peaceful setting with this command."
264     ." Please speak to the priest in the temple of Gorokh"
265     ." if you want to become hostile or in temple of Valriel"
266     ." if you want to become peaceful again.");
267    
268     #$ob->contr->peaceful ($ob->contr->peaceful ? 0 : 1);
269     #$ob->reply (undef, $ob->contr->peaceful ? "You will attack other players." : "You will not attack other players.");
270 pippijn 1.22
271     1
272 pippijn 1.20 };
273    
274 root 1.1 cf::register_command rename => sub {
275     my ($ob, $arg) = @_;
276    
277     $ob->speed_left ($ob->speed_left - 0.25);
278    
279     if ($arg =~ /^\s* (?: <([^>]+)> \s+)? to \s+ <([^>]*)> \s*$/x) {
280     # compatibility syntax
281     rename_to $ob, $1, $2;
282     } elsif ($arg =~ /
283     ^\s*
284     (?:
285     (?: "((?:[^"]+|\\.)*)" | (\S+) )
286     \s+)?
287     to \s+
288     (?: "((?:[^"]+|\\.)*)" | (\S+) )
289     \s*$
290     /x) {
291     # does not unquote $1 or $3
292     rename_to $ob, $2||$1, $4||$3;
293     } else {
294     $ob->reply (undef, 'Syntax error. Rename usage: rename ["oldname"] to "newname"');
295     }
296    
297     1
298     };
299    
300     cf::register_command uptime => sub {
301     my ($ob, $arg) = @_;
302    
303     my $startup = POSIX::strftime "%Y-%m-%d %H:%M:%S %Z", localtime $cf::UPTIME;
304     my $runtime = sprintf "%.1f", (time - $cf::UPTIME) / 86400;
305     $ob->reply (undef, "server started $startup, uptime ${runtime}\d");
306    
307     1
308     };
309    
310 root 1.8 my %IN_MEMORY = (
311     cf::MAP_IN_MEMORY => "I",
312     cf::MAP_SWAPPED => "S",
313     cf::MAP_LOADING => "L",
314     );
315    
316 root 1.7 cf::register_command maps => sub {
317     my ($ob, $arg) = @_;
318    
319     no re 'eval'; $arg = qr<$arg>;
320    
321 root 1.13 my $format = "%2s %1s %3s %5s %.60s\n";
322 root 1.7
323 root 1.15 $ob->reply (undef, (sprintf $format, "Pl", "I", "Svd", "Reset", "Name"), cf::NDI_BLACK | cf::NDI_UNIQUE);
324 root 1.7
325     for (sort keys %cf::MAP) {
326     my $map = $cf::MAP{$_}
327     or next;
328    
329     next unless $map->path =~ $arg;
330 root 1.17 next if $map->{deny_list};
331 root 1.7
332 root 1.10 my $svd = int $cf::RUNTIME - $map->{last_save};
333     $svd = "++" if $svd > 99;
334    
335 root 1.14 $ob->reply (undef,
336     (sprintf $format,
337     (scalar $map->players),
338     $IN_MEMORY{$map->in_memory} || "?",
339     $svd,
340     (int $map->reset_at - $cf::RUNTIME),
341 root 1.17 $map->visible_name),
342 root 1.14 cf::NDI_BLACK | cf::NDI_UNIQUE);
343 root 1.7 }
344    
345     1
346     };
347