/* -*- LPC -*- */ /* * $Id: bug_replies.c,v 1.10 2003/07/08 06:55:58 pinkfish Exp $ */ /** * THis is the base object for handleing error replies. * @author Pinkfish * @started Fri Feb 14 11:50:29 PST 2003 */ #include <error_handler.h> #include <db.h> #include <nroff.h> #define HELP_FILE "/doc/helpdir/bug_replies" class player_data { int position; int date; class error_replies* replys; } nosave private mapping _player_replies; void print_menu_input(); void create() { _player_replies = ([ ]); } void print_bug_replies(object player) { string str; class error_replies* replies; int i; int pos; replies = _player_replies[player]->replys; if (!sizeof(replies)) { tell_object(player, "No bug replies.\n"); return ; } pos = _player_replies[player]->position; str = ""; for (i = 0; i < sizeof(replies); i++) { if (i == pos) { str += ">"; } else { str += " "; } switch (replies[i]->status) { case "NEW" : str += "N"; break; case "DELETED" : str += "D"; break; default : str += " "; break; } str += (i+1) + ") " + replies[i]->sender + " Sub: " + replies[i]->subject + "\n"; } player->set_finish_func("finish_more_replies", this_object()); tell_object(player, "$P$Bug replies$P$" + str); } void finish_more_replies() { print_menu_input(); } void print_menu(object player) { int len; len = sizeof(_player_replies[player]->replys); if (len == 0) { tell_object(player, "[None] QDRULH?<num>: "); } else { tell_object(player, "[1-" + len + "] QDRULH?<num>: "); } } void delete_message(int start_pos, int end_pos) { int pos; for (pos = start_pos - 1; pos <= end_pos - 1; pos++) { ERROR_HANDLER->do_status_error_reply(_player_replies[this_player()]->replys[pos]->id, "DELETED", (: 1 :)); _player_replies[this_player()]->replys[pos]->status = "DELETED"; } if (start_pos != end_pos) { write("Delete error reply " + start_pos + " from " + end_pos + ".\n"); } else { write("Delete error reply " + (pos) + ".\n"); } } void undelete_message(int start_pos, int end_pos) { int pos; for (pos = start_pos - 1; pos <= end_pos - 1; pos++) { ERROR_HANDLER->do_status_error_reply(_player_replies[this_player()]->replys[pos]->id, "READ", (: 1 :)); _player_replies[this_player()]->replys[pos]->status = "READ"; } if (start_pos != end_pos) { write("Undelete error reply " + start_pos + " from " + end_pos + ".\n"); } else { write("Undelete error reply " + (pos) + ".\n"); } } int valid_message(int pos) { pos--; if (pos < 0 || pos >= sizeof(_player_replies[this_player()]->replys)) { return 0; } return 1; } void print_menu_input() { print_menu(this_player()); input_to("bug_replies_menu"); } void read_message(int pos) { class error_replies reply; pos--; reply = _player_replies[this_player()]->replys[pos]; this_player()->set_finish_func("print_menu_input", this_object()); this_player()->more_string("Date Sent: " + ctime(reply->senddate) + "\n" "From: " + reply->sender + "\n" "Subject: " + reply->subject + "\n\n" + reply->message + "\n"); if (reply->status == "NEW") { ERROR_HANDLER->do_status_error_reply(reply->id, "READ", (: 1 :)); reply->status = "READ"; } } int read_next_new() { int i; class error_replies* replies; replies = _player_replies[this_player()]->replys; for (i = 0; i < sizeof(replies); i++) { if (replies[i]->status == "NEW") { read_message(i + 1); return 1; } } write("No new unread error replies.\n"); return 0; } void finish_editing_message(string mess, int pos) { class error_replies reply; if (!mess || !strlen(mess)) { write("Aborting send of message.\n"); } else { reply = _player_replies[this_player()]->replys[pos]; ERROR_HANDLER->do_add_error_reply(reply->id, this_player()->query_name(), reply->sender, "Re: " + reply->subject, mess); write("Sent message to " + reply->sender + "\n"); } print_menu(this_player()); input_to("bug_replies_menu"); } int reply_message(int pos) { write("Replying to message:\n"); //read_message(pos); pos--; this_player()->do_edit("", "finish_editing_message", this_object(), 0, pos); return 1; } void help_command() { string nroff_fn; string str; nroff_fn = HELP_FILE + ".o"; str = NROFF_HAND->cat_file(nroff_fn, 1); if (!str) { NROFF_HAND->create_nroff(HELP_FILE, nroff_fn); str = NROFF_HAND->cat_file(nroff_fn, 0); } this_player()->set_finish_func("print_menu_input", this_object()); this_player()->more_string(str); } void bug_replies_menu(string inp) { int pos; int new_pos; int end_pos; // First strip any start and end spaces. while (strlen(inp) && inp[0] == ' ') { inp = inp[1..]; } while (strlen(inp) && inp[<1] == ' ') { inp = inp[0..<2]; } end_pos = -1; // Now figure out what we have here. if (!strlen(inp)) { if (read_next_new()) { return ; } } else { if (inp[0] >= '0' && inp[0] <= '9') { // Number! while (pos < strlen(inp) && inp[pos] >= '0' && inp[pos] <= '9') { pos ++; } pos = to_int(inp[0..pos-1]); if (valid_message(pos)) { read_message(pos); return ; } else { write("Message " + pos + " is invalid.\n"); } } else { // See if there is a number after us. while (pos < strlen(inp) && (inp[pos] < '0' || inp[pos] > '9')) { pos++; } if (pos < strlen(inp)) { new_pos = pos + 1; while (new_pos < strlen(inp) && inp[new_pos] >= '0' && inp[new_pos] <= '9') { new_pos++; } pos = to_int(inp[pos..new_pos-1]); if (inp[new_pos] == '-') { // Look for the next spot. end_pos = new_pos + 1; while (end_pos < strlen(inp) && inp[end_pos] >= '0' && inp[end_pos] <= '9') { end_pos++; } end_pos = to_int(inp[new_pos + 1..end_pos-1]); } } else { pos = -1; } switch(lower_case(inp)[0]) { case 'q' : write("Exiting the system.\n"); map_delete(_player_replies, this_player()); return ; case 'r' : if (valid_message(pos)) { if (reply_message(pos)) { return ; } } else { write("Message " + pos + " is invalid.\n"); } break; case 'd' : if (end_pos == -1) { end_pos = pos; } if (valid_message(pos)) { if (valid_message(end_pos)) { if (end_pos >= pos) { delete_message(pos, end_pos); } else { write("Your end position (" + end_pos + ") must be higher " "than the start position (" + pos + ").\n"); } } else { write("Message " + end_pos + " is invalid.\n"); } } else { write("Message " + pos + " is invalid.\n"); } break; case 'u' : if (end_pos == -1) { end_pos = pos; } if (valid_message(pos)) { if (valid_message(end_pos)) { if (end_pos >= pos) { undelete_message(pos, end_pos); } else { write("Your end position (" + end_pos + ") must be higher " "than the start position (" + pos + ").\n"); } } else { write("Message " + end_pos + " is invalid.\n"); } } else { write("Message " + pos + " is invalid.\n"); } break; case 'h' : case '?' : help_command(); return ; case 'l' : print_bug_replies(this_player()); return ; } } } print_menu(this_player()); input_to("bug_replies_menu"); } void bug_replies_result(int type, mixed* data, object player) { if (type != DB_SUCCESS) { tell_object(player, "Error retrieving replies.\n"); } else { _player_replies[player] = new(class player_data, date : time(), replys : data); print_bug_replies(player); //print_menu(player); } } /** * This method handles printing out any bug replies associated with * the player. * @param only_new only display new error replies */ int bug_replies(int only_new) { _player_replies[this_player()] = new(class player_data, date : time(), replys : ({ })); if (ERROR_HANDLER->do_error_replies(this_player()->query_name(), only_new, (: bug_replies_result($1, $2, $(this_player()) ) :))) { input_to("bug_replies_menu"); return 1; } add_failed_mess("Unable to find the bug replies.\n"); return 0; }