瀏覽代碼

Improve war info

JoostSijm 4 年之前
父節點
當前提交
a91de04627
共有 2 個文件被更改,包括 52 次插入4 次删除
  1. 30 2
      src/rival_regions_wrapper/api_wrapper/war.py
  2. 22 2
      tests/test_rival_regions_wrapper.py

+ 30 - 2
src/rival_regions_wrapper/api_wrapper/war.py

@@ -2,6 +2,7 @@
 
 import re
 from datetime import datetime, timedelta
+import unicodedata
 
 from bs4 import BeautifulSoup
 
@@ -35,8 +36,6 @@ class War():
         soup = BeautifulSoup(response, 'html.parser')
         war_info = {
             'damage': int(soup.select_one('.war_w_target_o').text.replace('.', '')),
-            'attack_damage': int(soup.select_one('.war_w_target_a').text.replace('.', '')),
-            'defence_damage': int(soup.select_one('.war_w_target_d').text.replace('.', '')),
             'attack_hourly_available': bool(soup.select_one('.hide_once_war')),
         }
         heading = soup.find('h1')
@@ -69,4 +68,33 @@ class War():
         war_info['war_units'] = {}
         for war_unit in soup.select('.war_w_unit_div'):
             war_info['war_units'][war_unit['url']] = war_unit.text
+
+        attack_side = soup.select('#war_w_ata_s .hov2')
+        if len(attack_side) >= 3:
+            war_info['attack'] = {
+                'state_id': int(attack_side[0]['action'].replace('map/state_details/', '')),
+                'state_name': unicodedata.normalize("NFKD", attack_side[0].text),
+                'region_id': int(attack_side[1]['action'].replace('map/details/', '')),
+                'region_name': unicodedata.normalize("NFKD", attack_side[1].text),
+                'damage': int(soup.select_one('.war_w_target_a').text.replace('.', '')),
+            }
+        else:
+            war_info['attack'] = {
+                'damage': int(soup.select_one('.war_w_target_a').text.replace('.', '')),
+            }
+
+        defend_side = soup.select('#war_w_def_s .hov2')
+        if len(defend_side) >= 3:
+            war_info['defend'] = {
+                'state_id': int(defend_side[0]['action'].replace('map/state_details/', '')),
+                'state_name': unicodedata.normalize("NFKD", defend_side[0].text),
+                'region_id': int(defend_side[1]['action'].replace('map/details/', '')),
+                'region_name': unicodedata.normalize("NFKD", defend_side[1].text),
+                'damage': int(soup.select_one('.war_w_target_d').text.replace('.', '')),
+            }
+        else:
+            war_info['defend'] = {
+                'damage': int(soup.select_one('.war_w_target_d').text.replace('.', '')),
+            }
+
         return war_info

+ 22 - 2
tests/test_rival_regions_wrapper.py

@@ -177,8 +177,8 @@ def test_war_info(api_wrapper):
 
     assert isinstance(response, dict), "The response should be a dict"
     assert isinstance(response['damage'], int), "Damage should be an int"
-    assert isinstance(response['attack_damage'], int), "Attack damage should be an int"
-    assert isinstance(response['defence_damage'], int), "Defence damage should be an int"
+    # assert isinstance(response['attack_damage'], int), "Attack damage should be an int"
+    # assert isinstance(response['defence_damage'], int), "Defence damage should be an int"
     assert isinstance(response['attack_hourly_available'], bool), "Attack hourly should be a bool"
     assert isinstance(response['energ_drinks'], int), "Energy drinks should be an int"
     assert isinstance(response['name'], str), "Name should be a str"
@@ -190,6 +190,26 @@ def test_war_info(api_wrapper):
     assert isinstance(response['war_units'], dict), "war units should be a dict"
 
 @pytest.mark.vcr()
+def test_war_info_regions(api_wrapper):
+    """Test war info"""
+    war_id = 329461
+    response = War(api_wrapper).info(war_id)
+    print(response)
+
+    assert isinstance(response, dict), "The response should be a dict"
+    assert isinstance(response['damage'], int), "Damage should be an int"
+    # assert isinstance(response['attack_damage'], int), "Attack damage should be an int"
+    # assert isinstance(response['defence_damage'], int), "Defence damage should be an int"
+    assert isinstance(response['attack_hourly_available'], bool), "Attack hourly should be a bool"
+    assert isinstance(response['energ_drinks'], int), "Energy drinks should be an int"
+    assert isinstance(response['name'], str), "Name should be a str"
+    assert isinstance(response['max_hero_name'], str), "max hero name should be a str"
+    assert isinstance(response['max_hero_damage'], int), "max hero damage should be an int"
+    if 'time_left' in response:
+        assert isinstance(response['time_left'], timedelta), "time left should be a time delta"
+    assert isinstance(response['finish_date'], datetime), "Finish date should be a date"
+    assert isinstance(response['war_units'], dict), "war units should be a dict"
+@pytest.mark.vcr()
 def test_work_info(api_wrapper):
     """Test work info"""
     response = Work(api_wrapper).page()