Browse Source

Add overview and war module

JoostSijm 4 years ago
parent
commit
ebd5533424

+ 1 - 1
rival_regions_wrapper/__init__.py

@@ -8,4 +8,4 @@ of some Rival Regions functionalities.
 
 from .authentication_handler import AuthenticationHandler
 from .middleware import LocalAuthentication, RemoteAuthentication
-from .api_wrapper import Profile, Storage, Market, ResourceState, Perks, Craft
+from .api_wrapper import Profile, Storage, Market, ResourceState, Perks, Craft, Overview, War

+ 2 - 0
rival_regions_wrapper/api_wrapper/__init__.py

@@ -35,3 +35,5 @@ from .market import Market
 from .resource_state import ResourceState
 from .perks import Perks
 from .craft import Craft
+from .overview import Overview
+from .war import War

+ 34 - 4
rival_regions_wrapper/api_wrapper/craft.py

@@ -11,7 +11,7 @@ class Craft(object):
     """Wrapper class for crafting"""
 
     @staticmethod
-    def info(resource):
+    def info(item):
         """Get profile"""
         keys = {
             'oil': 3,
@@ -34,9 +34,9 @@ class Craft(object):
             'moon_tanks': 22,
             'space_stations': 23
         }
-        if isinstance(resource, str) and resource in keys:
-            resource = keys[resource]
-        path = 'storage/produce/{}'.format(resource)
+        if isinstance(item, str) and item in keys:
+            item = keys[item]
+        path = 'storage/produce/{}'.format(item)
         response = MIDDLEWARE.get(path)
         soup = BeautifulSoup(response, 'html.parser')
         resources = soup.select_one('.storage_produce_exp')
@@ -60,3 +60,33 @@ class Craft(object):
             'resources': resource_cost
         }
         return craft
+
+    @staticmethod
+    def produce(item, amount):
+        """Craft item"""
+        keys = {
+            'oil': 3,
+            'ore': 4,
+            'uranium': 11,
+            'diamonds': 15,
+            'liquid_oxygen': 21,
+            'helium-3': 24,
+            'rivalium': 26,
+            'antirad': 13,
+            'energy_drink': 17,
+            'spacerockets': 20,
+            'lss': 25,
+            'tanks': 2,
+            'aircrafts': 1,
+            'missiles': 14,
+            'bombers': 16,
+            'battleships': 18,
+            'laser_drones': 27,
+            'moon_tanks': 22,
+            'space_stations': 23
+        }
+        if isinstance(item, str) and item in keys:
+            item = keys[item]
+        MIDDLEWARE.post('storage/newproduce/{}/{}'.format(item, amount))
+        return True
+        

+ 62 - 0
rival_regions_wrapper/api_wrapper/overview.py

@@ -0,0 +1,62 @@
+"""Profile class"""
+
+import re
+
+from bs4 import BeautifulSoup
+from dateutil import parser
+
+from . import MIDDLEWARE
+
+
+class Overview(object):
+    """Wrapper class for perks"""
+
+    @staticmethod
+    def info():
+        """Get perks"""
+        path = 'main/content'
+        response = MIDDLEWARE.get(path)
+        soup = BeautifulSoup(response, 'html.parser')
+        date_string = re.sub(r'^.*:\s', '', soup.select_one('.perk_source_4 .small').text)
+        current_perk = soup.select_one('.perk_source_4:has(.small)')
+        if current_perk.has_attr('perk'):
+            upgrade_perk = int(current_perk['perk'])
+        else:
+            upgrade_perk = None
+
+        auto_war = soup.select_one('.war_index_war span.pointer:nth-child(4)')
+        if auto_war.has_attr('action'):
+            auto_war = soup.select_one('.war_index_war span.pointer:nth-child(4)')['action']
+        else:
+            auto_war = None
+        overview = {
+            'perks': {
+                'strenght': int(soup.find('div', {'perk': 1, 'class': 'perk_source_2'}).text),
+                'education': int(soup.find('div', {'perk': 2, 'class': 'perk_source_2'}).text),
+                'endurance': int(soup.find('div', {'perk': 3, 'class': 'perk_source_2'}).text),
+                'upgrade_date': parser.parse(date_string),
+                'upgrade_perk': upgrade_perk
+            },
+            'war': {
+                'auto_war': auto_war.replace('war/details/', ''),
+            }
+        }
+        return overview
+
+    @staticmethod
+    def status():
+        """Get current status"""
+        path = 'main'
+        response = MIDDLEWARE.get(path)
+        soup = BeautifulSoup(response, 'html.parser')
+        profile_url = soup.select_one('#header_my_avatar')['action']
+        party_url = soup.select_one('#party_menu_members')['action']
+        stats = {
+            'profile_id': int(profile_url.replace('slide/profile/', '')),
+            'party_id': int(party_url.replace('listed/party/', '')),
+            'gold': int(soup.select_one('#g').text.replace('.', '')),
+            'money': int(soup.select_one('#m').text.replace('.', '')),
+            'level': int(soup.select_one('#exp_level').text),
+            'exp': int(soup.select_one('#exp_points').text),
+        }
+        return stats

