#define NAME "room/post_dir/"
string messages; /* The big string of all messages. */
int new_mail; /* Flag if there is any new mail. */
static string arr_messages; /* the result of explode on 'messages' */
static int loaded; /* Flag if this users mailbox is loaded */
static int curr_mess; /* Current message number */
static string new_message, new_subject, new_dest, new_cc;
static int is_reading;
id(str) {
return str == "mailread";
}
get() {
return 1;
}
init() {
add_action("read", "read");
add_action("mail_to", "mail");
add_action("headers", "from");
}
read() {
is_reading = 1;
if (!loaded) {
load_player();
if (arr_messages == 0) {
write("No mail.\n");
return 1;
}
}
loop();
return 1;
}
load_player() {
loaded = 1;
if (!restore_object(NAME + this_player()->query_real_name()) ||
messages == "" || messages == 0) {
arr_messages = 0;
messages = "";
return;
}
if (new_mail) {
new_mail = 0;
save_object(NAME + this_player()->query_real_name());
}
arr_messages = explode(messages, "\n**\n");
}
headers() {
int i, n;
string tmp_str, tmp_str2, rest_of_mess;
string name;
if (!loaded)
load_player();
if (arr_messages == 0) {
write("No mail.\n");
return 1;
}
for (i=0; i<sizeof(arr_messages); i+=2) {
name = i/2+1 + " " + arr_messages[i];
if (strlen(name) < 8)
name += "\t";
write(name + "\t");
n = sscanf(arr_messages[i+1],"%sRe: %s\n%s",
tmp_str,tmp_str2,rest_of_mess);
if (n == 3) write(" Re: " + tmp_str2);
n = sscanf(arr_messages[i+1],"%sSubj: %s\n%s",
tmp_str,tmp_str2,rest_of_mess);
if (n == 3) write(" Subj: " + tmp_str2);
n = sscanf(arr_messages[i+1],"%sDate: %s\n%s",
tmp_str,tmp_str2, rest_of_mess);
if (n == 3) write(" Date: " + tmp_str2);
write("\n");
}
return 1;
}
loop() {
string tmp;
if (!loaded)
load_player();
if (arr_messages == 0) {
write("No messages.\n");
is_reading = 0;
return;
}
if (curr_mess < 1 || curr_mess > sizeof(arr_messages)/2)
tmp = " (no current) ";
else
tmp = " (current: " + curr_mess + ") ";
write("[1 - " + (sizeof(arr_messages)/2) + " h d r x ?]" + tmp);
input_to("get_cmd");
}
get_cmd(str) {
int n, new_has_arrived;
string tmp;
/*
* First, test all nondestructive commands. The destructive commands
* will be tested after check if new mail has arrived.
*/
if (!loaded) {
load_player();
new_has_arrived = 1;
}
if (str == "r") { reply_to_message(); return; }
if (sscanf(str, "r %d", curr_mess) == 1) { reply_to_message(); return; }
if (str == "h") { headers(); loop(); return; }
if (str == "n") { curr_mess++; print_message(); loop(); return; }
if (str == ".") { print_message(); loop(); return; }
if (str == "l") { save_message(); loop(); return; }
if (sscanf(str, "m %s", tmp) == 1) { mail_to(tmp); return; }
if (str == "?") { help_msg(); loop(); return; }
if (str == "p" || str == "-") {
curr_mess--; print_message(); loop(); return;
}
if (sscanf(str, "%d", n) == 1) {
curr_mess = n; print_message(); loop(); return;
}
if (new_has_arrived) {
write("New mail has arrived. Command ignored\n");
loop();
return;
}
if (str == "x") { is_reading = 0; return; }
if (str == "d") { delete(); loop(); return; }
if (sscanf(str, "d %d", curr_mess) == 1) { delete(); loop(); return; }
loop();
}
print_message() {
if (curr_mess > sizeof(arr_messages)/2 || curr_mess < 1) {
write("Illegal message number " + curr_mess + "\n");
return;
}
write("Message " + curr_mess + ":\n");
write("From: " + arr_messages[curr_mess*2-2] + "\n");
write(arr_messages[curr_mess*2-1] + "\n");
}
save_message() {
string name;
if (curr_mess > sizeof(arr_messages)/2 || curr_mess < 1) {
write("Illegal message number " + curr_mess + "\n");
return;
}
name = this_player()->query_real_name() + ".mbox";
log_file(name, "From: " + arr_messages[curr_mess*2-2] + "\n");
log_file(name, arr_messages[curr_mess*2-1] + "\n");
}
delete() {
if (curr_mess > sizeof(arr_messages)/2 || curr_mess < 1) {
write("Illegal message number " + curr_mess + "\n");
return;
}
arr_messages[curr_mess*2-2] = 0;
arr_messages[curr_mess*2-1] = 0;
if (sizeof(arr_messages) == 2)
messages = "";
else
messages = implode(arr_messages, "\n**\n") + "\n**\n";
new_mail = 0;
save_object(NAME + this_player()->query_real_name());
if (messages == "")
arr_messages = 0;
else
arr_messages = explode(messages, "\n**\n");
}
mail_to(str) {
if (!str || str == "") {
write("No destination.\n");
if (is_reading)
loop();
return 1;
}
new_subject = 0;
new_cc = "";
mail_to_continue(str);
return 1;
}
mail_to_continue(str) {
str = lower_case(str);
if (!restore_object("players/" + str)) {
write("No such player.\n");
if (is_reading)
loop();
return 1;
}
new_dest = str;
new_message = "";
if (new_subject)
write("Return to get '" + new_subject + "'\n");
write("Subject: ");
input_to("get_subject");
return 1;
}
get_subject(str) {
if (str && str != "")
new_subject = "Subj: " + str + "\n";
if (new_subject == 0) {
write("No subject.\n");
if (is_reading)
loop();
return;
}
write("Give message. Finish message with '**', or '~q' to cancel\n");
write("]");
input_to("more_mail");
return;
}
more_mail(str) {
if (str == "~q") {
write("Aborted.\n");
if (is_reading)
loop();
return;
}
if (str == "**") {
write("Cc:");
input_to("get_cc");
return;
}
new_message += str + "\n";
write("]");
input_to("more_mail");
}
get_cc(cc) {
if (cc != "")
new_cc = cc;
send_mail(new_dest, new_subject + "\n", new_message, new_cc);
if (new_cc != "")
send_mail(new_cc, new_subject + "\n", new_message, new_dest);
if (is_reading)
loop();
}
/*
* Send a complete mail. If the receiver is reading mail, be sure to
* tell his mail reader that new mail has arrived.
*/
send_mail(dest, subj, mess, cc) {
if (cc != "")
cc = "Cc: " + cc + "\n";
notify_new_mail(dest, subj, this_player()->query_name());
messages = "";
restore_object(NAME + dest);
if (messages == 0)
messages = "";
messages += this_player()->query_name() + "\n**\n" + subj + cc +
"Date: " + ctime(time())[4..9] + "\n\n" + mess + "\n**\n";
new_mail = 1;
save_object(NAME + dest);
}
notify_new_mail(dest, subj, name) {
object ob;
if (ob = find_player(dest)) {
tell_object(ob,"You have new mail from " +
name + ", " + subj + "\n");
ob = present("mailread", ob);
if (ob)
ob->invalidate();
}
write("Sending mail to " + capitalize(dest) + ".\n");
}
invalidate() {
loaded = 0;
}
drop() {
return 1;
}
reply_to_message() {
int n;
string tmp_str, tmp_str2, rest_of_mess;
string name;
name = lower_case(arr_messages[curr_mess*2-2]);
n = sscanf(arr_messages[curr_mess*2-1],"%sRe: %s\n%s",
tmp_str,tmp_str2,rest_of_mess);
new_subject = " Re: " + tmp_str2;
n = sscanf(arr_messages[curr_mess*2-1],"%sSubj: %s\n%s",
tmp_str,tmp_str2,rest_of_mess);
new_subject = " Re: " + tmp_str2;
new_cc = "";
mail_to_continue(name);
}
help_msg() {
write("x Exit from mail reading mode.\n");
write("d Delete current message.\n");
write("d <num> Delete message number 'num'.\n");
write("? This help message.\n");
write("r Reply to current message.\n");
write("r <num> Reply to message number 'num'.\n");
write("m <name> Mail a message to player 'name'.\n");
write("h Print all headers.\n");
write("p Print previous message.\n");
write("n Print next message.\n");
write("l Append current message to /log/name.mbox\n");
return 1;
}