// MorgenGrauen MUDlib
//
// master.h -- definitions for the master object
//
// $Id: master.h 8809 2014-05-08 19:52:48Z Zesstra $

#ifndef __MASTER_H__
#define __MASTER_H__


#ifdef P_ARMOURS
#undef P_ARMOURS
#endif
#define P_ARMOURS "armours"

#ifdef P_WEAPON
#undef P_WEAPON
#endif
#define P_WEAPON "weapon"

//fuer den notify_fail-Hook
#ifndef P_DEFAULT_NOTIFY_FAIL
#define P_DEFAULT_NOTIFY_FAIL "default_notify_fail"
#endif

#include "/sys/functionlist.h"
#include "/sys/debug_message.h"

#include "/secure/config.h"
#include "/secure/wizlevels.h"

#include "/sys/userinfo.h"
#include "/sys/player/base.h"
#include "/sys/moving.h"
#include "/sys/defines.h"
#include "/sys/wizlist.h"
#include "/sys/daemon.h"
#include "/sys/mail.h"

//#define DEBUG(x)
#ifndef DEBUG
#define DEBUG(x)	if (funcall(symbol_function('find_player),"zesstra"))\
        tell_object(funcall(symbol_function('find_player),"zesstra"),\
        "MDBG: "+x+"\n")
#endif

//Logfile fuer Lesezugriffe
#define READ_FILE  "/log/ARCH/READ_FILE"

//Logfile fuer Crashes
#define CRASH_LOG  "/log/CRASH_LOG"

// MAX_ERRLOG_SIZE definiert, ab welcher Groesse ein Log in
// /log/error rotiert.
#define MAX_ERRLOG_SIZE 51200 

#define log_file(file,str) write_file("/log/"+file, str)
#define NAME(x)            getuid(x)
#define CAP_NAME(x)        capitalize(NAME(x))
#define TP                 efun::this_player()
#define TI                 efun::this_interactive()
#define PO                 efun::previous_object()
#define TO                 efun::this_object()

// Verzeichnis mit Infomails fuer Magierbefoerderungen
#define WIZ_HELP_MAIL_DIR "/doc/infomails/"

// aus master.c
public   string creator_file(mixed str);
protected mixed give_uid_to_object(string datei, object|lwobject po);
protected mixed load_uid_hook(string datei);
protected mixed clone_uid_hook(object bluep, string new_name);
protected mixed lwo_uid_hook(object bluep);
protected mixed call_sefun(string sefun, varargs mixed args);
protected void  save_wiz_file();

// aus domains.c
int            domain_master(string user, string domain);
int            domain_member(string user, string domain);
string         *get_domain_homes(string wiz);

// aus guild.c
int           guild_master(string user, string guild);

// aus file_access.c
void          LoadDeputyFileList();
mixed         valid_read(string path, string euid, string fun, object obj);
mixed         valid_write(string path, string euid, string fun, object obj);

// aus misc.c
string         _get_path(string path, string user);
string         QueryBanished(string str);
int            TBanishName(string name, int days);
varargs void   BanishName(string name, string reason, int force);

// sendet bei Befoerderungen Infomail an Magier
protected void SendWizardHelpMail(string name, int level);

// aus userinfo.c
public int       find_userinfo(string user);
protected mixed *get_full_userinfo(string user);
public mixed    *get_userinfo(string user);
public int       get_wiz_level(string user);
public mixed     query_userlist(string user, int prop);
public int       query_wiz_level(object|string player);
int              update_wiz_level(string user,int lev);
protected void   set_guilds(string player, string *guilds);
protected void   set_domains(string player, string *domains);
void             update_late_players();
public string    secure_savefile(string name);
protected void   save_userinfo(string user);
protected string query_secure_euid();
protected int    query_secure_level();
public varargs string* QueryUIDAlias(string alias, int rec);

//Einen Magier als verantwortlich fuer eine bestimmte UID eintragen
public string*   AddWizardForUID(string uid, string wizuid);
//Einen Magier wieder austragen, wenn er nicht mehr zustaendig ist.
public string*   RemoveWizardFromUID(string uid, string wizuid);
//Verantwortliche Magier fuer eine UID ausgeben
public varargs string* QueryWizardsForUID(string uid, int recursive);
//Welche UIDs ist ein Magier implizit verantwortlich? (Ist er RM,
//Gildenmagier, in welchen Regionen hat er ein Verzeichnis, etc.)
public varargs string* QueryUIDsForWizard(string wizuid, int recursive);


#endif //__MASTER_H__
