/* -*- LPC -*- */
/*
* $Locker: $
* $Id: dom_ain.c,v 1.1 2003/03/21 02:01:51 ceres Exp $
*
*/
#include <parser.h>
#include <access.h>
#include <player_handler.h>
inherit "/cmds/base";
#define MASTER "/secure/master"
string get_last_log( int last_log_on );
string master;
int list(string arg) {
int i, num, cols;
string *members, *domains, mast;
if (this_player() != this_player(1))
return 0;
domains = get_dir("/d/");
if(!sizeof(domains)) {
notify_fail("No domains exist.\n");
return 0;
}
if(arg) {
if(member_array(arg, domains) == -1) {
notify_fail("No such domain as " + arg + ".\n");
return 0;
} else {
mast = "/d/" + arg + "/master";
write(capitalize((string)mast->query_lord()) + " is the lord of " +
arg + ".\nMembers Project\n");
members = (string *)mast->query_members();
cols = (int)this_player()->query_cols();
for (i=0;i<sizeof(members);i++)
printf("%-15s %*-=s\n", members[i], cols-16,
mast->query_project(members[i]));
return 1;
}
}
write("Current domains:\n");
for(i=0; i<sizeof(domains); i++) {
mast = "/d/" + domains[i] + "/master";
members = (string *)mast->query_members(arg);
printf( "%15s has %2d %-7s and is owned by %s.\n", domains[ i ],
num = sizeof( (string *)mast->query_members() ),
( ( num == 1 ) ? "member" : "members" ),
capitalize( (string)mast->query_lord() ) );
}
return 1;
} /* list() */
int add_creator(string cre, string dom) {
string mast;
if (this_player() != this_player(1))
return 0;
if(file_size("/d/" + dom) != -2) {
notify_fail("No such domain as " + dom + ".\n");
return 0;
}
cre = (string)this_player()->expand_nickname(cre);
mast = "/d/" + dom + "/master";
if((string)mast->query_lord() != geteuid(previous_object()) &&
!"/secure/master"->query_player_trustee(this_player()->query_name())) {
notify_fail("You are not the Lord of that domain.\n");
return 0;
}
if(!mast->add_member(cre)) {
notify_fail("Failed to add " + capitalize(cre) + " to domain " +
dom + ".\n");
return 0;
}
write("Creator " + capitalize(cre) + " now added to domain " + dom + ".\n");
return 1;
} /* add_creator() */
int delete_creator(string cre, string dom) {
string mast;
if (this_player() != this_player(1))
return 0;
if(file_size("/d/" + dom) != -2) {
notify_fail("No such domain as " + dom + ".\n");
return 0;
}
cre = (string)this_player()->expand_nickname(cre);
mast = "d/" + dom + "/master";
if((string)mast->query_lord() != geteuid(previous_object()) &&
!"/secure/master"->query_player_trustee(this_player()->query_name())) {
notify_fail("You are not the Lord of that domain.\n");
return 0;
}
if (!mast->remove_member(cre)) {
notify_fail("Failed to remove " + capitalize(cre) + " from domain " +
dom + "\n");
return 0;
}
write("Member " + capitalize(cre) + " removed from domain " + dom + ".\n");
return 1;
} /* delete_creator() */
int do_project(string cre, string dom, string project) {
string mast;
if (this_player() != this_player(1))
return 0;
if(file_size("/d/" + dom) != -2) {
notify_fail("No such domain as " + dom + ".\n");
return 0;
}
cre = (string)this_player()->expand_nickname(cre);
mast = "d/" + dom + "/master";
if((string)mast->query_lord() != geteuid(previous_object()) &&
!"/secure/master"->query_player_trustee(this_player()->query_name())) {
notify_fail("You are not the Lord of that domain.\n");
return 0;
}
if (!mast->set_project(cre, project)) {
notify_fail("Failed to set the project " + project + " for " +
capitalize(cre) + " in the domain " + dom + "\n");
return 0;
}
write("Project for " + capitalize(cre) + " set to " + project +
" in the domain " + dom + ".\n");
return 1;
} /* do_project() */
#ifdef DISABLED
// This is disabled since it can freeze the mud for 10+ seconds
int do_info() {
string *creators,
*domains,
*mem,
*cre_not,
bit;
mapping no_dir, not_creator;
int i, j, cols;
cols = (int)this_player()->query_cols();
creators = get_dir("/w/");
domains = "/secure/master"->query_domains();
no_dir = ([ ]);
not_creator = ([ ]);
cre_not = ({ });
for (i=0;i<sizeof(creators);i++)
if (file_size("/w/"+creators[i]) != -2) {
creators = delete(creators, i, 1);
i--;
} else if (!PLAYER_HANDLER->test_creator(creators[i])) {
cre_not += ({ creators[i] });
creators = delete(creators, i, 1);
i--;
}
for (i=0;i<sizeof(domains);i++) {
mem = (string *)("/d/"+domains[i]+"/master")->query_members() +
({ (string *)("/d/"+domains[i]+"/master")->query_lord() });
/* remove the members from the creators domain. */
creators -= mem;
/* Check each one... */
for (j=0;j<sizeof(mem);j++) {
if (file_size("/w/"+mem[j]) != -2)
no_dir[mem[j]] = domains[i];
if (!PLAYER_HANDLER->test_creator(mem[j]))
not_creator[mem[j]] = domains[i];
}
/* Ok... print the membership list. */
bit = "Members of "+domains[i]+" are: ";
printf("%s%-=*s\n", bit, cols-strlen(bit), implode(mem, ", ")+".");
}
if (sizeof(no_dir)) {
write("These creators are in domains but do not have a directory:\n");
printf(" %-=*s", cols-5, implode(keys(no_dir), ", ")+".\n");
}
if (sizeof(not_creator)) {
write("These creators are in domains but are not actually creators:\n");
printf(" %-=*s", cols-5, implode(keys(not_creator), ", ")+".\n");
}
if (sizeof(creators)) {
write("These creators are not in any domain:\n");
printf(" %-=*s", cols-5, implode(creators, ", ")+".\n");
}
cre_not -= ({ ".dead_ed_files", ".old_creators" });
if (sizeof(cre_not)) {
write("These creators have a directory, but are not creators...:\n");
printf(" %-=*s", cols-5, implode(cre_not, ", ")+".\n");
}
return 1;
} /* do_info() */
#endif
int detailed_info( string name, string option ) {
string ret, *members;
int i, cols;
if(member_array(name, "/secure/master"->query_domains()) == -1)
return notify_fail("No such domain: " + name + "\n");
cols = this_player()->query_cols();
master = "/d/"+name+"/master";
write(master+"\n");
members = master->query_members();
switch (option[0..0]) {
case "n":
members = sort_array(members, 1);
break;
case "p":
members = sort_array(members,
(: strcmp(master->query_project($1),
master->query_project($2)) :));
break;
case "l":
members = sort_array(members,
(:PLAYER_HANDLER->test_last($2) -
PLAYER_HANDLER->test_last($1):));
break;
}
ret = "The current members of this domain are:";
for (i=0;i<sizeof(members);i++) {
ret += sprintf("\n%-12s: Last login: %s\n",
capitalize(members[i]),
find_player(members[i])?
"%^GREEN%^%^BOLD%^Now%^RESET%^"
:get_last_log((int)PLAYER_HANDLER->test_last(members[i])),
);
ret += sprintf(" Project : %-=*s\n", cols-27,
master->query_project(members[i]));
}
this_player()->more_string(ret, "Domain Info");
return 1;
}
string get_last_log(int last_log_on) {
string retval;
int tmp_time, sec, min, hour, day;
/* Should be a nice number.... */
tmp_time = time()-last_log_on;
if (!tmp_time) {
sec = min = hour = day = 0;
}
if(tmp_time > 24*60*60) {
retval = (day = tmp_time/(24*60*60))+" day"+
(day<2?"":"s")+" ago.";
if(day > 14)
retval = "%^RED%^"+retval+"%^RESET%^";
else if(day > 7)
retval = "%^YELLOW%^"+retval+"%^RESET%^";
else
retval = "%^GREEN%^"+retval+"%^RESET%^";
} else
retval = "%^GREEN%^Today%^RESET%^";
return retval;
}
mixed *query_patterns() {
return ({
"list <string'list'>", (: list($4[0]) :),
"add <word'creator'> <word'domain'>", (: add_creator($4[0], $4[1]) :),
"delete <word'creator'> <word'domain'>",
(: delete_creator($4[0], $4[1]) :),
"project <word'creator'> <word'domain'> <string'project'>",
(: do_project($4[0], $4[1], implode($4[2..], " ")) :),
#ifdef DISABLED
"info", (: do_info() :),
#endif
"info <string'domain'>", (: detailed_info($4[0], " ") :),
"info <string'domain'> [by] {n|name|p|project|l|login}",
(: detailed_info($4[0], $4[1]) :) });
} /* query_patterns() */