1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
#!/usr/bin/python
# -*- coding: utf-8 -*-
# --------------------------------------------------------------------------- #
# #
# Plugin for iSida Jabber Bot #
# Copyright (C) diSabler <dsy@dsy.name> #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program. If not, see <http://www.gnu.org/licenses/>. #
# #
# --------------------------------------------------------------------------- #
def gweather_raw(type, jid, nick, text, fully):
def get_date(body):
tmp = get_tag_item(body,'FORECAST','day')+'.'+get_tag_item(body,'FORECAST','month')
ytmp = get_tag_item(body,'FORECAST','year')
if str(tuple(time.localtime())[0]) == ytmp: return tmp
return tmp+'.'+ytmp
def get_maxmin(body,tag,splitter):
tmax = get_tag_item(body,tag,'max')
tmin = get_tag_item(body,tag,'min')
if not fully: return str(int((int(tmax)+int(tmin))/2))
if tmax == tmin: return tmax
if (int(tmin)+int(tmax))/2 == 0: return '0'
return tmin + splitter + tmax
def get_themp(body): return get_maxmin(body,'TEMPERATURE','..')
def get_wind(body): return get_maxmin(body,'WIND','-')
def get_pressure(body): return get_maxmin(body,'PRESSURE','-')
def get_relwet(body): return get_maxmin(body,'RELWET','-')
tods = {'0':L('Night','%s/%s'%(jid,nick)),'1':L('Morning','%s/%s'%(jid,nick)),'2':L('Day','%s/%s'%(jid,nick)),'3':L('Evening','%s/%s'%(jid,nick))}
precipitation = {'4':L('rain','%s/%s'%(jid,nick)),'5':L('downpour','%s/%s'%(jid,nick)),'6':L('snow','%s/%s'%(jid,nick)),'7':L('snow','%s/%s'%(jid,nick)),
'8':L('storm','%s/%s'%(jid,nick)),'9':L('no data','%s/%s'%(jid,nick)),'10':L('no precipitation','%s/%s'%(jid,nick))}
cloudiness = {'0':L('clear','%s/%s'%(jid,nick)),'1':L('cloudy','%s/%s'%(jid,nick)),'2':L('Cloudy','%s/%s'%(jid,nick)),'3':L('overcast','%s/%s'%(jid,nick))}
winddir = {'0':L('N','%s/%s'%(jid,nick)),'1':L('NE','%s/%s'%(jid,nick)),'2':L('E','%s/%s'%(jid,nick)),'3':L('SE','%s/%s'%(jid,nick)),
'4':L('S','%s/%s'%(jid,nick)),'5':L('SW','%s/%s'%(jid,nick)),'6':L('W','%s/%s'%(jid,nick)),'7':L('NW','%s/%s'%(jid,nick))}
if len(text.strip()):
text = text.lower()
wzc = cur_execute_fetchall('select * from gis where code ilike %s or lcity ilike %s',(text,text))
if not wzc:
ttext = '%%%s%%' % text
wzc = cur_execute_fetchall('select * from gis where code ilike %s or lcity ilike %s',(ttext,ttext))
if not wzc and text.isdigit() and 4 <= len(text) <= 5: wzc = [(text,'','')]
if wzc:
if len(wzc) == 1:
text = wzc[0][0]
link = 'http://informer.gismeteo.ru/xml/%s.xml' % text
try: body, noerr = html_encode(load_page(link)), True
except Exception, SM:
try: body = str(SM)
except: body = unicode(SM)
noerr = None
if not body or body == '<?xml version="1.0" encoding="UTF-8"?>\n</xml>': body,noerr = L('Unexpected error','%s/%s'%(jid,nick)), None
if noerr:
if wzc[0][1]: ct = wzc[0][1]
else:
try: res = re.findall('<TOWN index=".*?" sname="(.*?)"',body)
except: res = ''
if res: ct = urllib2.unquote(res[0]).encode('cp1252').decode('cp1251')
else: ct = L('Unknown','%s/%s'%(jid,nick))
body = body.split('<FORE')[1:]
msg = L('Weather in %s:\nDate\t t%s\tWind\tClouds','%s/%s'%(jid,nick)) % (ct,u'°')
if fully: msg += L('\tPressure, mm. Hg. Art.\tHumidity %','%s/%s'%(jid,nick))
for tmp in body:
tmp2 = '<FORE' + tmp
msg += '\n' + tods[get_tag_item(tmp2,'FORECAST','tod')] + ' ' + get_date(tmp2) # дата + время суток
msg += '\t' + get_themp(tmp2) # температура
gwi = get_wind(tmp2) # ветер
if gwi == '0': msg += L('\tCalm','%s/%s'%(jid,nick))
else: msg += '\t' + gwi+' '+winddir[get_tag_item(tmp2,'WIND','direction')]
msg += '\t' + cloudiness[get_tag_item(tmp2,'PHENOMENA','cloudiness')] # облачность
msg += ', ' + precipitation[get_tag_item(tmp2,'PHENOMENA','precipitation')] # осадки
if fully: msg += '\t' + get_pressure(tmp2) + '\t' + get_relwet(tmp2) # давление, влажность
else: msg = L('Error! %s','%s/%s'%(jid,nick)) % body
else:
msg = L('Found:','%s/%s'%(jid,nick))
for tmp in wzc: msg += '\n'+tmp[0]+' - '+tmp[1]
else: msg = L('Not found.','%s/%s'%(jid,nick))
else: msg = L('What?','%s/%s'%(jid,nick))
send_msg(type, jid, nick, msg)
def gweather(type, jid, nick, text): gweather_raw(type, jid, nick, text, None)
def gweatherplus(type, jid, nick, text): gweather_raw(type, jid, nick, text, True)
global execute
execute = [(3, 'gis', gweather, 2, 'Weather forecast (short). Courtesy Gismeteo.Ru | http://www.gismeteo.ru'),
(3, 'gis+', gweatherplus, 2, 'Weather forecast (full). Courtesy Gismeteo.Ru | http://www.gismeteo.ru')]
|