/* /daemon/remotepost.c
* from Foundation II
* daemon to handle the network to local mail interface
* created by Descartes of Borg 940130
* modified for IIPS 3.1 940513
*/
#include <lib.h>
#include <save.h>
#include <daemons.h>
#include "remotepost.h"
inherit LIB_DAEMON;
private mapping __MailQueue;
static private mapping __IncomingMail;
void create() {
string *muds;
int i;
daemon::create();
SetNoClean(1);
__MailQueue = ([]);
__IncomingMail = ([]);
if(file_exists(sprintf("%s%s", SAVE_MAILQUEUE, __SAVE_EXTENSION__)))
restore_mailqueue();
i = sizeof(muds = keys(__MailQueue));
while(i--) __MailQueue[muds[i]][0]["in transit"] = 0;
}
string postal_check(string mud) {
if(file_name(previous_object()) != SERVICES_D) return 0;
if(!__MailQueue[mud = replace_string(lower_case(mud), " ", ".")]) return 0;
if(__MailQueue[mud][0]["in transit"]) return 0;
__MailQueue[mud][0]["in transit"] = 1;
return __MailQueue[mud][0]["post"][0];
}
string next_post(string mud) {
int x;
if(file_name(previous_object(0)) != SERVICES_D) return 0;
if(!__MailQueue[mud = replace_string(lower_case(mud), " ", ".")]) return 0;
x = __MailQueue[mud][0]["in transit"]++;
if(sizeof(__MailQueue[mud][0]["post"]) == x) {
if( !sizeof(__MailQueue[mud] = __MailQueue[mud][1..]) )
map_delete(__MailQueue, mud);
save_mailqueue();
return 0;
}
return __MailQueue[mud][0]["post"][x];
}
string resend_post(string mud) {
if(file_name(previous_object(0)) != SERVICES_D) return 0;
if(!__MailQueue[mud = replace_string(lower_case(mud), " ", ".")]) return 0;
__MailQueue[mud][0]["in transit"] = 1;
return __MailQueue[mud][0]["post"][0];
}
void send_post(mapping borg, string mud) {
string *msg, *tmp;
int i, maxi, x, y;
borg["to"] = convert_names(borg["to"]);
borg["cc"] = convert_names(borg["cc"]);
borg["from"] = sprintf("%s@%s", convert_name(borg["from"]),
mud_name());
tmp = ({ sprintf("||WIZTO:%s||WIZFROM:%s%s||SUBJECT:%s||DATE:%d||MSG:",
implode(borg["to"], ","), borg["from"],
(sizeof(borg["cc"]) ? implode(borg["cc"], ",") : ""), borg["subject"],
time()) });
msg = explode(borg["message"], "\n");
for(i=0, maxi = sizeof(msg); i<maxi; i++) {
if((y=strlen(tmp[x])) > 200) {
x++;
tmp += ({ "||MSG:" });
}
tmp[x] += sprintf("%s\n", msg[i]);
}
tmp[x] += "||ENDMSG:1";
if(!__MailQueue[mud])
__MailQueue[mud] = ({ ([ "in transit": 0, "post": tmp ]) });
else __MailQueue[mud] += ({ ([ "in transit": 0, "post": tmp ]) });
SERVICES_D->new_mail(mud);
save_mailqueue();
}
int incoming_post(mapping info) {
mapping borg;
if(file_name(previous_object(0)) != SERVICES_D) return 0;
info["NAME"] = replace_string(lower_case(info["NAME"]), " ", ".");
if(info["WIZTO"]) __IncomingMail[info["NAME"]] = info;
else {
if(!__IncomingMail[info["NAME"]]) return 0;
else __IncomingMail[info["NAME"]]["MSG"] += info["MSG"];
}
borg = ([]);
if(info["ENDMSG"]) {
borg["to"] = __IncomingMail[info["NAME"]]["WIZTO"];
borg["cc"] = __IncomingMail[info["NAME"]]["CC"];
borg["from"] = __IncomingMail[info["NAME"]]["WIZFROM"];
borg["subject"] = __IncomingMail[info["NAME"]]["SUBJECT"];
borg["message"] = __IncomingMail[info["NAME"]]["MSG"];
borg["date"] = __IncomingMail[info["NAME"]]["DATE"];
LOCALPOST_D->send_post(copy(borg),
local_targets(distinct_array(borg["to"] + borg["cc"])));
map_delete(__IncomingMail, info["NAME"]);
}
return 1;
}
static private string *local_targets(string *str) {
string a, b;
int i;
i = sizeof(str);
while(i--) {
sscanf(str[i], "%s@%s", a, b);
if(replace_string(lower_case(b), " ", ".") ==
replace_string(lower_case(mud_name()), " ", ".")) str[i] = a;
}
return str;
}
static private void save_mailqueue() {
unguarded((: save_object, SAVE_MAILQUEUE :));
}
static private void restore_mailqueue() {
unguarded((: restore_object, SAVE_MAILQUEUE :));
}
static private string *convert_names(string *noms) {
string a, b;
int i;
i = sizeof(noms);
while(i--) {
if(sscanf(noms[i], "%s@%s", a, b) != 2)
noms[i] = sprintf("%s@%s", noms[i], mud_name());
}
return noms;
}
mapping query_mail_queue() { return copy(__MailQueue); }