/* The trouble with intermud is coming up with a configuration that is standard, and thus usable by people. Regardless, here is a start. My proposal is to use current standard data members with a REQUEST of "mail", plus two extra members; "HEADER", which is the title of the mail; and "ROUTE", which is a string that describes the path which the mail has taken. This is a string which gives the original author, forwards, replies, and cc recipients of the mail. */ #include <master.cfg> #include <udp.h> #define ID_MAILER "mailer" #define TIME ctime(time())[4..15] mixed *mail; status test_recipient(string who) { who = lower_case(who); return restore_object("usr/creators/"+ who) || restore_object("usr/players/"+ who) || restore_object("usr/newbies/"+ who); } int udp_mail(mapping data) { object who_ob, ob; string who; string route; who = lower_case(data[RECIPIENT]); if(!test_recipient(who)) { INETD->send_udp(data[NAME], ([ REQUEST: REPLY, RECIPIENT: data[SENDER], ID: data[ID], DATA: "No such player, "+ capitalize(who) +"@"+ LOCAL_NAME +".\n" ]) ); return 1; } #ifdef WIZ_ONLY if(!restore_object("usr/creators/"+ who)) { INETD->send_udp(data[NAME], ([ REQUEST: REPLY, RECIPIENT: data[SENDER], ID: data[ID], DATA: capitalize(who) +" is Not a Creator.\n"+ "Mail is Rejected.\n" ])); return 1; } #endif /* this is where the exact implementation will vary depending on the mailer used by the local mud. Our mailer works using an array, keeping mail data orderly, and easily accessable. */ /* note: I can save_object to /room/post with 3.2 when i add this object to valid_write(), valid_read() in master */ /* check for mailer object in use */ who_ob = find_player(who); if(who_ob) { /* old mailer would call invalidate() */ tell_object(who_ob,"You have New mail from "+ data[SENDER] +"@"+ data[NAME] +".\n"); if(ob = present(ID_MAILER,who_ob)) ob->refresh_mail(); } mail = ({}); restore_object(MAIL_DIR+who); route = data["ROUTE"]; if(!route) route = "Sent by: "+ data[SENDER] +"@"+ data[NAME] +"Received by: "+ who +"@"+ LOCAL_NAME +"\n"; mail += ({ ({ data[SENDER] +"@"+ data[NAME], /* reply address */ data["HEADER"], /* title of mail */ route, /* route of mail */ data[DATA], /* mail message */ 1, /* new mail flag */ 0, /* confidential flag */ TIME, /* local date */ }) }); save_object(MAIL_DIR+who); if(ob) ob->load_mail(); mail = ({}); INETD->send_udp(data[NAME], ([ REQUEST: REPLY, RECIPIENT: data[SENDER], ID: data[ID], DATA: "Mail Received by "+ capitalize(who) +"@"+ LOCAL_NAME +".\n" ])); return 1; } status mail(string who, /* who are we sending to */ string mud, /* which mud */ string title, /* what is the header */ string route, /* what is its route */ string message) { /* what is the message */ object ob; int i; #ifdef WIZ_ONLY if(!this_player()->query_security_level()) return 0; #endif if(!sscanf(file_name(previous_object()),MAILER +"#%d", i)) { write("Invalid Call.\n"); return 0; } if(INETD->send_udp(mud, ([ REQUEST: "mail", SENDER: (string)this_player()->query_name(1), RECIPIENT: lower_case(who), "HEADER": title, "ROUTE": route, DATA: message, ]), 1)) write("Mail Request Sent.\n"); else { write("Mail Request Failed.\n"); } return 1; }