]>
jfr.im git - irc/rizon/acid.git/blob - pyva/src/main/python/erepublik/api/feed.py
5 from BaseHTTPServer
import BaseHTTPRequestHandler
6 from decimal
import Decimal
7 from StringIO
import StringIO
8 from urlparse
import urlparse
9 from xml
. dom
. minidom
import Element
10 from xml
. dom
. minidom
import parse
12 class InputError ( Exception ):
13 def __init__ ( self
, msg
):
19 class FeedError ( Exception ):
20 def __init__ ( self
, e
):
21 if hasattr ( e
, 'code' ):
25 self
. msg
= 'not found.'
27 self
. msg
= 'this eRepublik API feed is unavailable.'
29 self
. msg
= 'eRepublik server has encountered an unexpected error.'
31 self
. msg
= 'invalid response from eRepublik server. Try again later.'
33 self
. msg
= 'eRepublik API feed is temporarily unavailable. Try again later.'
35 self
. msg
= 'something went wrong while connecting to eRepublik API feed ( %s )' % BaseHTTPRequestHandler
. responses
[ e
. code
][ 0 ]
39 elif hasattr ( e
, 'reason' ):
43 self
. msg
= 'connection to eRepublik API feed timed out. Try again later.'
52 if e
== 'an error occured' :
53 self
. msg
= 'this command cannot work because eRepublik admins disabled the API. If you want to complain, send a ticket: http://www.erepublik.com/en/tickets'
64 def __init__ ( self
, value
):
66 raise InputError ( 'Invalid feed input.' )
68 if isinstance ( value
, str ) or isinstance ( value
, unicode ):
70 opener
= urllib2
. build_opener ()
71 opener
. addheaders
= [( 'User-Agent' , 'Rizon eRepublik bot - www.rizon.net' )]
72 feed
= opener
. open ( value
. replace ( ' ' , '%20' ), timeout
= 20 )
73 self
._ html
= feed
. read ()
75 except urllib2
. URLError
, e
:
78 raise InputError ( 'Invalid feed input type.' )
85 raise InputError ( 'Invalid feed input.' )
87 if isinstance ( value
, basestring
):
88 feed
= HtmlFeed ( value
)
89 return json
. load ( StringIO ( feed
. html ()))
91 raise InputError ( 'Invalid feed input type.' )
94 def __init__ ( self
, value
, namespaces
= None ):
96 raise InputError ( 'Invalid feed input.' )
98 self
. namespaces
= {} if namespaces
== None else namespaces
100 if isinstance ( value
, basestring
):
101 feed
= HtmlFeed ( value
)
102 self
._ element
= parse ( StringIO ( feed
. html ()))
103 elif isinstance ( value
, Element
):
104 self
._ element
= value
106 raise InputError ( 'Invalid feed input type.' )
108 error
= xpath
. findvalue ( '/error/message' , self
._ element
)
111 raise FeedError ( error
)
113 def elements ( self
, query
):
114 return [ XmlFeed ( x
, self
. namespaces
) for x
in xpath
. find ( query
, self
._ element
, namespaces
= self
. namespaces
)]
116 def text ( self
, query
, default
= None ):
117 result
= xpath
. findvalue ( query
, self
._ element
, namespaces
= self
. namespaces
)
122 value
= result
. strip ()
124 if isinstance ( value
, unicode ):
126 value
= value
. encode ( 'latin-1' ). decode ( 'utf-8' )
132 def int ( self
, query
, default
= None ):
133 result
= self
. text ( query
, None )
143 def decimal ( self
, query
, default
= None ):
144 result
= self
. text ( query
, None )
150 return Decimal ( result
)
154 def bool ( self
, query
, default
= None ):
155 result
= self
. text ( query
, None )
160 if 'true' in result
. lower () or result
== '1' :
162 elif 'false' in result
. lower () or result
== '0' :
166 return int ( result
) > 0