Mercurial > eagle-eye
annotate pyikriam/ikariam.py @ 232:978a949602e5
Auto-update Scientists numbers for Academy.
Refined the rules for safehouse, the safe house must be same or higher level then Town Hall.
Make people very happy, when the townHall is less then 16.
Build museum first then tavern
THG: changed warfare.pl
author | "Rex Tsai <chihchun@kalug.linux.org.tw>" |
---|---|
date | Thu, 06 Nov 2008 20:31:05 +0800 |
parents | f3502833be7c |
children | 60c4b4b78a01 |
rev | line source |
---|---|
166
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
1 from lazy.www import c |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
2 from lconf import LoadConfigfile |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
3 import cookielib |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
4 import os |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
5 import urllib2 |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
6 import urllib |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
7 from utils import dyna_prog, decorator |
168
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
8 from lxml import etree |
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
9 from StringIO import StringIO |
166
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
10 |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
11 class fake_moz(object): |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
12 __metaclass__ = decorator |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
13 |
225
f3502833be7c
add a gmail to get confirme url address.
kevin@tombear.tombears.com
parents:
220
diff
changeset
|
14 def __init__(self,headers=None): |
218
785c89e5db32
Remove those file, and change the addheader from fake moz
kevin@localhost.localdomain
parents:
175
diff
changeset
|
15 fakeheaders=[('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.8.1.12pre) Gecko/20071220 BonEcho/2.0.0.12pre')] |
785c89e5db32
Remove those file, and change the addheader from fake moz
kevin@localhost.localdomain
parents:
175
diff
changeset
|
16 if headers: |
785c89e5db32
Remove those file, and change the addheader from fake moz
kevin@localhost.localdomain
parents:
175
diff
changeset
|
17 fakeheaders=fakeheaders+headers |
166
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
18 super(fake_moz, self).__init__() |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
19 cookie_jar = cookielib.LWPCookieJar() |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
20 cookie_proc = urllib2.HTTPCookieProcessor(cookie_jar) |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
21 opener = urllib2.build_opener(cookie_proc) |
218
785c89e5db32
Remove those file, and change the addheader from fake moz
kevin@localhost.localdomain
parents:
175
diff
changeset
|
22 opener.addheaders = fakeheaders |
166
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
23 fake_moz.set_backend(self, opener) |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
24 self.cookie_jar = cookie_jar |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
25 pass |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
26 pass |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
27 |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
28 class Ikariam: |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
29 |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
30 cities = {} |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
31 COOKIEFILE = '/tmp/ikariam.lwp' |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
32 |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
33 def __init__(self): |
218
785c89e5db32
Remove those file, and change the addheader from fake moz
kevin@localhost.localdomain
parents:
175
diff
changeset
|
34 self.browser = fake_moz() |
785c89e5db32
Remove those file, and change the addheader from fake moz
kevin@localhost.localdomain
parents:
175
diff
changeset
|
35 self._cookie_jar = self.browser.cookie_jar |
166
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
36 |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
37 if os.path.isfile(self.COOKIEFILE): |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
38 self._cookie_jar.load(self.COOKIEFILE) |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
39 pass |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
40 |
218
785c89e5db32
Remove those file, and change the addheader from fake moz
kevin@localhost.localdomain
parents:
175
diff
changeset
|
41 urllib2.install_opener(self.browser) |
166
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
42 self.confdata=LoadConfigfile().cd |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
43 self.baseurl='http://'+self.confdata['server'] |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
44 |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
45 self.login() |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
46 pass |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
47 |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
48 def login(self): |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
49 print "login to %s...." % self.confdata['server'] |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
50 params = {"universe":self.confdata['server'], \ |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
51 "name":self.confdata['user'], \ |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
52 "password":self.confdata['pass']} |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
53 ret = c(self.baseurl+'/index.php?action=loginAvatar&function=login').get(params).get_content() |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
54 self._cookie_jar.save(self.COOKIEFILE) |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
55 pass |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
56 |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
57 def logout(self): |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
58 print "logut from %s...." % self.confdata['server'] |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
59 c(self.baseurl+'/index.php?action=loginAvatar&function=logout') |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
60 os.remove(self.COOKIEFILE) |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
61 pass |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
62 |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
63 ## |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
64 # \note We can cache data with decorator 'dynamic programming'. |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
65 # |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
66 @dyna_prog |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
67 def city(self, id): |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
68 return IkariamCity(id=id, core=self) |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
69 pass |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
70 |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
71 class IkariamCity: |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
72 data_patterns = { |
175
9f248c8460ce
Simplize xpath patterns.
Thinker K.F. Li <thinker@branda.to>
parents:
168
diff
changeset
|
73 'gold': 'value_gold', |
9f248c8460ce
Simplize xpath patterns.
Thinker K.F. Li <thinker@branda.to>
parents:
168
diff
changeset
|
74 'inhabitants': 'value_inhabitants', |
9f248c8460ce
Simplize xpath patterns.
Thinker K.F. Li <thinker@branda.to>
parents:
168
diff
changeset
|
75 'wood': 'value_wood', |
9f248c8460ce
Simplize xpath patterns.
Thinker K.F. Li <thinker@branda.to>
parents:
168
diff
changeset
|
76 'wine': 'value_wine', |
9f248c8460ce
Simplize xpath patterns.
Thinker K.F. Li <thinker@branda.to>
parents:
168
diff
changeset
|
77 'marble': 'value_marble', |
9f248c8460ce
Simplize xpath patterns.
Thinker K.F. Li <thinker@branda.to>
parents:
168
diff
changeset
|
78 'crystal': 'value_crystal', |
9f248c8460ce
Simplize xpath patterns.
Thinker K.F. Li <thinker@branda.to>
parents:
168
diff
changeset
|
79 'sulfur': 'value_sulfur' |
166
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
80 } |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
81 def __init__(self, id, core ): |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
82 self.core = core |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
83 self.id = id |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
84 self.params = {'view':'city','id':id} |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
85 |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
86 def sync(self): |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
87 page = c(self.core.baseurl).get(self.params).get_content() |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
88 parser = etree.HTMLParser(encoding='utf8') |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
89 page_dom = etree.parse(StringIO(page), parser) |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
90 |
175
9f248c8460ce
Simplize xpath patterns.
Thinker K.F. Li <thinker@branda.to>
parents:
168
diff
changeset
|
91 xpath_globalinfo = '/descendant::*[@id=\'%s\']/text()' |
9f248c8460ce
Simplize xpath patterns.
Thinker K.F. Li <thinker@branda.to>
parents:
168
diff
changeset
|
92 for name, tag_id in self.data_patterns.items(): |
9f248c8460ce
Simplize xpath patterns.
Thinker K.F. Li <thinker@branda.to>
parents:
168
diff
changeset
|
93 xpath = xpath_globalinfo % (tag_id) |
166
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
94 value = page_dom.xpath(xpath)[0] |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
95 setattr(self, name, value) |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
96 pass |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
97 |
175
9f248c8460ce
Simplize xpath patterns.
Thinker K.F. Li <thinker@branda.to>
parents:
168
diff
changeset
|
98 xpath_mainview = '/descendant::div[@id=\'mainview\']/ul/li' |
166
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
99 pos_doms = page_dom.xpath(xpath_mainview) |
168
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
100 positions = [self._mk_position(pos_dom, idx) |
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
101 for idx, pos_dom in enumerate(pos_doms)] |
166
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
102 self.positions = positions |
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
103 pass |
168
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
104 |
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
105 def _mk_position(self, pos_dom, idx): |
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
106 import buildings |
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
107 |
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
108 build_type = pos_dom.get('class').split()[-1].lower() |
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
109 if hasattr(buildings, build_type): |
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
110 clz = getattr(buildings, build_type) |
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
111 if issubclass(clz, buildings.position): |
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
112 building = clz(self.id, idx, self.core.baseurl) |
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
113 return building |
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
114 pass |
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
115 return build_type |
166
f7fd2738b9b4
Move Ikariam out of __init__.py to ikariam.py.
Thinker K.F. Li <thinker@branda.to>
parents:
diff
changeset
|
116 pass |
168
8f699a9da6c0
Extract building level of townhalls.
Thinker K.F. Li <thinker@branda.to>
parents:
166
diff
changeset
|
117 |