view pyikriam/buildings.py @ 176:3ba3edda6d1e

Extract more information for building townhall.
author Thinker K.F. Li <thinker@branda.to>
date Sun, 02 Nov 2008 11:32:59 +0800
parents 9f248c8460ce
children 6adad3bcca78
line wrap: on
line source

from lazy.www import c
from lxml import etree
from StringIO import StringIO

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
    pass

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

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

        xpath_building = '/html/body/descendant::*[@class=\'%s\']/text()'
        for name, clzname in self.class_patterns.items():
            path = xpath_building % (clzname)
            value = page_dom.xpath(path)[0]
            setattr(self, name, value)
            pass

        xpath_value = '/html/body/descendant::*[starts-with(@class,\'%s\')]/descendant::*[@class=\'value\']/text()'
        for name, clzname in self.value_patterns.items():
            path = xpath_value % (clzname)
            value = page_dom.xpath(path)[0]
            setattr(self, name, value)
            pass

        xpath_count = '/html/body/descendant::*[starts-with(@class,\'%s\')]/descendant::*[@class=\'count\']/text()'
        for name, clzname in self.count_patterns.items():
            path = xpath_count % (clzname)
            value = page_dom.xpath(path)[0]
            setattr(self, name, value)
            pass

        xpath_appear = '/html/body/descendant::*[starts-with(@class,\'%s\')]'
        for name, clzname in self.appear_patterns.items():
            path = xpath_appear % (clzname)
            cnt = len(page_dom.xpath(path))
            if cnt != 0:
                setattr(self, name, True)
            else:
                setattr(self, name, False)
                pass
            pass

        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
        pass

    def sync(self):
        page = self.get_page()
        self._sync(page)
        pass

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