From 96949830e6e2320b0af5248111e4e02c1b1ae265 Mon Sep 17 00:00:00 2001 From: SirCotare Date: Mon, 9 Jul 2012 19:10:44 +0200 Subject: [PATCH] #1470 monday's update :) --HG-- branch : gsoc2012-achievements --- .../_AchWebParser/AchWebParser.php | 210 ++--- .../_AchWebParser/_AchWebParser.php | 207 +++++ .../_AchWebParser/class/Atom_class.php | 50 +- .../_AchWebParser/class/Callback_class.php | 15 + .../class/DataDispatcher_class.php | 80 ++ .../class/DataSourceHandler_class.php | 61 +- .../class/SourceDriver_abstract.php | 5 + .../_AchWebParser/class/ValueCache_class.php | 27 + .../app_achievements/_AchWebParser/conf.php | 10 +- .../PDRtoXMLdriver/PDRtoXMLdriver_class.php | 99 ++ .../source/PDRtoXMLdriver/conf.php | 6 + .../class/AchAchievement_class.php | 25 +- .../class/AchCategory_class.php | 8 +- .../class/AchList_abstract.php | 12 +- .../class/AchMenuNode_class.php | 25 +- .../app_achievements/class/AchPerk_class.php | 32 +- .../app/app_achievements/class/DLL_class.php | 4 + .../class/Parentum_abstract.php | 4 +- .../class/RyzomUser_class.php | 2 +- .../include/ach_render_ig.php | 10 +- .../include/ach_render_web.php | 12 +- code/web/app/app_achievements/index.php | 8 +- .../class/AdmAchievement_class.php | 10 + .../class/AdmAtom_class.php | 65 +- .../class/AdmObjective_class.php | 26 +- .../class/AdmPerk_class.php | 40 +- .../include/adm_render_ach.php | 96 +- .../include/adm_render_atom.php | 856 ++++++++++++++++++ code/web/app/app_achievements_admin/index.php | 69 +- 29 files changed, 1796 insertions(+), 278 deletions(-) create mode 100644 code/web/app/app_achievements/_AchWebParser/_AchWebParser.php create mode 100644 code/web/app/app_achievements/_AchWebParser/class/Callback_class.php create mode 100644 code/web/app/app_achievements/_AchWebParser/class/DataDispatcher_class.php create mode 100644 code/web/app/app_achievements/_AchWebParser/class/SourceDriver_abstract.php create mode 100644 code/web/app/app_achievements/_AchWebParser/class/ValueCache_class.php create mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/PDRtoXMLdriver_class.php create mode 100644 code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/conf.php create mode 100644 code/web/app/app_achievements_admin/include/adm_render_atom.php diff --git a/code/web/app/app_achievements/_AchWebParser/AchWebParser.php b/code/web/app/app_achievements/_AchWebParser/AchWebParser.php index ced23e986..0d02dcc70 100644 --- a/code/web/app/app_achievements/_AchWebParser/AchWebParser.php +++ b/code/web/app/app_achievements/_AchWebParser/AchWebParser.php @@ -8,18 +8,21 @@ require_once("class/mySQL_class.php"); require_once("conf.php"); - require_once("inlcude/functions_inc.php"); + require_once("include/functions_inc.php"); - $logfile = false; + $_REQUEST['file'] = $argv[1]; + + + /*$logfile = false; if($CONF['logging'] == true) { require_once("class/Logfile_class.php"); #$logfile = fopen($CONF['logfile'].'.'.date("Ymd",time()).'.txt','a'); - $logfile = new Logfile($CONF['logfile']); - } + $logfile = new Logfile($CONF['logfile']);#!! MUST HAVE ONE LOGFILE PER RUN!! + }*/ //set mode: cron || single with given cid #MISSING: conf to allow external calls; whitelist ips - $MODE = "CRON"; + /*$MODE = "CRON"; if($_REQUEST["cid"] > 0 || $_REQUEST["invoke"] == "TRUE") { if($_REQUEST["cid"] > 0 && $_REQUEST["invoke"] == "TRUE") { $MODE = "SINGLE"; @@ -30,52 +33,39 @@ logf($e); die($e); } - } + }*/ //create database connection $DBc = new mySQL($CONF['mysql_error']); $DBc->connect($CONF['mysql_server'],$CONF['mysql_user'],$CONF['mysql_pass'],$CONF['mysql_database']); - if($MODE == "CRON") { - $RID = $DBc->sendSQL("INSERT INTO ach_monitor_state (ams_start,ams_end) VALUES ('".time()."','0')","INSERT"); // insert run into monitoring table - } + #if($MODE == "CRON") { + # $RID = $DBc->sendSQL("INSERT INTO ach_monitor_state (ams_start,ams_end) VALUES ('".time()."','0')","INSERT"); // insert run into monitoring table + #} + require_once("class/DataDispatcher_class.php"); require_once("class/DataSourceHandler_class.php"); - require_once("class/DataSource_abstract.php"); - + require_once("class/SourceDriver_abstract.php"); + require_once("class/Callback_class.php"); + require_once("class/ValueCache_class.php"); require_once("class/Atom_class.php"); + + #MISSING: static ValueCache! + + $_CACHE = new ValueCache(); + //create datasource handler - $_DATA = new DataSourceHandler(); + $_DISPATCHER = new DataDispatcher(); + $_DATASOURCE = new DataSourceHandler(); foreach($CONF['data_source'] as $elem) { //populate require_once("source/".$elem."/".$elem."_class.php"); eval('$tmp = new '.$elem.'();'); - $_DATA->registerDataSource($tmp); - } - - //synch chars from ring_open character table - if($CONF['synch_chars'] == true) { - $DBc_char = new mySQL($CONF['mysql_error']); - $DBc_char->connect($CONF['char_mysql_server'],$CONF['char_mysql_user'],$CONF['char_mysql_pass'],$CONF['char_mysql_database']); - - $DBc->sendSQL("UPDATE ach_monitor_character SET amc_confirmed='0'","NONE"); - - $res = $DBc_char->sendSQL("SELECT char_id,last_played_date FROM characters","ARRAY"); - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("INSERT INTO ach_monitor_character (amc_character,amc_last_import,amc_last_login,amc_confirmed) VALUES ('".$res[$i]['char_id']."','0','".dateTime_to_timestamp($res[$i]['last_played_date'])."','1') ON DUPLICATE KEY UPDATE amc_confirmed='1', amc_last_login='".dateTime_to_timestamp($res[$i]['last_played_date'])."'","NONE"); - } - - $DBc->sendSQL("DELETE FROM ach_monitor_character WHERE amc_confirmed='0'","NONE"); //remove deleted characters - //remove data for deleted chars - $DBc->sendSQL("DELETE FROM ach_player_atom WHERE NOT EXISTS (SELECT * FROM ach_monitor_character WHERE amc_character='apa_player')","NONE"); - $DBc->sendSQL("DELETE FROM ach_player_objective WHERE NOT EXISTS (SELECT * FROM ach_monitor_character WHERE amc_character='apo_player')","NONE"); - $DBc->sendSQL("DELETE FROM ach_player_perk WHERE NOT EXISTS (SELECT * FROM ach_monitor_character WHERE amc_character='app_player')","NONE"); - $DBc->sendSQL("DELETE FROM ach_player_valuecache WHERE NOT EXISTS (SELECT * FROM ach_monitor_character WHERE amc_character='apv_player')","NONE"); + $_DATASOURCE->addSource($tmp); } // fetch candidates - if($MODE == "SINGLE") { + /*if($MODE == "SINGLE") { $chars = array(); $chars[] = array('amc_character',$CID); } @@ -87,118 +77,74 @@ $DBc->sendSQL("UPDATE ach_monitor_character SET amc_working='".$RID."' WHERE amc_last_login>amc_last_import AND amc_working='0'","NONE"); $chars = $DBc->sendSQL("SELECT amc_character FROM ach_monitor_character WHERE amc_working='".$RID."'","ARRAY"); - } + }*/ + $tmp = explode("/",$_REQUEST['file']); + $tmp2 = explode("_",$tmp[(sizeof($tmp)-1)]); - //fork if enabled in conf - if($CONF['fork'] == true && $MODE == "CRON") { - require_once("class/ParallelCURL_class.php"); + + $chars = array(($tmp2[1]*16+$tmp2[2])); + + foreach($chars as $cid) { + #STEP 1: load and register atoms - $max_requests = 0; - $curl_options = array( - CURLOPT_SSL_VERIFYPEER => FALSE, - CURLOPT_SSL_VERIFYHOST => FALSE, - CURLOPT_USERAGENT, 'Ryzom - Achievement Tracker', - ); - - $_CURL = new ParallelCurl($max_requests, $curl_options); - - foreach($chars as $elem) { - $_CURL->startRequest("http://".$CONF['self_host']."/".$CONF['self_path']."?invoke=TRUE&cid=".$elem['amc_character'], 'received_char',null); - } - } - else { $atom_list = array(); - foreach($chars as $elem) { - $_DATA->freeData($elem['amc_character']); - - #STEP 1: evaluate atoms - - //get unfinished perks which have no parent or complete parent - $res = $DBc->sendSQL("SELECT ap_id FROM ach_perk WHERE (ap_parent IS NULL OR EXISTS (SELECT * FROM ach_player_perk WHERE app_player='".$elem['amc_character']."' AND app_perk=ap_parent)) AND (NOT EXISTS (SELECT * FROM ach_player_perk WHERE app_player='".$elem['amc_character']."' AND app_perk=ap_id))","ARRAY"); - foreach($res as $perk) { - //get unfinished atoms belonging to unfinished objectives - $res = $DBc->sendSQL("SELECT ach_atom.* FROM ach_atom,ach_objective WHERE ao_perk='".$perk['ap_id']."' AND ao_id=atom_objective AND NOT EXISTS (SELECT * FROM ach_player_objective WHERE apo_player='".$elem['amc_character']."' AND apo_objective=ao_id)","ARRAY"); - foreach($res2 as $atom) { - if(!isset($atom_list[$atom['atom_id']])) { // only load if not already cached - $atom_list[$atom['atom_id']] = new Atom($atom); - } - - $atom_list[$atom['atom_id']]->evalRuleset($elem['amc_character']); - } - } - - $_DATA->freeData($elem['amc_character']); - - $DBc->sendSQL("UPDATE ach_monitor_character SET amc_last_import='".time()."', amc_working='0' WHERE amc_character='".$elem['amc_character']."' AND amc_working='".$RID."'","NONE"); - - #STEP 2: detect obj/perk progression - //obj - $res = $DBc->sendSQL("SELECT ao_id FROM ach_objective WHERE ao_condition='all' AND NOT EXISTS (SELECT * FROM ach_atom WHERE atom_objective=ao_id AND NOT EXISTS (SELECT * FROM ach_player_atom WHERE apa_atom=atom_id AND apa_state!='GRANT' AND apa_player='".$elem['amc_character']."'))","ARRAY"); - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("INSERT INTO ach_player_objective (apo_objective,apo_player,apo_date) VALUES ('".$res[$i]['ao_id']."','".$elem['amc_character']."','".time()."')","NONE"); - } - - $res = $DBc->sendSQL("SELECT ao_id FROM ach_objective WHERE ao_condition='value' AND ao_value<=(SELECT count(*) FROM ach_atom WHERE atom_objective=ao_id AND EXISTS (SELECT * FROM ach_player_atom WHERE apa_atom=atom_id AND apa_state='GRANT' AND apa_player='".$elem['amc_character']."'))","ARRAY"); - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("INSERT INTO ach_player_objective (apo_objective,apo_player,apo_date) VALUES ('".$res[$i]['ao_id']."','".$elem['amc_character']."','".time()."')","NONE"); - } - - $res = $DBc->sendSQL("SELECT ao_id FROM ach_objective WHERE ao_condition='any' AND EXISTS (SELECT * FROM ach_atom WHERE atom_objective=ao_id AND EXISTS (SELECT * FROM ach_player_atom WHERE apa_atom=atom_id AND apa_state='GRANT' AND apa_player='".$elem['amc_character']."'))","ARRAY"); - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("INSERT INTO ach_player_objective (apo_objective,apo_player,apo_date) VALUES ('".$res[$i]['ao_id']."','".$elem['amc_character']."','".time()."')","NONE"); - } - - //perk - $res = $DBc->sendSQL("SELECT ap_id FROM ach_perk WHERE ap_condition='all' AND NOT EXISTS (SELECT * FROM ach_objective WHERE ao_perk=ap_id AND NOT EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_state!='GRANT' AND apo_player='".$elem['amc_character']."'))","ARRAY"); - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("INSERT INTO ach_player_perk (app_objective,app_player,app_date) VALUES ('".$res[$i]['ap_id']."','".$elem['amc_character']."','".time()."')","NONE"); - } - - $res = $DBc->sendSQL("SELECT ap_id FROM ach_perk WHERE ap_condition='value' AND ap_value<=(SELECT count(*) FROM ach_objective WHERE ao_perk=ap_id AND EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_state='GRANT' AND apo_player='".$elem['amc_character']."'))","ARRAY"); - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("INSERT INTO ach_player_perk (app_objective,app_player,app_date) VALUES ('".$res[$i]['ap_id']."','".$elem['amc_character']."','".time()."')","NONE"); + $res = $DBc->sendSQL("SELECT ap_id FROM ach_perk WHERE NOT EXISTS (SELECT * FROM ach_player_perk WHERE app_player='".$cid."' AND app_perk=ap_id)","ARRAY"); + foreach($res as $perk) { + //get unfinished atoms belonging to unfinished objectives + $res2 = $DBc->sendSQL("SELECT ach_atom.* FROM ach_atom,ach_objective WHERE ao_perk='".$perk['ap_id']."' AND ao_id=atom_objective AND NOT EXISTS (SELECT * FROM ach_player_objective WHERE apo_player='".$cid."' AND apo_objective=ao_id)","ARRAY"); + foreach($res2 as $atom) { + $a = new Atom($atom,$cid); + $atom_list[] = $a; + $a->register(); } + } + + #STEP 2: drive data + $_CACHE->setChar($cid); + $_DATASOURCE->drive($cid); - $res = $DBc->sendSQL("SELECT ap_id FROM ach_perk WHERE ap_condition='any' AND EXISTS (SELECT * FROM ach_objective WHERE ao_perk=ap_id AND EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_state='GRANT' AND apo_player='".$elem['amc_character']."'))","ARRAY"); - $sz = sizeof($res); - for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("INSERT INTO ach_player_perk (app_objective,app_player,app_date) VALUES ('".$res[$i]['ap_id']."','".$elem['amc_character']."','".time()."')","NONE"); - } + #STEP 3: detect obj/perk progression + //obj + $res = $DBc->sendSQL("SELECT ao_id FROM ach_objective WHERE ao_condition='all' AND NOT EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_player='".$cid."') AND NOT EXISTS (SELECT * FROM ach_atom WHERE atom_objective=ao_id AND EXISTS (SELECT * FROM ach_player_atom WHERE apa_atom=atom_id AND apa_state!='GRANT' AND apa_player='".$cid."'))","ARRAY"); + $sz = sizeof($res); + for($i=0;$i<$sz;$i++) { + $DBc->sendSQL("INSERT INTO ach_player_objective (apo_objective,apo_player,apo_date) VALUES ('".$res[$i]['ao_id']."','".$cid."','".time()."')","NONE"); } - } - if($CONF['sleep_time'] != false) { - sleep($CONF['sleep_time']); - } + $res = $DBc->sendSQL("SELECT ao_id FROM ach_objective WHERE ao_condition='value' AND NOT EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_player='".$cid."') AND ao_value<=(SELECT count(*) FROM ach_atom WHERE atom_objective=ao_id AND EXISTS (SELECT * FROM ach_player_atom WHERE apa_atom=atom_id AND apa_state='GRANT' AND apa_player='".$cid."'))","ARRAY"); + $sz = sizeof($res); + for($i=0;$i<$sz;$i++) { + $DBc->sendSQL("INSERT INTO ach_player_objective (apo_objective,apo_player,apo_date) VALUES ('".$res[$i]['ao_id']."','".$cid."','".time()."')","NONE"); + } - //self call if cron mode is on - if($MODE == "CRON" && $CONF['enable_selfcall'] == true) { - $DBc->sendSQL("UPDATE ach_monitor_state SET ams_end='".time()."' WHERE ams_id='".$RID."'","NONE"); + $res = $DBc->sendSQL("SELECT ao_id FROM ach_objective WHERE ao_condition='any' AND NOT EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_player='".$cid."') AND EXISTS (SELECT * FROM ach_atom WHERE atom_objective=ao_id AND EXISTS (SELECT * FROM ach_player_atom WHERE apa_atom=atom_id AND apa_state='GRANT' AND apa_player='".$cid."'))","ARRAY"); + $sz = sizeof($res); + for($i=0;$i<$sz;$i++) { + $DBc->sendSQL("INSERT INTO ach_player_objective (apo_objective,apo_player,apo_date) VALUES ('".$res[$i]['ao_id']."','".$cid."','".time()."')","NONE"); + } - $fp = fsockopen($CONF['self_host'], 80, $errno, $errstr, 30); - if(!$fp) { - logf("ERROR: self call; socket: ".$errstr." (."$errno.")"); + //perk + $res = $DBc->sendSQL("SELECT ap_id FROM ach_perk WHERE ap_condition='all' AND NOT EXISTS (SELECT * FROM ach_player_perk WHERE app_perk=ap_id AND app_player='".$cid."') AND NOT EXISTS (SELECT * FROM ach_objective WHERE ao_perk=ap_id AND NOT EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_player='".$cid."'))","ARRAY"); + $sz = sizeof($res); + for($i=0;$i<$sz;$i++) { + $DBc->sendSQL("INSERT INTO ach_player_perk (app_perk,app_player,app_date) VALUES ('".$res[$i]['ap_id']."','".$cid."','".time()."')","NONE"); } - else { - $out = "GET ".$CONF['self_path']." HTTP/1.1\r\n"; - $out .= "Host: ".$CONF['self_host']."\r\n"; - $out .= "Connection: Close\r\n\r\n"; - fwrite($fp, $out); - fclose($fp); + $res = $DBc->sendSQL("SELECT ap_id FROM ach_perk WHERE ap_condition='value' AND NOT EXISTS (SELECT * FROM ach_player_perk WHERE app_perk=ap_id AND app_player='".$cid."') AND ap_value<=(SELECT count(*) FROM ach_objective WHERE ao_perk=ap_id AND EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_player='".$cid."'))","ARRAY"); + $sz = sizeof($res); + for($i=0;$i<$sz;$i++) { + $DBc->sendSQL("INSERT INTO ach_player_perk (app_perk,app_player,app_date) VALUES ('".$res[$i]['ap_id']."','".$cid."','".time()."')","NONE"); } - } - if($logfile) { - $logfile->write(); + $res = $DBc->sendSQL("SELECT ap_id FROM ach_perk WHERE ap_condition='any' AND NOT EXISTS (SELECT * FROM ach_player_perk WHERE app_perk=ap_id AND app_player='".$cid."') AND EXISTS (SELECT * FROM ach_objective WHERE ao_perk=ap_id AND EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_player='".$cid."'))","ARRAY"); + $sz = sizeof($res); + for($i=0;$i<$sz;$i++) { + $DBc->sendSQL("INSERT INTO ach_player_perk (app_perk,app_player,app_date) VALUES ('".$res[$i]['ap_id']."','".$cid."','".time()."')","NONE"); + } } + - exit(0); + ?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/_AchWebParser.php b/code/web/app/app_achievements/_AchWebParser/_AchWebParser.php new file mode 100644 index 000000000..425b62540 --- /dev/null +++ b/code/web/app/app_achievements/_AchWebParser/_AchWebParser.php @@ -0,0 +1,207 @@ + 0 || $_REQUEST["invoke"] == "TRUE") { + if($_REQUEST["cid"] > 0 && $_REQUEST["invoke"] == "TRUE") { + $MODE = "SINGLE"; + $CID = $DBc->mre($_REQUEST["cid"]); + } + else { + $e = "Failed to start SINGLE mode; cid=".$_REQUEST["cid"]; + logf($e); + die($e); + } + } + + //create database connection + $DBc = new mySQL($CONF['mysql_error']); + $DBc->connect($CONF['mysql_server'],$CONF['mysql_user'],$CONF['mysql_pass'],$CONF['mysql_database']); + + if($MODE == "CRON") { + $RID = $DBc->sendSQL("INSERT INTO ach_monitor_state (ams_start,ams_end) VALUES ('".time()."','0')","INSERT"); // insert run into monitoring table + } + + require_once("class/DataSourceHandler_class.php"); + require_once("class/DataSource_abstract.php"); + + require_once("class/Atom_class.php"); + + //create datasource handler + $_DATA = new DataSourceHandler(); + foreach($CONF['data_source'] as $elem) { //populate + require_once("source/".$elem."/".$elem."_class.php"); + eval('$tmp = new '.$elem.'();'); + $_DATA->registerDataSource($tmp); + } + + //synch chars from ring_open character table + if($CONF['synch_chars'] == true) { + $DBc_char = new mySQL($CONF['mysql_error']); + $DBc_char->connect($CONF['char_mysql_server'],$CONF['char_mysql_user'],$CONF['char_mysql_pass'],$CONF['char_mysql_database']); + + $DBc->sendSQL("UPDATE ach_monitor_character SET amc_confirmed='0'","NONE"); + + $res = $DBc_char->sendSQL("SELECT char_id,last_played_date FROM characters","ARRAY"); + $sz = sizeof($res); + for($i=0;$i<$sz;$i++) { + $DBc->sendSQL("INSERT INTO ach_monitor_character (amc_character,amc_last_import,amc_last_login,amc_confirmed) VALUES ('".$res[$i]['char_id']."','0','".dateTime_to_timestamp($res[$i]['last_played_date'])."','1') ON DUPLICATE KEY UPDATE amc_confirmed='1', amc_last_login='".dateTime_to_timestamp($res[$i]['last_played_date'])."'","NONE"); + } + + $DBc->sendSQL("DELETE FROM ach_monitor_character WHERE amc_confirmed='0'","NONE"); //remove deleted characters + //remove data for deleted chars + $DBc->sendSQL("DELETE FROM ach_player_atom WHERE NOT EXISTS (SELECT * FROM ach_monitor_character WHERE amc_character='apa_player')","NONE"); + $DBc->sendSQL("DELETE FROM ach_player_objective WHERE NOT EXISTS (SELECT * FROM ach_monitor_character WHERE amc_character='apo_player')","NONE"); + $DBc->sendSQL("DELETE FROM ach_player_perk WHERE NOT EXISTS (SELECT * FROM ach_monitor_character WHERE amc_character='app_player')","NONE"); + $DBc->sendSQL("DELETE FROM ach_player_valuecache WHERE NOT EXISTS (SELECT * FROM ach_monitor_character WHERE amc_character='apv_player')","NONE"); + } + + // fetch candidates + if($MODE == "SINGLE") { + $chars = array(); + $chars[] = array('amc_character',$CID); + } + else { + #$chars = array(); + + $DBc->sendSQL("UPDATE ach_monitor_character SET amc_working='0' WHERE amc_last_import<'".(time()-60*60)."'"); // unlock if something went wrong + + $DBc->sendSQL("UPDATE ach_monitor_character SET amc_working='".$RID."' WHERE amc_last_login>amc_last_import AND amc_working='0'","NONE"); + + $chars = $DBc->sendSQL("SELECT amc_character FROM ach_monitor_character WHERE amc_working='".$RID."'","ARRAY"); + } + + + //fork if enabled in conf + if($CONF['fork'] == true && $MODE == "CRON") { + require_once("class/ParallelCURL_class.php"); + + $max_requests = 0; + $curl_options = array( + CURLOPT_SSL_VERIFYPEER => FALSE, + CURLOPT_SSL_VERIFYHOST => FALSE, + CURLOPT_USERAGENT, 'Ryzom - Achievement Tracker', + ); + + $_CURL = new ParallelCurl($max_requests, $curl_options); + + foreach($chars as $elem) { + $_CURL->startRequest("http://".$CONF['self_host']."/".$CONF['self_path']."?invoke=TRUE&cid=".$elem['amc_character'], 'received_char',null); + } + } + else { + $atom_list = array(); + + foreach($chars as $elem) { + $_DATA->freeData($elem['amc_character']); + + #STEP 1: evaluate atoms + + //get unfinished perks which have no parent or complete parent + #$res = $DBc->sendSQL("SELECT ap_id FROM ach_perk WHERE (ap_parent IS NULL OR EXISTS (SELECT * FROM ach_player_perk WHERE app_player='".$elem['amc_character']."' AND app_perk=ap_parent)) AND (NOT EXISTS (SELECT * FROM ach_player_perk WHERE app_player='".$elem['amc_character']."' AND app_perk=ap_id))","ARRAY"); + + //get all unfinished perks since perks my not directly inherit objectives... + $res = $DBc->sendSQL("SELECT ap_id FROM ach_perk WHERE NOT EXISTS (SELECT * FROM ach_player_perk WHERE app_player='".$elem['amc_character']."' AND app_perk=ap_id)","ARRAY"); + foreach($res as $perk) { + //get unfinished atoms belonging to unfinished objectives + $res = $DBc->sendSQL("SELECT ach_atom.* FROM ach_atom,ach_objective WHERE ao_perk='".$perk['ap_id']."' AND ao_id=atom_objective AND NOT EXISTS (SELECT * FROM ach_player_objective WHERE apo_player='".$elem['amc_character']."' AND apo_objective=ao_id)","ARRAY"); + foreach($res2 as $atom) { + if(!isset($atom_list[$atom['atom_id']])) { // only load if not already cached + $atom_list[$atom['atom_id']] = new Atom($atom); + } + + $atom_list[$atom['atom_id']]->evalRuleset($elem['amc_character']); + } + } + + $_DATA->freeData($elem['amc_character']); + + $DBc->sendSQL("UPDATE ach_monitor_character SET amc_last_import='".time()."', amc_working='0' WHERE amc_character='".$elem['amc_character']."' AND amc_working='".$RID."'","NONE"); + + #STEP 2: detect obj/perk progression + //obj + $res = $DBc->sendSQL("SELECT ao_id FROM ach_objective WHERE ao_condition='all' AND NOT EXISTS (SELECT * FROM ach_atom WHERE atom_objective=ao_id AND NOT EXISTS (SELECT * FROM ach_player_atom WHERE apa_atom=atom_id AND apa_state!='GRANT' AND apa_player='".$elem['amc_character']."'))","ARRAY"); + $sz = sizeof($res); + for($i=0;$i<$sz;$i++) { + $DBc->sendSQL("INSERT INTO ach_player_objective (apo_objective,apo_player,apo_date) VALUES ('".$res[$i]['ao_id']."','".$elem['amc_character']."','".time()."')","NONE"); + } + + $res = $DBc->sendSQL("SELECT ao_id FROM ach_objective WHERE ao_condition='value' AND ao_value<=(SELECT count(*) FROM ach_atom WHERE atom_objective=ao_id AND EXISTS (SELECT * FROM ach_player_atom WHERE apa_atom=atom_id AND apa_state='GRANT' AND apa_player='".$elem['amc_character']."'))","ARRAY"); + $sz = sizeof($res); + for($i=0;$i<$sz;$i++) { + $DBc->sendSQL("INSERT INTO ach_player_objective (apo_objective,apo_player,apo_date) VALUES ('".$res[$i]['ao_id']."','".$elem['amc_character']."','".time()."')","NONE"); + } + + $res = $DBc->sendSQL("SELECT ao_id FROM ach_objective WHERE ao_condition='any' AND EXISTS (SELECT * FROM ach_atom WHERE atom_objective=ao_id AND EXISTS (SELECT * FROM ach_player_atom WHERE apa_atom=atom_id AND apa_state='GRANT' AND apa_player='".$elem['amc_character']."'))","ARRAY"); + $sz = sizeof($res); + for($i=0;$i<$sz;$i++) { + $DBc->sendSQL("INSERT INTO ach_player_objective (apo_objective,apo_player,apo_date) VALUES ('".$res[$i]['ao_id']."','".$elem['amc_character']."','".time()."')","NONE"); + } + + //perk + $res = $DBc->sendSQL("SELECT ap_id FROM ach_perk WHERE ap_condition='all' AND NOT EXISTS (SELECT * FROM ach_objective WHERE ao_perk=ap_id AND NOT EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_state!='GRANT' AND apo_player='".$elem['amc_character']."'))","ARRAY"); + $sz = sizeof($res); + for($i=0;$i<$sz;$i++) { + $DBc->sendSQL("INSERT INTO ach_player_perk (app_objective,app_player,app_date) VALUES ('".$res[$i]['ap_id']."','".$elem['amc_character']."','".time()."')","NONE"); + } + + $res = $DBc->sendSQL("SELECT ap_id FROM ach_perk WHERE ap_condition='value' AND ap_value<=(SELECT count(*) FROM ach_objective WHERE ao_perk=ap_id AND EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_state='GRANT' AND apo_player='".$elem['amc_character']."'))","ARRAY"); + $sz = sizeof($res); + for($i=0;$i<$sz;$i++) { + $DBc->sendSQL("INSERT INTO ach_player_perk (app_objective,app_player,app_date) VALUES ('".$res[$i]['ap_id']."','".$elem['amc_character']."','".time()."')","NONE"); + } + + $res = $DBc->sendSQL("SELECT ap_id FROM ach_perk WHERE ap_condition='any' AND EXISTS (SELECT * FROM ach_objective WHERE ao_perk=ap_id AND EXISTS (SELECT * FROM ach_player_objective WHERE apo_objective=ao_id AND apo_state='GRANT' AND apo_player='".$elem['amc_character']."'))","ARRAY"); + $sz = sizeof($res); + for($i=0;$i<$sz;$i++) { + $DBc->sendSQL("INSERT INTO ach_player_perk (app_objective,app_player,app_date) VALUES ('".$res[$i]['ap_id']."','".$elem['amc_character']."','".time()."')","NONE"); + } + } + } + + if($CONF['sleep_time'] != false) { + sleep($CONF['sleep_time']); + } + + //self call if cron mode is on + if($MODE == "CRON" && $CONF['enable_selfcall'] == true) { + $DBc->sendSQL("UPDATE ach_monitor_state SET ams_end='".time()."' WHERE ams_id='".$RID."'","NONE"); + + $fp = fsockopen($CONF['self_host'], 80, $errno, $errstr, 30); + if(!$fp) { + logf("ERROR: self call; socket: ".$errstr." (."$errno.")"); + } + else { + $out = "GET ".$CONF['self_path']." HTTP/1.1\r\n"; + $out .= "Host: ".$CONF['self_host']."\r\n"; + $out .= "Connection: Close\r\n\r\n"; + + fwrite($fp, $out); + fclose($fp); + } + } + + if($logfile) { + $logfile->write(); + } + + exit(0); +?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/Atom_class.php b/code/web/app/app_achievements/_AchWebParser/class/Atom_class.php index 0d04b8960..700475e45 100644 --- a/code/web/app/app_achievements/_AchWebParser/class/Atom_class.php +++ b/code/web/app/app_achievements/_AchWebParser/class/Atom_class.php @@ -3,66 +3,86 @@ private $ruleset; private $id; private $objective; + private $user; - function Atom(&$data) { + function Atom(&$data,$user) { $this->ruleset = $data['atom_ruleset_parsed']; $this->id = $data['atom_id']; $this->objective = $data['atom_objective']; + + $this->user = $user; } - function evalRuleset($user) { + function register() { global $DBc,$_DATA; + echo "register
"; + try { return eval($this->ruleset); } catch(Exception $e) { - return $e->getMessage() + echo $e->getMessage(); } } - private function grant($user,$condition) { + function registerValue($name,$func) { + global $_DISPATCHER; + + $tmp = new Callback($this,$func); + $_DISPATCHER->registerValue($name,$tmp); + } + + function unregisterValue($name,$callback) { + global $_DISPATCHER; + + $_DISPATCHER->unregisterValue($name,$callback); + } + + function grant() { global $DBc; - $DBc->sendSQL("INSERT INTO ach_player_atom (apa_atom,apa_player,apa_date,apa_expire,apa_state) VALUES ('".$this->id."','".$user."','".date()."','".$DBc->mre($condition)."','GRANT')","NONE"); + echo "G
"; + + $DBc->sendSQL("INSERT INTO ach_player_atom (apa_atom,apa_player,apa_date,apa_expire,apa_state) VALUES ('".$this->id."','".$this->user."','".time()."',null,'GRANT')","NONE"); } - private function deny($user,$condition) { + function deny() { global $DBc; - $DBc->sendSQL("INSERT INTO ach_player_atom (apa_atom,apa_player,apa_date,apa_expire,apa_state) VALUES ('".$this->id."','".$user."','".date()."','".$DBc->mre($condition)."','DENY')","NONE"); + $DBc->sendSQL("INSERT INTO ach_player_atom (apa_atom,apa_player,apa_date,apa_expire,apa_state) VALUES ('".$this->id."','".$this->user."','".time()."',null,'DENY')","NONE"); } - private function reset_($user) { + function reset_() { global $DBc; - $DBc->sendSQL("DELETE FROM ach_player_atom WHERE apa_atom='".$this->id."' AND apa_player='".$user."'","NONE"); + $DBc->sendSQL("DELETE FROM ach_player_atom WHERE apa_atom='".$this->id."' AND apa_player='".$this->user."'","NONE"); } - private function reset_all($user) { + function reset_all() { global $DBc; $res = $DBc->sendSQL("SELECT atom_id FROM ach_atom WHERE atom_objective='".$this->objective."'","ARRAY"); $sz = sizeof($res); for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("DELETE FROM ach_player_atom WHERE apa_atom='".$res[$i]['atom_id']."' AND apa_player='".$user."'","NONE"); + $DBc->sendSQL("DELETE FROM ach_player_atom WHERE apa_atom='".$res[$i]['atom_id']."' AND apa_player='".$this->user."'","NONE"); } } - private function unlock($user) { + function unlock() { global $DBc; - $DBc->sendSQL("DELETE FROM ach_player_atom WHERE apa_atom='".$this->id."' AND apa_player='".$user."' AND apa_state='DENY'","NONE"); + $DBc->sendSQL("DELETE FROM ach_player_atom WHERE apa_atom='".$this->id."' AND apa_player='".$this->user."' AND apa_state='DENY'","NONE"); } - private function unlock_all($user) { + function unlock_all() { global $DBc; $res = $DBc->sendSQL("SELECT atom_id FROM ach_atom WHERE atom_objective='".$this->objective."'","ARRAY"); $sz = sizeof($res); for($i=0;$i<$sz;$i++) { - $DBc->sendSQL("DELETE FROM ach_player_atom WHERE apa_atom='".$res[$i]['atom_id']."' AND apa_player='".$user."' AND apa_state='DENY'","NONE"); + $DBc->sendSQL("DELETE FROM ach_player_atom WHERE apa_atom='".$res[$i]['atom_id']."' AND apa_player='".$this->user."' AND apa_state='DENY'","NONE"); } } diff --git a/code/web/app/app_achievements/_AchWebParser/class/Callback_class.php b/code/web/app/app_achievements/_AchWebParser/class/Callback_class.php new file mode 100644 index 000000000..5d7351f74 --- /dev/null +++ b/code/web/app/app_achievements/_AchWebParser/class/Callback_class.php @@ -0,0 +1,15 @@ +who = $who; + $this->func = $func; + } + + function call($what) { + eval(''.$this->func.'($what,$this->who,$this);'); + } + } +?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/DataDispatcher_class.php b/code/web/app/app_achievements/_AchWebParser/class/DataDispatcher_class.php new file mode 100644 index 000000000..b20239821 --- /dev/null +++ b/code/web/app/app_achievements/_AchWebParser/class/DataDispatcher_class.php @@ -0,0 +1,80 @@ +value = array(); + $this->entity = array(); + $this->event = array(); + } + + function registerValue($name,$callback) { + if(!is_array($this->value[$name])) { + $this->value[$name] = array(); + } + $this->value[$name][] = $callback; + } + + function registerEntity($name,$callback) { + if(!is_array($this->entity[$name])) { + $this->entity[$name] = array(); + } + $this->entity[$name][] = $callback; + } + + function registerEvent($name,$callback) { + if(!is_array($this->event[$name])) { + $this->event[$name] = array(); + } + $this->event[$name][] = $callback; + } + + function unregisterValue($name,$callback) { + $res = array_search($callback,$this->value[$name],true); + if($res !== false) { + unset($this->value[$name][$res]); + } + } + + function unregisterEntity($name,$callback) { + $res = array_search($callback,$this->entity[$name],true); + if($res !== false) { + unset($this->entity[$name][$res]); + } + } + + function unregisterEvent($name,$callback) { + $res = array_search($callback,$this->event[$name],true); + if($res !== false) { + unset($this->event[$name][$res]); + } + } + + function dispatchValue($key,$val) { + echo "dispatching: $key=>$val
"; + if(is_array($this->value[$key])) { + foreach($this->value[$key] as $callback) { + $callback->call($val); + } + } + } + + function dispatchEntity($key,$val) { + if(is_array($this->entity[$key])) { + foreach($this->entity[$key] as $callback) { + $callback->call($val); + } + } + } + + function dispatchEvent($key,$val) { + if(is_array($this->event[$key])) { + foreach($this->event[$key] as $callback) { + $callback->call($val); + } + } + } + } +?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/DataSourceHandler_class.php b/code/web/app/app_achievements/_AchWebParser/class/DataSourceHandler_class.php index 3eab46a95..a36347969 100644 --- a/code/web/app/app_achievements/_AchWebParser/class/DataSourceHandler_class.php +++ b/code/web/app/app_achievements/_AchWebParser/class/DataSourceHandler_class.php @@ -1,71 +1,20 @@ source = array(); - $this->alloc = array(); } - function registerDataSource($src) { - $i = sizeof($this->source); - $this->source[$i] = $src; - foreach($src->getTypes() as $elem) { - //add to list - $this->alloc[$elem] = $i; - } + function addSource($src) { + $this->source[] = $src; } - function freeData($ident) { - foreach($source as $elem) { - $elem->freeData($ident); - } - } - - function getData($ident,$query) { // SELECT ? FROM c_items WHERE q>='300' - $matches = array(); - preg_match("#SELECT (\?|\*) FROM ([^ ]+) WHERE ([.]*)#", $query, $matches); - - $mode = $matches[1]; - $type = $matches[2]; - $cond = $matches[3]; - - $tmp = $this->getDataSource($type); - if($tmp == false) { // no datasource available for this ident - return false; + function drive($cid) { + foreach($this->source as $elem) { + $elem->drive($cid); } - - return $tmp->getData($ident,$type,$mode,$cond); } - function writeData($ident,$query) { // INSERT INTO c_cache () VALUES () - $matches = array(); - preg_match("#INSERT INTO ([^ ]+) \(([^\)]*)\) VALUES \(([^\)]*)\)#", $query, $matches); - - $type = $matches[1]; - $keys = $matches[2]; - $data = $matches[3]; - - $tmp = $this->getDataSource($type); - if($tmp == false) { // no datasource available for this ident - return false; - } - - if(!$tmp->isWriteable()) { // can't write here - return false; - } - - return $tmp->writeData($ident,$type,$keys,$data); - } - - - private function getDataSource(&$ident) { - if(!$this->alloc[$ident]) { - return false; //unknown type - } - - return $this->source[$this->alloc[$ident]]; - } } ?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/SourceDriver_abstract.php b/code/web/app/app_achievements/_AchWebParser/class/SourceDriver_abstract.php new file mode 100644 index 000000000..dca4ad542 --- /dev/null +++ b/code/web/app/app_achievements/_AchWebParser/class/SourceDriver_abstract.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/class/ValueCache_class.php b/code/web/app/app_achievements/_AchWebParser/class/ValueCache_class.php new file mode 100644 index 000000000..424877521 --- /dev/null +++ b/code/web/app/app_achievements/_AchWebParser/class/ValueCache_class.php @@ -0,0 +1,27 @@ +char = false; + } + + function setChar($c) { + $this->char = $c; + } + + function writeData($key,$val) { + global $DBc; + + $DBc->sendSQL("INSERT INTO ach_player_valuecache (apv_name,apv_player,apv_value,apv_date) VALUES ('".$this->user."','".$DBc->mre($key)."','".$DBc->mre($val)."','".time()."') ON DUPLICATE KEY UPDATE apv_value='".$DBc->mre($val)."', apv_date='".time()."'","NONE"); + } + + function getData($key) { + global $DBc; + + $res = $DBc->sendSQL("SELECT apv_value as value, apv_date as date FROM ach_player_valuecache WHERE apv_name='".$DBc->mre($key)."' AND apv_player='".$this->char."'","ARRAY"); + + return $res[0]; + } + } +?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/conf.php b/code/web/app/app_achievements/_AchWebParser/conf.php index 23401b223..5cf0e27ff 100644 --- a/code/web/app/app_achievements/_AchWebParser/conf.php +++ b/code/web/app/app_achievements/_AchWebParser/conf.php @@ -4,19 +4,19 @@ $CONF['logging'] = true; $CONF['logfile'] = "log/AchWebParser.log"; - $CONF['mysql_error'] = ""; + $CONF['mysql_error'] = "PRINT"; $CONF['mysql_server'] = "localhost"; $CONF['mysql_user'] = "root"; $CONF['mysql_pass'] = ""; $CONF['mysql_database'] = "app_achievements"; - $CONF['data_source'] = array(); + $CONF['data_source'] = array("PDRtoXMLdriver"); - $CONF['synch_chars'] = true + /*$CONF['synch_chars'] = true; $CONF['char_mysql_server'] = "localhost"; $CONF['char_mysql_user'] = "root"; $CONF['char_mysql_pass'] = ""; - $CONF['char_mysql_database'] = "ring_open"; + $CONF['char_mysql_database'] = "ring_open";*/ $CONF['fork'] = true; @@ -25,7 +25,7 @@ $CONF['sleep_time'] = 1500; - $CONF['enable_selfcall'] = true + $CONF['enable_selfcall'] = true; $CONF['timeout'] = 60*60; ?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/PDRtoXMLdriver_class.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/PDRtoXMLdriver_class.php new file mode 100644 index 000000000..60241dca2 --- /dev/null +++ b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/PDRtoXMLdriver_class.php @@ -0,0 +1,99 @@ +conf = $_CONF; + + + $this->lock = 0; + + $this->ignore = array(); + $this->ignore[] = "XML"; + $this->ignore[] = "ENTITYBASE"; + $this->ignore[] = "NORMALPOSITIONS"; + $this->ignore[] = "_VEC"; + $this->ignore[] = "SESSIONID"; + $this->ignore[] = "POSSTATE"; + $this->ignore[] = "_PLAYERROOM"; + $this->ignore[] = "_INVENTORYID"; + $this->ignore[] = "_PHYSCHARACS"; + $this->ignore[] = "_PHYSSCORES"; + $this->ignore[] = "_SKILLS"; + $this->ignore[] = "_FAMES"; + + $this->ignore_block = array(); + $this->ignore_block[] = "_MEMORIZEDPHRASES"; + $this->ignore_block[] = "_FORBIDPOWERDATES"; + $this->ignore_block[] = "_INEFFECTIVEAURAS"; + $this->ignore_block[] = "_CONSUMABLEOVERDOSEENDDATES"; + $this->ignore_block[] = "_MODIFIERSINDB"; + $this->ignore_block[] = "_MISSIONS"; + $this->ignore_block[] = "_ITEMSINSHOPSTORE"; + $this->ignore_block[] = "RINGREWARDPOINTS"; + $this->ignore_block[] = "_PACT"; + $this->ignore_block[] = "_KNOWNPHRASES"; + $this->ignore_block[] = "STARTINGCHARACTERISTICVALUES"; + $this->ignore_block[] = "_ENCYCLOCHAR"; + $this->ignore_block[] = "_GAMEEVENT"; + $this->ignore_block[] = "_ENTITYPOSITION"; + } + + function drive($cid) { + global $CONF; + + echo "kk"; + + #$uid = floor($cid/16); + #$slot = ($cid%16); + + #$file = $this->conf['xml_dir']."account_".$uid."_".$slot."_pdr.xml"; + $file = $_REQUEST['file']; + + $xml_parser = xml_parser_create(); + xml_set_object($xml_parser,$this); + xml_set_element_handler($xml_parser, "startElement", "endElement"); + + if(!xml_parse($xml_parser, file_get_contents($file))) { + #error + echo "error"; + } + xml_parser_free($xml_parser); + } + + function startElement($parser, $name, $attrs) { + global $_DISPATCHER; + + if($this->lock == 1) { + return null; + } + + if(in_array($name,$this->ignore)) { + return null; + } + + if(in_array($name,$this->ignore_block)) { + $this->lock = 1; + return null; + } + + if($attrs["VALUE"] != "") { + echo "dispatching"; + $_DISPATCHER->dispatchValue(strtolower($name),$attrs["VALUE"]); + } + } + + function endElement($parser, $name) { + if(in_array($name,$this->ignore_block)) { + $this->lock = 0; + } + } + + + } +?> \ No newline at end of file diff --git a/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/conf.php b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/conf.php new file mode 100644 index 000000000..5bf95e0d4 --- /dev/null +++ b/code/web/app/app_achievements/_AchWebParser/source/PDRtoXMLdriver/conf.php @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/code/web/app/app_achievements/class/AchAchievement_class.php b/code/web/app/app_achievements/class/AchAchievement_class.php index 0902f0c1a..67d0360d9 100644 --- a/code/web/app/app_achievements/class/AchAchievement_class.php +++ b/code/web/app/app_achievements/class/AchAchievement_class.php @@ -1,6 +1,29 @@ dev == 1); + } + + function getDev() { + return $this->dev; + } + + function setInDev($tf) { + if($tf == true) { + $this->setDev(1); + } + else { + $this->setDev(0); + } + + $this->update(); + } + + function setDev($d) { + $this->dev = $d; + } protected $parent_id; protected $category; diff --git a/code/web/app/app_achievements/class/AchCategory_class.php b/code/web/app/app_achievements/class/AchCategory_class.php index dd05b55d4..218b9078c 100644 --- a/code/web/app/app_achievements/class/AchCategory_class.php +++ b/code/web/app/app_achievements/class/AchCategory_class.php @@ -15,9 +15,9 @@ parent::__construct(); - $civ = mysql_real_escape_string($civ); - $cult = mysql_real_escape_string($cult); - $race = mysql_real_escape_string($race); + $civ = $DBc->sqlEscape($civ); + $cult = $DBc->sqlEscape($cult); + $race = $DBc->sqlEscape($race); if($race == null) { $race = $_USER->getRace(); @@ -34,7 +34,7 @@ $this->cult = $cult; $this->civ = $civ; - $this->id = mysql_real_escape_string($id); + $this->id = $DBc->sqlEscape($id); $res = $DBc->sqlQuery("SELECT * FROM ach_achievement LEFT JOIN (ach_achievement_lang) ON (aal_lang='".$_USER->getLang()."' AND aal_achievement=aa_id) WHERE aa_category='".$this->id."' AND (aa_parent IS NULL OR NOT EXISTS (SELECT * FROM ach_perk WHERE ap_achievement=aa_id AND NOT EXISTS (SELECT * FROM ach_player_perk WHERE app_player='".$_USER->getID()."' AND app_perk=ap_id))) AND (aa_tie_race IS NULL OR aa_tie_race LIKE '".$race."') AND (aa_tie_cult IS NULL OR aa_tie_cult LIKE '".$cult."') AND (aa_tie_civ IS NULL OR aa_tie_civ LIKE '".$civ."') ORDER by aal_name ASC"); diff --git a/code/web/app/app_achievements/class/AchList_abstract.php b/code/web/app/app_achievements/class/AchList_abstract.php index eae3c3329..7d9846637 100644 --- a/code/web/app/app_achievements/class/AchList_abstract.php +++ b/code/web/app/app_achievements/class/AchList_abstract.php @@ -34,14 +34,14 @@ return ($this->child_done->getSize() != 0); } - final function addOpen($data) { - $this->child_open->addNode($data); - $this->addChild($data); #Parentum::addChild() + final function addOpen($data,$b = null) { + $this->child_open->addNode($data,$b); + $this->addChild($data,$b); #Parentum::addChild() } - final function addDone($data) { - $this->child_done->addNode($data); - $this->addChild($data); #Parentum::addChild() + final function addDone($data,$b = null) { + $this->child_done->addNode($data,$b); + $this->addChild($data,$b); #Parentum::addChild() } final function setChildDone($id) { diff --git a/code/web/app/app_achievements/class/AchMenuNode_class.php b/code/web/app/app_achievements/class/AchMenuNode_class.php index 2a47afbef..ef232d520 100644 --- a/code/web/app/app_achievements/class/AchMenuNode_class.php +++ b/code/web/app/app_achievements/class/AchMenuNode_class.php @@ -1,6 +1,29 @@ dev == 1); + } + + function getDev() { + return $this->dev; + } + + function setInDev($tf) { + if($tf == true) { + $this->setDev(1); + } + else { + $this->setDev(0); + } + + $this->update(); + } + + function setDev($d) { + $this->dev = $d; + } protected $parent_id; protected $name; diff --git a/code/web/app/app_achievements/class/AchPerk_class.php b/code/web/app/app_achievements/class/AchPerk_class.php index 91d45e5b2..bef5e5d71 100644 --- a/code/web/app/app_achievements/class/AchPerk_class.php +++ b/code/web/app/app_achievements/class/AchPerk_class.php @@ -1,6 +1,29 @@ dev == 1); + } + + function getDev() { + return $this->dev; + } + + function setInDev($tf) { + if($tf == true) { + $this->setDev(1); + } + else { + $this->setDev(0); + } + + $this->update(); + } + + function setDev($d) { + $this->dev = $d; + } protected $achievement; protected $value; @@ -94,12 +117,5 @@ function getParentID() { return $this->parent_id; } - - function setParentID($p) { - if($this->parent_id != null) { - - } - $this->parent_id = $p; - } } ?> \ No newline at end of file diff --git a/code/web/app/app_achievements/class/DLL_class.php b/code/web/app/app_achievements/class/DLL_class.php index c52ccd4d9..38e4be733 100644 --- a/code/web/app/app_achievements/class/DLL_class.php +++ b/code/web/app/app_achievements/class/DLL_class.php @@ -61,6 +61,10 @@ $tmp->setChild($n); } } + else { + $this->addNode($data); + return null; + } } if($this->first == null) { diff --git a/code/web/app/app_achievements/class/Parentum_abstract.php b/code/web/app/app_achievements/class/Parentum_abstract.php index 09cb7b380..db1c53c21 100644 --- a/code/web/app/app_achievements/class/Parentum_abstract.php +++ b/code/web/app/app_achievements/class/Parentum_abstract.php @@ -22,8 +22,8 @@ return $this->nodes->isEmpty(); } - function addChild($data) { - $this->nodes->addNode($data); + function addChild($data,$b = null) { + $this->nodes->addNode($data,$b); } function removeChild($id) { diff --git a/code/web/app/app_achievements/class/RyzomUser_class.php b/code/web/app/app_achievements/class/RyzomUser_class.php index 9383d5aaf..e8dcb02fb 100644 --- a/code/web/app/app_achievements/class/RyzomUser_class.php +++ b/code/web/app/app_achievements/class/RyzomUser_class.php @@ -7,7 +7,7 @@ } function getID() { - return $this->data["id"]; + return $this->data["cid"]; } function getLang() { diff --git a/code/web/app/app_achievements/include/ach_render_ig.php b/code/web/app/app_achievements/include/ach_render_ig.php index 8e639cc3b..dee5e19c9 100644 --- a/code/web/app/app_achievements/include/ach_render_ig.php +++ b/code/web/app/app_achievements/include/ach_render_ig.php @@ -266,7 +266,7 @@ } if($perk->getName() != null) { - $html .= "".$perk->getName()." "; + $html .= "".$perk->getDisplayName()." "; } if($perk->objDrawable()) { $html .= "".ach_render_obj_list($perk->getIterator()).""; @@ -288,7 +288,7 @@ if($perk->inDev()) { continue; } - $html .= "".$perk->getName()." ( ".date('d.m.Y',$perk->getDone())." ) ".$perk->getValue().""; + $html .= "".$perk->getDisplayName()." ( ".date('d.m.Y',$perk->getDone())." ) ".$perk->getValue().""; } return $html; @@ -359,7 +359,7 @@ $html .= " "; } - $html .= $obj->getName().""; + $html .= $obj->getDisplayName().""; return $html; } @@ -379,7 +379,7 @@ return " - +
getMetaImage()."' /> ".$obj->getName()." ".$obj->getDisplayName()."
"; } @@ -393,7 +393,7 @@ else { $col = "#999999"; } - $html .= "".$obj->getName().""; + $html .= "".$obj->getDisplayName().""; } $html .= ach_render_progressbar($obj->getProgress(),$obj->getValue(),250); diff --git a/code/web/app/app_achievements/include/ach_render_web.php b/code/web/app/app_achievements/include/ach_render_web.php index 459bebffd..3058b2890 100644 --- a/code/web/app/app_achievements/include/ach_render_web.php +++ b/code/web/app/app_achievements/include/ach_render_web.php @@ -24,7 +24,7 @@ $open = $menu->getOpenCat(); if($open != 0) { - $cat = new AchCategory($open,'matis',$_REQUEST['cult'],$_REQUEST['civ']); + $cat = new AchCategory($open,null,$_REQUEST['cult'],$_REQUEST['civ']); } else { $cat = new AchSummary($menu,8); @@ -305,7 +305,7 @@ } if($perk->getName() != null) { - $html .= "".$perk->getName().""; + $html .= "".$perk->getDisplayName().""; } if($perk->objDrawable()) { $html .= ach_render_obj_list($perk->getIterator()); @@ -326,7 +326,7 @@ if($perk->inDev()) { continue; } - $html .= "
".$perk->getName()." ( ".date('d.m.Y',$perk->getDone())." ) ".$perk->getValue()."
"; + $html .= "
".$perk->getDisplayName()." ( ".date('d.m.Y',$perk->getDone())." ) ".$perk->getValue()."
"; } return $html; @@ -396,7 +396,7 @@ $html .= " "; } - $html .= $obj->getName().""; + $html .= $obj->getDisplayName().""; return $html; } @@ -416,7 +416,7 @@ return " - +
getMetaImage()."' width='20px' /> ".$obj->getName()." ".$obj->getDisplayName()."
"; } @@ -430,7 +430,7 @@ else { $col = "#999999"; } - $html .= "
".$obj->getName()."
"; + $html .= "
".$obj->getDisplayName()."
"; } $html .= ach_render_progressbar($obj->getProgress(),$obj->getValue(),350); diff --git a/code/web/app/app_achievements/index.php b/code/web/app/app_achievements/index.php index 726b8d047..316b636ae 100644 --- a/code/web/app/app_achievements/index.php +++ b/code/web/app/app_achievements/index.php @@ -13,8 +13,11 @@ require_once('conf.php'); // Ask to authenticate user (using ingame or session method) and fill $user with all information ryzom_app_authenticate($user, false); +#$user['id'] = $user['char_id']; +#$user['name'] = $user['char_name']; + $user = array(); -$user['id'] = 1; +$user['id'] = 16; $user['lang'] = 'en'; $user['name'] = 'Talvela'; $user['race'] = "r_matis"; @@ -35,7 +38,7 @@ else { require_once("include/ach_render_common.php"); require_once("class/DLL_class.php"); -require_once("class/InDev_trait.php"); +#require_once("class/InDev_trait.php"); require_once("class/Node_abstract.php"); require_once("class/AVLTree_class.php"); require_once("class/Parentum_abstract.php"); @@ -55,6 +58,7 @@ require_once("class/AchObjective_class.php"); // Update user acces on Db +#$DBc = ryDB::getInstance(APP_NAME."_test"); $DBc = ryDB::getInstance(APP_NAME); #$DBc = ryDB::getInstance("ahufler"); diff --git a/code/web/app/app_achievements_admin/class/AdmAchievement_class.php b/code/web/app/app_achievements_admin/class/AdmAchievement_class.php index 3092a58b4..bb01aafe1 100644 --- a/code/web/app/app_achievements_admin/class/AdmAchievement_class.php +++ b/code/web/app/app_achievements_admin/class/AdmAchievement_class.php @@ -80,5 +80,15 @@ function setTemplate($t) { $this->template = $t; } + + function orderPerks() { + $iter = $this->getIterator(); + $i = 0; + while($iter->hasNext()) { + $curr = $iter->getNext(); + + $curr->setPorder($i); + } + } } ?> \ No newline at end of file diff --git a/code/web/app/app_achievements_admin/class/AdmAtom_class.php b/code/web/app/app_achievements_admin/class/AdmAtom_class.php index b75dbd6aa..9ede36606 100644 --- a/code/web/app/app_achievements_admin/class/AdmAtom_class.php +++ b/code/web/app/app_achievements_admin/class/AdmAtom_class.php @@ -59,11 +59,72 @@ } private function parse() { + /*VALUE _money AS $money { + CACHE blach AS $test - } + if($money >= 10000 && $test == 0) { + GRANT + FINAL + } + else { + CACHE blach SET $money + } + } + + $res = $this->ruleset; + + #VALUE ([^ ]+) AS ([^ ]+) {# + $match = array(); + preg_match_all("#VALUE ([^ ]+) AS ([^ ]+) {#",$this->ruleset,$match); + foreach($match[0] as $key=>$elem) { + $func = "_".md5(microtime()); + + $tmp = '$this->registerValue("'.$match[1][$key].'","'.$func.'"); + + function '.$func.'('.$match[2][$key].',$_P,$_CB) { + $_IDENT = "'.$match[1][$key].'";'; + + //replace + $res = str_replace($elem,$tmp,$res); + } + + #ENTITY ([^ ]+) AS ([^ ]+) {# + $match = array(); + preg_match_all("#ENTITY ([^ ]+) AS ([^ ]+) {#",$this->ruleset,$match); + foreach($match[0] as $key=>$elem) { + $func = "_".md5(microtime()); + + $tmp = '$this->registerEntity("'.$match[1][$key].'","'.$func.'"); + + function '.$func.'('.$match[2][$key].',$_P,$_CB) { + $_IDENT = "'.$match[1][$key].'";'; + + //replace + $res = str_replace($elem,$tmp,$res); + } + + #EVENT ([^ ]+) AS ([^ ]+) {# + $match = array(); + preg_match_all("#EVENT ([^ ]+) AS ([^ ]+) {#",$this->ruleset,$match); + foreach($match[0] as $key=>$elem) { + $func = "_".md5(microtime()); + + $tmp = '$this->registerEvent("'.$match[1][$key].'","'.$func.'"); + + function '.$func.'('.$match[2][$key].',$_P,$_CB) { + $_IDENT = "'.$match[1][$key].'";'; + + //replace + $res = str_replace($elem,$tmp,$res); + } + + #CACHE ([^ ]+) AS ([^ ]+)# + + #GRANT# - function setInDev($tf) { + #FINAL# + #CACHE ([^ ]+) SET ([^ ]+)#*/ } } ?> \ No newline at end of file diff --git a/code/web/app/app_achievements_admin/class/AdmObjective_class.php b/code/web/app/app_achievements_admin/class/AdmObjective_class.php index e75147fa9..82c301453 100644 --- a/code/web/app/app_achievements_admin/class/AdmObjective_class.php +++ b/code/web/app/app_achievements_admin/class/AdmObjective_class.php @@ -35,7 +35,7 @@ function update() { global $DBc; - $DBc->sqlQuery("UPDATE ach_objective SET ao_condition='".mysql_real_escape_string($this->getCondition())."',ao_value=".mre($this->getValue()).",ao_display='".mysql_real_escape_string($this->getDisplay())."',ao_metalink=".mkn($this->getMetalink())." WHERE ao_id='".$this->getID()."'"); + $DBc->sqlQuery("UPDATE ach_objective SET ao_condition='".mysql_real_escape_string($this->getCondition())."',ao_value=".mkn($this->getValue()).",ao_display='".mysql_real_escape_string($this->getDisplay())."',ao_metalink=".mkn($this->getMetaImage())." WHERE ao_id='".$this->getID()."'"); $DBc->sqlQuery("INSERT INTO ach_objective_lang (aol_objective,aol_lang,aol_name) VALUES ('".$this->getID()."','en','".mysql_real_escape_string($this->getName())."') ON DUPLICATE KEY UPDATE aol_name='".mysql_real_escape_string($this->getName())."'"); } @@ -43,15 +43,35 @@ function insert() { global $DBc; - $DBc->sqlQuery("INSERT INTO ach_objective (ao_perk,ao_condition,ao_value,ao_display,ao_metalink) VALUES ('".$this->getPerk()."','".mysql_real_escape_string($this->getCondition())."',".mre($this->getValue()).",'".mysql_real_escape_string($this->getDisplay())."',".mkn($this->getMetalink()).")"); + $DBc->sqlQuery("INSERT INTO ach_objective (ao_perk,ao_condition,ao_value,ao_display,ao_metalink) VALUES ('".$this->getPerk()."','".mysql_real_escape_string($this->getCondition())."',".mkn($this->getValue()).",'".mysql_real_escape_string($this->getDisplay())."',".mkn($this->getMetaImage()).")"); $id = mysql_insert_id(); $this->setID($id); - $DBc->sqlQuery("INSERT INTO ach_objective_lang (aol_objective,aol_lang,aopl_name) VALUES ('".$this->getID()."','en','".mysql_real_escape_string($this->getName())."')"); + $DBc->sqlQuery("INSERT INTO ach_objective_lang (aol_objective,aol_lang,aol_name) VALUES ('".$this->getID()."','en','".mysql_real_escape_string($this->getName())."')"); } function setCondition($c) { $this->condition = $c; } + + function setDisplay($d) { + $this->display = $d; + } + + function setName($n) { + $this->name = $n; + } + + function setValue($v) { + $this->value = $v; + } + + function setMetalink($m) { + $this->meta_image = $m; + } + + function setPerk($p) { + $this->perk = $p; + } } ?> \ No newline at end of file diff --git a/code/web/app/app_achievements_admin/class/AdmPerk_class.php b/code/web/app/app_achievements_admin/class/AdmPerk_class.php index 21fbc0ca2..73c446e40 100644 --- a/code/web/app/app_achievements_admin/class/AdmPerk_class.php +++ b/code/web/app/app_achievements_admin/class/AdmPerk_class.php @@ -4,12 +4,14 @@ protected $condition; protected $condition_value; + protected $porder; function AdmPerk($data,$parent) { parent::__construct($data,$parent); $this->condition = $data["ap_condition"]; $this->condition_value = $data["ap_condition_value"]; + $this->porder = $data["ap_porder"]; } protected function makeChild($d) { @@ -33,7 +35,7 @@ function update() { global $DBc; - $DBc->sqlQuery("UPDATE ach_perk SET ap_parent=NULL,ap_value='".mysql_real_escape_string($this->getValue())."',ap_condition='".mysql_real_escape_string($this->getCondition())."',ap_condition_value=".mkn($this->getConditionValue()).",ap_dev='".$this->getDev()."' WHERE ap_id='".$this->getID()."'"); + $DBc->sqlQuery("UPDATE ach_perk SET ap_parent=".mkn($this->getParentID()).",ap_value='".mysql_real_escape_string($this->getValue())."',ap_condition='".mysql_real_escape_string($this->getCondition())."',ap_condition_value=".mkn($this->getConditionValue()).",ap_dev='".$this->getDev()."',ap_porder='".$this->porder."' WHERE ap_id='".$this->getID()."'"); $DBc->sqlQuery("INSERT INTO ach_perk_lang (apl_perk,apl_lang,apl_name,apl_template) VALUES ('".$this->getID()."','en','".mysql_real_escape_string($this->getName())."',".mkn($this->getTemplate()).") ON DUPLICATE KEY UPDATE apl_name='".mysql_real_escape_string($this->getName())."',apl_template=".mkn($this->getTemplate()).""); } @@ -43,7 +45,7 @@ $this->dev = 1; - $DBc->sqlQuery("INSERT INTO ach_perk (ap_achievement,ap_parent,ap_value,ap_condition,ap_condition_value,ap_dev) VALUES ('".$this->getAchievement()."',NULL,'".mysql_real_escape_string($this->getValue())."','".mysql_real_escape_string($this->getCondition())."',".mkn($this->getConditionValue()).",'1')"); + $DBc->sqlQuery("INSERT INTO ach_perk (ap_achievement,ap_parent,ap_value,ap_condition,ap_condition_value,ap_dev,ap_porder) VALUES ('".$this->getAchievement()."',".mkn($this->getParentID()).",'".mysql_real_escape_string($this->getValue())."','".mysql_real_escape_string($this->getCondition())."',".mkn($this->getConditionValue()).",'1','".$this->porder."')"); $id = mysql_insert_id(); $this->setID($id); @@ -81,5 +83,39 @@ function setConditionValue($v) { $this->condition_value = $v; } + + function getPorder() { + return $this->porder; + } + + function setPorder($p) { + $this->porder = $p; + } + + function setParentID($p) { #!! CUTTING KILLS NODES! HAVE TO BE REROUTED! + if($p == null || $p == "null") { + //remove from ach list; insert as first! + $this->parent_id = null; + + $this->parent->removeChild($this->id); + $iter = $this->parent->getIterator(); + $this->parent->addOpen($this,$iter->getNext()); + } + else { + //remove from ach list; insert after parent + echo "--".$p."
"; + $this->parent_id = $p; + + $this->parent->removeChild($this->id); + $item = $this->parent->getChildByID($this->parent_id); + $tmp = $item->getChild(); + if($tmp != null) { + $this->parent->addOpen($this,$tmp->getID()); + } + else { + $this->parent->addOpen($this,null); + } + } + } } ?> \ No newline at end of file diff --git a/code/web/app/app_achievements_admin/include/adm_render_ach.php b/code/web/app/app_achievements_admin/include/adm_render_ach.php index 7b9f52d2a..133d3ed56 100644 --- a/code/web/app/app_achievements_admin/include/adm_render_ach.php +++ b/code/web/app/app_achievements_admin/include/adm_render_ach.php @@ -137,8 +137,8 @@ @@ -310,7 +310,7 @@ "; $html .= "