/* * This file handles non-fighting player actions. */ #include <sys/types.h> #include <stdio.h> #include <string.h> #include <unistd.h> /* include main header file */ #include "mud.h" void cmd_say(D_MOBILE *dMob, char *arg) { if (arg[0] == '\0') { text_to_mobile(dMob, "Say what?\n\r"); return; } communicate(dMob, arg, COMM_LOCAL); } void cmd_ooc(D_MOBILE *dMob, char *arg) { if (arg[0] == '\0') { text_to_mobile(dMob, "OOC what?\n\r"); return; } communicate(dMob, arg, COMM_OOC); } void cmd_quit(D_MOBILE *dMob, char *arg) { char buf[MAX_BUFFER]; /* log the attempt */ sprintf(buf, "%s has left the game.", dMob->name); log_string(buf); MySQL_log_logins("%s has left the game.", dMob->name); save_player(dMob); dMob->socket->player = NULL; free_mobile(dMob); close_socket(dMob->socket, FALSE); } void cmd_shutdown(D_MOBILE *dMob, char *arg) { shut_down = TRUE; } void cmd_commands(D_MOBILE *dMob, char *arg) { BUFFER *buf = buffer_new(MAX_BUFFER); int i, col = 0; bprintf(buf, " - - - - ----==== The full command list ====---- - - - -\n\n\r"); for (i = 0; tabCmd[i].cmd_name[0] != '\0'; i++) { if (dMob->admin_level < tabCmd[i].level) continue; bprintf(buf, " %-16.16s", tabCmd[i].cmd_name); if (!(++col % 4)) bprintf(buf, "\n\r"); } if (col % 4) bprintf(buf, "\n\r"); text_to_mobile(dMob, buf->data); buffer_free(buf); } void cmd_who(D_MOBILE *dMob, char *arg) { D_MOBILE *xMob; D_SOCKET *dsock; ITERATOR *pIter; BUFFER *buf = buffer_new(MAX_BUFFER); bprintf(buf, " - - - - ----==== Who's Online ====---- - - - -\n\r"); pIter = AllocIterator(dsock_list); while ((dsock = (D_SOCKET *) NextInList(pIter)) != NULL) { if (dsock->state != STATE_PLAYING) continue; if ((xMob = dsock->player) == NULL) continue; bprintf(buf, " %-12s %s\n\r", xMob->name, dsock->hostname); } FreeIterator(pIter); bprintf(buf, " - - - - ----======================---- - - - -\n\r"); text_to_mobile(dMob, buf->data); buffer_free(buf); } void cmd_compress(D_MOBILE *dMob, char *arg) { /* no socket, no compression */ if (!dMob->socket) return; /* enable compression */ if (!dMob->socket->out_compress) { text_to_mobile(dMob, "Trying compression.\n\r"); text_to_buffer(dMob->socket, (char *) compress_will2); text_to_buffer(dMob->socket, (char *) compress_will); } else /* disable compression */ { if (!compressEnd(dMob->socket, dMob->socket->compressing, FALSE)) { text_to_mobile(dMob, "Failed.\n\r"); return; } text_to_mobile(dMob, "Compression disabled.\n\r"); } } void cmd_save(D_MOBILE *dMob, char *arg) { save_player(dMob); text_to_mobile(dMob, "Saved.\n\r"); } void cmd_copyover(D_MOBILE *dMob, char *arg) { FILE *fp; ITERATOR *pIter; D_SOCKET *dsock; char buf[100]; if ((fp = fopen(COPYOVER_FILE, "w")) == NULL) { text_to_mobile(dMob, "Copyover file not writeable, aborted.\n\r"); return; } sprintf(buf, "\n\r <*> The world starts spinning <*>\n\r"); /* For each playing descriptor, save its state */ pIter = AllocIterator(dsock_list); while ((dsock = (D_SOCKET *) NextInList(pIter)) != NULL) { compressEnd(dsock, dsock->compressing, FALSE); if (dsock->state != STATE_PLAYING) { text_to_socket(dsock, "\n\rSorry, we are rebooting. Come back in a few minutes.\n\r"); close_socket(dsock, FALSE); } else { fprintf(fp, "%d %s %s\n", dsock->control, dsock->player->name, dsock->hostname); /* save the player */ save_player(dsock->player); text_to_socket(dsock, buf); } } FreeIterator(pIter); fprintf (fp, "-1\n"); fclose (fp); /* close any pending sockets */ recycle_sockets(); /* exec - descriptors are inherited */ sprintf(buf, "%d", control); execl(EXE_FILE, "SocketMud", "copyover", buf, (char *) NULL, (char *) NULL); /* Failed - sucessful exec will not return */ text_to_mobile(dMob, "Copyover FAILED!\n\r"); } void cmd_linkdead(D_MOBILE *dMob, char *arg) { D_MOBILE *xMob; ITERATOR *pIter; char buf[MAX_BUFFER]; bool found = FALSE; pIter = AllocIterator(dmobile_list); while ((xMob = (D_MOBILE *) NextInList(pIter)) != NULL) { if (!xMob->socket) { sprintf(buf, "%s is linkdead.\n\r", xMob->name); text_to_mobile(dMob, buf); found = TRUE; } } FreeIterator(pIter); if (!found) text_to_mobile(dMob, "Noone is currently linkdead.\n\r"); } /* * cmd_admin() * * Various Admin utilities in one location. */ void cmd_admin(D_MOBILE * ch, char * argument) { char arg1[MAX_BUFFER]; argument = one_arg(argument, arg1); if (arg1[0] == '\0') { ptc(ch, "Syntax: admin <command>\n"); ptc(ch, "Valid commands are:\n"); ptc(ch, " clearlogins - Clears login data from MySQL database.\n"); ptc(ch, " clearchat - Clears chat log from MySQL Database.\n"); ptc(ch, " optimize - Optimizes all tables in MySQL Database.\n"); ptc(ch, " fix_helps - Runs through vand_helps and prepares field webtxt\n"); return; } if (compares(arg1, "clearlogins")) { MySQL_clear_logins(); ptc(ch, "Login logs turnacated.\n"); return; } if (compares(arg1, "clearchat")) { MySQL_clear_chatlog(); MySQL_log_chat(ch->name, "utility", "Chat log cleared"); ptc(ch, "Chat log turnacated.\n"); return; } if (compares(arg1, "optimize")) { MySQL_optimize(); ptc(ch, "All tables have been optimized.\n"); return; } if (compares(arg1, "fix_helps")) { cmd_fix_online_helps(ch, ""); return; } else { cmd_admin(ch, ""); return; } return; }