/* login.c */
#include <sys.h>
#include <secure.h>
static init() {
check_secure(SECURE_BOOTOBJ,NULL);
set_interactive();
if (!prototype(this_object())) return;
add_xverb("","do_huh");
add_verb("connect","do_connect");
add_verb("create","do_create");
add_verb("help","do_help");
add_verb("quit","do_quit");
add_verb("QUIT","do_quit");
}
static disconnect() {
destruct(this_object());
}
connect() {
if (connected(this_object()))
alarm(0,"welcome");
}
listen(arg) {
send_device(arg);
}
static welcome() {
cat("/login_banner");
}
static do_huh(arg) {
write(HUH_STRING);
return 1;
}
static do_help(arg) {
write("\nLogin Help:\n");
write("-----------\n");
write("create <name> <password>\n");
write("connect <name> <password>\n");
write("quit\n");
write("\n");
return 1;
}
static do_create(arg) {
string name,password;
int pos;
object new_player;
pos=instr(arg,1," ");
name=leftstr(arg,pos-1);
password=rightstr(arg,strlen(arg)-pos);
if ((!name) || (!password)) return 0;
if (!is_legal(name)) {
write("Illegal name.\n");
return 1;
}
if (find_player(name)) {
write("That player already exists.\n");
return 1;
}
if (find_wiz(name)) {
write("That player already exists.\n");
return 1;
}
new_player=clone_object("/obj/player");
call_other(new_player,"set_secure");
call_other(new_player,"set_name",name);
call_other(new_player,"set_password",password);
move_object(new_player,atoo("/obj/room"));
if (reconnect_device(new_player))
send_device("Reconnect to "+otoa(new_player)+" failed.\n");
else
call_other(new_player,"connect");
self_destruct();
return 1;
}
static self_destruct() {
alarm(1,"do_self_destruct");
}
static do_self_destruct() {
destruct(this_object());
}
static do_connect(arg) {
string name,password;
int pos;
object player;
pos=instr(arg,1," ");
name=leftstr(arg,pos-1);
password=rightstr(arg,strlen(arg)-pos);
if (!name) return 0;
if (!(player=find_player(name))) {
if (player=find_wiz(name))
return do_wiz(arg);
write("That player does not exist.\n");
return 1;
}
if (!call_other(player,"check_password",password)) {
write("Wrong password.\n");
return 1;
}
if (connected(player)) call_other(player,"force_disconnect");
if (reconnect_device(player))
send_device("Reconnect to "+otoa(player)+" failed.\n");
else
call_other(player,"connect");
self_destruct();
return 1;
}
static do_wiz(arg) {
string name,password;
int pos;
object wizard;
pos=instr(arg,1," ");
name=leftstr(arg,pos-1);
password=rightstr(arg,strlen(arg)-pos);
if (!name) return 0;
if (!(wizard=find_wiz(name))) {
write("That wizard does not exist.\n");
return 1;
}
if (!call_other(wizard,"check_password",password)) {
write("Wrong password.\n");
return 1;
}
if (connected(wizard)) call_other(wizard,"force_disconnect");
if (reconnect_device(wizard))
send_device("Reconnect to "+otoa(wizard)+" failed.\n");
else
call_other(wizard,"connect");
self_destruct();
return 1;
}
static do_quit(arg) {
disconnect_device();
destruct(this_object());
return 1;
}