Source code for cslbot.commands.metar

# -*- coding: utf-8 -*-
# Copyright (C) 2013-2015 Samuel Damashek, Peter Foley, James Forcier, Srijay Kasturi, Reed Koser, Christopher Reffett, and Fox Wilson
#
# 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 2
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

from xml.etree import ElementTree

from requests import get

from ..helpers import arguments
from ..helpers.command import Command


@Command(['metar'], ['nick', 'config', 'db', 'name', 'source', 'handler'])
[docs]def cmd(send, msg, args): """Gets the weather. Syntax: {command} <station> [station2...] """ parser = arguments.ArgParser(args['config']) parser.add_argument('stations', nargs='*') try: cmdargs = parser.parse_args(msg) except arguments.ArgumentException as e: send(str(e)) return if not cmdargs.stations: send("What station?") return if isinstance(cmdargs.stations, list): cmdargs.stations = ','.join(cmdargs.stations) req = get('http://aviationweather.gov/adds/dataserver_current/httpparam', params={'datasource': 'metars', 'requestType': 'retrieve', 'format': 'xml', 'mostRecentForEachStation': 'constraint', 'hoursBeforeNow': '1.25', 'stationString': cmdargs.stations}) xml = ElementTree.fromstring(req.text) errors = xml.find('./errors') if len(errors): errstring = ','.join([error.text for error in errors]) send('Error: %s' % errstring) return data = xml.find('./data') if data.attrib['num_results'] == '0': send('No results found.') else: for station in data: send(station.find('raw_text').text)