285 lines
7.3 KiB
C
285 lines
7.3 KiB
C
#include <lib.h>
|
|
#include <commands.h>
|
|
#include <daemons.h>
|
|
#include <vendor_types.h>
|
|
inherit LIB_ITEM;
|
|
|
|
int count, state, blocked, short, logged, forwarding;
|
|
int lastchecked, lastmessage;
|
|
string message, announce, name, final, tempy, cratty, f_global, forwardee;
|
|
object owner;
|
|
|
|
int read_it(string str);
|
|
|
|
int validate(){
|
|
object prev = previous_object();
|
|
if(prev && prev->GetForced()) return 0;
|
|
if(this_player() && this_player()->GetForced()) return 0;
|
|
if(!name || (owner && this_player() == owner)) return 1;
|
|
return 0;
|
|
}
|
|
|
|
void create(){
|
|
::create();
|
|
AddSave(({"state","forwarding","name","forwardee","announce","message",
|
|
"lastchecked","lastmessage"}));
|
|
SetKeyName("answering machine");
|
|
SetId( ({"machine","voicemail"}) );
|
|
SetShort("an answering machine");
|
|
SetLong("This is a portable answering machine. There is a label on "
|
|
"it you can read.");
|
|
SetItems(([
|
|
"label" : "A label you can read.",
|
|
]));
|
|
SetRead(([
|
|
"label" : (: read_it :),
|
|
]));
|
|
SetDefaultRead("Try: read label on machine");
|
|
SetProperties(([
|
|
"no steal" : 1,
|
|
]));
|
|
SetMass(1);
|
|
SetVendorType(VT_TREASURE);
|
|
state=0;
|
|
count = 0;
|
|
set_heart_beat(10);
|
|
}
|
|
|
|
void init(){
|
|
::init();
|
|
add_action("toggle_answer","answer");
|
|
add_action("check_it","check");
|
|
add_action("set_ann","announce");
|
|
add_action("check_mess","tells");
|
|
add_action("erase","erase");
|
|
//add_action("tellforward","tellforward");
|
|
add_action("arch_it","archive");
|
|
if(owner){
|
|
this_object()->get_ann();
|
|
}
|
|
else {
|
|
if(name && owner) return;
|
|
if(environment() && interactive(environment())){
|
|
unguarded( (: owner = environment() :) );
|
|
unguarded( (: name = owner->GetKeyName() :) );
|
|
}
|
|
}
|
|
}
|
|
|
|
void heart_beat(){
|
|
count++;
|
|
if(!clonep(this_object())) return;
|
|
if(name && !owner){
|
|
if(!(owner = unguarded( (: find_player(name) :) ))){
|
|
this_object()->eventDestruct();
|
|
}
|
|
}
|
|
if(count > 36){
|
|
count = 0;
|
|
if(lastchecked < lastmessage){
|
|
if(environment()){
|
|
environment()->eventPrint("The answering machine %^GREEN%^"+
|
|
"BEEPS%^RESET%^.");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int tellforward(string str){
|
|
object env = environment();
|
|
//This functionality is incomplete
|
|
return 0;
|
|
if(!validate()) return 0;
|
|
if(!env || !this_player() || env != this_player() ){
|
|
return 0;
|
|
}
|
|
if(!str){
|
|
if(forwardee && forwarding){
|
|
write("You are forwarding tells to "+forwardee+".");
|
|
}
|
|
else {
|
|
write("There is no current forwarding recipient.");
|
|
}
|
|
return 1;
|
|
}
|
|
if(str == "off"){
|
|
write("Disabling tell forwarding.");
|
|
forwarding = 0;
|
|
forwardee = 0;
|
|
return 1;
|
|
}
|
|
write("You are now forwarding tells to: "+str);
|
|
forwardee = str;
|
|
forwarding = 1;
|
|
return 1;
|
|
}
|
|
|
|
int toggle_answer(string str){
|
|
if(str=="on"){
|
|
if(state==1){
|
|
write("The answering machine is already on.\n");
|
|
return 1;
|
|
}
|
|
state=1;
|
|
blocked=1;
|
|
short=1;
|
|
logged=1;
|
|
unguarded( (: owner = this_player() :) );
|
|
unguarded( (: name = this_player()->GetKeyName() :) );
|
|
this_object()->log_it("*** Answering machine activated on "+
|
|
local_ctime(time())+".\n");
|
|
write("The answering machine is on.\n");
|
|
return 1;
|
|
}
|
|
if(str=="off"){
|
|
if(state==0){
|
|
write("The machine is already turned off.\n");
|
|
return 1;
|
|
}
|
|
state=0;
|
|
blocked=0;
|
|
short=0;
|
|
logged=0;
|
|
name=0;
|
|
owner=0;
|
|
cratty=0;
|
|
tempy=0;
|
|
forwardee=0;
|
|
forwarding=0;
|
|
write("The answering machine is off.\n");
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
int query_answer(){
|
|
return state;
|
|
}
|
|
|
|
int do_tell(string wut){
|
|
owner->eventForce(wut);
|
|
return 1;
|
|
}
|
|
|
|
int get_message(string str){
|
|
object prev = previous_object();
|
|
if(!prev ||
|
|
(base_name(prev) != CMD_TELL && base_name(prev) != SERVICES_D)){
|
|
return 0;
|
|
}
|
|
cratty="";
|
|
if(forwarding && forwardee){
|
|
string localtemp;
|
|
cratty += "(forwarded to "+forwardee+") ";
|
|
localtemp = "tell "+forwardee+" "+str;
|
|
tempy = replace_string(localtemp,"tells you","");
|
|
unguarded( (: do_tell, tempy :) );
|
|
}
|
|
tempy = 0;
|
|
cratty += str;
|
|
this_object()->final();
|
|
lastmessage = time();
|
|
return 1;
|
|
}
|
|
|
|
string send_message(){
|
|
if(!sizeof(announce)) this_object()->get_ann();
|
|
return announce;
|
|
}
|
|
|
|
static int log_it(string str){
|
|
f_global=str;
|
|
name=lower_case(owner->GetKeyName());
|
|
unguarded((: write_file(homedir(owner)+"/log/messages", f_global+"\n") :));
|
|
return 1;
|
|
}
|
|
|
|
static int final(){
|
|
tempy = local_ctime(time())+":\n"+cratty+"\n\n";
|
|
if(!blocked){
|
|
message("info",final+"\n", environment(this_object()));
|
|
}
|
|
if(logged){
|
|
unguarded( (: this_object()->log_it(tempy) :) );
|
|
}
|
|
cratty = 0;
|
|
tempy = 0;
|
|
return 1;
|
|
}
|
|
|
|
int set_ann(string str){
|
|
if(!validate()) return 0;
|
|
if(!state){
|
|
write("The machine is not turned on.\n");
|
|
return 1;
|
|
}
|
|
announce=str;
|
|
rm(homedir(owner)+"/log/annc");
|
|
write_file(homedir(this_player())+"/log/annc", announce);
|
|
return 1;
|
|
}
|
|
|
|
int get_ann(){
|
|
if(file_size(homedir(owner)+"/log/annc") > 0){
|
|
unguarded( (: announce=read_file(homedir(owner)+"/log/annc") :) );
|
|
}
|
|
if(!sizeof(announce)){
|
|
announce=capitalize(name)+" cannot "+
|
|
"answer your tell right now. Your message has been recorded "+
|
|
"and "+nominative(owner)+" will get back to you as soon as possible.";
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int check_mess(string str){
|
|
if(!validate()) return 0;
|
|
if(!str){
|
|
lastchecked = time();
|
|
owner->more(homedir(owner)+"/log/messages");
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
string read_it(string str){
|
|
string ret = "\n"+
|
|
"answer on/off - on activates the machine. off doesn't.\n"+
|
|
"announce <msg> - '<msg>' is whatever you want the sender to see.\n"+
|
|
"tells - lists messages by date, time and sender.\n"+
|
|
"erase tape - erases all messages on the machine.\n"+
|
|
"archive tape - copies tape onto backup archive file.\n"+
|
|
//"tellforward <name> - Forwards any tells you receive to the "+
|
|
//"person specifed. Use with GREAT caution.\n"+
|
|
"\n"+
|
|
"\n";
|
|
return ret;
|
|
}
|
|
|
|
int erase(string str){
|
|
if(!validate()) return 1;
|
|
if(str=="tape"){
|
|
write("You erase the answering machine tape.\n");
|
|
rm(homedir(owner)+"/log/messages");
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
int arch_it(string str){
|
|
string temp;
|
|
if(!validate()) return 0;
|
|
if(str=="tape"){
|
|
write("You save the contents of the answering machine tape "
|
|
"into "+homedir(owner)+"/log/archive.\n");
|
|
temp=read_file(homedir(owner)+"/log/messages");
|
|
write_file(homedir(owner)+"/log/archive", temp);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
int clean_tape(string str){
|
|
if(!validate()) return 0;
|
|
if(str=="tape"){
|
|
this_object()->arch_it("tape");
|
|
this_object()->erase("tape");
|
|
return 1;
|
|
}
|
|
}
|