// This is a Library handler, (as in books rather than quest information)
#define SAVE_FILE "/save/handlers/book_libraries"
#include "/secure/std/classes/book_repository"
mapping libraries;
/** @ignore yes */
void load_me(){
if ( unguarded( (: file_exists, SAVE_FILE + ".o" :) ) )
unguarded( (: restore_object, SAVE_FILE :) );
} /* load_me() */
/** @ignore yes */
void save_me(){
unguarded( (:save_object, SAVE_FILE :) );
} /* save_me() */
/** @ignore yes */
void create()
{
load_me();
if(!libraries)
libraries = ([ ]);
} /* create() */
/** @ignore yes */
void dest_me(){
save_me();
}
int setup_library(string lib_name, object lib_room_ob){
if(member_array(lib_name,keys(libraries)) > -1)
return 0;
libraries[lib_name] = new(class library, name: lib_name, books: ([ ]),
owners: ({ }), authorised_librarians: ({ }),
location: file_name(lib_room_ob) );
save_me();
return 1;
}
void delete_library(string lib_name){
if(member_array(lib_name,keys(libraries)) == -1)
return ;
map_delete(libraries,lib_name);
save_me();
}
string *query_libraries(){return keys(libraries); }
void add_owner(string lib_name, string owner){
if(member_array(lib_name,keys(libraries)) == -1)
return;
libraries[lib_name]->owners += ({ owner });
save_me();
}
void remove_owner(string lib_name, string owner){
if(member_array(lib_name,keys(libraries)) == -1)
return;
libraries[lib_name]->owners -= ({ owner });
if(!sizeof(libraries[lib_name]->owners))
event(users(),"inform",file_name(TO)+" reports no owners listed in library"+
libraries[lib_name]->name+":"+libraries[lib_name]->location,"debug");
save_me();
return;
}
string *query_owners(string lib_name){
if(member_array(lib_name,keys(libraries)) == -1)
return 0;
return libraries[lib_name]->owners;
}
string *query_librarians(string lib_name){
if(member_array(lib_name,keys(libraries)) == -1)
return 0;
return libraries[lib_name]->authorised_librarians;
}
void add_librarian(string lib_name, string librarian){
if(member_array(lib_name,keys(libraries)) == -1)
return;
libraries[lib_name]->authorised_librarians += ({ librarian });
save_me();
}
void remove_librarian(string lib_name, string librarian){
if(member_array(lib_name,keys(libraries)) == -1)
return;
libraries[lib_name]->authorised_librarians -= ({ librarian });
save_me();
return;
}
string *query_all_books_short(string lib_name){
string *bks = ({ });
if(member_array(lib_name,keys(libraries)) == -1)
return ({ });
foreach (class book b in values(libraries[lib_name]->books)){
bks += ({ b->short });
}
return bks;
}
class book *query_all_books_details(string lib_name){
class book *bks = ({ });
if(member_array(lib_name,keys(libraries)) == -1)
return ({ });
foreach (class book b in values(libraries[lib_name]->books)){
bks += ({ b });
}
return bks;
}
class book query_book_details(string lib_name, string book){
if(member_array(lib_name,keys(libraries)) == -1)
return 0;
if(member_array(book,keys(libraries[lib_name]->books))== -1)
return 0;
return libraries[lib_name]->books[book];
}
void add_book(string lib_name, string book_filename, int copyable){
if(member_array(lib_name,keys(libraries)) == -1)
return;
if(member_array(book_filename,keys(libraries[lib_name]->books)) > -1)
if(load_object(book_filename)->query_short() ==
libraries[lib_name]->books[book_filename]->short){
return;
}else{
event(users(),"inform",file_name(TO)+" duplicate book title found trying to "
"be added to library:" +libraries[lib_name]->location+" "+book_filename+
" & " + libraries[lib_name]->books[book_filename]->filename,"debug");
return ;
}
libraries[lib_name]->books[book_filename] = new(class book,
short: load_object(book_filename)->query_short(),
filename: book_filename,
author: find_object(book_filename)->query_author(),
keywords: find_object(book_filename)->query_keywords(),
loanee: 0,
copyable: copyable);
save_me();
return;
}
void remove_book(string lib_name, string book_filename){
if(member_array(lib_name,keys(libraries)) == -1)
return;
if(member_array(book_filename,keys(libraries[lib_name]->books)) == -1)
return ;
map_delete(libraries[lib_name]->books,book_filename);
save_me();
return;
}
string query_loanee(string lib_name, string book_filename){
if(member_array(lib_name,keys(libraries)) == -1)
return 0;
if(member_array(book_filename,keys(libraries[lib_name]->books)) == -1)
return 0;
return libraries[lib_name]->books[book_filename]->loanee;
}
void delete_loanees(string lib_name, string book_filename){
if(member_array(lib_name,keys(libraries)) == -1)
return ;
if(member_array(book_filename,keys(libraries[lib_name]->books)) == -1)
return ;
libraries[lib_name]->books[book_filename]->loanee = 0;
}
// Warning this wipes the loan info from all books in the library
void delete_library_loans(string lib_name){
if(member_array(lib_name,keys(libraries)) == -1)
return;
foreach(string str in keys(libraries[lib_name]->books)){
libraries[lib_name]->books[str]->loanee = 0;
}
save_me();
}
int add_loanee(string lib_name, string book_filename, string p_name){
if(member_array(lib_name,keys(libraries)) == -1)
return 0;
if(member_array(book_filename,keys(libraries[lib_name]->books)) == -1)
return 0;
if(libraries[lib_name]->books[book_filename]->loanee != 0)
return 0;
libraries[lib_name]->books[book_filename]->loanee = p_name ;
save_me();
return 1;
}
void remove_loanee(string lib_name, string book_filename, string p_name){
if(member_array(lib_name,keys(libraries)) == -1)
return ;
if(member_array(book_filename,keys(libraries[lib_name]->books)) == -1)
return ;
if(p_name != libraries[lib_name]->books[book_filename]->loanee)
return ;
libraries[lib_name]->books[book_filename]->loanee = 0;
save_me();
return ;
}
string query_filename_from_title(string lib_name, string b_title){
if(member_array(lib_name,keys(libraries)) == -1)
return 0;
foreach (string str in keys(libraries[lib_name]->books)){
if(libraries[lib_name]->books[str]->short == b_title)
return str;
}
return 0;
}
string *query_all_titles_in_library(string lib_name){
string *bks = ({ });
if(member_array(lib_name,keys(libraries)) == -1)
return 0;
foreach (string str in keys( libraries[lib_name]->books)){
bks += ({ libraries[lib_name]->books[str]->short });
}
return bks;
}