* @license http://opensource.org/licenses/gpl-license.php GNU Public License * * @author freddy * $Rev: 132 $ $Date: 2007-05-15 00:55:01 -0700 (Tue, 15 May 2007) $ */ // EQdkp required files/vars define('EQDKP_INC', true); define('IN_ADMIN', true); define('PLUGIN', 'ctrt'); $eqdkp_root_path = './../../'; include_once($eqdkp_root_path . 'common.php'); include('config_ctrt.php'); $ctrt = $pm->get_plugin('ctrt'); if ( !$pm->check(PLUGIN_INSTALLED, 'ctrt') ) { message_die('The CT_RaidTracker Import plugin is not installed.'); } if(!function_exists("html_entity_decode")) { function html_entity_decode($string) { $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string); $string = preg_replace('~&#([0-9]+);~e', 'chr(\\1)', $string); $trans_tbl = get_html_translation_table(HTML_ENTITIES); $trans_tbl = array_flip($trans_tbl); return strtr($string, $trans_tbl); } } /** * Class CTRT_Import displays the import pages and import raid and item data * @subpackage ImportCTRT */ class CTRT_Import extends EQdkp_Admin { /** * @var array configuration settings * @access private */ var $_ctrt_settings = array(); function ctrt_import() { global $db, $eqdkp, $user, $tpl, $pm; global $SID; parent::eqdkp_admin(); $this->assoc_buttons(array( 'parse' => array( 'name' => 'parse', 'process' => 'process_parse', 'check' => 'a_raid_add'), 'form' => array( 'name' => '', 'process' => 'display_form', 'check' => 'a_raid_add'), 'insert' => array( 'name' => 'insertraids', 'process' => 'insert_log', 'check' => 'a_raid_add'), ) ); /** * Get CTRT Import configuration settings */ $sql = "SELECT config_name, config_value FROM ".CTRT_CONFIG_TABLE; $config_results = $db->query($sql); while ($config_value = $db->fetch_record($config_results)) { /** * Because IDs are stored instead of names, we need to get the name for CTRT */ if (!strcmp($config_value['config_name'],'NewMemberDefaultRank')) { $sql = "SELECT rank_name FROM ".MEMBER_RANKS_TABLE." WHERE rank_id = '".$config_value['config_value']."'"; $this->_ctrt_settings[$config_value['config_name']] = $db->query_first($sql); } else { $this->_ctrt_settings[$config_value['config_name']] = $config_value['config_value']; } } $db->free_result($config_results); /** * Get Player Aliases */ include_once("admin/dao/playeralias.php"); $daoPlayerAlias = new CTRT_PlayerAlias; $aliases = $daoPlayerAlias->getAll(); $this->_ctrt_settings['PlayerAliases'] = array(); foreach ($aliases as $alias) { $this->_ctrt_settings['PlayerAliases'][$alias['alias_name']] = $alias['member_name']; } /** * Get Event Triggers */ include_once("admin/dao/eventtrigger.php"); $daoEventTrigger = new CTRT_EventTrigger; $eventTriggers = $daoEventTrigger->getAll(); $this->_ctrt_settings['EventTriggers'] = array(); foreach ($eventTriggers as $eventTrigger) { $this->_ctrt_settings['EventTriggers'][$eventTrigger['event_trigger_name']] = $eventTrigger['event_trigger_result']; } /** * Get Raidnote Triggers */ include_once("admin/dao/raidnotetrigger.php"); $daoRaidNoteTrigger = new CTRT_RaidNoteTrigger; $raidNoteTriggers = $daoRaidNoteTrigger->getAll(); $this->_ctrt_settings['RaidNoteTriggers'] = array(); foreach ($raidNoteTriggers as $raidNoteTrigger) { $this->_ctrt_settings['RaidNoteTriggers'][$raidNoteTrigger['raid_note_trigger_name']] = $raidNoteTrigger['raid_note_trigger_result']; } /** * Get Own Raid */ include_once("admin/dao/ownraid.php"); $daoOwnRaid = new CTRT_OwnRaid; $ownRaids = $daoOwnRaid->getAll(); $this->_ctrt_settings['OwnRaids'] = array(); foreach ($ownRaids as $ownRaid) { $this->_ctrt_settings['OwnRaids'][] = $ownRaid['own_raid_name']; } /** * Get Add Items */ include_once("admin/dao/additem.php"); $daoAddItem = new CTRT_AddItem; $addItems = $daoAddItem->getAll(); $this->_ctrt_settings['AlwaysAddItems'] = array(); foreach ($addItems as $addItem) { $this->_ctrt_settings['AlwaysAddItems'][] = $addItem['add_items_wow_id']; } /** * Get Ignore Items */ include_once("admin/dao/ignoreitem.php"); $daoIgnoreItem = new CTRT_IgnoreItem; $ignoreItems = $daoIgnoreItem->getAll(); $this->_ctrt_settings['IgnoreItems'] = array(); foreach ($ignoreItems as $ignoreItem) { $this->_ctrt_settings['IgnoreItems'][] = $ignoreItem['ignore_items_wow_id']; } } function GetRaidNoteFromString($string) { foreach($this->_ctrt_settings['RaidNoteTriggers'] as $trigger => $value) { if($this->in_string($trigger, $string, true)) { return $value; } } return "Unknown"; } function GetRaidEventFromString($string) { foreach($this->_ctrt_settings['EventTriggers'] as $trigger => $value) { if($this->in_string($trigger, stripslashes($string), true)) { return $value; } } return "Unknown Event"; } function GetItemName($itemid) { global $gitemlist, $itemidtoname; if(empty($gitemlist) && file_exists("itemlist.xml")) { $itemlisthandle = fopen("itemlist.xml", "r"); while(!feof($itemlisthandle)) { $itemlistbuffer = fgets($itemlisthandle, 1024); preg_match_all("//s", $itemlistbuffer, $itemlista, PREG_SET_ORDER); foreach($itemlista as $itemlistdata) { $gitemlist[$itemlistdata[2]] = $itemlistdata[1]; } } fclose($itemlisthandle); } if(function_exists("GetItemName")) // Just ignore this, it's my part to get the itemname from my database { $altitemname = @GetItemName($itemid, $lang = "en"); } if(!empty($altitemname)) { return $altitemname; } elseif(!empty($gitemlist[$itemid])) { return $gitemlist[$itemid]; } elseif(!empty($itemidtoname[$itemid])) { return $itemidtoname[$itemid]; } else { return false; } } function ConvertTimestringToTimestamp($timestring) { $parts = preg_split('/[\/ :]/', $timestring); return mktime($parts[3], $parts[4], $parts[5], $parts[0], $parts[1], $parts[2]); } function in_string($needle, $haystack, $insensitive=false) { if ($insensitive) { $haystack = strtolower($haystack); $needle = strtolower($needle); } return (false !== strpos($haystack, $needle)) ? true : false; } function xml2array($xml) { $xml = trim($xml); $xml = ''.$xml; $xp = xml_parser_create(""); xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, false); // whether or not to upercase chars xml_parser_set_option($xp, XML_OPTION_SKIP_WHITE, false); // whether or not to skip whitespaces xml_parser_set_option($xp, XML_OPTION_TARGET_ENCODING, "ISO-8859-1"); xml_parse_into_struct($xp,trim($xml),$vals,$index); xml_parser_free($xp); $_data = NULL; $temp = $depth = array(); $dc = array(); foreach($vals as $value) { $p = join('::', $depth); $key = $value['tag']; switch ($value['type']) { case 'open': array_push($depth, $key); array_push($depth, (int)$dc[$p]++); break; case 'complete': array_pop($depth); array_push($depth, $key); $p = join('::',$depth); $temp[$p] = $value['value']; array_pop($depth); array_push($depth, (int)$dc[$p]); break; case 'close': array_pop($depth); array_pop($depth); break; } } foreach($temp as $key=>$value) { $levels = explode('::',$key); $num_levels = count($levels); if ($num_levels==1) { $_data[$levels[0]] = $value; } else { $pointer = &$_data; for ($i = 0; $i < $num_levels; $i++) { if (!isset($pointer[$levels[$i]])) { $pointer[$levels[$i]] = array(); } $pointer = &$pointer[$levels[$i]]; } $pointer = $value; } } return ($_data); } function GetMainItemId($itemid) { $itemid = trim($itemid, "item:"); $itemid = preg_split("/:/", $itemid); return $itemid[0]; } function GetItemQualityByColor($color) { $color = strtolower($color); if($color == "ffff8000") { return CTRT_IQ_LEGENDARY; } elseif($color == "ffa335ee") { return CTRT_IQ_EPIC; } elseif($color == "ff0070dd") { return CTRT_IQ_RARE; } elseif($color == "ff1eff00") { return CTRT_IQ_UNCOMMON; } elseif($color == "ffffffff") { return CTRT_IQ_COMMON; } elseif($color == "ff9d9d9d") { return CTRT_IQ_POOR; } else { return -1; } } function GetDkpValue($item) { global $db; $value = $db->query("SELECT MIN(`item_value`) as minval FROM ".ITEMS_TABLE." WHERE `item_name` = '".mysql_real_escape_string($item)."';"); $value = $db->fetch_record($value); if(!is_numeric($value['minval'])) { return $this->_ctrt_settings['DefaultDKPCost']; } else { return $value['minval']; } } function GetClassIdByClassNameLevel($classname, $level) { global $db; $value = $db->query("SELECT `class_id` FROM ".CLASS_TABLE." WHERE (`class_name` = '".mysql_real_escape_string(ucwords($classname))."' OR `class_name` = '".mysql_real_escape_string($this->GetGermanClassName(ucwords($classname)))."') AND `class_min_level` <= '".mysql_real_escape_string($level)."' AND `class_max_level` >= '".mysql_real_escape_string($level)."' ORDER by class_min_level DESC;"); if($db->num_rows($value) >= 1) { $value = $db->fetch_record($value); return $value['class_id']; } else { return 0; } } function GetRaceIdByRaceName($racename) { global $db; if($racename == "Scourge") { $racename = "Undead"; } elseif($racename == "NightElf") { $racename = "Night Elf"; } $value = $db->query("SELECT `race_id` FROM ".RACE_TABLE." WHERE `race_name` = '".mysql_real_escape_string($racename)."' OR `race_name` = '".mysql_real_escape_string($this->GetGermanRaceName($racename))."';"); if($db->num_rows($value) >= 1) { $value = $db->fetch_record($value); return $value['race_id']; } else { return 0; } } function GetRankIdByRankName($rankname) { global $db; $value = $db->query("SELECT `rank_id` FROM ".MEMBER_RANKS_TABLE." WHERE `rank_name` = '".mysql_real_escape_string($rankname)."';"); if($db->num_rows($value) >= 1) { $value = $db->fetch_record($value); return $value['rank_id']; } else { return 0; } } function GetClassNameByClassId($classid) { global $db; $value = $db->query("SELECT `class_name` FROM ".CLASS_TABLE." WHERE `class_id` = '".mysql_real_escape_string($classid)."';"); if($db->num_rows($value) >= 1) { $value = $db->fetch_record($value); return $value['class_name']; } else { return "Unknown"; } } function GetRaceNameByRaceId($raceid) { global $db; $value = $db->query("SELECT `race_name` FROM ".RACE_TABLE." WHERE `race_id` = '".mysql_real_escape_string($raceid)."';"); if($db->num_rows($value) >= 1) { $value = $db->fetch_record($value); return $value['race_name']; } else { return "Unknown"; } } function GetRankNameByRankId($rankid) { global $db; $value = $db->query("SELECT `rank_name` FROM ".MEMBER_RANKS_TABLE." WHERE `rank_id` = '".mysql_real_escape_string($rankid)."';"); if($db->num_rows($value) >= 1) { $value = $db->fetch_record($value); if(!empty($value['rank_name'])) { return $value['rank_name']; } else { return "None"; } } else { return "None"; } } function GetGermanClassName($className) { switch (ucwords($className)) { case "Warrior": $germanClassName = "Krieger"; break; case "Rogue": $germanClassName = "Schurke"; break; case "Hunter": $germanClassName = "Jäger"; break; case "Paladin": $germanClassName = "Paladin"; break; case "Priest": $germanClassName = "Priester"; break; case "Druid": $germanClassName = "Druide"; break; case "Shaman": $germanClassName = "Schamane"; break; case "Warlock": $germanClassName = "Hexenmeister"; break; case "Mage": $germanClassName = "Magier"; break; default: $germanClassName = $className; break; } return $germanClassName; } function GetGermanRaceName($raceName) { switch ($raceName) { case "Gnome": $germanRaceName = 'Gnom'; break; case "Human": $germanRaceName = 'Mensch'; break; case "Dwarf": $germanRaceName = 'Zwerg'; break; case "Night Elf": $germanRaceName = 'Nachtelf'; break; case "Troll": $germanRaceName = 'Troll'; break; case "Undead": $germanRaceName = 'Untoter'; break; case "Orc": $germanRaceName = 'Ork'; break; case "Tauren": $germanRaceName = 'Taure'; break; case "Blood Elf": $germanRaceName = 'Blutelf'; break; default: $germanRaceName = $raceName; break; } return $germanRaceName; } function GenerateUniqId() { return md5(uniqid(rand(), true)); } function StripUniqIdFromString($string) { return preg_replace("/(.*?)-[a-z0-9]{32}-(.*?)/", "\\1\\2", $string); } function StripSpecialChars($string) { $string = strtr($string, "\xA1\xAA\xBA\xBF\xC0\xC1\xC2\xC3\xC5\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD8\xD9\xDA\xDB\xDD\xE0\xE1\xE2\xE3\xE5\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF8\xF9\xFA\xFB\xFD\xFF", "!ao?AAAAACEEEEIIIIDNOOOOOUUUYaaaaaceeeeiiiidnooooouuuyy"); $string = strtr($string, array("\xC4"=>"Ae", "\xC6"=>"AE", "\xD6"=>"Oe", "\xDC"=>"Ue", "\xDE"=>"TH", "\xDF"=>"ss", "\xE4"=>"ae", "\xE6"=>"ae", "\xF6"=>"oe", "\xFC"=>"ue", "\xFE"=>"th")); return($string); } function process_parse() { # Declare Variables global $db, $eqdkp, $user, $tpl, $pm; global $SID; global $itemidtoname; # Input Cleanup $_POST['log'] = trim(str_replace("&", "and", html_entity_decode($_POST['log']))); # Basic xml validation if(!preg_match("/.*?<\/key>.*?.*?<\/Join>.*?<\/Leave>.*?<\/Loot><\/RaidInfo>/s", $_POST['log'])) { message_die($user->lang['ctrt_step1_invalidstring_msg'], $user->lang['ctrt_step1_invalidstring_title']); } #Initialize arrrays $allraids = array(); $allevents = array(); $allraidattendees = array(); $itemidtoname = array(); $adata = $this->xml2array($_POST['log']); $globalevent = $this->GetRaidEventFromString($adata['RaidInfo']['note']); $globalraidnote = $this->GetRaidNoteFromString($adata['RaidInfo']['note']); $globalraidstart = $this->ConvertTimestringToTimestamp($adata['RaidInfo']['start']); # Set Join Times for Players if($allforeachdata = @array_shift($adata['RaidInfo'][0]['Join'])) foreach($allforeachdata as $playerdata) { # Convert Names, Set Timestamp, Initialize the Player Data $playerdata['time'] = $this->ConvertTimestringToTimestamp($playerdata['time']); if(!empty($this->_ctrt_settings['PlayerAliases'][$playerdata['player']])) { $playerdata['player'] = $this->_ctrt_settings['PlayerAliases'][$playerdata['player']]; } if($this->_ctrt_settings['ConvertNames']) { $playerdata['player'] = $this->StripSpecialChars($playerdata['player']); } if(!isset($allattendees[$playerdata['player']])) { $allattendees[$playerdata['player']] = array("race" => 0, "class" => 0, "level" => 0); } # Set Class, Race, Level if available and not set if(!empty($playerdata['race']) && empty($allattendees[$playerdata['player']]['race'])) { $allattendees[$playerdata['player']]['race'] = $this->GetRaceIdByRaceName($playerdata['race']); } if(!empty($playerdata['class']) && empty($allattendees[$playerdata['player']]['class'])) { $alla