inherit "std/object";
#include "mail.h"
#define SECURITY if (!"/secure/master"->high_programmer(geteuid(this_player()))) return 0;
int add_member(string list, string mem);
void load_me();
void save_me();
/*
* this object keeps track of who has a mailer at the moment and sends the
* mail to there instead.
* bounce.
*/
/*
* Hmmm, well I think I will add mailing list support. Sounds cute huh?
*/
static object *our_mailers;
mapping mailing_lists;
void setup() {
set_short("Mail tracker");
set_long("Mail tracker object");
reset_get();
reset_drop();
our_mailers = ({ });
mailing_lists = ([ ]);
load_me();
move("/room/admin/mail_room");
seteuid("Root");
} /* setup() */
int add_mailer(object ob, string str) {
int i;
if ((i=member_array(str, our_mailers)) == -1)
our_mailers += ({ ob, str });
else {
write(i);
if (our_mailers[i-1]) /* make sure it hasn't already died somehow */
our_mailers[i-1]->dest_me(); /* we dont want two of them */
our_mailers[i-1] = ob;
}
return 1;
} /* add_mailer() */
object find_mailer(string str) {
int i;
if ((i=member_array(str, our_mailers))==-1)
return 0;
return our_mailers[i-1];
} /* find_mailer() */
int delete_mailer(object ob) {
int i;
if ((i=member_array(ob, our_mailers))==-1)
return 0;
our_mailers = delete(our_mailers,i,2);
} /* delete_mailer() */
void we_are_done(object me) {
if (me)
me->dest_me();
} /* we_are_done() */
int mail(string str, string sub) {
object mailer;
mailer = clone_object(MAILER);
mailer->set_do_this_last( ({ this_object(), "we_are_done", mailer }) );
mailer->read_mail(str, sub);
return 2;
} /* mail() */
void save_me() {
save_object("/save/mail_track",1);
} /* save_me() */
void load_me() {
restore_object("/save/mail_track",1);
} /* load_me() */
string *query_mailing_lists() {
return keys(mailing_lists) + get_dir("/d/");
} /* query_mailing_lists() */
/* does this list exist??? */
int query_list(string list) {
return !undefinedp(mailing_lists[list]) || (file_size("/d/"+list) == -2);
} /* query_list() */
string *query_members(string list) {
if (mailing_lists[list])
return mailing_lists[list][0] + ({ });
if (file_size("/d/"+list) == -2)
return (string *)("/d/"+list+"/master")->query_members() +
({ (string)("/d/"+list+"/master")->query_lord() });
return ({ });
} /* query_members() */
int query_member(string list, string name) {
if (!mailing_lists[list])
if (file_size("/d/"+list) == -2)
return (int)("/d/"+list+"/master")->query_member(name);
else
return 0;
return member_array(name, mailing_lists[list][0]) != -1;
} /* query_member() */
int query_controller(string list, string name) {
if (!mailing_lists[list])
return 0;
return member_array(name, mailing_lists[list][1]) != -1;
} /* query_controller() */
int create_list(string list, string creator) {
int i;
SECURITY
if (mailing_lists[list])
return 0;
if (file_size("/d/"+list) == -2) {
return 0;
}
if ("/secure/login"->test_user(list)) {
return 0;
}
mailing_lists[list] = ({ ({ creator }), ({ creator }), creator });
save_me();
return 1;
} /* create_list() */
static int delete_list(string list) {
if (!mailing_lists[list])
return 0;
map_delete(mailing_lists, list);
save_me();
return 1;
} /* delete_list() */
int add_controller(string list, string mem) {
SECURITY
if (!mailing_lists[list])
return 0;
if (member_array(mem, mailing_lists[list][1]) != -1)
return 0; /* already a member... */
mailing_lists[list][1] += ({ mem });
add_member(list, mem);
save_me();
} /* add_controller() */
int remove_controller(string list, string meme) {
int i;
SECURITY
if (!mailing_lists[list])
return 0;
if ((i = member_array(name, mailing_lists[list][1])) == -1)
return 0;
mailing_lists[list][0] = delete(mailing_lists[list][1], i, 1);
save_me();
} /* remove_controller() */
int add_member(string list, string mem) {
SECURITY
if (!mailing_lists[list])
return 0;
if (member_array(mem, mailing_lists[list][0]) != -1)
return 0; /* already a member... */
mailing_lists[list][0] += ({ mem });
save_me();
return 1;
} /* add_member() */
int delete_member(string list, string mem) {
int i;
SECURITY
if (!mailing_lists[list])
return 0;
if ((i = member_array(mem, mailing_lists[list][0])) == -1)
return 0;
mailing_lists[list][0] = delete(mailing_lists[list][0], i, 1);
remove_controller(list, mem);
if (!sizeof(mailing_lists[list][0]))
delete_list(list);
save_me();
return 1;
} /* delete_member() */