예제 #1
0
 function buildResourceItem($blocks, $tCoor)
 {
     $PLANETS = $this->PLANETS;
     if (!isset($PLANETS)) {
         echo "No Planet list! return false.\n";
         return false;
     }
     $page = $blocks[0];
     for ($i = 0; $i < sizeof($PLANETS); $i++) {
         if (GlobalFunc::isCoordinateMatch($PLANETS[$i]->coord, $tCoor)) {
             echo "ResourceManager: Planet[" . $tCoor[0] . ":" . $tCoor[1] . ":" . $tCoor[2] . "](" . $tCoor[3] . ") isFound.\n";
             //取得切換到該星球的 url
             $pos = strpos($PLANETS[$i]->href, "cp=");
             $cpText = substr($PLANETS[$i]->href, $pos);
             if ($page == "R") {
                 //資源
                 $resourceUrl = $this->Config['RESOURCE_URL'] . "&" . $cpText;
             } else {
                 if ($page == "S") {
                     //設施
                     $resourceUrl = $this->Config['STATION_URL'] . "&" . $cpText;
                 } else {
                     if ($page == "T") {
                         //科技
                         $resourceUrl = $this->Config['TECH_URL'] . "&" . $cpText;
                     } else {
                         echo "ResourceManager.buildResourceItem(): error, invalid page value: (" . $page . ") found. return 1 to skip.\n";
                         return 1;
                     }
                 }
             }
             //切換星球 順便取得resources page
             $this->resourceUrl = $resourceUrl;
             $resources_page = GlobalFunc::synExecute("Change focused planet and get resources page", function () {
                 echo "resourceUrl: " . $this->resourceUrl;
                 return GlobalFunc::changeFocusPlanet($this->resourceUrl);
             });
             if (strlen($resources_page) < $this->Config['AskPageLeastStrLen']) {
                 echo "ResourceManager: resources_page len " . strlen($resources_page) . " too few, return 0.\n";
                 return 0;
                 //發送的請求可能失敗了
             }
             $resources_dom = GlobalFunc::loadHtml($resources_page);
             //找金屬礦
             //$resource_item_name = "button1";
             //$but1 = $resources_dom->getElementById( $resource_item_name );
             if ($page == "R" || $page == "S") {
                 $item_id = $blocks[1];
                 $but1 = $this->getResourceStationBtn($resources_dom, $item_id);
             } else {
                 if ($page == "T") {
                     $item_id = $blocks[1];
                     $item_num = $blocks[2] - 1;
                     $but1 = $this->getTechnologyBtn($resources_dom, $item_id, $item_num);
                 } else {
                     echo "Page is not R, S or T, invalid. return 1 to skip this request.";
                     return 1;
                 }
             }
             //發送 蓋資源 的請求
             return $this->sendBuildRequest($but1, $item_id);
         }
     }
     //找不到該星球
     return -1;
 }
