ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/commands.ext
Revision: 1.20
Committed: Fri Mar 2 10:15:38 2007 UTC (17 years, 2 months ago) by pippijn
Branch: MAIN
Changes since 1.19: +36 -0 lines
Log Message:
some tiny cleanups and moving of non-time-critical commands into 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.19 cf::register_command afk => sub {
93     my ($ob, $arg) = @_;
94    
95     $ob->contr->ns->afk ($ob->contr->ns->afk ? 0 : 1);
96     $ob->reply (undef, $ob->contr->ns->afk ? "You are now AFK" : "You are no longer AFK");
97     };
98    
99 pippijn 1.20 cf::register_command brace => sub {
100     my ($ob, $arg) = @_;
101    
102     $ob->contr->braced ($ob->contr->braced ? 0 : 1);
103     $ob->reply (undef, $ob->contr->braced ? "You are braced." : "Not braced.");
104     };
105    
106     # XXX: This has a bug. After one sets his wimpy level to 0 and resets it to
107     # some other level (which may also be 0), this does not get echoed,
108     # but it does get set.
109     cf::register_command wimpy => sub {
110     my ($ob, $arg) = @_;
111    
112     my $wimpy = $ob->run_away;
113     return $ob->reply (undef, "Your current wimpy level is $wimpy.")
114     if $arg eq "";
115    
116     return $ob->run_away ($arg) && $ob->reply (undef, "Your new wimpy level is $arg.")
117     if $arg =~ /^\d+$/ and $arg <= 100;
118    
119     $ob->reply (undef, "Incorrect parameters for wimpy: $arg");
120     };
121    
122     cf::register_command peaceful => sub {
123     my ($ob, $arg) = @_;
124    
125     $ob->reply (undef, "You cannot change your peaceful setting with this command."
126     ." Please speak to the priest in the temple of Gorokh"
127     ." if you want to become hostile or in temple of Valriel"
128     ." if you want to become peaceful again.");
129    
130     #$ob->contr->peaceful ($ob->contr->peaceful ? 0 : 1);
131     #$ob->reply (undef, $ob->contr->peaceful ? "You will attack other players." : "You will not attack other players.");
132     };
133    
134    
135 root 1.1 cf::register_command rename => sub {
136     my ($ob, $arg) = @_;
137    
138     $ob->speed_left ($ob->speed_left - 0.25);
139    
140     if ($arg =~ /^\s* (?: <([^>]+)> \s+)? to \s+ <([^>]*)> \s*$/x) {
141     # compatibility syntax
142     rename_to $ob, $1, $2;
143     } elsif ($arg =~ /
144     ^\s*
145     (?:
146     (?: "((?:[^"]+|\\.)*)" | (\S+) )
147     \s+)?
148     to \s+
149     (?: "((?:[^"]+|\\.)*)" | (\S+) )
150     \s*$
151     /x) {
152     # does not unquote $1 or $3
153     rename_to $ob, $2||$1, $4||$3;
154     } else {
155     $ob->reply (undef, 'Syntax error. Rename usage: rename ["oldname"] to "newname"');
156     }
157    
158     1
159     };
160    
161     cf::register_command uptime => sub {
162     my ($ob, $arg) = @_;
163    
164     my $startup = POSIX::strftime "%Y-%m-%d %H:%M:%S %Z", localtime $cf::UPTIME;
165     my $runtime = sprintf "%.1f", (time - $cf::UPTIME) / 86400;
166     $ob->reply (undef, "server started $startup, uptime ${runtime}\d");
167    
168     1
169     };
170    
171 root 1.8 my %IN_MEMORY = (
172     cf::MAP_IN_MEMORY => "I",
173     cf::MAP_SWAPPED => "S",
174     cf::MAP_LOADING => "L",
175     );
176    
177 root 1.7 cf::register_command maps => sub {
178     my ($ob, $arg) = @_;
179    
180     no re 'eval'; $arg = qr<$arg>;
181    
182 root 1.13 my $format = "%2s %1s %3s %5s %.60s\n";
183 root 1.7
184 root 1.15 $ob->reply (undef, (sprintf $format, "Pl", "I", "Svd", "Reset", "Name"), cf::NDI_BLACK | cf::NDI_UNIQUE);
185 root 1.7
186     for (sort keys %cf::MAP) {
187     my $map = $cf::MAP{$_}
188     or next;
189    
190     next unless $map->path =~ $arg;
191 root 1.17 next if $map->{deny_list};
192 root 1.7
193 root 1.10 my $svd = int $cf::RUNTIME - $map->{last_save};
194     $svd = "++" if $svd > 99;
195    
196 root 1.14 $ob->reply (undef,
197     (sprintf $format,
198     (scalar $map->players),
199     $IN_MEMORY{$map->in_memory} || "?",
200     $svd,
201     (int $map->reset_at - $cf::RUNTIME),
202 root 1.17 $map->visible_name),
203 root 1.14 cf::NDI_BLACK | cf::NDI_UNIQUE);
204 root 1.7 }
205    
206     1
207     };
208