]> jfr.im git - irc/rizon/acid.git/blob - pyva/pyva/src/main/python/esim/api/feed.py
Split pyva plugin into pyva.core and pyva.pyva
[irc/rizon/acid.git] / pyva / pyva / src / main / python / esim / api / feed.py
1 import json
2 import socket
3 import urllib2
4 import xpath
5 #import lxml.html
6 from BaseHTTPServer import BaseHTTPRequestHandler
7 from decimal import Decimal
8 from StringIO import StringIO
9 from urlparse import urlparse
10 from xml.dom.minidom import Element
11 from xml.dom.minidom import parse
12
13 class InputError(Exception):
14 def __init__(self, msg):
15 self.msg = msg
16
17 def __str__(self):
18 return str(self.msg)
19
20 class FeedError(Exception):
21 def __init__(self, e):
22 if hasattr(e, 'code'):
23 c = e.code
24
25 if c == 404:
26 self.msg = 'not found.'
27 elif c == 406:
28 self.msg = 'this e-Sim API feed is unavailable.'
29 elif c == 500:
30 self.msg = 'e-Sim server has encountered an unexpected error.'
31 elif c == 502:
32 self.msg = 'invalid response from e-Sim server. Try again later.'
33 elif c == 503:
34 self.msg = 'e-Sim API feed is temporarily unavailable. Try again later.'
35 else:
36 self.msg = 'something went wrong while connecting to e-Sim API feed (%s)' % BaseHTTPRequestHandler.responses[e.code][0]
37
38 self.code = c
39 self.url = e.url
40 elif hasattr(e, 'reason'):
41 r = str(e.reason)
42
43 if r == 'timed out':
44 self.msg = 'connection to e-Sim API feed timed out. Try again later.'
45 else:
46 self.msg = r
47
48 self.code = None
49 self.url = None
50 else:
51 e = unicode(e)
52
53 if e == 'No citizen with such name':
54 self.msg = 'Requested citizen was not found. @c3@bNote:@o names are case sensitive @errsep @bCiTizeN@b is not the same as @bcitizen@b.'
55 elif e == "No JSON object could be decoded":
56 self.msg = 'e-Sim API feed is temporarily unavailable. Try again later.'
57 else:
58 self.msg = e
59
60 self.code = None
61 self.url = None
62
63 def __str__(self):
64 return self.msg
65
66 class HtmlFeed:
67 def __init__(self, value):
68 if value == None:
69 raise InputError('Invalid feed input.')
70
71 if isinstance(value, str) or isinstance(value, unicode):
72 try:
73 opener = urllib2.build_opener()
74 opener.addheaders = [('User-Agent', 'Rizon e-Sim bot - www.rizon.net')]
75 feed = opener.open(value.replace(' ', '%20'), timeout=20)
76 self._html = feed.read()
77 feed.close()
78 except urllib2.URLError, e:
79 raise FeedError(e)
80 else:
81 raise InputError('Invalid feed input type.')
82
83 def html(self):
84 return self._html
85
86 def get_json(value):
87 if value == None:
88 raise InputError('Invalid feed input.')
89
90 if isinstance(value, basestring):
91 feed = HtmlFeed(value)
92 try:
93 return json.load(StringIO(feed.html()))
94 except ValueError, r:
95 raise FeedError(r)
96 else:
97 raise InputError('Invalid feed input type.')