load(db_fetch_assoc($res)); } function load($indata) { foreach($indata as $key=>$val) { $this->$key = $val; } } } class wvNav { /** * Speichert die Kategorien * @var array */ var $cat; /** * Speichert die einzelnen Navpunkte * @var array */ var $navs; /** * Beinhaltet den Ausgangslink zur aktuellen Seite * @var unknown_type */ var $baselink; /** * Standardkategorie für navs ohne Angabe * @var unknown_type */ var $defcat; /** * Beinhaltet die Daten in neuer Baumstruktur * $d * > categoryA * -> item1 * ==> label1 * ==> link1 * -> item2 * [...] * @var array */ var $d = array(); /** * Referenz auf eine Instanz von sysTxt * * @var sysTxt */ var $txt; function wvNav($baselink = HAUS_BASEFILE) { $this->baselink = $baselink; $this->txt = sysTxt::instance(); } function getLink($part, $keep_cat = false, $keep_loc = true) { global $quater; $str = $this->baselink . '?' . $part; if($keep_cat && !empty($_GET['cat'])) $str .= '&cat=' . $_GET['cat']; if($keep_loc && !strpos($str, 'quater_id')) $str .= (empty($part) ? '' : '&') . 'quater_id=' . $quater->quater_id; return $str; } function getAdvLink($part, $misc) { if (isset($misc['final']) || false !== strpos($part,'.php')) { return $part; } else { $keep_cat = isset($misc['keep_cat']) ? $misc['keep_cat'] : false; $keep_loc = isset($misc['keep_loc']) ? $misc['keep_loc'] : true; return $this->getLink($part,$keep_cat,$keep_loc); } } function getParsed($in,$file = false) { if (substr($in,0,4) == 'nav_') { $ret = $this->txt->get($in,$file); if (empty($ret)) echo "Konnte nichts zu '$in' in der file '$file' finden
\n"; return $ret; } else return $in; } function setDefCategory($intext,$textfile = false) { $name = $this->getParsed($intext,$textfile); if (!empty($this->d[$name])) { $this->defcat = $name; return true; } else return false; } function insNav($label, $link, $category){ $category = $this->getParsed($category); if (isset($this->d[$category])) { $this->d[$category][] = array('label' => $label, 'link' => $link); return true; } else { echo "insNav geht nicht, Kategorie '$category' fehlt!
\n"; return false; } } function addCategory($intext, $setdef = true, $textfile = false){ $name = $this->getParsed($intext, $textfile); if (empty($this->d[$name])) { $this->d[$name] = array(); // echo "Kategorie '$name' Eingefügt!
\n"; } else { // echo "Kategorie '$name' bereits vorhanden, Überschreiben unterbunden
\n"; } if ($setdef) $this->setDefCategory($name); } function addNav($inlabel, $linkpart, $incategory = false, $textfile = false, $linkmisc = array()) { $category = empty($incategory) ? $this->defcat : $this->getParsed($incategory,$textfile); $label = $this->getParsed($inlabel, $textfile); $link = empty($linkmisc) ? $this->getLink($linkpart) : $this->getAdvLink($linkpart, $linkmisc); return $this->insNav($label,$link,$category); } //////////////////// // Alte Versionen // //////////////////// function category($name,$setdef = true) { if($setdef) $this->defcat = $name; $this->cat[$name] = array(); } function insertNav($name,$link,$category = false) { if($category == false) $category = $this->defcat; if (substr($category,0,4) == 'nav_') { $wvtxt = & sysTxt::instance(); $category = $wvtxt->get($category); } $this->navs[] = array('name'=>$name, 'link'=>$link); $this->cat[$category][] = count($this->navs) - 1; } function link($text,$keep_cat = false, $keep_loc = true) { return $this->getLink($text,$keep_cat,$keep_loc); } function nav($name,$text = '',$category = false,$keep_cat = false) { $link = $this->link($text, $keep_cat); $this->insertNav($name, $link, $category); } function txtCategory($catname,$setdef = true,$txtcat = false) { $wvtxt = & sysTxt::instance(); $this->category($wvtxt->get($catname, $txtcat), $setdef); } function txtNav($txtname,$text = '',$category = false,$keep_cat = false,$txtcat = false) { $wvtxt = & sysTxt::instance(); if (substr($category,0,4) == 'nav_') $category = $wvtxt->get($category,$txtcat); $this->nav($wvtxt->get($txtname, $txtcat), $text, $category, $keep_cat); } function end() { // Neuer Einzelbaum foreach($this->d as $category=>$items) { addnav($category); foreach($items as $item) { addnav($item['label'],$item['link']); } } // Alter Doppelbaum if(!empty($this->cat)) { foreach($this->cat as $name=>$arr) { if(empty($name)) continue; addnav($name); foreach($arr as $num) { addnav($this->navs[$num]['name'], $this->navs[$num]['link']); } } } } function clear() { $this->cat = array(); $this->navs = array(); $this->defcat = ''; } } class wvKey { var $key_id; var $house_id; var $user_id; var $key_nr; var $owner; function wvKey($indata,$readRest = false) { $this->readIndata($indata); if($readRest && !empty($this->key_id)) $this->readFromDB(); } function readIndata($indata) { foreach(array_keys($indata) as $k) { $this->$k = $indata[$k]; } } function readFromDB() { $sql = 'SELECT * FROM `' . HAUS_KEY_TABLE . '` WHERE `key_id` = ' . $this->key_id . ' LIMIT 1'; $res = dying_query($sql, 'Fehler beim Lesen eines Schlüssels', __FILE__, __LINE__); $row = db_fetch_assoc($res); $this->readIndata($row); } function save() { if(!empty($this->key_id)) { $sql = 'REPLACE INTO `' . HAUS_KEY_TABLE . '`(`key_id`,`house_id`,`acctid`,`key_nr`,`owner`) VALUES(' . $this->key_id . ',' . $this->get(HAUS_ID_FIELD) . ',' . $this->user_id . ',' . $this->key_nr . ',"' . $this->owner . '")'; } else { $sql = 'INSERT INTO `' . HAUS_KEY_TABLE . '`(`house_id`,`acctid`,`key_nr`,`owner`) VALUES(' . $this->house_id . ',' . $this->user_id . ',' . $this->key_nr . ',"' . $this->owner . '")'; } dying_query($sql, 'Fehler beim Speichern eines Keys', __FILE__, __LINE__, $this); } function generateKeys($houseid,$keys,$owner,$start = 1) { for($i = $start; $i < $keys + $start; $i++) { $key = new wvKey(array('house_id'=>$houseid, 'user_id'=>$owner, 'key_nr'=>$i, 'owner'=>$i == 1 ? '1' : '0')); $key->save(); unset($key); } } function findByHouse($house_id, $with_ownerdata=false) { if (empty($with_ownerdata)) { $sql = sprintf("SELECT `k`.* FROM `wv_keys` `k` WHERE `house_id`=%s",$house_id); } else { $fields = is_array($with_ownerdata) ? implode(', ',$with_ownerdata) : $with_ownerdata; $sql = sprintf("SELECT `k`.*, %s FROM `".HAUS_KEY_TABLE."` `k` JOIN `accounts` USING(`acctid`) WHERE `house_id`=%s",$fields,$house_id); } $res = dying_query($sql,"Fehler beim Suchen der Schlüssel eines Hauses",__FILE__,__LINE__); $keys = array(); for($i=0,$max=db_num_rows($res);$i<$max;$i++) { $keys[] = new wvKey(db_fetch_assoc($res)); } return $keys; } } class wvTxt { var $included; var $texts; var $deffile; var $language; function wvTxt($language = HAUS_TXT_DEFLANG,$startfile = false) { $this->loadLanguage($language); if(!empty($startfile)) { if(is_array($startfile)) { foreach($startfile as $file) $this->loadFile($file); $this->deffile = $startfile[count($startfile) - 1]; } else { $this->loadFile($startfile); $this->deffile = $startfile; } } } function loadLanguage($language) { if(substr($language, strlen($language) - 1) != '/') $language .= '/'; if(file_exists(HAUS_TXT_LANGDIR . $language)) { $this->language = $language; } elseif($language == HAUS_TXT_DEFLANG || $language == HAUS_TXT_DEFLANG . '/') { stirb("Fehler beim Laden des Standard-Sprachordners für das Haussystem " . HAUS_TXT_LANGDIR . $language, $this, __FILE__, __LINE__); } else { $this->loadLanguage(HAUS_TXT_DEFLANG); } } function loadFile($filename,$setdef=true) { if(empty($this->included[$filename])) { $existenz = $this->fileExists($filename); if($existenz === 0) { stirb("Fehler: Konnte keine Textdatei für das Kürzel '$filename' finden. Diese sollte zumindst in der Standardsprache verfügbar sein", $this, __FILE__, __LINE__); } elseif($existenz === 2) { wvLog(array('loss','text','tune'),"Konnte die Textdatei für das Kürzel '$filename' in der Sprachkategorie '$this->language' finden."); } require_once $this->buildFilestr($filename,$existenz == 2 ? HAUS_TXT_DEFLANG : false); $str = 'text_' . $filename; $this->texts[$filename] = $$str; $this->included[$filename] = true; if($setdef || empty($this->deffile)) $this->deffile = $filename; } } function fileExists($filename) { $ret = 0; if (file_exists($this->buildFilestr($filename))) $ret = 1; elseif ($this->language != HAUS_TXT_DEFLANG && file_exists($this->buildFilestr($filename,HAUS_TXT_DEFLANG))) $ret = -1; return $ret; } function buildFilestr($filename, $language = false) { $language = $language === false ? $this->language : $language; $extension = substr($filename,-4) == '.php' ? '' : '.php'; return HAUS_TXT_LANGDIR . $language . $filename . $extension; } function search($name){ $found = false; // Alle eingelesenen Daten durchsuchen foreach($this->texts as $catname => $category) { // Einzelne Texte durchsuchen if(!empty($category[$name])) { $found = array('category' => $catname, 'value' => $category[$name]); break; } } return $found; } function lookup($name,$cat) { $ret = ''; $found = $this->search($name); // Debug-Data vorbereiten $data = array('searched_for' => $name ,'searched_cat' => $cat, 'language' => $this->language, 'read_files' => implode(',', array_keys($this->included))); if($found !== false) { // Wert an anderer Stelle gefunden $ret = $found['value']; $types = 'text,loss'; $text = 'Textitem in falscher Kategorie gefunden'; } else { // Wert nicht gefunden if($this->language != HAUS_TXT_DEFLANG) { // Daten zwischenspeichern und standard-Sprachdatei laden, wenn diese nicht aktiv ist $bak = $this->texts[$cat]; $baklang = $this->language; $this->loadLanguage(HAUS_TXT_DEFLANG); $this->loadFile($cat); $found2 = $this->search($name); if($found2 !== false) { // Wert in Standardsprache gefunden $ret = $found2['value']; $types = 'text,loss'; $text = 'Textitem in der language nicht gefunden, auf Standardsprache ausgewichen'; } else { // Wert auch hier nicht gefunden $ret = ''; $types = 'test,loss,error'; $text = 'Textitem konnte auch in der standardsprache nicht gefunden werden nicht gefunden werden'; } $this->loadLanguage($baklang); $this->texts[$cat] = $bak; } else { // Wert nicht gefunden, Standardsprache bereits aktiv $ret = ''; $types = 'test,loss,error'; $text = 'Textitem konnte nicht gefunden werden, Standardsprache bereits aktiv'; } } // Logeintrag schreiben wvLog($types, $text, array_merge((array) $found, $data)); return $ret; } function get($name,$cat = false) { if($cat) $this->loadFile($cat); else $cat = $this->deffile; $ret = $this->texts[$cat][$name]; if(empty($ret)) { // Suchen mit debug-logging: $lookup = $this->lookup($name,$cat); if (!empty($lookup)) $ret = $lookup; } return $ret; } function massGet($names,$cat = false) { $str = ''; foreach($names as $name) $str .= $this->get($name, $cat); return $str; } function repGet($name,$sea,$rep,$cat = false) { $str = $this->get($name, $cat); if(is_array($sea)) $str = $this->multipleReplace($sea, $rep, $str); else $str = str_replace($sea, $rep, $str); return $str; } function multipleReplace($sea,$rep,$str) { $ret = $str; foreach($sea as $key=>$val) { $ret = str_replace($val, $rep[$key], $ret); } return $ret; } } class wvLevel { // @todo Zu Überarbeiten var $level; var $name; var $gold; var $gems; var $keys; var $zimmer; var $goldchest; var $gemschest; function wvLevel($level = 1) { if($level <= $this->hoechste()) { $sql = 'SELECT * FROM `'.HAUS_LEVEL_TABLE.'` WHERE level = ' . $level; $res = dying_query($sql,'Ausbaustufenfehler',__FILE__,__LINE__); $row = db_fetch_assoc($res); foreach($row as $key=>$val) { $this->{$key} = $val; } } else { stirb("Fehler - Zugrif auf einen nicht eingetragenen Level nicht möglich. Bitte Admin kontaktieren!
\n" . "Folgende Werte wurden übergeben:
Eingetragene Level: " . $this->levels() . ",
Angeforterter Level: " . $level); } } function levels() { $sql = 'SELECT COUNT(`level`) AS `anzahl` FROM '.HAUS_LEVEL_TABLE; $res = dying_query($sql,'Fehler beim lesen der Levels',__FILE__,__LINE__); $row = db_fetch_assoc($res); return (int) $row['anzahl']; } function hoechste() { $sql = 'SELECT MAX(`level`) AS maximum FROM '.HAUS_LEVEL_TABLE; $res = dying_query($sql,'Level error'); $row = db_fetch_assoc($res); return (int) $row['maximum']; } /* function speichern($aufid = false) { if($aufid == false) $aufid = $this->level; if($aufid <= $this->levels()) { $sql = "UPDATE `houselevels` SET level=" . $aufid . ", name=" . $this->name . ", gold=" . $this->gold . ", gems=" . $this->gems . ", keys=" . $this->keys . ", goldchest=" . $this->goldchest . ", gemschest=" . $this->gemschest . " WHERE level=" . $this->level; } else { $sql = "INSERT INTO houselevels SET level=" . $aufid . ", name=" . $this->name . ", gold=" . $this->gold . ", gems=" . $this->gems . ", keys=" . $this->keys . ", goldchest=" . $this->goldchest . ", gemschest=" . $this->gemschest; } db_query($sql) or dir(db_error(LINK)); } */ } class wvStreet extends wvLoadable { var $street_id; var $street_nr; var $quater_id; var $name; var $description; var $shortdesc; var $house_num; function wvStreet($in) { if(is_array($in)) { $this->load($in); } elseif(is_numeric((int) $in)) { $this->street_id = $in; $this->read('SELECT * FROM `' . HAUS_STREET_TABLE . '` WHERE `street_id` = ' . $this->street_id . ' LIMIT 1'); } else { stirb('Fehler beim Einlesen einer Straße', null, __FILE__, __LINE__); } } function findHouses($level = false,$level_op = '>=') { $whereclause = 'WHERE `h`.`street_id`=' . $this->street_id . ($level ? ' AND `level`' . $level_op . $level : ''); $sql = 'SELECT `h`.`' . HAUS_ID_FIELD . '`,`h`.`' . HAUS_NR_FIELD . '`, `h`.`name`, `h`.`level`, `h`.`extensions`, `l`.`name` AS `level_name`, `a`.`name` AS `owner_name`, COUNT(`k`.`key_nr`) AS `keys` FROM `' . HAUS_TABLE . '` `h` INNER JOIN `' . HAUS_LEVEL_TABLE . '` `l` USING(`level`) INNER JOIN `' . HAUS_KEY_TABLE . '` `k` USING(`' . HAUS_ID_FIELD . '`) INNER JOIN `accounts` `a` USING(`acctid`) ' . $whereclause . ' GROUP BY `h`.`' . HAUS_ID_FIELD . '` ORDER BY `h`.`' . HAUS_NR_FIELD . '` ASC'; $res = dying_query($sql, 'Fehler beim Suchen nach Hausdaten für die Übersichtstabelle', __FILE__, __LINE__); $all = array(); for($i = 0, $max = db_num_rows($res); $i < $max; $i++) $all[] = new haus_outside(db_fetch_assoc($res)); return $all; } function listHouses($level = false,$level_op = '>=') { $wvtxt = & sysTxt::instance(); $all = $this->findHouses($level, $level_op); $str = sprintf($wvtxt->get('list_houses_head'), count($all)); for($i = 0, $max = count($all); $i < $max; $i++) { $str .= $all[$i]->list_row(($i + 1) % 2); } $str .= $wvtxt->get('list_foot'); return $str; } function list_row($class = 0,$fields = array('street_nr','name','house_num','shortdesc')) { $wvtxt = & sysTxt::instance(); $str = ''; $tpl = $wvtxt->get('list_field'); for($i = 0, $max = count($fields); $i < $max; $i++) { $str .= sprintf($tpl, $this->$fields[$i]); } addnav('', $this->getLink()); $str .= sprintf($wvtxt->get('list_field_link'), $this->getLink()); return sprintf($wvtxt->get('list_row_' . ($class ? 'light' : 'dark')), $str); } function getText() { $str = ''; $str .= $this->listHouses(); return $str; } function isBuildPossible() { return $this->house_num < HAUS_PER_STREET; } function incHouses($id) { dying_query('UPDATE `' . HAUS_STREET_TABLE . '` SET `house_num`=`house_num` + 1 WHERE `street_id` = ' . $id, 'Fehler beim Erhöhen der Häuserzahl einer Straße', __FILE__, __LINE__); } function getLink($txtonly=false) { global $wvnav; $link = 'act=street&street_id=' . $this->street_id; if (!$txtonly) $link = $wvnav->link($link); return $link; } function findAccessableHouses($userid=false){ if(!$userid) { global $session; $userid = $session['user']['acctid']; } $sql = 'SELECT `k`.`'.HAUS_ID_FIELD.'`, `name`, `house_nr` FROM `'.HAUS_KEY_TABLE.'` `k` INNER JOIN `'.HAUS_TABLE.'` `h` USING(`'.HAUS_ID_FIELD.'`) WHERE `k`.`acctid` = '.$userid.' AND `h`.`street_id` = '.$this->street_id.' GROUP BY `h`.`'.HAUS_ID_FIELD.'`'; $res = dying_query($sql,'Fehler beim Finden der betretbaren Häuser des Straße '.$this->street_id.' für den User'.$userid,__FILE__,__LINE__); $data = array(); for($i=0,$max=db_num_rows($res);$i<$max;$i++) { $row = db_fetch_assoc($res); $data[$row[HAUS_ID_FIELD]] = $row; } return $data; } function listAccessableHouses($userid=false){ $wvtxt = & sysTxt::instance(); $data = $this->findAccessableHouses($userid); $str = sprintf($wvtxt->get('list_keys_head'),count($data)); $i = 0; foreach($data as $value) { $haus = new haus_outside($value); $str .= $haus->list_row($i%2,array('house_nr','name','enter_link')); $i++; } $str .= $wvtxt->get('list_foot'); return $str; } } class wvQuater extends wvLoadable { var $quater_id; var $name; var $description; var $backlink; function wvQuater($in) { if(is_array($in)) { $this->load($in); } elseif(is_numeric((int) $in)) { $this->quater_id = $in; $this->read('SELECT * FROM `' . HAUS_QUATER_TABLE . '` WHERE `quater_id` = ' . $this->quater_id . ' LIMIT 1'); } else { stirb('Fehler beim Einlesen eines Wohnviertels', null, __FILE__, __LINE__); } } function findStreets($onlyExtendable = false) { $sql = 'SELECT `s`.`street_id`, `s`.`street_nr`, `s`.`name`, `s`.`shortdesc`, COUNT(`house_id`) AS `house_num` FROM `' . HAUS_STREET_TABLE . '` `s` LEFT OUTER JOIN `' . HAUS_TABLE . '` USING(`street_id`) WHERE `s`.`quater_id`=' . $this->quater_id . ($onlyExtendable ? ' AND `house_num` < `maxhouses`' : '') . ' GROUP BY `street_id`'; $res = dying_query($sql, 'Fehler beim einlesen aller Straßen eines Viertels', __FILE__, __LINE__); $streets = array(); for($i = 0, $max = db_num_rows($res); $i < $max; $i++) { $streets[] = new wvStreet(db_fetch_assoc($res)); } return $streets; } function listStreets() { $wvtxt = & sysTxt::instance(); $streets = $this->findStreets(); $houses = 0; $str = ''; for($i = 0, $max = count($streets); $i < $max; $i++) { $str .= $streets[$i]->list_row($i % 2); $houses += $streets[$i]->house_num; } $str .= $wvtxt->get('list_foot'); return sprintf($wvtxt->get('list_streets_head'), $houses, count($streets)) . $str; } } /** * Bietet eine interne Loggingfunktion (Primär zum debuggen und als Programmierhilfe) * * @param mixed $types * @param string $message * @param mixed $data */ function wvLog($types,$message,$data='NULL'){ $sql = "INSERT INTO `".HAUS_LOG_TABLE."`(`type`,`message`,`data`) VALUES ('%s','%s','%s')"; $params = array( is_array($types) ? implode(',',$types) : $types, $message, addslashes(is_string($data) ? $data : serialize($data)) ); dying_query(vsprintf($sql,$params),"Fehler beim Speichern eines Logeintrags (d'oh!)",__FILE__,__LINE__,true); } /** * Stellt ein erweitertes die() zur Verfügung * Es wird eine strukturierte Fehlermeldung mit Zusätzliche details ausgegeben * * @param string $nachricht Fehlermessage * @param object $objekt Fehlerauslöser * @param string $datei Datei des Vorfalls __FILE__ * @param int $zeile Zeile des Vorfalls __LINE__ */ function stirb($nachricht,$objekt = null,$datei = "",$zeile = "",$nolog=false) { global $session; $basestr = "

Schwerwiegender Fehler:

\nEin schwerwiegender Fehler ist aufgetreten, sodass das Skript beendet " . "werden musste. Hier nun weitere Informationen:

\n"; if($datei != "") $str .= "Der Fehler trat auf in Datei '" . $datei . "';
\n"; if($zeile != "") $str .= "Nahe der Zeile '" . $zeile . "';
\n"; if($objekt != null) $str .= "
Erzeugt wurde diese Fehlermeldung von einem Objekt der Klasse '" . get_class($objekt) . "' (oder höher)
\n"; $str .= "


Folgende Fehlermeldung wurde übergeben:
\n" . $nachricht . "
\n"; if($objekt != null) { $str .= "

Dump des Objektes:
\n"; ob_start(); var_dump($objekt); $dump = ob_get_contents(); ob_end_clean(); $str .= '
'.$dump.'
'; } if(strpos(db_error(), '#0') === false) { $str .= "


Anscheinend handelt es sich um einen Datenbankfehler - MySQL berichtet:
" . db_error(); } if(!$nolog) { if(strpos(HAUS_DEBUGGING, 'db') !== false) debuglog($str, $session['user']['acctid']); if(strpos(HAUS_DEBUGGING, 'wv') !== false) wvLog(array('critical','debug'),'Scriptabbruch nach Schwerwiegendem Fehler',$basestr . $str); } if($session['user']['superuser'] > HAUS_DEBUG_TEXT_USERLVL) $basestr .= $str; die($basestr); } function dying_query($sql,$errortxt,$datei = "",$zeile = "",$nolog=false) { $res = db_query($sql); if($res === false) stirb($errortxt, null, $datei, $zeile,$nolog); return $res; } ?>