145 lines
4.0 KiB
C
145 lines
4.0 KiB
C
/* /daemon/postal/folders.c
|
|
* from Dead Souls
|
|
* folder management daemon
|
|
* created by Descartes of Borg 940502
|
|
*/
|
|
|
|
#include <lib.h>
|
|
#include <dirs.h>
|
|
#include <iips.h>
|
|
#include <daemons.h>
|
|
#include <objects.h>
|
|
#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); }
|