view pyikriam/buildings.py @ 369:fb3cfa5533ac

merged
author "Rex Tsai <chihchun@kalug.linux.org.tw>"
date Thu, 05 Mar 2009 17:36:03 +0800
parents 60c4b4b78a01
children
line wrap: on
line source

from lazy.www import c, Resource
from lxml import etree
from StringIO import StringIO
from sync_utils import sync_tagclass, sync_tagvalue
from sync_utils import sync_tagcount, sync_tagclass_start_appear
from sync_utils import ikariam_zh_timeval

class position(object):
    def __init__(self, build_type, city_id, idx, baseurl):
        self._baseurl = baseurl + '/index.php'
        self.build_type = build_type
        self.city_id = city_id
        self.idx = idx
        self._params = {'view': 'buildingGround',
                        'id': city_id,
                        'position': idx}
        pass

    def get_page(self):
        page = c(self._baseurl).get(self._params).get_content()
        return page

    def sync(self):
        page = self.get_page()
        parser = etree.HTMLParser(encoding='utf8')
        page_dom = etree.parse(StringIO(page), parser)

        self._sync(page_dom)
        pass
    pass

## \brief Base class of all building class.
#
# This class extract information from page of building.  That are
# information all buildings have.
#
class building(position):
    class_patterns = {
        'level': 'buildingLevel'
        }
    appear_patterns = {
        'is_upgrading': 'isUpgrading'
        }
    upgrade_res_patterns = {
        'wood': 'wood',
        'marble': 'marble',
        'crystal': 'glass'
        }

    def _sync(self, page_dom):
        sync_tagclass(self, building.class_patterns, page_dom)

        sync_tagclass_start_appear(self, building.appear_patterns, page_dom)

        xpath_upgrade = '/descendant::ul[@class=\'actions\']/li[@class=\'upgrade\']/a'
        anodes = page_dom.xpath(xpath_upgrade)
        if len(anodes) == 1:
            anode = anodes[0]
            self._upgrade_uri = anode.get('href')
        else:
            self._upgrade_uri = None
            pass

        self.upgrade_wood = 0
        self.upgrade_marble = 0
        self.upgrade_crystal = 0
        self.upgrade_time = 0
        self.upgrade_countdown = 0

        if self.is_upgrading:
            xpath_countdown = '/descendant::div[@id=\'upgradeCountDown\']/text()'
            value = page_dom.xpath(xpath_countdown)[0]
            self.upgrade_countdown = ikariam_zh_timeval(value)
        else:
            xpath_res = '/descendant::div[@class=\'content\']/ul[@class=\'resources\']/li[starts-with(@class, \'%s\')]/text()'

            for resname, clzname in building.upgrade_res_patterns.items():
                xpath = xpath_res % (clzname)
                txts = page_dom.xpath(xpath)
                if len(txts) == 1:
                    value = txts[0].strip()
                    setattr(self, 'upgrade_' + resname, int(value))
                    pass
                pass

            xpath_time = xpath_res % ('time')
            txts = page_dom.xpath(xpath_time)
            if len(txts) == 1:
                value = txts[0].strip()
                self.upgrade_time = ikariam_zh_timeval(value)
                pass
            pass
        pass

    def upgrade(self):
        url = self._baseurl + self._upgrade_uri
        page = c(url).get().get_content()
        pass
    pass

class townhall(building):
    class_patterns = {
        'occupied': 'value occupied',
        'rooms': 'value total',
        }
    value_patterns = {
        'growth': 'growth',
        'happiness': 'happiness',
        'interest_base': 'base',
        'interest_research': 'research1',
        'interest_capital': 'capital',
        'overpopulation': 'cat overpopulation'
        }
    count_patterns = {
        'pop_citizens': 'citizens',
        'pop_woodworkers': 'woodworkers',
        'pop_specialworkers': 'specialworkers',
        'pop_scientists': 'scientists'
        }
    
    def __init__(self, city_id, idx, baseurl):
        super(townhall, self).__init__('townhall', city_id, idx, baseurl)
        pass

    def _sync(self, page_dom):
        sync_tagclass(self, townhall.class_patterns, page_dom)

        sync_tagvalue(self, townhall.value_patterns, page_dom)

        sync_tagcount(self, townhall.count_patterns, page_dom)

        super(townhall, self)._sync(page_dom)
        pass
    pass

