PennMUSH Community

root/1.8.3/trunk/src/cmds.c

Revision 1278, 31.5 kB (checked in by shawnw, 2 months ago)

Prep for 1.8.3p7

Line 
1 /**
2  * \file cmds.c
3  *
4  * \brief Definitions of commands.
5  * This file is a set of functions that defines commands. The parsing
6  * of commands is elsewhere (command.c), as are the implementations
7  * of most of the commands (throughout the source.)
8  *
9  */
10
11 #include "copyrite.h"
12 #include "config.h"
13
14 #include <string.h>
15
16 #include "conf.h"
17 #include "externs.h"
18 #include "dbdefs.h"
19 #include "mushdb.h"
20 #include "match.h"
21 #include "game.h"
22 #include "attrib.h"
23 #include "extmail.h"
24 #include "malias.h"
25 #include "parse.h"
26 #include "access.h"
27 #include "version.h"
28 #include "lock.h"
29 #include "function.h"
30 #include "command.h"
31 #include "flags.h"
32 #include "log.h"
33 #include "confmagic.h"
34
35 /* External Stuff */
36 void do_poor(dbref player, char *arg1);
37 void do_list_memstats(dbref player);
38
39 #define DOL_MAP 1               /**< dolist/map bitflag */
40 #define DOL_NOTIFY 2            /**< dolist/notify bitflag */
41 #define DOL_DELIM 4             /**< dolist/delim bitflag */
42
43 void do_dolist(dbref player, char *list, char *command,
44                dbref cause, unsigned int flags);
45 void do_list(dbref player, char *arg, int lc);
46 void do_writelog(dbref player, char *str, int ltype);
47 void do_readcache(dbref player);
48 void do_scan(dbref player, char *command, int flag);
49 void do_uptime(dbref player, int mortal);
50 extern int config_set(const char *opt, char *val, int source, int restrictions);
51
52 /** Is there a right-hand side of the equal sign? From command.c */
53 extern int rhs_present;
54
55 COMMAND(cmd_allhalt)
56 {
57   do_allhalt(player);
58 }
59
60 COMMAND(cmd_allquota)
61 {
62   do_allquota(player, arg_left, SW_ISSET(sw, SWITCH_QUIET));
63 }
64
65 COMMAND(cmd_atrlock)
66 {
67   do_atrlock(player, arg_left, arg_right);
68 }
69
70 COMMAND(cmd_attribute)
71 {
72   if (SW_ISSET(sw, SWITCH_ACCESS))
73     do_attribute_access(player, arg_left, arg_right,
74                         SW_ISSET(sw, SWITCH_RETROACTIVE));
75   else if (SW_ISSET(sw, SWITCH_DELETE))
76     do_attribute_delete(player, arg_left);
77   else if (SW_ISSET(sw, SWITCH_RENAME))
78     do_attribute_rename(player, arg_left, arg_right);
79   else
80     do_attribute_info(player, arg_left);
81 }
82
83 COMMAND(cmd_atrchown)
84 {
85   do_atrchown(player, arg_left, arg_right);
86 }
87
88 COMMAND(cmd_boot)
89 {
90   if (SW_ISSET(sw, SWITCH_PORT))
91     do_boot(player, arg_left, BOOT_DESC);
92   else if (SW_ISSET(sw, SWITCH_ME))
93     do_boot(player, (char *) NULL, BOOT_SELF);
94   else if (SW_ISSET(sw, SWITCH_SILENT))
95     do_boot(player, arg_left, BOOT_SILENT);
96   else
97     do_boot(player, arg_left, BOOT_NAME);
98 }
99
100 COMMAND(cmd_break)
101 {
102   if (parse_boolean(arg_left)) {
103     global_eval_context.break_called = 1;
104     if (arg_right && *arg_right) {
105       char const *sp = arg_right;
106       char *bp = global_eval_context.break_replace;
107       process_expression(global_eval_context.break_replace, &bp, &sp,
108                          player, player, cause,
109                          PE_COMMAND_BRACES, PT_DEFAULT, NULL);
110       *bp++ = '\0';
111     }
112   }
113 }
114
115 COMMAND(cmd_assert)
116 {
117   if (!parse_boolean(arg_left)) {
118     global_eval_context.break_called = 1;
119     if (arg_right && *arg_right) {
120       char const *sp = arg_right;
121       char *bp = global_eval_context.break_replace;
122       process_expression(global_eval_context.break_replace, &bp, &sp,
123                          player, player, cause,
124                          PE_COMMAND_BRACES, PT_DEFAULT, NULL);
125       *bp++ = '\0';
126     }
127   }
128 }
129
130 COMMAND(cmd_chownall)
131 {
132   do_chownall(player, arg_left, arg_right, SW_ISSET(sw, SWITCH_PRESERVE));
133 }
134
135 COMMAND(cmd_chown)
136 {
137   do_chown(player, arg_left, arg_right, SW_ISSET(sw, SWITCH_PRESERVE));
138 }
139
140 COMMAND(cmd_chzoneall)
141 {
142   do_chzoneall(player, arg_left, arg_right);
143 }
144
145 COMMAND(cmd_chzone)
146 {
147   (void) do_chzone(player, arg_left, arg_right, 1);
148 }
149
150 COMMAND(cmd_config)
151 {
152   int lc;
153   lc = SW_ISSET(sw, SWITCH_LOWERCASE);
154   if (SW_ISSET(sw, SWITCH_GLOBALS))
155     do_config_list(player, NULL, lc);
156   else if (SW_ISSET(sw, SWITCH_DEFAULTS))
157     do_config_list(player, NULL, lc);
158   else if (SW_ISSET(sw, SWITCH_COSTS))
159     do_config_list(player, NULL, lc);
160   else if (SW_ISSET(sw, SWITCH_FUNCTIONS))
161     do_list_functions(player, lc);
162   else if (SW_ISSET(sw, SWITCH_COMMANDS))
163     do_list_commands(player, lc);
164   else if (SW_ISSET(sw, SWITCH_ATTRIBS))
165     do_list_attribs(player, lc);
166   else if (SW_ISSET(sw, SWITCH_LIST))
167     do_config_list(player, arg_left, lc);
168   else if (SW_ISSET(sw, SWITCH_FLAGS))
169     do_list_flags("FLAG", player, arg_left, lc, T("Flags"));
170   else if (SW_ISSET(sw, SWITCH_POWERS))
171     do_list_flags("POWER", player, arg_left, lc, T("Powers"));
172   else if (SW_ISSET(sw, SWITCH_SET)) {
173     if (!Wizard(player)) {
174       notify(player, T("You can't remake the world in your image."));
175       return;
176     }
177     if (!arg_left || !*arg_left) {
178       notify(player, T("What did you want to set?"));
179       return;
180     }
181     if (!config_set(arg_left, arg_right, 1, 0)
182         && !config_set(arg_left, arg_right, 1, 1))
183       notify(player, T("Couldn't set that option"));
184     else
185       notify(player, T("Option set."));
186   } else
187     do_config_list(player, arg_left, lc);
188 }
189
190 COMMAND(cmd_cpattr)
191 {
192   do_cpattr(player, arg_left, args_right, 0, SW_ISSET(sw, SWITCH_NOFLAGCOPY));
193 }
194
195 COMMAND(cmd_create)
196 {
197   do_create(player, arg_left, parse_integer(arg_right));
198 }
199
200 COMMAND(cmd_clone)
201 {
202   if (SW_ISSET(sw, SWITCH_PRESERVE))
203     do_clone(player, arg_left, arg_right, SWITCH_PRESERVE);
204   else
205     do_clone(player, arg_left, arg_right, SWITCH_NONE);
206 }
207
208 COMMAND(cmd_dbck)
209 {
210   do_dbck(player);
211 }
212
213 COMMAND(cmd_decompile)
214 {
215   char prefix[BUFFER_LEN];
216   int sd = SW_ISSET(sw, SWITCH_SKIPDEFAULTS);
217   *prefix = '\0';
218   if (SW_ISSET(sw, SWITCH_TF)) {
219     /* @dec/tf overrides @dec/prefix */
220     ATTR *a;
221     if (((a = atr_get_noparent(player, "TFPREFIX")) != NULL) &&
222         AL_STR(a) && *AL_STR(a)) {
223       strcpy(prefix, atr_value(a));
224     } else {
225       strcpy(prefix, "FugueEdit > ");
226     }
227   } else if (SW_ISSET(sw, SWITCH_PREFIX)) {
228     strcpy(prefix, arg_right);
229   }
230   if (SW_ISSET(sw, SWITCH_DB) || SW_ISSET(sw, SWITCH_TF))
231     do_decompile(player, arg_left, prefix, DEC_DB, sd);
232   else if (SW_ISSET(sw, SWITCH_FLAGS))
233     do_decompile(player, arg_left, prefix, DEC_FLAG, sd);
234   else if (SW_ISSET(sw, SWITCH_ATTRIBS))
235     do_decompile(player, arg_left, prefix, DEC_ATTR, sd);
236   else
237     do_decompile(player, arg_left, prefix, DEC_NORMAL, sd);
238 }
239
240 COMMAND(cmd_teach)
241 {
242   do_teach(player, cause, arg_left);
243 }
244
245 COMMAND(cmd_destroy)
246 {
247   do_destroy(player, arg_left, (SW_ISSET(sw, SWITCH_OVERRIDE)));
248 }
249
250 COMMAND(cmd_dig)
251 {
252   do_dig(player, arg_left, args_right, (SW_ISSET(sw, SWITCH_TELEPORT)));
253 }
254
255 COMMAND(cmd_disable)
256 {
257   do_enable(player, arg_left, 0);
258 }
259
260 COMMAND(cmd_doing)
261 {
262   if (SW_ISSET(sw, SWITCH_HEADER))
263     do_poll(player, arg_left, 0);
264   else
265     do_doing(player, arg_left);
266 }
267
268 COMMAND(cmd_dolist)
269 {
270   unsigned int flags = 0;
271   if (SW_ISSET(sw, SWITCH_NOTIFY))
272     flags |= DOL_NOTIFY;
273   if (SW_ISSET(sw, SWITCH_DELIMIT))
274     flags |= DOL_DELIM;
275   do_dolist(player, arg_left, arg_right, cause, flags);
276 }
277
278 COMMAND(cmd_dump)
279 {
280   if (SW_ISSET(sw, SWITCH_PARANOID))
281     do_dump(player, arg_left, DUMP_PARANOID);
282   else if (SW_ISSET(sw, SWITCH_DEBUG))
283     do_dump(player, arg_left, DUMP_DEBUG);
284   else
285     do_dump(player, arg_left, DUMP_NORMAL);
286 }
287
288 COMMAND(cmd_edit)
289 {
290   do_gedit(player, arg_left, args_right,
291            SW_ISSET(sw, SWITCH_FIRST) ? EDIT_FIRST : EDIT_ALL,
292            SW_ISSET(sw, SWITCH_CHECK) ? 0 : 1);
293 }
294
295 COMMAND(cmd_elock)
296 {
297   do_lock(player, arg_left, arg_right, Enter_Lock);
298 }
299
300 COMMAND(cmd_emit)
301 {
302   int spflags = !strcmp(cmd->name, "@NSEMIT") ? PEMIT_SPOOF : 0;
303   SPOOF(player, cause, sw);
304
305   if (SW_ISSET(sw, SWITCH_ROOM))
306     do_lemit(player, arg_left,
307              (SW_ISSET(sw, SWITCH_SILENT) * PEMIT_SILENT) | spflags);
308   else
309     do_emit(player, arg_left, spflags);
310 }
311
312 COMMAND(cmd_enable)
313 {
314   do_enable(player, arg_left, 1);
315 }
316
317 COMMAND(cmd_entrances)
318 {
319   if (SW_ISSET(sw, SWITCH_EXITS))
320     do_entrances(player, arg_left, args_right, ENT_EXITS);
321   else if (SW_ISSET(sw, SWITCH_THINGS))
322     do_entrances(player, arg_left, args_right, ENT_THINGS);
323   else if (SW_ISSET(sw, SWITCH_PLAYERS))
324     do_entrances(player, arg_left, args_right, ENT_PLAYERS);
325   else if (SW_ISSET(sw, SWITCH_ROOMS))
326     do_entrances(player, arg_left, args_right, ENT_ROOMS);
327   else
328     do_entrances(player, arg_left, args_right, ENT_ALL);
329 }
330
331 COMMAND(cmd_eunlock)
332 {
333   do_unlock(player, arg_left, Enter_Lock);
334 }
335
336 COMMAND(cmd_find)
337 {
338   do_find(player, arg_left, args_right);
339 }
340
341 COMMAND(cmd_firstexit)
342 {
343   do_firstexit(player, arg_left);
344 }
345
346 COMMAND(cmd_flag)
347 {
348   if (SW_ISSET(sw, SWITCH_LIST))
349     do_list_flags("FLAG", player, arg_left, 0, T("Flags"));
350   else if (SW_ISSET(sw, SWITCH_ADD))
351     do_flag_add("FLAG", player, arg_left, args_right);
352   else if (SW_ISSET(sw, SWITCH_DELETE))
353     do_flag_delete("FLAG", player, arg_left);
354   else if (SW_ISSET(sw, SWITCH_ALIAS))
355     do_flag_alias("FLAG", player, arg_left, args_right[1]);
356   else if (SW_ISSET(sw, SWITCH_RESTRICT))
357     do_flag_restrict("FLAG", player, arg_left, args_right);
358   else if (SW_ISSET(sw, SWITCH_DISABLE))
359     do_flag_disable("FLAG", player, arg_left);
360   else if (SW_ISSET(sw, SWITCH_ENABLE))
361     do_flag_enable("FLAG", player, arg_left);
362   else if (SW_ISSET(sw, SWITCH_LETTER))
363     do_flag_letter("FLAG", player, arg_left, args_right[1]);
364   else if (SW_ISSET(sw, SWITCH_TYPE))
365     do_flag_type("FLAG", player, arg_left, args_right[1]);
366   else
367     do_flag_info("FLAG", player, arg_left);
368 }
369
370 COMMAND(cmd_force)
371 {
372   do_force(player, arg_left, arg_right);
373 }
374
375 COMMAND(cmd_function)
376 {
377   if (SW_ISSET(sw, SWITCH_DELETE))
378     do_function_delete(player, arg_left);
379   else if (SW_ISSET(sw, SWITCH_ENABLE))
380     do_function_toggle(player, arg_left, 1);
381   else if (SW_ISSET(sw, SWITCH_DISABLE))
382     do_function_toggle(player, arg_left, 0);
383   else if (SW_ISSET(sw, SWITCH_RESTRICT))
384     do_function_restrict(player, arg_left, args_right[1],
385                          SW_ISSET(sw, SWITCH_BUILTIN));
386   else if (SW_ISSET(sw, SWITCH_RESTORE))
387     do_function_restore(player, arg_left);
388   else {
389     int split;
390     char *saved;
391     split = 0;
392     saved = NULL;
393     if (args_right[1] && *args_right[1] && !(args_right[2] && *args_right[2])) {
394       split = 1;
395       saved = args_right[2];
396       if ((args_right[2] = strchr(args_right[1], '/')) == NULL) {
397         notify(player, T("#-1 INVALID SECOND ARGUMENT"));
398         return;
399       }
400       *args_right[2]++ = '\0';
401     }
402     if (args_right[1] && *args_right[1])
403       do_function(player, arg_left, args_right, SW_ISSET(sw, SWITCH_PRESERVE));
404     else if (arg_left && *arg_left)
405       do_function_report(player, arg_left);
406     else
407       do_function(player, NULL, NULL, 0);
408     if (split) {
409       if (args_right[2])
410         *--args_right[2] = '/';
411       args_right[2] = saved;
412     }
413   }
414 }
415
416
417 COMMAND(cmd_grep)
418 {
419   do_grep(player, arg_left, arg_right, ((SW_ISSET(sw, SWITCH_IPRINT))
420                                         || (SW_ISSET(sw, SWITCH_PRINT))),
421           ((SW_ISSET(sw, SWITCH_IPRINT))
422            || (SW_ISSET(sw, SWITCH_ILIST))));
423 }
424
425 COMMAND(cmd_halt)
426 {
427   if (SW_ISSET(sw, SWITCH_ALL))
428     do_allhalt(player);
429   else if (SW_BY_NAME(sw, "PID"))
430     do_haltpid(player, arg_left);
431   else
432     do_halt1(player, arg_left, arg_right);
433 }
434
435 COMMAND(cmd_hide)
436 {
437   hide_player(player, !(SW_ISSET(sw, SWITCH_NO) || SW_ISSET(sw, SWITCH_OFF)));
438 }
439
440 COMMAND(cmd_hook)
441 {
442   enum hook_type flags;
443
444   if (!(Wizard(player) || has_power_by_name(player, "HOOK", NOTYPE))) {
445     notify(player, T("You need a fishing license to use that hook."));
446     return;
447   }
448
449   if (SW_ISSET(sw, SWITCH_AFTER))
450     flags = HOOK_AFTER;
451   else if (SW_ISSET(sw, SWITCH_BEFORE))
452     flags = HOOK_BEFORE;
453   else if (SW_ISSET(sw, SWITCH_IGNORE))
454     flags = HOOK_IGNORE;
455   else if (SW_ISSET(sw, SWITCH_OVERRIDE))
456     flags = HOOK_OVERRIDE;
457   else if (SW_ISSET(sw, SWITCH_LIST)) {
458     do_hook_list(player, arg_left);
459     return;
460   } else {
461     notify(player, T("You must give a switch for @hook"));
462     return;
463   }
464   do_hook(player, arg_left, args_right[1], args_right[2], flags);
465 }
466
467 COMMAND(cmd_huh_command)
468 {
469   notify(player, T("Huh?  (Type \"help\" for help.)"));
470 }
471
472 COMMAND(cmd_home)
473 {
474   if (!Mobile(player))
475     return;
476   do_move(player, "home", MOVE_NORMAL);
477 }
478
479 COMMAND(cmd_kick)
480 {
481   do_kick(player, arg_left);
482 }
483
484 COMMAND(cmd_lemit)
485 {
486   int spflags = !strcmp(cmd->name, "@NSLEMIT") ? PEMIT_SPOOF : 0;
487   SPOOF(player, cause, sw);
488   do_lemit(player, arg_left,
489            (SW_ISSET(sw, SWITCH_SILENT) * PEMIT_SILENT) | spflags);
490 }
491
492 COMMAND(cmd_link)
493 {
494   do_link(player, arg_left, arg_right, SW_ISSET(sw, SWITCH_PRESERVE));
495 }
496
497 COMMAND(cmd_listmotd)
498 {
499   do_motd(player, MOTD_LIST, "");
500 }
501
502 COMMAND(cmd_list)
503 {
504   int lc;
505   lc = SW_ISSET(sw, SWITCH_LOWERCASE);
506   if (SW_ISSET(sw, SWITCH_MOTD))
507     do_motd(player, MOTD_LIST, "");
508   else if (SW_ISSET(sw, SWITCH_FUNCTIONS))
509     do_list_functions(player, lc);
510   else if (SW_ISSET(sw,