#include "/secure/master.h"#include "/sys/files.h"
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | P_GUILD_DEFAULT_SPELLBOOK "guild_sb" |
| #define | GUILDMASTER "/secure/gildenmaster" |
| #define | PLAYERSHELLS |
Funktionen | |
| public varargs string * | QueryWizardsForUID (string uid, int recursive) |
| public void | ResetUIDAliase () |
| public varargs string * | QueryUIDAlias (string alias, int rec) |
| public varargs string * | QueryUIDsForWizard (string wizuid, int recursive) |
| public string * | AddWizardForUID (string uid, string wizuid) |
| public string * | RemoveWizardFromUID (string uid, string wizuid) |
| void | RemoveFromCache (string user) |
| int | clear_cache () |
| int | ResetUIDCache () |
| string | list_late_players () |
| int | check_late_player (string str) |
| public mixed * | show_cache () |
| public int | find_userinfo (string user) |
| public mixed * | get_userinfo (string user) |
| public string | query_player_object (string name) |
| public int | good_password (string str, string name) |
| public string | get_wiz_name (string file) |
| public int | get_wiz_level (string user) |
| public int | query_wiz_level (mixed player) |
| public string | secure_savefile (string name) |
| public string | secure_isavefile (string name) |
| int | update_wiz_level (string user, int lev) |
| int | update_ep (string user, string ep_neu) |
| int | update_ek (string user, string ek_neu) |
| int | update_mq (string user, string mq_neu) |
| int | update_ektips (string user, string ek_neu) |
| int | update_fptips (string user, string fp_neu) |
| string | query_ep (string user) |
| string | query_ek (string user) |
| string | query_mq (string user) |
| string | query_ektips (string user) |
| string | query_fptips (string user) |
| int | set_player_object (string user, string objectname) |
| int | update_password (string old, string new) |
| int | delete_player (string passwd, string real_name) |
| public mapping | get_all_players () |
| protected void | create () |
| void | update_late_players () |
| protected mixed * | get_full_userinfo (string user) |
| protected void | save_userinfo (string user) |
| protected void | set_domains (string player, string *domains) |
| protected void | set_guilds (string player, string *guilds) |
| protected void | _cleanup_uinfo () |
| private string * | ExpandUIDAlias (string alias, int rec) |
Variablen | |
| nosave mapping | userlist |
| string | name |
| string | password |
| string | ektips |
| string | fptips |
| int | level |
| string | shell |
| int | creation_date |
| string | ep |
| string | ek |
| string | mq |
| string * | domains |
| string * | guilds |
| string * | uidstotakecare |
| nosave string * | lateplayers |
| nosave private mapping | userids = ([]) |
| nosave private mapping | uidaliase = ([]) |
| #define GUILDMASTER "/secure/gildenmaster" |
Definiert in Zeile 88 der Datei userinfo.c.
Wird benutzt von austreten(), beitreten(), create() und ExpandUIDAlias().
| #define P_GUILD_DEFAULT_SPELLBOOK "guild_sb" |
Definiert in Zeile 86 der Datei userinfo.c.
Wird benutzt von AddSpell(), create() und ExpandUIDAlias().
| #define PLAYERSHELLS |
({"/std/shells/darkelf", "/std/shells/dwarf", \
"/std/shells/elf", "/std/shells/feline", "/std/shells/hobbit", \
"/std/shells/human" })
Definiert in Zeile 641 der Datei userinfo.c.
| protected void _cleanup_uinfo | ( | ) |
Definiert in Zeile 927 der Datei userinfo.c.
00928 { 00929 mixed users; 00930 int i; 00931 00932 for (users=m_indices(userlist),i=sizeof(users)-1; i>=0;i--) 00933 if ((time()-userlist[users[i],USER_TOUCH]) > 1800 00934 && !funcall(symbol_function('find_player/*'*/),users[i])) 00935 efun::m_delete(userlist,users[i]); 00936 }
| public string* AddWizardForUID | ( | string | uid, | |
| string | wizuid | |||
| ) |
Definiert in Zeile 209 der Datei userinfo.c.
00209 { 00210 if (!stringp(wizuid) || !strlen(wizuid) 00211 || !IS_LEARNER(wizuid)) 00212 return(({})); 00213 00214 //Zugriff nur als EM oder jemand, der fuer die UID zustaendig ist. 00215 if ( funcall(symbol_function('secure_level)) < ARCH_LVL 00216 && member( 00217 QueryUIDsForWizard(funcall(symbol_function('secure_euid))), 00218 uid) == -1) 00219 return(userlist[wizuid,USER_UIDS_TO_TAKE_CARE]); 00220 00221 if (!pointerp(userlist[wizuid,USER_UIDS_TO_TAKE_CARE])) 00222 //Array neu anlegen 00223 userlist[wizuid,USER_UIDS_TO_TAKE_CARE]=({uid}); 00224 else { 00225 //Ein Array schon vorhanden 00226 if (member(userlist[wizuid,USER_UIDS_TO_TAKE_CARE],uid)==-1) 00227 //uid nicht drin 00228 userlist[wizuid,USER_UIDS_TO_TAKE_CARE]= 00229 userlist[wizuid,USER_UIDS_TO_TAKE_CARE]+({uid}); 00230 } 00231 save_userinfo(wizuid); 00232 // aus dem UID-Alias-Cache werfen 00233 efun::m_delete(uidaliase, wizuid); 00234 // Aufruf, um userids und uidaliase zu aktualisieren 00235 QueryUIDsForWizard(wizuid); 00236 return(userlist[wizuid,USER_UIDS_TO_TAKE_CARE]); 00237 }
| int check_late_player | ( | string | str | ) |
Definiert in Zeile 325 der Datei userinfo.c.
Benutzt lateplayers.
Wird benutzt von logon2().
00326 { 00327 if(!lateplayers || !str || str=="") 00328 { 00329 return 0; 00330 } 00331 00332 if(member(lateplayers,str)!=-1) 00333 { 00334 return 1; 00335 } 00336 00337 return 0; 00338 }

| int clear_cache | ( | ) |
Definiert in Zeile 281 der Datei userinfo.c.
00281 { 00282 userlist=m_allocate(0,widthof(userlist)); 00283 update_late_players(); 00284 return 1; 00285 }
| protected void create | ( | ) |
Definiert in Zeile 804 der Datei userinfo.c.
00805 { 00806 userlist=m_allocate(0,12); 00807 update_late_players(); 00808 }
| int delete_player | ( | string | passwd, | |
| string | real_name | |||
| ) |
Definiert in Zeile 748 der Datei userinfo.c.
Benutzt find_userinfo(), get_wiz_level(), LEARNER_LVL, LIBSAVEDIR, m_delete(), MAILDIR, P_SECOND, password, PO, SECUREDIR, SEER_LVL, TBanishName(), TI, TO, TP, update_password(), USER_PASSWORD und userlist.
Wird benutzt von self_delete2().
00749 { 00750 int wlevel; 00751 string part_filename; 00752 00753 if (!PO || PO!=TP || PO!=TI || real_name != getuid(PO) || 00754 !find_userinfo(real_name)) 00755 return 0; 00756 mixed erstie=(mixed)this_interactive()->QueryProp(P_SECOND); 00757 password = userlist[real_name,USER_PASSWORD]; 00758 wlevel = get_wiz_level(real_name); 00759 if (!update_password(passwd, passwd)) return 0; 00760 00761 // Spielpausen aufheben (sonst kann man als Spieler nen Namen sperren). 00762 TBanishName(real_name, 0); 00763 00764 part_filename="/"+real_name[0..0]+"/"+real_name+".o"; 00765 rm("/"SECUREDIR"/save"+part_filename); 00766 rm("/"LIBSAVEDIR"/"+part_filename); 00767 rm("/"MAILDIR"/"+part_filename); 00768 00769 efun::m_delete(userlist,real_name); 00770 00771 if (wlevel >= LEARNER_LVL) 00772 TO->BanishName(real_name, "So hiess mal ein Magier hier"); 00773 else if (wlevel >= SEER_LVL) 00774 TO->BanishName(real_name, "So hiess mal ein Seher hier"); 00775 00776 funcall( symbol_function('log_file), "USERDELETE", 00777 sprintf("%s: %s %s(%s)\n", 00778 ctime(time()),real_name, 00779 (stringp(erstie)?sprintf("[Erstie: %s] ",erstie):""), 00780 query_ip_number(TI))); 00781 00782 return 1; 00783 }


| private string* ExpandUIDAlias | ( | string | alias, | |
| int | rec | |||
| ) |
Definiert in Zeile 946 der Datei userinfo.c.
Benutzt __MAX_MAPPING_KEYS__, DOMAINDIR, find_userinfo(), FSIZE_DIR, guild, GUILDDIR, GUILDID, GUILDMASTER, P_GUILD_DEFAULT_SPELLBOOK, PROJECTDIR, QueryUIDsForWizard(), uidaliase und uids.
00946 { 00947 00948 string *uids=({}); 00949 00950 // Regionsname? 00951 if (file_size("/"DOMAINDIR"/"+alias) == FSIZE_DIR) { 00952 //generelle Pseudo-UID 'd.region' und 'region' fuer geloeschte 00953 //Magier dieser Region 00954 uids += ({DOMAINDIR"."+alias, alias}); 00955 //alle Magier-Verzeichnisse ermitteln: 00956 string tmpdir="/"DOMAINDIR"/"+alias+"/"; 00957 foreach(string dir: (get_dir(tmpdir+"*") || ({})) 00958 - ({".","..",".svn"})) { 00959 // schauen, obs nen (sichtbares) Verzeichnis ist und ob der Magier 00960 // existiert. Letzteres aber nur, falls die Rekursionstiefe min. 100 00961 // ist, da beim Nachschauen eines Magiers mit (mehreren) 00962 // RM-Posten, der in der Region RMs aus anderen Regionen hat, leicht 00963 // Rekursionstiefen von 20 (*4) auftreten koennen, wenn noch gar 00964 // keine UIDs im Cache sind (find_userinfo() ruft indirekt diese 00965 // Funktion). 00966 if (dir[0]!='.' 00967 && file_size(tmpdir+dir) == FSIZE_DIR 00968 #if __MAX_RECURSION__ > 99 00969 && find_userinfo(dir) 00970 #endif 00971 ) 00972 uids += ({DOMAINDIR"."+alias+"."+dir}); 00973 } 00974 } 00975 // Gildenname? 00976 else if (GUILDMASTER->ValidGuild(alias)) { 00977 uids += ({GUILDID"."+alias}); 00978 //hat die Gilde ein Projektverzeichnis? 00979 if (file_size("/"PROJECTDIR"/"+alias) == FSIZE_DIR) { 00980 uids += ({PROJECTDIR"."+alias}); 00981 } 00982 // jetzt haben dummerweise die Spellbooks meist nicht den gleichen 00983 // Namen wie die Gilde. D.h. die Gilde muss nun noch nach dem 00984 // Namen des Spellbooks gefragt werden, weil dessen UID nicht 00985 // unbedingt gleich dem der Gilde ist. *seufz* 00986 string spbook; 00987 object guild; 00988 catch(guild=load_object(GUILDDIR"/"+alias)); 00989 if (objectp(guild) 00990 && (strlen(spbook=(string) 00991 guild->QueryProp(P_GUILD_DEFAULT_SPELLBOOK))) 00992 && spbook!=alias) 00993 uids += ({GUILDID"."+spbook}); 00994 } 00995 // Spieler/Magier-UID? 00996 else if (find_userinfo(alias)) { 00997 // wenn rec > 0, wird eine Spieler-UID als Alias aufgefasst und zu seinen 00998 // UIDs expandiert. Hierbei erfolgt aber nur eine Rekursion. 00999 if (!rec) uids = QueryUIDsForWizard(alias, 1); 01000 else uids = ({alias}); 01001 } 01002 // Projektkrams? -> alle Subdirs von /p/ ausser /p/service selber. 01003 else if (alias==PROJECTDIR) { 01004 foreach(string dir: (get_dir("/"PROJECTDIR"/*") || ({})) 01005 - ({".","..",".svn","service"})) { 01006 if (dir[0]!='.' && 01007 file_size("/"PROJECTDIR"/"+dir) == FSIZE_DIR) 01008 uids += ({PROJECTDIR"."+dir}); 01009 } 01010 } 01011 // p.service? -> Alle Subdirs von /p/service. 01012 else if (alias==PROJECTDIR".service") { 01013 foreach(string dir: (get_dir("/"PROJECTDIR"/service/*") || ({})) 01014 - ({".","..",".svn"})) { 01015 if (dir[0]!='.' && 01016 file_size("/"PROJECTDIR"/service/"+dir) == FSIZE_DIR) 01017 uids += ({PROJECTDIR".service."+dir}); 01018 } 01019 } 01020 // wenn nix zutrifft -> unexpandiert zurueckgeben 01021 else 01022 uids = ({alias}); 01023 01024 // im Cache vermerken 01025 if (sizeof(uidaliase) >= __MAX_MAPPING_KEYS__) 01026 uidaliase=m_allocate(1); 01027 // auch vermerken, wenn keine UIDs ermittelt wurden. 01028 uidaliase += ([alias: uids]); 01029 return uids; 01030 }

| public int find_userinfo | ( | string | user | ) |
Definiert in Zeile 346 der Datei userinfo.c.
Benutzt __MAX_MAPPING_KEYS__, __MAX_MAPPING_SIZE__, creation_date, domains, ek, ektips, ep, file(), fptips, guilds, i, LEARNER_LVL, level, mq, password, QueryUIDsForWizard(), restore_object(), secure_savefile(), shell, uidstotakecare, USER_LEVEL, USER_TOUCH und userlist.
Wird benutzt von add_domain_master(), add_guild_master(), advance_wizlevel(), delete_player(), domain_master(), ExpandUIDAlias(), get_userinfo(), get_wiz_level(), guild_master(), query_ek(), query_ektips(), query_ep(), query_fptips(), query_mq(), query_player_object(), QueryWizardsForUID(), remove_domain_master(), remove_guild_master(), set_player_object(), update_ek(), update_ektips(), update_ep(), update_fptips(), update_mq(), update_password() und update_wiz_level().
00346 { 00347 string file; 00348 int i; 00349 if (!stringp(user) || !strlen(user) 00350 || member(user,' ')!=-1 || member(user,':')!=-1) 00351 return 0; 00352 if (!member(userlist,user)) { 00353 //erstmal schauen, ob wir mit einem neuen Eintrag nicht die max. 00354 //Mapping-Groessen ueberschreiten, wenn ja, einen Eintrag loeschen 00355 //BTW: widthof()+1 ist richtig so. 00356 //BTW2: Ich hoffe, die max. Arraygroesse ist immer gross genug, sollte 00357 //sie aber sein bei ner Mappingbreite von 10. 00358 // BTW3: Dieses Rausloeschen von einem Eintrag bei Erreichen der Grenze 00359 // erhoeht die benoetigten Ticks fuer diese Funktion um das 5-6fache und 00360 // die noetige Zeit um das 70fache. Daher wird der Cache bei Erreichen 00361 // der Grenze jetzt einfach geloescht. 00362 if ( ( (i=sizeof(userlist)+1) >= __MAX_MAPPING_KEYS__) 00363 || (( i * (widthof(userlist)+1)) > 00364 __MAX_MAPPING_SIZE__)) 00365 //efun::m_delete(userlist,m_indices(userlist)[0]); 00366 userlist=m_allocate(1,widthof(userlist)); 00367 00368 // Usersavefile finden 00369 if ((file=secure_savefile(user))=="") { 00370 // User gibt es nicht, aber Anfrage cachen 00371 userlist+=([user: "NP"; -1; ({}); "LOCKED"; -1; time(); ""; ""; ""; 00372 ({});"";""; 0 ]); 00373 return 0; 00374 } 00375 password=""; 00376 ep=""; 00377 ek=""; 00378 mq=""; 00379 guilds=({}); 00380 ektips=""; 00381 fptips=""; 00382 uidstotakecare=0; 00383 if (!restore_object(file)) return 0; 00384 userlist+=([user: password; level; domains; shell; creation_date; 00385 time();ep; ek; mq; guilds; ektips; fptips; uidstotakecare]); 00386 // die speziellen UIDs, fuer die dieser Magier zustaendig ist, ermitten 00387 // und gleichzeitig im entsprechenden Mapping fuers Reverse-Loopup 00388 // speichern. 00389 if (level >= LEARNER_LVL) 00390 QueryUIDsForWizard(user); 00391 } 00392 userlist[user,USER_TOUCH]=time(); 00393 if (userlist[user,USER_LEVEL]==-1) return 0; 00394 return 1; 00395 }


| public mapping get_all_players | ( | ) |
Definiert in Zeile 788 der Datei userinfo.c.
00788 { 00789 string *dirs=({"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o", 00790 "p","q","r","s","t","u","v","w","x","y","z"}); 00791 mapping allplayer=([]); 00792 string *tmp; 00793 foreach(string dir: dirs) { 00794 tmp=get_dir("/secure/save/"+dir+"/*") 00795 + get_dir("/secure/save_inactive/"+dir+"/*") 00796 - ({".","..",".KEEP",".svn"}); 00797 allplayer[dir] = map(tmp,function string (string fn) 00798 { return explode(fn,".")[0]; } ); 00799 } 00800 return allplayer; 00801 }
| protected mixed* get_full_userinfo | ( | string | user | ) |
Definiert in Zeile 835 der Datei userinfo.c.
Wird benutzt von advance_wizlevel() und CheckPasswd().
00835 { 00836 if(!user||user=="") 00837 return 0; 00838 user=explode(user,".")[0]; 00839 if (!member(userlist,user) && !find_userinfo(user)) 00840 return 0; 00841 00842 return({user,userlist[user,USER_PASSWORD],userlist[user,USER_LEVEL], 00843 userlist[user,USER_DOMAIN], userlist[user,USER_OBJECT], 00844 userlist[user,USER_CREATION_DATE], 0, 0, userlist[user,USER_GUILD], 00845 userlist[user,USER_EKTIPS],userlist[user,USER_FPTIPS], 00846 userlist[user,USER_UIDS_TO_TAKE_CARE]}); 00847 }

| public mixed* get_userinfo | ( | string | user | ) |
Definiert in Zeile 398 der Datei userinfo.c.
Benutzt find_userinfo(), USER_CREATION_DATE, USER_DOMAIN, USER_EKTIPS, USER_FPTIPS, USER_GUILD, USER_LEVEL, USER_OBJECT, USER_UIDS_TO_TAKE_CARE und userlist.
Wird benutzt von add_domain_master(), add_guild_master(), domain_master(), guild_master(), remove_domain_master(), remove_guild_master() und Validate().
00398 { 00399 if(!user||user=="") 00400 return 0; 00401 user=explode(user,".")[0]; 00402 if (!member(userlist,user) && !find_userinfo(user)) 00403 return 0; 00404 00405 if (userlist[user,USER_LEVEL]==-1) return 0; 00406 00407 return({user,"##"+user,userlist[user,USER_LEVEL], 00408 userlist[user,USER_DOMAIN], userlist[user,USER_OBJECT], 00409 userlist[user,USER_CREATION_DATE], 0, 0, 00410 userlist[user,USER_GUILD], 00411 userlist[user,USER_EKTIPS],userlist[user,USER_FPTIPS], 00412 userlist[user,USER_UIDS_TO_TAKE_CARE]}); 00413 }


| public int get_wiz_level | ( | string | user | ) |
Definiert in Zeile 491 der Datei userinfo.c.
Benutzt find_userinfo(), USER_LEVEL und userlist.
Wird benutzt von add_domain_master(), delete_player(), FtpAccess(), query_wiz_level() und valid_write().
00491 { 00492 if (user && find_userinfo(user)) 00493 return userlist[user,USER_LEVEL]; 00494 //return 0 if no user given (return type needed) 00495 return(0); 00496 }


| public string get_wiz_name | ( | string | file | ) |
Definiert in Zeile 486 der Datei userinfo.c.
Benutzt creator_file().
00486 { 00487 return creator_file(file); 00488 }

| public int good_password | ( | string | str, | |
| string | name | |||
| ) |
Definiert in Zeile 424 der Datei userinfo.c.
Benutzt i, QueryBanished() und secure_savefile().
Wird benutzt von update_password().
00425 { 00426 string rts; 00427 int i, n; 00428 00429 if ( str[0] == '!' ){ 00430 tell_object( this_player() || this_object(), "Ein Ausrufungszeichen " 00431 "('!') als erster Buchstabe des Passwortes wuerde zu\n" 00432 "Problemen fuehren. Such Dir bitte ein anderes Passwort " 00433 "aus.\n" ); 00434 return 0; 00435 } 00436 00437 if ( strlen(str) < 6 ){ 00438 tell_object( this_player() || this_object(), 00439 "Das Passwort muss wenigstens 6 Zeichen lang sein.\n" ); 00440 return 0; 00441 } 00442 00443 str = lower_case(str); 00444 rts = ""; 00445 00446 // Zahlen/Sonderzeichen am Anfang oder Ende des Passwortes 00447 // (z.B. "merlin99") sind nicht wirklich einfallsreich. 00448 while ( strlen(str) && (str[0] > 'z' || str[0] < 'a') ){ 00449 rts += str[0..0]; 00450 str = str[1..]; 00451 } 00452 00453 while ( strlen(str) && (str[<1] > 'z' || str[<1] < 'a') ){ 00454 rts += str[<1..]; 00455 str = str[0..<2]; 00456 } 00457 00458 // Anzahl unterschiedlicher Zeichen merken, die herausgeschnitten wurden 00459 n = sizeof( mkmapping(efun::explode( rts, "" )) ); 00460 rts = ""; 00461 00462 for ( i = strlen(str); i--; ) 00463 rts += str[i..i]; 00464 00465 // Eigener Name als Passwort bzw. eigener Name rueckwaerts 00466 if ( str == lower_case(name) || rts == lower_case(name) || 00467 // Name eines anderen Mudders (Erstie?) 00468 secure_savefile(str) != "" || secure_savefile(rts) != "" || 00469 // Name von der Banish-Liste 00470 QueryBanished(str) || QueryBanished(rts) || 00471 // Name eines vorhandenen NPC o.ae. 00472 funcall( symbol_function( 'find_living/*'*/ ), str ) || 00473 funcall( symbol_function( 'find_living/*'*/ ), rts ) || 00474 // Zuwenig verschiedene Zeichen 00475 sizeof( mkmapping(efun::explode( str, "" )) ) + n < 4 ){ 00476 tell_object( this_player() || this_object(), 00477 "Das Passwort waere zu einfach zu erraten. Nimm bitte " 00478 "ein anderes.\n" ); 00479 return 0; 00480 } 00481 00482 return 1; 00483 }


| string list_late_players | ( | ) |
Definiert in Zeile 302 der Datei userinfo.c.
Benutzt i und lateplayers.
00303 { 00304 string ret; 00305 int size,i; 00306 00307 ret= "************************************\n"; 00308 ret+="* Verstorbene Spieler *\n"; 00309 ret+="************************************\n"; 00310 00311 if(!lateplayers || (size=sizeof(lateplayers))==0) 00312 { 00313 return ret; 00314 } 00315 00316 for(i=0;i<size;i++) 00317 { 00318 ret+=lateplayers[i]+"\n"; 00319 } 00320 00321 return ret; 00322 }
| string query_ek | ( | string | user | ) |
Definiert in Zeile 614 der Datei userinfo.c.
Benutzt find_userinfo(), PO, ROOTID, USER_EK und userlist.
00614 { 00615 if (getuid(PO) != ROOTID) return 0; 00616 if (!find_userinfo(user)) return 0; 00617 return userlist[user,USER_EK]; 00618 }

| string query_ektips | ( | string | user | ) |
Definiert in Zeile 628 der Datei userinfo.c.
Benutzt find_userinfo(), PO, ROOTID, USER_EKTIPS und userlist.
00628 { 00629 if (getuid(PO) != ROOTID) return 0; 00630 if (!find_userinfo(user)) return 0; 00631 return userlist[user,USER_EKTIPS]; 00632 }

| string query_ep | ( | string | user | ) |
Definiert in Zeile 607 der Datei userinfo.c.
Benutzt find_userinfo(), PO, ROOTID, USER_EP und userlist.
00607 { 00608 if (getuid(PO) != ROOTID) return 0; 00609 if (!find_userinfo(user)) return 0; 00610 return userlist[user,USER_EP]; 00611 }

| string query_fptips | ( | string | user | ) |
Definiert in Zeile 635 der Datei userinfo.c.
Benutzt find_userinfo(), PO, ROOTID, USER_FPTIPS und userlist.
00635 { 00636 if (getuid(PO) != ROOTID) return 0; 00637 if (!find_userinfo(user)) return 0; 00638 return userlist[user,USER_FPTIPS]; 00639 }

| string query_mq | ( | string | user | ) |
Definiert in Zeile 621 der Datei userinfo.c.
Benutzt find_userinfo(), PO, ROOTID, USER_MQ und userlist.
00621 { 00622 if (getuid(PO) != ROOTID) return 0; 00623 if (!find_userinfo(user)) return 0; 00624 return userlist[user,USER_MQ]; 00625 }

| public string query_player_object | ( | string | name | ) |
Definiert in Zeile 416 der Datei userinfo.c.
Benutzt find_userinfo(), USER_OBJECT, userentry und userlist.
Wird benutzt von renew_player_object().
00417 { 00418 mixed *userentry; 00419 if( !find_userinfo(name) ) return ""; 00420 return userlist[name,USER_OBJECT]; 00421 }


| int query_wiz_level | ( | mixed | player | ) |
Definiert in Zeile 499 der Datei userinfo.c.
Wird benutzt von __auswerten(), _query_info(), _set_earmuffs(), actions(), allowed(), befoerdere(), call_out_info(), check(), check_arch(), command_me(), CommandScan(), create_wizard(), do_mail(), finger_single(), format_paths(), get_domain_homes(), HitFunc(), is_greater(), is_wiz_level_ge(), is_wiz_level_lt(), logaccess(), Message(), scan(), search_for_path(), secure(), security(), set_max_guests(), sponsoring(), stat(), valid_read(), valid_write() und WizLevel().
00500 { 00501 if ( objectp(player) && query_once_interactive(player) ) 00502 return get_wiz_level( getuid(player) ); 00503 else { 00504 // erstmal UID ermitteln, falls Objekt 00505 //if (objectp(player)) 00506 // player=getuid(player); 00507 if ( stringp(player) ) { 00508 if( player[0..1]==DOMAINDIR"." ) return 25; 00509 if( player[0..5]==GUILDID"." ) 00510 return WIZLVLS[GUILDID]; 00511 if( player[0..1]==PROJECTDIR"." ) return 21; 00512 // die alte Loesung mit || verhaelt sich falsch, wenn ein UID ne 00513 // spezielle ist, der Level 0 zugeordnet wurde und es einen 00514 // Spieler mit diesem namen gibt. 00515 if (member(WIZLVLS,player)) 00516 return(WIZLVLS[player]); 00517 return get_wiz_level(player); 00518 } 00519 } 00520 return 0; 00521 }

| public varargs string* QueryUIDAlias | ( | string | alias, | |
| int | rec | |||
| ) |
Definiert in Zeile 105 der Datei userinfo.c.
00105 { 00106 string *uids; 00107 if (!stringp(alias) || !strlen(alias)) 00108 return ({}); 00109 // Wen im cache, gehts schnell. 00110 if (member(uidaliase, alias)) 00111 uids = uidaliase[alias]; 00112 else 00113 uids = ExpandUIDAlias(alias, rec); 00114 00115 if (extern_call()) 00116 return copy(uids); 00117 00118 return(uids); 00119 }
| public varargs string* QueryUIDsForWizard | ( | string | wizuid, | |
| int | recursive | |||
| ) |
Definiert in Zeile 126 der Datei userinfo.c.
Wird benutzt von access_check(), ExpandUIDAlias() und find_userinfo().
00126 { 00127 string *uids, *tmp, *uidstoadd; 00128 int i; 00129 00130 if (!stringp(wizuid) || !strlen(wizuid) || !IS_LEARNER(wizuid)) 00131 return(({})); 00132 00133 if (!find_userinfo(wizuid)) 00134 return(({})); 00135 00136 uidstoadd=({}); //diese werden hinterher in userids gespeichert. 00137 00138 // als erstes die ratebaren UIDs. ;-) 00139 uids=({wizuid}); 00140 // Regionen ermitteln, wo wizuid ein Verzeichnis hat und entsprechende 00141 // UIDs anhaengen: 00142 foreach(string region: get_domain_homes(wizuid)) { 00143 uids+=({ sprintf(DOMAINDIR".%s.%s",region,wizuid) }); 00144 } 00145 // Verzeichnis in /p/service? 00146 if (file_size(PROJECTDIR"/service/"+wizuid) == FSIZE_DIR) 00147 uids+=({PROJECTDIR".service."+wizuid}); 00148 00149 // Gildenchef? 00150 if (pointerp(userlist[wizuid,USER_GUILD])) { 00151 foreach(string gilde: userlist[wizuid,USER_GUILD]) { 00152 uidstoadd += QueryUIDAlias(gilde); 00153 } 00154 } 00155 // Regionsmagier? 00156 if (pointerp(userlist[wizuid,USER_DOMAIN])) { 00157 foreach(string domain: userlist[wizuid,USER_DOMAIN]) { 00158 //generelle Pseudo-UID 'd.region' und 'region' fuer geloeschte 00159 //Magier dieser Region vormerken, um sie hinterher fuers 00160 //Reverse-Lookup ins uid-Mapping zu schreiben. 00161 string *pseudo=({DOMAINDIR"."+domain, domain}); 00162 uidstoadd += pseudo; 00163 // Rest macht QueryUIDAlias, dabei aber die von der Funktion 00164 // ebenfalls gelieferten Pseudo-UIDs wieder abziehen. 00165 uids += QueryUIDAlias(domain) - pseudo; 00166 } 00167 } 00168 // jetzt noch nachgucken, fuer welche UIDs dieser Magier explizit noch 00169 // zustaendig ist. 00170 if (pointerp(userlist[wizuid,USER_UIDS_TO_TAKE_CARE])) { 00171 // dies koennte etwas a la "region" oder "anderermagier" sein, d.h. dieser 00172 // Magier ist fuer alle UIDs von 'andermagier' auch zustaendig. Daher muss 00173 // jedes davon durch QueryUIDAlias() (was im Falle von Spielern wiederum 00174 // QueryUIDsForWizard() ruft, aber die Rekursion im Falle von Spielern ist 00175 // auf 1 begrenzt). 00176 foreach(string uid2: userlist[wizuid,USER_UIDS_TO_TAKE_CARE]) { 00177 uidstoadd += QueryUIDAlias(uid2, recursive); 00178 } 00179 } 00180 00181 // so, in uidstoadd stehen UIDs drin, die nicht Magiername selber, 00182 // d.region.magier oder p.service.magier sind und bei welchen folglich das 00183 // Mapping UIDs-nach-Magier nur mit einer Liste moeglich ist. In die 00184 // werden die uids nun eingetragen. (z.B. d.region) 00185 if (sizeof(uidstoadd)) { 00186 // genug Platz in userids? Sonst welche rauswerfen. :-/ 00187 // (besser als bug) TODO: Auf 10k begrenzen -> max Arraygroesse! 00188 if ( sizeof(userids)+(i=sizeof(uidstoadd)) 00189 >= __MAX_MAPPING_KEYS__) { 00190 foreach(string tmpuid: m_indices(userids)[0..i]) 00191 efun::m_delete(userids,tmpuid); 00192 } 00193 foreach(string tmpuid: uidstoadd) { 00194 if (member(userids,tmpuid)) { 00195 //User dem Array hinzufuegen, wenn noch nicht drin. 00196 if (member(userids[tmpuid],wizuid)==-1) 00197 userids[tmpuid]=userids[tmpuid]+({wizuid}); 00198 } 00199 //sonst neuen Eintragen hinzufuegen 00200 else 00201 m_add(userids,tmpuid,({wizuid})); 00202 } 00203 } // Ende spez. uids speichern 00204 00205 return(uids+uidstoadd); 00206 }

| public varargs string* QueryWizardsForUID | ( | string | uid, | |
| int | recursive | |||
| ) |
Definiert in Zeile 34 der Datei userinfo.c.
Benutzt find_userinfo(), QueryWizardsForUID() und userids.
Wird benutzt von QueryWizardsForUID().
00034 { 00035 00036 if (!stringp(uid) || !strlen(uid)) 00037 return(({})); 00038 00039 string *tolookup=({uid}); //diese spaeter in userids nachgucken. 00040 string *wizards=({}); 00041 // Schauen, was automatisch ermittelt werden kann. 00042 string *parts=explode(uid,"."); 00043 switch(sizeof(parts)) { 00044 case 3: 00045 // z.B. d.region.magier und p.service.magier 00046 if (find_userinfo(parts[2])) 00047 //Magier existiert, reinschreiben. 00048 wizards+=({parts[2]}); 00049 if (parts[0]=="d") 00050 // d.region noch nachgucken (RMs) 00051 tolookup=({implode(parts[0..1],".")}); 00052 break; 00053 //case 2: 00054 // GUILD.gilde, p.project, d.region 00055 // koennen nur in userids nachgeguckt werden (s.u. tolookup) 00056 // muessen da als GUILD.*, d.* und p.* drinstehen! 00057 case 1: 00058 // kein Punkt drin. Entweder Magier-ID oder spezielle ID 00059 // (letztere wird unten noch per tolookup nachgeguckt) 00060 if (find_userinfo(parts[0])) 00061 wizards+=({parts[0]}); 00062 break; 00063 } 00064 // jetzt in userids nachschlagen 00065 foreach(uid: tolookup) { 00066 if (member(userids,uid)) 00067 wizards+=userids[uid]; 00068 } 00069 // so. Nun kann es aber noch sein, dass in userids sowas wie 00070 // "d.wald.atamur":({atamur}) und "atamur":({"rumata"}) drinsteht, also 00071 // ein Magier sozusagen fuer Kram eines anderen verantwortlich ist. D.h. 00072 // nochmal durch QueryWizardsForUID() schicken (das ist dann allerdings nicht 00073 // weiter rekursiv). 00074 if (!recursive) { 00075 foreach(uid: wizards) { 00076 //es ist moeglich, in der Schleife wizards zu vergroessern, ohne dass 00077 //es Einfluss auf die Schleife hat. 00078 wizards += QueryWizardsForUID(uid, 1) - ({uid}); 00079 } 00080 } 00081 return(m_indices(mkmapping(wizards))); 00082 }


| void RemoveFromCache | ( | string | user | ) |
Definiert in Zeile 276 der Datei userinfo.c.
00276 { 00277 efun::m_delete(userlist,user); 00278 }
| public string* RemoveWizardFromUID | ( | string | uid, | |
| string | wizuid | |||
| ) |
Definiert in Zeile 240 der Datei userinfo.c.
00240 { 00241 if (!stringp(wizuid) || !strlen(wizuid) 00242 || !find_userinfo(wizuid)) 00243 return(({})); 00244 00245 //Zugriff nur als EM oder jemand, der fuer die UID zustaendig ist. 00246 if ( funcall(symbol_function('secure_level)) < ARCH_LVL 00247 && member( 00248 QueryUIDsForWizard(funcall(symbol_function('secure_euid))), 00249 uid)==-1) 00250 return copy(userlist[wizuid,USER_UIDS_TO_TAKE_CARE]); 00251 00252 // jetzt muss diese wizuid aus allen UIDs in userids geloescht werden, die 00253 // sie bisher enthalten. Hierzu sollte QueryUIDAlias die potentiell 00254 // drinstehenden UIDs liefern. 00255 foreach(string tuid: QueryUIDAlias(wizuid,0)) { 00256 if (member(userids, tuid) && 00257 member(userids[tuid],wizuid)!=-1 ) 00258 userids[tuid] -= ({wizuid}); 00259 } 00260 // wenn es eine UID war, fuer die der Magier explizit zustaendig war, 00261 // entsprechend loeschen. Sonst ist hier Ende. 00262 if (!pointerp(userlist[wizuid,USER_UIDS_TO_TAKE_CARE])) 00263 return ({}); 00264 if (member(userlist[wizuid,USER_UIDS_TO_TAKE_CARE],uid)==-1) 00265 return copy(userlist[wizuid,USER_UIDS_TO_TAKE_CARE]); 00266 00267 // Jetzt aus userlist loeschen. 00268 userlist[wizuid,USER_UIDS_TO_TAKE_CARE] -= ({uid}); 00269 save_userinfo(wizuid); 00270 // und userids/uidaliase aktualisieren. 00271 QueryUIDsForWizard(wizuid); 00272 return copy(userlist[wizuid,USER_UIDS_TO_TAKE_CARE]); 00273 }
| public void ResetUIDAliase | ( | ) |
Definiert in Zeile 91 der Datei userinfo.c.
| int ResetUIDCache | ( | ) |
Definiert in Zeile 290 der Datei userinfo.c.
| protected void save_userinfo | ( | string | user | ) |
Definiert in Zeile 850 der Datei userinfo.c.
Wird benutzt von set_player_object(), update_ek(), update_ektips(), update_ep(), update_fptips(), update_mq(), update_password() und update_wiz_level().
00850 { 00851 if(!user||user=="") 00852 return; 00853 user=explode(user,".")[0]; 00854 if (!member(userlist,user)) return; 00855 name = user; 00856 level = userlist[name,USER_LEVEL]; 00857 domains = userlist[name,USER_DOMAIN]; 00858 shell = userlist[name,USER_OBJECT]; 00859 password = userlist[name,USER_PASSWORD]; 00860 creation_date = userlist[name,USER_CREATION_DATE]; 00861 if (!creation_date) creation_date = -1; 00862 ep = userlist[name,USER_EP]; 00863 if (!ep) ep=""; 00864 ek = userlist[name,USER_EK]; 00865 if (!ek) ek=""; 00866 mq = userlist[name,USER_MQ]; 00867 if (!mq) mq=""; 00868 guilds = userlist[name,USER_GUILD]; 00869 ektips=userlist[name,USER_EKTIPS]; 00870 if(!ektips) ektips=""; 00871 fptips=userlist[name,USER_FPTIPS]; 00872 if(!fptips) fptips=""; 00873 uidstotakecare=userlist[name,USER_UIDS_TO_TAKE_CARE]; 00874 00875 if (save_object(SECURESAVEPATH+name[0..0]+"/"+name) != 0) { 00876 // autsch. Buggen damit dieser moeglichst schnell auffaellt, dass hier 00877 // Savefiles in /secure/save/ nicht geschrieben wurden. 00878 raise_error(sprintf( 00879 "Savefile %O konnte nicht erstellt werden!\n", 00880 SECURESAVEPATH+name[0..0]+"/"+name)); 00881 } 00882 // Savefile aus save_inactive loeschen 00883 string inactive = secure_isavefile(user); 00884 if (stringp(inactive) && strlen(inactive)) 00885 rm("/"+inactive); 00886 }

| public string secure_isavefile | ( | string | name | ) |
Definiert in Zeile 537 der Datei userinfo.c.
Wird benutzt von load_player_object().
00538 { 00539 if(!name||name=="") 00540 return ""; 00541 name=explode(name,".")[0]; 00542 if (file_size("secure/save_inactive/"+name[0..0]+"/"+name+".o")>=0) 00543 return "secure/save_inactive/"+name[0..0]+"/"+name; 00544 return ""; 00545 }

| public string secure_savefile | ( | string | name | ) |
Definiert in Zeile 524 der Datei userinfo.c.
Benutzt SECURESAVEPATH.
Wird benutzt von find_userinfo(), good_password(), logon2() und new_logon().
00525 { 00526 if(!name||name=="") 00527 return ""; 00528 name=explode(name,".")[0]; 00529 if (file_size(SECURESAVEPATH+name[0..0]+"/"+name+".o")>=0) 00530 return SECURESAVEPATH+name[0..0]+"/"+name; 00531 else if (file_size("secure/save_inactive/"+name[0..0]+"/"+name+".o")>=0) 00532 return "secure/save_inactive/"+name[0..0]+"/"+name; 00533 return ""; 00534 }

| protected void set_domains | ( | string | player, | |
| string * | domains | |||
| ) |
Definiert in Zeile 889 der Datei userinfo.c.
Wird benutzt von add_domain_master() und remove_domain_master().
00890 { 00891 // wenn der Magier jetzt Domains nicht mehr hat, muessen die aus 'userids' 00892 // entfernt werden, das uebernimmt RemoveWizardFromUID(). 00893 if (pointerp(userlist[player, USER_DOMAIN])) { 00894 string *removeduids= 00895 ((string*)userlist[player, USER_DOMAIN] | domains) - domains; 00896 foreach(string uid: removeduids) 00897 RemoveWizardFromUID(uid, player); 00898 } 00899 // gecachtes Alias fuer player loeschen 00900 efun::m_delete(uidaliase,player); 00901 userlist[player, USER_DOMAIN]=domains; 00902 save_userinfo(player); 00903 // UID-zu-Magier-Mapping aktualisieren 00904 QueryUIDsForWizard(player); 00905 }

| protected void set_guilds | ( | string | player, | |
| string * | guilds | |||
| ) |
Definiert in Zeile 908 der Datei userinfo.c.
Wird benutzt von add_guild_master() und remove_guild_master().
00909 { 00910 // wenn der Magier jetzt Gilden nicht mehr hat, muessen die aus 'userids' 00911 // entfernt werden, das uebernimmt RemoveWizardFromUID(). 00912 if (pointerp(userlist[player, USER_GUILD])) { 00913 string *removeduids= 00914 ((string*)userlist[player, USER_GUILD] | guilds) - guilds; 00915 foreach(string uid: removeduids) 00916 RemoveWizardFromUID(uid, player); 00917 } 00918 // gecachtes Alias fuer player loeschen 00919 efun::m_delete(uidaliase,player); 00920 userlist[player, USER_GUILD]=guilds; 00921 save_userinfo(player); 00922 // UID-zu-Magier-Mapping aktualisieren 00923 QueryUIDsForWizard(player); 00924 }

| int set_player_object | ( | string | user, | |
| string | objectname | |||
| ) |
Definiert in Zeile 646 der Datei userinfo.c.
Benutzt _get_path(), ARCH_LVL, find_userinfo(), path, ROOTID, save_userinfo(), strftime(), USER_OBJECT und userlist.
Wird benutzt von create_wizard().
00647 { 00648 mixed *path; 00649 string prev; 00650 00651 // nur EM und ROOT duerfen die Shell eines Charakters aendern 00652 if ( (funcall(symbol_function('secure_level/*'*/)) < ARCH_LVL) && 00653 (!previous_object() || getuid(previous_object()) != ROOTID) ){ 00654 return -1; 00655 } 00656 00657 if ( objectname == "" ) 00658 objectname = 0; 00659 00660 if ( !stringp(user) || user == "" ) 00661 return -6; 00662 00663 if ( !stringp(objectname) ){ 00664 if ( !find_userinfo(user) ) 00665 return -4; 00666 00667 userlist[user, USER_OBJECT] = 0; 00668 save_userinfo(user); 00669 return 1; 00670 } 00671 00672 if ( catch(load_object(objectname);publish) ) { 00673 write( "Fehler in " + objectname + "!\n" ); 00674 return -2; 00675 } 00676 00677 objectname = _get_path( objectname, 0 ); 00678 path = (efun::explode( objectname, "/" ) - ({ "", 0 })); 00679 00680 if ( sizeof(path) < 3 || path[0] != "std" || path[1] != "shells" ) 00681 return -3; 00682 00683 if ( !find_userinfo(user) ) 00684 return -4; 00685 00686 prev = userlist[user, USER_OBJECT]; 00687 userlist[user, USER_OBJECT] = objectname; 00688 save_userinfo(user); 00689 00690 // Loggen, falls die Aenderung nicht von Login beim Anlegen des Chars 00691 // erfolgt. 00692 if (load_name(this_interactive()) != "/secure/login" 00693 || prev != "") { 00694 if (prev == "") prev ="<keine>"; 00695 funcall( symbol_function('log_file), "ARCH/SHELL_AENDERUNGEN", 00696 sprintf( "%s: %O aendert die Shell von %s von %s auf %s (PO: %O)\n", 00697 funcall(symbol_function('strftime),"%Y%m%d-%H%M%S",time()), 00698 this_interactive(), capitalize(user), prev, objectname, 00699 previous_object()) ); 00700 } 00701 00702 return 1; 00703 }


| public mixed* show_cache | ( | ) |
Definiert in Zeile 341 der Datei userinfo.c.
Benutzt userlist.
00341 { 00342 return m_indices(userlist); 00343 }
| int update_ek | ( | string | user, | |
| string | ek_neu | |||
| ) |
Definiert in Zeile 571 der Datei userinfo.c.
Benutzt find_userinfo(), PO, ROOTID, save_userinfo(), USER_EK und userlist.
00571 { 00572 if (getuid(PO) != ROOTID) return 0; 00573 if (!find_userinfo(user)) return 0; 00574 userlist[user,USER_EK] = ek_neu; 00575 save_userinfo(user); 00576 return 1; 00577 }

| int update_ektips | ( | string | user, | |
| string | ek_neu | |||
| ) |
Definiert in Zeile 589 der Datei userinfo.c.
Benutzt find_userinfo(), PO, ROOTID, save_userinfo(), USER_EKTIPS und userlist.
00589 { 00590 if (getuid(PO) != ROOTID) return 0; 00591 if (!find_userinfo(user)) return 0; 00592 userlist[user,USER_EKTIPS] = ek_neu; 00593 save_userinfo(user); 00594 return 1; 00595 }

| int update_ep | ( | string | user, | |
| string | ep_neu | |||
| ) |
Definiert in Zeile 562 der Datei userinfo.c.
Benutzt find_userinfo(), PO, ROOTID, save_userinfo(), USER_EP und userlist.
00562 { 00563 if (getuid(PO) != ROOTID) return 0; 00564 if (!find_userinfo(user)) return 0; 00565 userlist[user,USER_EP] = ep_neu; 00566 save_userinfo(user); 00567 return 1; 00568 }

| int update_fptips | ( | string | user, | |
| string | fp_neu | |||
| ) |
Definiert in Zeile 598 der Datei userinfo.c.
Benutzt find_userinfo(), PO, ROOTID, save_userinfo(), USER_FPTIPS und userlist.
00598 { 00599 if (getuid(PO) != ROOTID) return 0; 00600 if (!find_userinfo(user)) return 0; 00601 userlist[user,USER_FPTIPS] = fp_neu; 00602 save_userinfo(user); 00603 return 1; 00604 }

| void update_late_players | ( | ) |
Definiert in Zeile 811 der Datei userinfo.c.
00811 { 00812 string read; 00813 string *tmp; 00814 00815 lateplayers=0; 00816 00817 read=read_file("/secure/LATE_PLAYERS"); 00818 if(!read || read=="") 00819 { 00820 return; 00821 } 00822 00823 tmp=explode(read,"\n"); 00824 if(!sizeof(tmp)) 00825 { 00826 return; 00827 } 00828 00829 lateplayers=tmp; 00830 }
| int update_mq | ( | string | user, | |
| string | mq_neu | |||
| ) |
Definiert in Zeile 580 der Datei userinfo.c.
Benutzt find_userinfo(), PO, ROOTID, save_userinfo(), USER_MQ und userlist.
00580 { 00581 if (getuid(PO) != ROOTID) return 0; 00582 if (!find_userinfo(user)) return 0; 00583 userlist[user,USER_MQ] = mq_neu; 00584 save_userinfo(user); 00585 return 1; 00586 }

| int update_password | ( | string | old, | |
| string | new | |||
| ) |
Definiert in Zeile 706 der Datei userinfo.c.
Benutzt crypt, find_userinfo(), good_password(), PO, save_userinfo(), user, USER_PASSWORD und userlist.
Wird benutzt von delete_player().
00707 { 00708 string user; 00709 00710 // nanu, kein user? 00711 if ( !find_userinfo(user = getuid(PO)) ) 00712 return 0; 00713 00714 // wenn das neue PW unterschiedlich ist, schauen, ob das neue PW ok ist. 00715 if ( old != new && !good_password( new, user ) ) 00716 return 0; 00717 00718 string pwhash = userlist[user, USER_PASSWORD]; 00719 string oldpwhash; 00720 if (strlen(pwhash) > 13) { 00721 // MD5-Hash 00722 oldpwhash = md5_crypt(old, pwhash); 00723 } 00724 else if (strlen(pwhash) > 2) { 00725 // Crypt-Hash 00726 oldpwhash = crypt(old, pwhash[0..1]); 00727 } 00728 00729 // wenn es einen PW-hash gibt, also ein PW gesetzt wird, muss der Hash von 00730 // old mit dem pwhash uebereinstimmen. Leerer Hash oder gar kein Hash 00731 // erlaubt jedes beliebige PW. 00732 if ( stringp(pwhash) && strlen(pwhash) && pwhash != oldpwhash) 00733 return 0; 00734 // an dieser Stelle stimmt 'old' wohl mit dem gesetzten Passwort ueberein. 00735 // Wenn allerdings die Funktion mit old==new aufgerufen wurde, wird hier 00736 // nur 1 zurueckgeben und sonst an sich nix gemacht. Kann nicht weiter 00737 // oben schon gemacht werden, die Shells dies als PW-Pruefung nutzen. 00738 // *seufz* 00739 if (old == new) return 1; 00740 00741 // dann mal neu setzen 00742 userlist[ user, USER_PASSWORD ] = md5_crypt( new, 0 ); 00743 save_userinfo(user); 00744 return 1; 00745 }


| int update_wiz_level | ( | string | user, | |
| int | lev | |||
| ) |
Definiert in Zeile 551 der Datei userinfo.c.
Benutzt find_userinfo(), ob(), PO, ROOTID, save_userinfo(), USER_LEVEL und userlist.
Wird benutzt von add_domain_master() und advance_wizlevel().
00551 { 00552 object ob; 00553 00554 if (getuid(PO) != ROOTID && extern_call()) return 0; 00555 if (!find_userinfo(user)) return 0; 00556 userlist[user,USER_LEVEL] = lev; 00557 save_userinfo(user); 00558 return 1; 00559 }


| int creation_date |
Definiert in Zeile 18 der Datei userinfo.c.
| string* domains |
Definiert in Zeile 20 der Datei userinfo.c.
| string ek |
Definiert in Zeile 19 der Datei userinfo.c.
| string ektips |
Definiert in Zeile 14 der Datei userinfo.c.
| string ep |
Definiert in Zeile 19 der Datei userinfo.c.
| string fptips |
Definiert in Zeile 15 der Datei userinfo.c.
| string * guilds |
Definiert in Zeile 20 der Datei userinfo.c.
| nosave string* lateplayers |
Definiert in Zeile 21 der Datei userinfo.c.
Wird benutzt von check_late_player() und list_late_players().
| int level |
Definiert in Zeile 16 der Datei userinfo.c.
| string mq |
Definiert in Zeile 19 der Datei userinfo.c.
| string name |
Definiert in Zeile 13 der Datei userinfo.c.
| string password |
Definiert in Zeile 13 der Datei userinfo.c.
| string shell |
Definiert in Zeile 17 der Datei userinfo.c.
| nosave private mapping uidaliase = ([]) |
Definiert in Zeile 29 der Datei userinfo.c.
Wird benutzt von ExpandUIDAlias().
| string * uidstotakecare |
Definiert in Zeile 20 der Datei userinfo.c.
| nosave private mapping userids = ([]) |
Definiert in Zeile 25 der Datei userinfo.c.
Wird benutzt von QueryWizardsForUID().
| nosave mapping userlist |
Definiert in Zeile 12 der Datei userinfo.c.
Wird benutzt von delete_player(), find_userinfo(), get_userinfo(), get_wiz_level(), query_ek(), query_ektips(), query_ep(), query_fptips(), query_mq(), query_player_object(), set_player_object(), show_cache(), swho(), update_ek(), update_ektips(), update_ep(), update_fptips(), update_mq(), update_password() und update_wiz_level().
1.6.3