/* /daemon/postal/folders.c * from Dead Souls * folder management daemon * created by Descartes of Borg 940502 */ #include #include #include #include #include #include "folders.h" inherit LIB_DAEMON; private mapping *__BoxInfo; static private string __Folder, __Owner; void create() { daemon::create(); SetNoClean(1); __BoxInfo = ({}); __Folder = "new"; __Owner = 0; } static private void load_folder(string who, string folder) { string file; if(who == __Owner && folder == __Folder) return; OPTIONS_D->assure_box_exists(who); file = sprintf("%s/%s/%s/%s", DIR_POSTAL, who[0..0], who, folder); if(!unguarded((: file_exists, save_file(file) :))) { __BoxInfo = ({}); __Folder = folder; __Owner = who; } else { __Folder = folder; __Owner = who; if(!RestoreObject(file)) __BoxInfo = ({}); } } static private void save_folder() { string file; if(!__Owner || !__Folder) return; file= sprintf("%s/%s/%s/%s", DIR_POSTAL, __Owner[0..0], __Owner, __Folder); SaveObject(file); } mapping *query_box_info(string who, string folder) { if(base_name(previous_object(0)) != OBJ_POST) return ({}); load_folder(who, folder); return __BoxInfo; } void add_post(string who, string folder, mapping borg) { string fwd, a, b, msg, tmp; object ob, pl; tmp = base_name(previous_object(0)); if(previous_object(0) != this_object() && tmp != OBJ_POST && tmp != LOCALPOST_D) return; if(folder=="new" && (fwd=OPTIONS_D->query_option(who, "forward")) && strsrch(borg["subject"], "[FORWARD]") == -1) { borg["subject"] += " [FORWARD]"; if(sscanf(fwd, "%s@%s", a, b) == 2) { borg["message"] = LETTERS_D->query_letter(borg["id"]); LOCALPOST_D->send_post(borg, fwd); return; } else if(user_exists(fwd)) { this_object()->add_post(fwd, "new", borg); return; } } load_folder(who, folder); if(__Folder != "new") borg["read"] = 1; else borg["read"] = 0; __BoxInfo = sort_array(__BoxInfo+({ borg }), "sort_folder",this_object()); LETTERS_D->add_folder(__Owner, __Folder, borg["id"]); save_folder(); if(folder != "new") return; if((pl=find_player(who)) && OPTIONS_D->query_option(who, "notify")) { msg = OPTIONS_D->query_option(who, "message"); if( !stringp(msg) ) msg = "%^RED%^%^BOLD%^New mail from $N!%^RESET%^\n"; msg = replace_string(replace_string(msg, "$S", borg["subject"]), "$N", capitalize(borg["from"])); message("system", msg, pl); } if(pl && ob = present(POSTAL_ID, pl)) { ob->incoming_post(); } } void delete_posts(string who, string folder, int *del) { int i; if(base_name(previous_object(0)) != OBJ_POST) return; load_folder(who, folder); if((i = sizeof(del)) != sizeof(__BoxInfo)) return; while(i--) { if(del[i]) { LETTERS_D->delete_folder(__Owner, __Folder, __BoxInfo[i]["id"]); __BoxInfo[i] = 0; } } __BoxInfo = sort_array(filter(__BoxInfo, "filter_folder", this_object()), "sort_folder", this_object()); save_folder(); } void mark_read(string who, string folder, int x) { if(base_name(previous_object(0)) != OBJ_POST) return; load_folder(who, folder); __BoxInfo[x]["read"] = 1; save_folder(); } mapping mail_status(string who) { int unread, total, i; load_folder(who, "new"); i = sizeof(__BoxInfo); while(i--) { total++; if(!__BoxInfo[i]["read"]) unread++; } return ([ "unread" : unread, "total" : total ]); } int sort_folder(mapping a, mapping b) { string alpha, beta; if(!stringp(a["date"])) alpha = ""+a["date"]; else alpha = a["date"]; if(!stringp(b["date"])) beta = ""+b["date"]; else beta = b["date"]; return strcmp(beta, alpha); } int filter_folder(mapping borg) { return (borg ? 1 : 0); }