+ 29 - 0
rival_regions_wrapper/api_wrapper/war.py

@@ -0,0 +1,29 @@
+"""Profile class"""
+
+import re
+
+from bs4 import BeautifulSoup
+
+from . import MIDDLEWARE
+
+
+class War(object):
+    """Wrapper class for profile"""
+
+    @staticmethod
+    def page():
+        """Get training war"""
+        path = 'war'
+        response = MIDDLEWARE.get(path)
+        soup = BeautifulSoup(response, 'html.parser')
+        pattern = re.compile(r'war\/details\/\d+')
+        script = soup.find('script', text=pattern)
+        war_url = pattern.search(str(script))
+        if war_url:
+            training_war = int(war_url.group(0).replace('war/details/', ''))
+        else:
+            training_war = None
+        page = {
+            'training_war': training_war
+        }
+        return page

+ 11 - 0
rival_regions_wrapper/middleware.py

@@ -66,3 +66,14 @@ class RemoteAuthentication(MiddlewareBase):
 
     def post(self, path, data=None):
         """Send post request"""
+        try:
+            response = requests.post(
+                '{}{}'.format(self.api_url, path), headers=self.headers
+            )
+            return response.text
+        except requests.exceptions.Timeout:
+            print('timeout')
+        except requests.exceptions.RequestException as exception:
+            print('request exception')
+            raise SystemExit(exception)
+        return None

+ 41 - 11
tests/test_rival_regions_wrapper.py

@@ -4,7 +4,8 @@ from datetime import datetime
 
 import pytest
 
-from rival_regions_wrapper.api_wrapper import Profile, Storage, Market, ResourceState, Perks, Craft
+from rival_regions_wrapper.api_wrapper import Profile, Storage, Market, ResourceState, Perks, \
+    Craft, Overview, War
 
 
 @pytest.fixture
@@ -117,15 +118,44 @@ def craft_keys():
     return ['market_price', 'resources']
 
 @pytest.mark.vcr()
-def test_craft_info(craft_keys):
-    """Test an API call to get craft info"""
-    item = 'bombers'
-    response = Craft.info(item)
+def test_craft_produce():
+    """Test an API call to produce new item"""
+    item = 'energy_drink'
+    Craft.produce(item, 10)
+
+    assert True
+
+@pytest.fixture
+def overview_info_keys():
+    """Standard keys for overview info"""
+    return ['perks', 'war']
+
+@pytest.mark.vcr()
+def test_overview_info(overview_info_keys):
+    """Test an API call for overview"""
+    response = Overview.info()
+
+    assert isinstance(response, dict), "The response hould be a dict"
+    assert set(overview_info_keys).issubset(response.keys()), "All keys should be in the response"
+    assert isinstance(response['war'], dict), "The war key should be a dict"
+
+@pytest.fixture
+def overview_status_keys():
+    """Standard kenys for overview status"""
+    return ['profile_id', 'party_id', 'gold', 'money', 'level', 'exp']
+
+@pytest.mark.vcr()
+def test_overview_status(overview_status_keys):
+    """Test an API cal for status"""
+    response = Overview.status()
+
+    assert isinstance(response, dict), "The response hould be a dict"
+    assert set(overview_status_keys).issubset(response.keys()), "All keys should be in the response"
+
+@pytest.mark.vcr()
+def test_war_page():
+    """Test getting training war"""
+    response = War.page()
 
     assert isinstance(response, dict), "The response should be a dict"
-    assert isinstance(response['market_price'], int), "The market_price should be an int"
-    assert isinstance(response['resources'], dict), "The resources should be a dict"
-    assert isinstance(response['resources']['cash'], int), "The cash should be an int"
-    assert isinstance(response['resources']['oil'], int), "The oil should be an int"
-    assert isinstance(response['resources']['ore'], int), "The ore should be an int"
-    assert isinstance(response['resources']['diamond'], int), "The diamond should be an int"
+    assert isinstance(response['training_war'], int), "The training_war should be an int"