예제 #2
0
 private function getfleetDetails($inhalt_dom, $oring_pos, $target_pos)
 {
     $divs = $inhalt_dom->getElementsByTagName("div");
     $len = $divs->length;
     //取得所有的fleet div(每一筆飛行事件)
     $fleet_divs = array();
     $f_idx = 0;
     for ($i = 0; $i < $len; $i++) {
         $attrs = $divs->item($i)->attributes;
         if ($attrs != null) {
             $id = $attrs->getNamedItem('id');
         }
         if ($id != null) {
             $id = $id->nodeValue;
             if (substr($id, 0, 5) == "fleet") {
                 //echo "---------------------------Div found---------------------------";
                 $fleet_divs[$f_idx] = $divs->item($i);
                 $f_idx++;
             }
         }
         //var_dump($attrs);
     }
     $fleet_div_length = $f_idx;
     //從飛行事件比對 取得相同origin星球且相同target星球的fleet div
     for ($fd_i = $fleet_div_length - 1; $fd_i >= 0; $fd_i--) {
         //從後面開始找, 逃出的船都設10%速度 正常來說都在後排
         $f_div = $fleet_divs[$fd_i];
         //比對每筆飛行事件
         $spans = $f_div->getElementsByTagName("span");
         $span_num = $spans->length;
         //找出每筆fleet div下的span 取得需要的資訊
         $this_origin = null;
         //class="originData"
         $this_target = null;
         //class="destinationData"
         $this_origin_str;
         $this_target_str;
         //紀錄星球的種類
         $origin_type = 0;
         $dest_type = 0;
         $this_id = null;
         //ref="1026133" 取ref != null
         $this_arrive_time = $f_div->attributes->getNamedItem("data-arrival-time")->nodeValue;
         //div 的 data-arrival-time="1407182351"
         for ($i = 0; $i < $span_num; $i++) {
             $span = $spans->item($i);
             //prevent null class
             if ($span->attributes->getNamedItem("class")) {
                 $s_class = $span->attributes->getNamedItem("class")->nodeValue;
             }
             if ($s_class == "originData") {
                 //起始座標的parent span
                 $child_spans = $span->getElementsByTagName("span");
                 $child_num = $child_spans->length;
                 for ($j = 0; $j < $child_num; $j++) {
                     $child_span = $child_spans->item($j);
                     //prevent null class
                     if ($child_span->attributes->getNamedItem("class")) {
                         $s_class = $child_span->attributes->getNamedItem("class")->nodeValue;
                     }
                     if ($s_class == "originCoords tooltip") {
                         $this_origin_str = $child_span->getElementsByTagName("a")->item(0)->textContent;
                         $this_origin = GlobalFunc::getCoordArrayByStr($this_origin_str);
                     }
                     if ($s_class == "originPlanet") {
                         $origin_type = GlobalFunc::getTargetTypeByTdDom($child_span);
                     }
                 }
             } else {
                 if ($s_class == "destinationData") {
                     //目標座標的parent span
                     $child_spans = $span->getElementsByTagName("span");
                     $child_num = $child_spans->length;
                     for ($j = 0; $j < $child_num; $j++) {
                         $child_span = $child_spans->item($j);
                         //prevent null class
                         if ($child_span->attributes->getNamedItem("class")) {
                             $s_class = $child_span->attributes->getNamedItem("class")->nodeValue;
                         }
                         if ($s_class == "destinationCoords tooltip") {
                             $this_target_str = $child_span->getElementsByTagName("a")->item(0)->textContent;
                             $this_target = GlobalFunc::getCoordArrayByStr($this_target_str);
                         }
                         $pos = strpos($s_class, "destinationPlanet");
                         //注意 必須用 === 或 !== 運算元
                         //因為false = 0(boolean)
                         //第一個字吻合 = 0(int) 位置為0
                         //要用全等號===來判斷是否連型態都吻合
                         if ($pos !== false) {
                             //有找到
                             //找到後下面可能有很多span, 其中沒有class value的才是正確的
                             $in_sp_array = $child_span->getElementsByTagName("span");
                             $in_sp_len = $in_sp_array->length;
                             for ($inner_idx = 0; $inner_idx < $in_sp_len; $inner_idx++) {
                                 $in_sp = $in_sp_array->item($inner_idx);
                                 $in_class = $in_sp->attributes->getNamedItem("class");
                                 if (!is_object($in_class)) {
                                     $dest_type = GlobalFunc::getTargetTypeByTdDom($in_sp);
                                 }
                             }
                         }
                     }
                 } else {
                     if ($span->attributes->getNamedItem("ref") != null) {
                         $this_id = $span->attributes->getNamedItem("ref")->nodeValue;
                     }
                 }
             }
         }
         //更新星球的type
         $this_origin[3] = $origin_type;
         $this_target[3] = $dest_type;
         //var_dump($this_target);
         /*echo "This: ";
           var_dump($this_target);
           var_dump($this_origin);
           echo "Compare with: ";
           var_dump($oring_pos);
           var_dump($target_pos);*/
         //目前只比對起始及目的座標 ; 若怕有重複 可考慮比較其他資訊
         if (GlobalFunc::isCoordinateMatch($this_origin, $oring_pos) && GlobalFunc::isCoordinateMatch($this_target, $target_pos)) {
             echo "\n====================== Get Fleet Info After Send ========================\n";
             echo "Found ID: " . $this_id . "\n";
             echo "Found similar fleet info Origin:" . $this_origin_str . " | Target: " . $this_target_str . "\n";
             echo "Right info: Origin[" . $oring_pos[0] . ":" . $oring_pos[1] . ":" . $oring_pos[2] . "]({$oring_pos['3']}) | ";
             echo "Target: [" . $target_pos[0] . ":" . $target_pos[1] . ":" . $target_pos[2] . "]({$target_pos['3']})\n";
             echo "\n===============================================================+=========\n";
             //$f_info["arrivetime"] = $this_arrive_time - $this->Config['timeDiff'] ;
             $f_info["id"] = $this_id;
             //echo "My fleet info in get detail: ";
             //var_dump($f_info);
             return $f_info;
             break;
         }
         //echo "============". $this_origin ."============";
         //echo "============". $this_target ."============";
         //echo "============". $this_id ."============";
     }
 }
