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, 3 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

# Content
1 #! perl
2
3 use POSIX ();
4
5 # miscellaneous commands
6
7 sub rename_to($$$) {
8 my ($ob, $from, $to) = @_;
9
10 $to =~ /^[a-zA-Z0-9.,=#\/%$!^ ]*$/
11 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 my $ns = $pl->ns or next;
51 my $ob = $pl->ob;
52
53 next unless $ob->map
54 && ($privileged || !$pl->hidden);
55
56 $numwiz++ if $ob->flag (cf::FLAG_WIZ);
57 $numafk++ if $ns->afk;
58
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 my ($pl, $ob, $ns) = ($_, $_->ob, $_->ns);
67
68 "* " . $ob->name . "/" . $ob->level . " " . (length $pl->own_title ? $pl->own_title : "the " . $pl->title)
69 . ($pl->peaceful ? " [peaceful]" : " [HOSTILE]")
70 . ($ns->afk ? " [AFK]" : "")
71 . ($ob->flag (cf::FLAG_WIZ) ? " [WIZ]" : "")
72 . " [" . $pl->ns->version . "]"
73 . " [" . ($pl->peaceful || $privileged ? $ob->map->visible_name : $ob->region->name) . "]"
74 . (sprintf " [rtt %.3fs]", $pl->ns->rtt * 1e-6)
75 . ($privileged ? " " . $pl->ns->host : "")
76 } 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 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 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 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 my %IN_MEMORY = (
172 cf::MAP_IN_MEMORY => "I",
173 cf::MAP_SWAPPED => "S",
174 cf::MAP_LOADING => "L",
175 );
176
177 cf::register_command maps => sub {
178 my ($ob, $arg) = @_;
179
180 no re 'eval'; $arg = qr<$arg>;
181
182 my $format = "%2s %1s %3s %5s %.60s\n";
183
184 $ob->reply (undef, (sprintf $format, "Pl", "I", "Svd", "Reset", "Name"), cf::NDI_BLACK | cf::NDI_UNIQUE);
185
186 for (sort keys %cf::MAP) {
187 my $map = $cf::MAP{$_}
188 or next;
189
190 next unless $map->path =~ $arg;
191 next if $map->{deny_list};
192
193 my $svd = int $cf::RUNTIME - $map->{last_save};
194 $svd = "++" if $svd > 99;
195
196 $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 $map->visible_name),
203 cf::NDI_BLACK | cf::NDI_UNIQUE);
204 }
205
206 1
207 };
208