#include <unistd.h> #include <stdlib.h> #include <string.h> #include "kernel.h" #include "locations.h" #include "sendsys.h" #include "wizlist.h" #include "bprintf.h" #include "actions.h" #include "pflags.h" #include "sflags.h" #include "mobile.h" #include "timing.h" #include "fight.h" #include "rooms.h" #include "verbs.h" #include "parse.h" #include "log.h" #include "god.h" #include "uaf.h" #include "mud.h" void deletecom () { if (plev (mynum) < LVL_AVATAR) { erreval (); return; } if (brkword () == -1 || strlen (wordbuf) > PNAME_LEN) { bprintf ("Delete who?\n"); return; } mudlog ("DELETE: %s deleted %s", pname (mynum), wordbuf); send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), LVL_AVATAR, LVL_MAX, mynum, NOBODY, "&+B[&+W\001p%s\003 &*has &+Cdeleted &+W%s&+B]\n", pname (mynum), wordbuf); deluaf (wordbuf); update_wizlist (wordbuf, LEV_MORTAL); bprintf ("Deleted %s.\n", wordbuf); } /* The OPENGAME command. */ void opengamecom () { if (!ptstflg (mynum, PFL_SHUTDOWN)) { erreval (); return; } if (unlink (NOLOGIN) < 0) { bprintf ("The MUD is already open.\n"); } else { mudlog ("SYSTEM: Opengame by %s", pname (mynum)); bprintf ("MUD is now &+WOpen&*.\n"); send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), LVL_WIZARD, LVL_MAX, mynum, NOBODY, "&+B[&+COpengame &*by &+W\001p%s\003&+B]\n", pname (mynum)); } } void shutdowncom (Boolean crash) { FILE *nologin_file; char s[MAX_COM_LEN]; char pidfile[50]; int i; char *t = "iDiRT is currently unavailable, please try again later.\n"; char *gt = "iDiRT Daemon is shutting down.\n"; if (!ptstflg (mynum, PFL_SHUTDOWN)) { erreval (); return; } getreinput (s); if (!EMPTY (s)) t = s; if ((nologin_file = fopen (NOLOGIN, "w")) == NULL) { bprintf ("&#&+WUnable to write NOLOGIN file&*"); mudlog ("ERROR: Could not write NOLOGIN file"); } else { fprintf (nologin_file, "%s\n", t); fclose (nologin_file); } bprintf ("MUD is now &+WClosed&*%s\n", crash ? ", and is being &+RShutdown&*." : "."); mudlog ("SYSTEM: %s by %s", crash ? "Crash" : "Shutdown", pname (mynum)); send_msg (DEST_ALL, MODE_QUIET, LVL_WIZARD, LVL_MAX, mynum, NOBODY, "&+B[&+C%s &*by &+W\001p%s\003&+B]\n", crash ? "Crash" : "Shutdown", pname (mynum)); for (i = 0; i < max_players; i++) { if (is_in_game (i) && plev (i) < LVL_GOD) { sendf (i, "MUD is now &+WClosed&*%s\n", crash ? ", and is being &+RShutdown&*." : "."); p_crapup (i, t, CRAP_SAVE | CRAP_UNALIAS | CRAP_RETURN); } } if (crash) { for (i = 0; i < max_players; i++) { if (is_in_game (i)) { p_crapup (i, gt, CRAP_SAVE | CRAP_UNALIAS | CRAP_RETURN); } } sprintf (pidfile, "%spid", data_dir); remove (pidfile); exit (0); } } void bresetcom (void) { if (!ptstflg (mynum, PFL_REBOOT)) { erreval (); return; } if (breset) { bprintf ("Cancelling reboot for next full reset.\n"); mudlog ("BRESET: BootReset turned off by %s", pname (mynum)); breset = False; } else { bprintf ("The MUD will now reboot during the next full reset.\n"); mudlog ("BRESET: BootReset turned on by %s", pname (mynum)); breset = True; } } void idlecom (void) { if (plev (mynum) < LVL_AVATAR) { bprintf ("Pardon?\n"); return; } if (ptstflg (mynum, PFL_IDLE)) { bprintf ("You will no longer pretend to be idle.\n"); pclrflg (mynum, PFL_IDLE); return; } else { bprintf ("You are now pretending to be idle.\n"); psetflg (mynum, PFL_IDLE); return; } } void seeidlecom (void) { if (plev (mynum) < LVL_GOD) { bprintf ("Pardon?\n"); return; } if (ptstflg (mynum, PFL_SEEIDLE)) { bprintf ("You will no longer see real idle times.\n"); pclrflg (mynum, PFL_SEEIDLE); return; } else { bprintf ("You will now see real idle times.\n"); psetflg (mynum, PFL_SEEIDLE); return; } } /* Socket handler */ void socketcom () { static char *SockTable[] = { "view", "kill", "write", TABLE_END }; int i, b, x, d; int old_mynum = mynum; Boolean noton = False; char idlebuff[64], loginbuff[64]; char txt[MAX_COM_LEN]; if (!ptstflg (mynum, PFL_SOCKET)) { bprintf ("Pardon?\n"); return; } if (brkword () == -1) { bprintf ("&+CName FD Idle On For Host\n"); bprintf ("&+B-------------------------------------------------------------------------------\n"); for (i = 0; i < max_players; ++i) { if (see_player (mynum, i) && is_conn (i)) { strcpy (idlebuff, sec_to_hhmmss (global_clock - prlast_cmd (i))); strcpy (loginbuff, sec_to_hhmmss (global_clock - plogged_on (i))); bprintf ("&+w%-19s %2d %8.8s %8.8s %-34.34s\n", pname (i), players[i].fil_des, idlebuff, loginbuff, !ptstflg (mynum, PFL_SEEUSER) ? players[i].hostname : players[i].usrname); } } bprintf ("&+B-------------------------------------------------------------------------------\n"); return; } if ((d = atoi (wordbuf)) == 0) { if ((b = find_player_by_name (wordbuf)) == -1) { bprintf ("Person not on-line.\n"); return; } d = players[b].fil_des; } else { if ((b = find_pl_index (d)) == -1) { bprintf ("That descriptor is not in use.\n"); return; } if (!is_in_game (b)) { if (!is_conn (b)) { bprintf ("That descriptor is not in use.\n"); return; } noton = True; } } if (b >= max_players) { bprintf ("A mobile doesn't have a socket.\n"); return; } if (is_in_game (b) && (pvis (b) > plev (mynum))) { bprintf ("That descriptor is not in use.\n"); return; } if (brkword () == -1) { if (noton) bprintf ("What do you want to do with descriptor %d?\n", d); else bprintf ("What do you want to do with %s's descriptor?\n", pname (b)); return; } if ((x = tlookup (wordbuf, SockTable)) < 0) { bprintf ("What are you trying to do?\n"); return; } switch (x) { case 0: strcpy (idlebuff, sec_to_hhmmss (global_clock - prlast_cmd (b))); strcpy (loginbuff, sec_to_hhmmss (global_clock - plogged_on (b))); bprintf ("&+CDescriptor &+B: &+W%-2d\n", d); bprintf ("&+B----------------------------------\n"); bprintf ("&+wUser Name &+B: &+w%s\n", pname (b)); bprintf ("&+wHostname &+B: &+w%s\n", !ptstflg (mynum, PFL_SEEUSER) ? players[b].hostname : players[b].usrname); bprintf ("&+wIdle Time &+B: &+w%s\n", idlebuff); bprintf ("&+wLogged On &+B: &+w%s\n", loginbuff); bprintf ("&+B----------------------------------\n"); break; case 1: bprintf ("Killing Descriptor %d (User: %s)\n", d, pname (b)); mudlog ("SOCKET: %s killed descriptor %d (User: %s)", pname (mynum), d, pname (b)); if (noton) send_msg (DEST_ALL, MODE_PFLAG | MP (PFL_SOCKET), LVL_WIZARD, LVL_MAX, b, mynum, "&+W[&+CSocket: &+w\001p%s\003 has killed descriptor " "%d (Logging In)&+W]\n", pname (mynum), d); else send_msg (DEST_ALL, MODE_PFLAG | MP (PFL_SOCKET), LVL_WIZARD, LVL_MAX, b, mynum, "&+W[&+CSocket: &+w\001p%s\003 has killed descriptor " "%d (User: \001p%s\003)&+W]\n", pname (mynum), d, pname (b)); setup_globals (b); bflush (); if (noton) quit_player (); else crapup (NULL, NO_SAVE); setup_globals (old_mynum); break; case 2: if (noton) bprintf ("Writing text to descriptor %d.\n", d); else bprintf ("Writing text to %s's descriptor.\n", pname (b)); getreinput (txt); setup_globals (b); bprintf ("%s\n", txt); setup_globals (old_mynum); break; } } void toggleseesocket (void) { if (!ptstflg (mynum, PFL_SOCKET)) { bprintf ("Pardon?\n"); return; } if (!ptstflg (mynum, PFL_SEESOCKET)) { psetflg (mynum, PFL_SEESOCKET); bprintf ("You can now see socket messages.\n"); } else { pclrflg (mynum, PFL_SEESOCKET); bprintf ("You will no longer see socket messages.\n"); } } void togglecoding (void) { if (plev (mynum) < LVL_GOD) { erreval (); return; } if (!ststflg (mynum, SFL_CODING)) { ssetflg (mynum, SFL_CODING); bprintf ("You are marked as coding.\n"); send_msg (DEST_ALL, 0, pvis (mynum), LVL_MAX, mynum, NOBODY, "&+G[&+W%s &*is going away to code&+G]\n", pname (mynum)); } else { sclrflg (mynum, SFL_CODING); bprintf ("You are no longer marked as coding.\n"); send_msg (DEST_ALL, 0, pvis (mynum), LVL_MAX, mynum, NOBODY, "&+G[&+W%s &*is back from coding&+G]\n", pname (mynum)); } } void wloadcom () { char work[100]; char ps1[100]; char ps2[300]; FILE *fp; char command[50]; if (plev (mynum) < LVL_GOD) { erreval (); return; } sprintf (command, "ps -ux | grep 'aberd' | grep '%d'", getpid ()); if ((fp = popen ("uptime; ps -ux", "r")) == NULL) { bprintf ("Error getting system work load statistics.\n"); return; } fgets (work, sizeof (work), fp); fgets (ps1, sizeof (ps1), fp); pclose (fp); if ((fp = popen (command, "r")) == NULL) { bprintf ("Error getting system work load statistics.\n"); return; } fgets (ps2, sizeof (ps2), fp); pclose (fp); bprintf ("System statistics on server %s:\n", my_hostname); bprintf ("%s\n", work); bprintf ("iDiRT Daemon Statistics\n"); bprintf ("-----------------------\n"); bprintf ("%s", ps1); bprintf ("%-79.79s\n", ps2); } void silentcom (void) { if (plev (mynum) < LVL_GOD) { erreval (); return; } if (ststflg (mynum, SFL_SILENT)) { bprintf ("Disabling Silent Entry\n"); sclrflg (mynum, SFL_SILENT); } else { bprintf ("Enabling Silent Entry\n"); ssetflg (mynum, SFL_SILENT); } } void ploccom (void) { int x, loc; int me = real_mynum; char buff[100]; if (plev (mynum) < LVL_GOD) { bprintf ("Pardon?\n"); return; } if (EMPTY (item1)) { bprintf ("Who do you want to relocate?\n"); return; } if (EMPTY (item2)) { bprintf ("Where do you want to relocate them to?\n"); return; } if ((x = pl1) == -1) { bprintf ("That person can't be found.\n"); return; } if ((loc = findroomnum (item2)) == 0) { bprintf ("Location does not exist!\n"); return; } bprintf ("You relocate %s to %s (%s).\n", pname (x), sdesc (loc), xshowname (buff, loc)); send_msg (DEST_ALL, 0, LVL_GOD, LVL_MAX, mynum, x, "&+B[&+W\001p%s\003 &*has located &+W\001p%s\003 &*to %s (%s)&+B]\n", pname (mynum), pname (x), sdesc (loc), xshowname (buff, loc)); if (x < max_players) { setup_globals (x); setploc (mynum, loc); setup_globals (me); } else setploc (x, loc); } void writelog (void) { char data[MAX_COM_LEN]; if (!ptstflg (mynum, PFL_CANLOG)) { erreval (); return; } getreinput (data); if (EMPTY (data)) { bprintf ("What do you want to log?\n"); return; } mudlog ("LOG: %s", data); } void bancom (char filename[100], int type) { static char *log[] = { "BANHOST", "BANUSER", "BANLOGIN", "BANCHECK" }; static char *info[] = { "the host", "the user", "logins from", "login checks from" }; int val; char text[80], orig[80]; if (!ptstflg (mynum, PFL_BAN)) { erreval (); return; } getreinput (text); if (EMPTY (text)) { bprintf ("Ban/Unban who or what?\n"); return; } sprintf (orig, "%s", text); if (type == BANUSER) orig[0] = toupper (orig[0]); val = addordel (filename, text); if (val == 0) { bprintf ("Error has occured in ban.\n"); mudlog ("%s: Error has occured.", log[type]); return; } if (val == ADDED) { bprintf ("You have banned %s %s.\n", info[type], orig); mudlog ("%s: %s banned %s.", log[type], pname (mynum), orig); return; } if (val == DELETED) { bprintf ("You have unbanned %s %s.\n", info[type], orig); mudlog ("%s: %s unbanned %s.", log[type], pname (mynum), orig); return; } } void probationcom (void) { int b; if (!ptstflg (mynum, PFL_PROBATION)) { erreval (); return; } if (EMPTY (item1)) { bprintf ("Put whom on probation?\n"); return; } if ((b = pl1) == -1) { bprintf ("Who is that?\n"); return; } if (b >= max_players) { bprintf ("I'm afraid that you can't place a mobile on probation.\n"); return; } if (!do_okay (mynum, b, PFL_NOPROBATION)) { bprintf ("You cannot place that player under probation.\n"); return; } if (!ststflg (b, SFL_ONPROBATION)) { mudlog ("PROBATION: %s placed %s ON probation", pname (mynum), pname (b)); bprintf ("Placing %s on probation.\n", pname (b)); send_msg (DEST_ALL, MODE_QUIET, LVL_WIZARD, LVL_MAX, mynum, b, "&+B[&+WProbation (On): &+C\001p%s\003 &*by &+C\001p%s\003" "&+B]\n", pname (b), pname (mynum)); ssetflg (b, SFL_ONPROBATION); if (plev (b) < LVL_WIZARD) return; pclrflg (b, PFL_EXOR); pclrflg (b, PFL_ZAP); pclrflg (b, PFL_MFLAGS); pclrflg (b, PFL_OBJECT); pclrflg (b, PFL_HEAL); pclrflg (b, PFL_ALIAS); pclrflg (b, PFL_ROOM); pclrflg (b, PFL_CLONE); pclrflg (b, PFL_PUNT); pclrflg (b, PFL_TIMEOUT); pclrflg (b, PFL_LD_STORE); pclrflg (b, PFL_BURN); pclrflg (b, PFL_SIC); if (wlevel (b) < LEV_PROPHET) return; pclrflg (b, PFL_RAW); pclrflg (b, PFL_CH_SCORE); pclrflg (b, PFL_CH_LEVEL); } else { mudlog ("PROBATION: %s placed %s OFF probation", pname (mynum), pname (b)); bprintf ("Taking %s off probation.\n", pname (b)); send_msg (DEST_ALL, MODE_QUIET, LVL_WIZARD, LVL_MAX, mynum, b, "&+B[&+WProbation (Off): &+C\001p%s\003 &*by &+C\001p%s\003" "&+B]\n", pname (b), pname (mynum)); sclrflg (b, SFL_ONPROBATION); if (plev (b) < LVL_WIZARD) return; psetflg (b, PFL_EXOR); psetflg (b, PFL_ZAP); psetflg (b, PFL_MFLAGS); psetflg (b, PFL_OBJECT); psetflg (b, PFL_HEAL); psetflg (b, PFL_ALIAS); psetflg (b, PFL_ROOM); psetflg (b, PFL_CLONE); psetflg (b, PFL_PUNT); psetflg (b, PFL_TIMEOUT); psetflg (b, PFL_LD_STORE); psetflg (b, PFL_BURN); psetflg (b, PFL_SIC); if (wlevel (b) < LEV_PROPHET) return; psetflg (b, PFL_RAW); psetflg (b, PFL_CH_SCORE); psetflg (b, PFL_CH_LEVEL); } } void forgetlist (void) { int b, i; if (plev (mynum) < LVL_GOD) { erreval (); return; } if (brkword () == -1) { bprintf ("Who?\n"); return; } if ((b = fpbns (wordbuf)) != -1 && seeplayer (b)) { if (b >= max_players) { bprintf ("A mobile does not have a forget list."); return; } bprintf ("%s is currently forgetting:\n", pname (b)); for (i = 0; i < 10; ++i) { if (players[b].forget[i] != -1) { if (!is_in_game (players[b].forget[i])) players[b].forget[i] = -1; else bprintf ("%s\n", pname (players[b].forget[i])); } } return; } bprintf ("That player is not online.\n"); } void reboot_actions (void) { FILE *fp; if (plev (mynum) < LVL_GOD) { erreval (); return; } bprintf ("Rebooting Actions File...\n"); if ((fp = fopen ("actions", "r")) == NULL) { bprintf ("Error: Cannot read actions file.\n"); mudlog ("ERROR: File actions cannot be read (reboot_actions)"); return; } boot_extern (fp, "actions"); bprintf ("Actions File Rebooted.\n"); mudlog ("SYSTEM: Actions reloaded by %s", pname (mynum)); send_msg (DEST_ALL, MODE_QUIET, LVL_GOD, LVL_MAX, mynum, NOBODY, "&+B[&+CReload Actions &*by &+W\001p%s\003&+B]\n", pname (mynum)); } void levforcecom (void) { Boolean LessThan = False; int i, lev, me = real_mynum; char com[MAX_COM_LEN]; if (plev (mynum) < LVL_ARCHWIZARD) { erreval (); return; } if (brkword () == -1) { bprintf ("LevForce at what level?\n"); return; } if (strchr (wordbuf, '-') != NULL) { LessThan = True; wordbuf[strlen (wordbuf) - 1] = '\0'; } if ((lev = atoi (wordbuf)) <= 0) { bprintf ("Invalid Level: %s.\n", wordbuf); return; } if (lev > plev (mynum)) { bprintf ("Sorry, you can't levforce that high.\n"); return; } getreinput (com); if (EMPTY (com)) { bprintf ("Levforce %d%c what?\n", lev, LessThan ? '-' : '+'); return; } for (i = 0; i < max_players; ++i) { if (is_in_game (i) && see_player (me, i) && do_okay (me, i, PFL_NOFORCE) && i != me) { if ((LessThan && plev (i) <= lev) || (!LessThan && plev (i) >= lev)) { setup_globals (i); bprintf ("\001p%s\003 has forced you to %s.\n", pname (me), com); cur_player->isforce = True; gamecom (com, True); cur_player->isforce = False; } } } setup_globals (me); send_msg (DEST_ALL, MODE_QUIET, LVL_WIZARD, LVL_MAX, mynum, NOBODY, "&+B[&+CLevForce (%d%c) &*by &+W\001p%s\003 &*(%s)&+B]\n", lev, LessThan ? '-' : '+', pname (mynum), com); } void noruncom (void) { int i, me = real_mynum; if (plev (mynum) < LVL_GOD) { erreval (); return; } if (norun) { norun = False; send_msg (DEST_ALL, 0, LVL_MIN, LVL_MAX, NOBODY, NOBODY, "&+B[&+WRunning Is Allowed Again&+B]\n"); mudlog ("NORUN: Turned Off by %s", pname (mynum)); } else { norun = True; send_msg (DEST_ALL, 0, LVL_MIN, LVL_MAX, NOBODY, NOBODY, "&+B[&+WRunning Is Being Disabled&+B]\n"); mudlog ("NORUN: Turned On by %s", pname (mynum)); } for (i = 0; i < max_players; i++) { if (is_in_game (i) && plev (i) < LVL_WIZARD) { setploc (i, norun ? LOC_LIMBO_NORUN : randperc () < 50 ? LOC_START_TEMPLE : LOC_START_CHURCH); setup_globals (i); trapch (ploc (mynum)); } } setup_globals (me); }