Added ability to query for weather

Uses meteomedia.de and a list of stations and their IDs to reply a fancy picture url with weather information.
This commit is contained in:
JuliusFreudenberger 2020-05-12 22:29:44 +02:00
parent bb1a7ce99a
commit db06e812ee
2 changed files with 1067 additions and 4 deletions

34
bot.py
View file

@ -1,6 +1,7 @@
import logging
import requests
import re
import requests
from telegram import InlineQueryResultArticle, InputTextMessageContent, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, InlineQueryHandler, CallbackQueryHandler
@ -28,7 +29,7 @@ class Query:
argument_names = re.findall(r' to | in | times ', request_tmp)
arguments = re.split(r' to | in | times ', request_tmp)
if not arguments[0].isdigit():
reply = search_station(arguments[0])
reply = search_vvs_station(arguments[0])
if len(reply) == 1:
self.station_id = reply[0]['stationId']
else:
@ -77,7 +78,7 @@ def handle_multiple_stations_reply(update, context):
del sent_multiple_station_message_ids[update.effective_chat['id']]
def search_station(query):
def search_vvs_station(query):
request = requests.get("https://efa-api.asw.io/api/v1/station/?search=" + query)
if request.status_code != 200:
raise ServerCommunicationError
@ -121,7 +122,7 @@ def get_vvs_departures(query):
reply.append("Next departures for station: " + request.json()[0]['stopName'])
printed_departures = 0
for station in request.json():
if station['direction'].casefold().find(query.destination.casefold()) != -1 :
if station['direction'].casefold().find(query.destination.casefold()) != -1:
if query.line == '' or (query.line != -1 and station['number'] == query.line):
reply.append(
"Line " + station['number'] + " to \"" + station['direction'] + "\" at "
@ -154,6 +155,30 @@ def get_station_id_list(name):
return request.json()
def search_weather_station(query: str):
station_file = open('stations', 'r')
for line in station_file:
if line.casefold().find(query.casefold()) != -1:
station_file.close()
return line
return 'none'
def handle_weather(update, context):
if len(context.args) == 0:
update.message.reply_text('Please provide a name!')
return
station_line = search_vvs_station(' '.join(context.args))
if station_line == 'none':
update.message.reply_text('No weather station matching this name found!')
return
separator_index = station_line.find(' ')
update.message.reply_text('Weather for ' + station_line[separator_index+1:-1]
+ ':\nhttp://wetterstationen.meteomedia.de/messnetz/vorhersagegrafik/' +
station_line[:separator_index] + '.png',
disable_notification=True)
def error_callback(update, context):
try:
raise context.error
@ -172,6 +197,7 @@ def __main__():
inline_station_search_handler = InlineQueryHandler(inline_station_search)
dispatcher.add_handler(inline_station_search_handler)
dispatcher.add_handler(CommandHandler('vvs', handle_vvs))
dispatcher.add_handler(CommandHandler('weather', handle_weather))
dispatcher.add_error_handler(error_callback)

1037
stations Normal file

File diff suppressed because it is too large Load diff