예제 #3
0
 function detectAttack()
 {
     /******************************************/
     // 基本上 此物件裡面使用到的資訊
     // 都會從檔案中讀取 並不會產生http request
     // 不需要做synchronization
     /******************************************/
     $PLANET = $this->PLANET;
     //echo "\n";
     echo "AttackDetector: [" . $PLANET[0] . ":" . $PLANET[1] . ":" . $PLANET[2] . "](" . $PLANET[3] . ") ";
     echo "Start detecting attacks.\n";
     $final_arrive_time = "0";
     if ($this->hasAttack()) {
         //Attacked; get event list
         $eList = file_get_contents($this->Config['ADEventList'], true);
         //echo "event list result strlen: ". strlen($eList)."\n";
         if (strlen($eList) < $this->Config['AskPageLeastStrLen']) {
             $LoginManager = new LoginManager();
             $eList = GlobalFunc::getEventList();
         }
         $event_list_dom = GlobalFunc::loadHtml("<?xml encoding='UTF-8'>" . $eList);
         //每個tr都是一筆傳對往返的event
         $items = $event_list_dom->getElementsByTagName('tr');
         if (!is_object($items)) {
             echo "Error occur, <tr> tags are not found in event list, return 0.\n";
             return 0;
         }
         $items_num = $items->length;
         //items of fleets action report are sorted by arriving time from closest to farest
         //逐項檢查event list(items)裡面的每筆event(item)
         for ($i = 0; $i < $items_num; $i++) {
             //船隊的抵達時間
             $arrive_time = 0;
             //取得event(item)下的所有td
             $item = $items->item($i);
             $tds = $item->getElementsByTagName('td');
             $tds_num = $tds->length;
             //取得船隊的到達時間
             echo "Prepare to check arrival time.\n";
             for ($tdIdx = 0; $tdIdx < $tds_num; $tdIdx++) {
                 $tmp_td_item = $tds->item($tdIdx);
                 $tmp_class_value = $tmp_td_item->attributes->getNamedItem('class')->nodeValue;
                 if ($tmp_class_value == "arrivalTime") {
                     $arrive_time_str = $tmp_td_item->textContent;
                     //trim chinese code after the time string
                     $arrive_time = GlobalFunc::trimArrivalTime($arrive_time_str);
                     break;
                 }
             }
             if ($arrive_time != "") {
                 //data-arrival-time不為空值
                 //剩下多少時間會到達
                 $left_arrive_time = GlobalFunc::timeFromNowInSecond($arrive_time, true);
                 echo "AttackDetector: Arrive_time " . $arrive_time . ".\n";
                 echo "AttackDetector: Reaction time " . $this->ReactionTime . " seconds.\n";
                 echo "AttackDetector: An Attack arrive after " . $left_arrive_time . " seconds.\n";
                 if ($left_arrive_time > $this->ReactionTime) {
                     echo "AttackDetector: Attack over reaction time, do nothing. \n";
                     //(因為第一個偵測到的攻擊一定是最早到的攻擊)
                     //所以第一個都還沒到就可以直接結束偵測了
                     //到達時間超過反應時間 不需理會
                     break;
                 }
             } else {
                 echo "AttackDetector: No arrive time , it's not an attack.\n";
                 //沒有抵達時間 該event應該不是攻擊
                 break;
             }
             //紀錄event狀態的flag
             $isTDAttackEvent = false;
             $isGroupAttackEvent = false;
             //是聯合攻擊
             $isTDEventOver = true;
             $dest_coord = array(0, 0, 0);
             $dest_type = 0;
             $total_fleets_count = 10000;
             $eventFleetStr = "";
             //查看該event的所有<td>並取得重要內容
             for ($j = 0; $j < $tds_num; $j++) {
                 $td_dom = $tds->item($j);
                 $td_class_value = $td_dom->attributes->getNamedItem('class')->nodeValue;
                 if ($td_class_value == "missionFleet") {
                     //確認該事件是否為攻擊事件
                     //被攻擊的會有這個圖示 以圖片網址來判定
                     //<td class="missionFleet">
                     //<img src="http://gf1.geo.gfsrv.net/cdn9a/cd360bccfc35b10966323c56ca8aac.gif" class="tooltipHTML" title="">
                     //</td>
                     $img = $td_dom->getElementsByTagName('img')->item(0);
                     $icon_source = $img->attributes->getNamedItem('src')->nodeValue;
                     if ($icon_source == "http://gf1.geo.gfsrv.net/cdn9a/cd360bccfc35b10966323c56ca8aac.gif") {
                         $isTDAttackEvent = true;
                     } else {
                         if ($icon_source == "http://gf2.geo.gfsrv.net/cdnad/87d615c4fb395b75ec902b66b7757e.gif") {
                             $isTDAttackEvent = true;
                             $isGroupAttackEvent = true;
                             echo "AttackDetector: This is a group attack event. Withdraw fleets whatever.\n";
                         } else {
                             echo "AttackDetector: This is not an known attack event. ";
                             echo "Check if is attack event. Icon Source = " . $icon_source . "\n";
                         }
                     }
                 } else {
                     if ($td_class_value == "detailsFleet") {
                         $span_dom = $td_dom->getElementsByTagName('span')->item(0);
                         $total_fleets_count = $span_dom->textContent;
                         //一定要拿掉三位撇 否則會錯
                         //"6,643" <= 20 = true (錯誤結果)
                         //"6643"  <= 20 = false
                         echo "total_fleets_count before trim: " . $total_fleets_count . "\n";
                         $total_fleets_count = GlobalFunc::strToIntByTakeCommaOff($total_fleets_count);
                         echo "total_fleets_count after trim: " . $total_fleets_count . "\n";
                         /*if($total_fleets_count <= $this->Config['ThreatenCount']){
                         			echo "\n================= Ignore Attack ==================\n";
                         			echo "\nFleets count Total(".$total_fleets_count.") <= Threshold(".$this->Config['ThreatenCount']."), no big deal. Ignore the attack.\n";
                         			echo "AttackDetector: Attack arrive after ". $left_arrive_time . " seconds.\n";
                         			echo "\n==================================================\n";
                         			break;
                         		}else{
                         			echo "AttackDetector: This attack is dangerous, hide fleets.\n";
                         		}*/
                     } else {
                         if ($td_class_value == "icon_movement") {
                             //確認該船隊是否為前往狀態
                             //icon_movement存在表示艦隊正在前往
                             $isTDEventOver = false;
                             //取得eventFleetStr
                             $eventFleetStr = EscapeFilter::getEventFleetStr($td_dom);
                         } else {
                             if ($td_class_value == "destFleet") {
                                 //找出被攻擊的星球type
                                 $dest_type = GlobalFunc::getTargetTypeByTdDom($td_dom);
                                 if ($dest_type != $PLANET[3]) {
                                     //打的不是本Planet(type不一樣)
                                     $isTDAttackEvent = false;
                                 }
                             } else {
                                 if ($td_class_value == "destCoords") {
                                     //取得目的地星球座標
                                     //<td class="destCoords">
                                     //<a href="http://s113-tw.ogame.gameforge.com/game/index.php?page=galaxy&amp;galaxy=1&amp;system=79" target="_top">
                                     //[1:79:10]
                                     //</a>
                                     //</td>
                                     $a_dom = $td_dom->getElementsByTagName('a')->item(0);
                                     $dest_coord_string = trim($a_dom->textContent);
                                     $dest_coord_string = substr($dest_coord_string, 1, strlen($dest_coord_string) - 2);
                                     // trim notation '[]'
                                     $dest_coord = explode(":", $dest_coord_string);
                                     //echo "dest_coord_string = ".$dest_coord_string;
                                     //var_dump($dest_coord);
                                     //echo PHP_EOL;
                                 }
                             }
                         }
                     }
                 }
             }
             //取得目標的type
             $dest_coord[3] = $dest_type;
             if ($isTDAttackEvent && !$isTDEventOver) {
                 //確定該星球正在被攻擊 且 攻擊船隊是前往的狀態
                 if (GlobalFunc::isCoordinateMatch($dest_coord, $PLANET)) {
                     //判斷威脅性 若此event沒有威脅性 則coninue
                     $p_coord_text = GlobalFunc::getCoordTextWithType($PLANET);
                     //是聯合攻擊的話 不管怎樣直接逃
                     if ($isGroupAttackEvent == false) {
                         $isThreaten = EscapeFilter::escapeIfThreatenFilter($total_fleets_count, $eventFleetStr, EscapeFilter::getEscapeList(), $p_coord_text);
                         if ($isThreaten != true) {
                             //不具威脅性
                             echo "================================= Ignore Attack =================================\n";
                             echo iconv("UTF-8", "big5//IGNORE", "\n此攻擊(arrive_time:{$arrive_time})(目標:{$p_coord_text}) 不具威脅性 忽略.\n");
                             echo "\n================================= Ignore Attack =================================\n";
                             continue;
                         }
                     }
                     //宣告該星球是被攻擊的星球
                     echo "AttackDetector: [{$dest_coord['0']}:{$dest_coord['1']}:{$dest_coord['2']}]({$dest_coord['3']}):\n";
                     echo "final_arrive_time: ";
                     var_dump($final_arrive_time);
                     if (strcmp($final_arrive_time, "0") == 0) {
                         $final_arrive_time = $arrive_time;
                         echo "Attack arrive time is updated, after," . $left_arrive_time . " s.\n";
                     } else {
                         //之前已經有一個攻擊被偵測到了了
                         //之前被偵測到的攻擊 還剩幾秒鐘會到?
                         $latest_attack_left_arr_time = GlobalFunc::timeFromNowInSecond($final_arrive_time, true);
                         //這次攻擊抵達的時間 一定要 比之前檢查到的晚到(因為對方伺服器給的資料有照時間順序排序)
                         //所以如果 attack_interval < 0 表示有error
                         $attack_interval = $left_arrive_time - $latest_attack_left_arr_time;
                         if ($attack_interval < 0) {
                             echo "\n!!!!!!!!!!!!! error !!!!!!!!!!!!!!\n";
                             echo "attack_interval = " . $attack_interval . "\n";
                             echo "There must be some error happened.\n";
                             echo "\n!!!!!!!!!!!!! error !!!!!!!!!!!!!!\n";
                         }
                         //確認attack interval是否太近 會造成危險
                         //若太接近則視為同一起攻擊事件,
                         //		取最晚到的攻擊做為final_arrive_time
                         //但	取最早到的攻擊做為判斷船隻是否需要撤離的條件
                         //(只要 $final_arrive_time 不為0, 船隻就會被送走)
                         echo "{$attack_interval}: " . $attack_interval . " CAttackPvtInterval: " . $this->Config['CAttackPvtInterval'] . "\n";
                         if ($attack_interval < $this->Config['CAttackPvtInterval']) {
                             $final_arrive_time = $arrive_time;
                             echo "Second Attack is detected, arrive time is updated, after " . $left_arrive_time . " sec.\n";
                         } else {
                             echo "Second Attack is detected, it's too far from the preceding ones.\n";
                         }
                     }
                 }
             }
         }
     } else {
         echo "AttackDetector: [" . $PLANET[0] . ":" . $PLANET[1] . ":" . $PLANET[2] . "](" . $PLANET[3] . ") ";
         echo " No Attack Detected.\n";
     }
     echo "AttackDetector: [" . $PLANET[0] . ":" . $PLANET[1] . ":" . $PLANET[2] . "](" . $PLANET[3] . ") ";
     echo "Detecting finished.\n";
     return $final_arrive_time;
 }