class academy(building):
    def __init__(self, city_id, idx, baseurl):
        super(academy, self).__init__('academy', city_id, idx, baseurl)
        pass

    def _sync(self, page_dom):
        xpath_research_name = '/descendant::*[@class=\'researchName\']/a'
        anodes = page_dom.xpath(xpath_research_name)
        if len(anodes) == 1:
            anode = anodes[0]
            self.researching = anode.get('title')
            xpath_countdown = '/descendant::div[@id=\'researchCountDown\']/text()'
            txtnodes = page_dom.xpath(xpath_countdown)
            self.researching_countdown = ikariam_zh_timeval(txtnodes[0])
        else:
            self.researching = None
            self.researching_countdown = None
            pass

        super(academy, self)._sync(page_dom)
        pass
    pass

class warehouse(building):
    def __init__(self, city_id, idx, baseurl):
        super(warehouse, self).__init__('warehouse', city_id, idx, baseurl)
        pass
    pass

class barracks(building):
    def __init__(self, city_id, idx, baseurl):
        super(barracks, self).__init__('barracks', city_id, idx, baseurl)
        pass
    pass

class branchoffice(building):
    def __init__(self, city_id, idx, baseurl):
        super(branchoffice, self).__init__('branchoffice', city_id, idx, baseurl)
        pass
    pass

class port(building):
    def __init__(self, city_id, idx, baseurl):
        super(port, self).__init__('port', city_id, idx, baseurl)
        pass
    pass

class wall(building):
    def __init__(self, city_id, idx, baseurl):
        super(wall, self).__init__('wall', city_id, idx, baseurl)
        pass
    pass

class shipyard(building):
    def __init__(self, city_id, idx, baseurl):
        super(shipyard, self).__init__('shipyard', city_id, idx, baseurl)
        pass
    pass

class safehouse(building):
    def __init__(self, city_id, idx, baseurl):
        super(shipyard, self).__init__('safehouse', city_id, idx, baseurl)
        self.data_patterns = {
                              'vacancy_spys_total':"/::input[@id='spyCount']/@value",
                              'trained_spys_total':"/descendant::div[@id='mainview']/div[4]/div[1]/p/span/span[2]/text()"}
    pass

    def __sync__(self, page_dom):        
        workflow = create_workflow('find', page_dom)
        attrs = workflow.findall(self.data_patterns).get_content()
        for attr_name, attr_value in attrs:
            setattr(self, attr_name, attr_value)
        pass
    pass

    def _mk_spy(self):
        import spys

class empty_pos(position):
    res_patterns = {
        'wood': 'wood',
        'marble': 'marble',
        'crystal': 'glass'
        }

    def _sync(self, page_dom):
        self.building_info = None
        self.res_wood = 0
        self.res_marble = 0
        self.res_crystal = 0
        self.building_time = 0
        self._building_uri = None

        xpath_building = '/descendant::div[@class=\'buildinginfo\']/h4/text()'
        buildings = page_dom.xpath(xpath_building)
        if len(buildings) == 1:
            self.building_info = buildings[0]
            pass

        xpath_costs = '/descendant::div[@class=\'costs\']/ul/li[@class=\'%s\']/text()'
        for res, ptn in empty_pos.res_patterns.items():
            xpath = xpath_costs % (ptn)
            txts = page_dom.xpath(xpath)
            if len(txts) == 1:
                value = int(txts[0])
                setattr(self, 'res_' + res, value)
                pass
            pass

        xpath = xpath_costs % ('time')
        txts = page_dom.xpath(xpath)
        if len(txts) == 1:
            value = ikariam_zh_timeval(txts[0])
            self.building_time = value
            pass

        xpath_button = '/descendant::a[@class=\'button build\']'
        anodes = page_dom.xpath(xpath_button)
        if len(anodes) == 1:
            self._building_uri = anodes[0].get('href')
            pass
        pass

    def build(self):
        url = self._baseurl + self._building_uri
        page = c(url).get().get_content()
        pass
    pass

class land(empty_pos):
    def __init__(self, city_id, idx, baseurl):
        super(land, self).__init__('land', city_id, idx, baseurl)
        pass
    pass

class shore(empty_pos):
    def __init__(self, city_id, idx, baseurl):
        super(shore, self).__init__('shore', city_id, idx, baseurl)
        pass
    pass