- Weather unterstützt jetzt Inline-Query!
ACHTUNG: Falls noch Daten im Cache hängen (unter telegram:cache:weather in Redis, aber NUR die Koordinaten, nicht die Städtenamen!), diese bitte LÖSCHEN, da jetzt Hashes benutzt werden, um mehr Daten zu cachen (für den Inline-Mode), anstatt simple Keys - Fixe Caching für Hashes (am besten ohne TTL verwenden, TODO: fixen)
This commit is contained in:
parent
cf3dea9f79
commit
575ec300b8
@ -17,6 +17,10 @@ function weather:init(config)
|
|||||||
"^/w$",
|
"^/w$",
|
||||||
"^/w (.*)$"
|
"^/w (.*)$"
|
||||||
}
|
}
|
||||||
|
weather.inline_triggers = {
|
||||||
|
"^w (.+)$",
|
||||||
|
"^w$"
|
||||||
|
}
|
||||||
weather.doc = [[*
|
weather.doc = [[*
|
||||||
]]..config.cmd_pat..[[wetter*: Wetter für deinen Wohnort _(/location set [Ort])_
|
]]..config.cmd_pat..[[wetter*: Wetter für deinen Wohnort _(/location set [Ort])_
|
||||||
*]]..config.cmd_pat..[[wetter* _<Ort>_: Wetter für diesen Ort
|
*]]..config.cmd_pat..[[wetter* _<Ort>_: Wetter für diesen Ort
|
||||||
@ -42,10 +46,43 @@ function get_city_name(lat, lng)
|
|||||||
return city
|
return city
|
||||||
end
|
end
|
||||||
|
|
||||||
function weather:get_weather(lat, lng)
|
function weather:get_city_coordinates(city, config)
|
||||||
|
local lat = redis:hget('telegram:cache:weather:'..string.lower(city), 'lat')
|
||||||
|
local lng = redis:hget('telegram:cache:weather:'..string.lower(city), 'lng')
|
||||||
|
if not lat and not lng then
|
||||||
|
print('Koordinaten nicht eingespeichert, frage Google...')
|
||||||
|
coords = utilities.get_coords(city, config)
|
||||||
|
lat = coords.lat
|
||||||
|
lng = coords.lon
|
||||||
|
end
|
||||||
|
|
||||||
|
if not lat and not lng then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
redis:hset('telegram:cache:weather:'..string.lower(city), 'lat', lat)
|
||||||
|
redis:hset('telegram:cache:weather:'..string.lower(city), 'lng', lng)
|
||||||
|
return lat, lng
|
||||||
|
end
|
||||||
|
|
||||||
|
function weather:get_weather(lat, lng, is_inline)
|
||||||
print('Finde Wetter in '..lat..', '..lng)
|
print('Finde Wetter in '..lat..', '..lng)
|
||||||
local text = redis:get('telegram:cache:weather:'..lat..','..lng)
|
local hash = 'telegram:cache:weather:'..lat..','..lng
|
||||||
if text then print('...aus dem Cache') return text end
|
|
||||||
|
local text = redis:hget(hash, 'text')
|
||||||
|
if text then
|
||||||
|
print('...aus dem Cache')
|
||||||
|
if is_inline then
|
||||||
|
local ttl = redis:ttl(hash)
|
||||||
|
local city = redis:hget(hash, 'city')
|
||||||
|
local temperature = redis:hget(hash, 'temperature')
|
||||||
|
local weather_icon = redis:hget(hash, 'weather_icon')
|
||||||
|
local condition = redis:hget(hash, 'condition')
|
||||||
|
return city, condition..' bei '..temperature..' °C', weather_icon, text, ttl
|
||||||
|
else
|
||||||
|
return text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local url = BASE_URL..'/'..apikey..'/'..lat..','..lng..'?lang=de&units=si&exclude=minutely,hourly,daily,alerts,flags'
|
local url = BASE_URL..'/'..apikey..'/'..lat..','..lng..'?lang=de&units=si&exclude=minutely,hourly,daily,alerts,flags'
|
||||||
|
|
||||||
@ -58,7 +95,7 @@ function weather:get_weather(lat, lng)
|
|||||||
local ok, response_code, response_headers, response_status_line = https.request(request_constructor)
|
local ok, response_code, response_headers, response_status_line = https.request(request_constructor)
|
||||||
if not ok then return nil end
|
if not ok then return nil end
|
||||||
local data = json.decode(table.concat(response_body))
|
local data = json.decode(table.concat(response_body))
|
||||||
local ttl = string.sub(response_headers["cache-control"], 9)
|
local ttl = tonumber(string.sub(response_headers["cache-control"], 9))
|
||||||
|
|
||||||
|
|
||||||
local weather = data.currently
|
local weather = data.currently
|
||||||
@ -66,26 +103,28 @@ function weather:get_weather(lat, lng)
|
|||||||
local temperature = string.gsub(round(weather.temperature, 1), "%.", ",")
|
local temperature = string.gsub(round(weather.temperature, 1), "%.", ",")
|
||||||
local feelslike = string.gsub(round(weather.apparentTemperature, 1), "%.", ",")
|
local feelslike = string.gsub(round(weather.apparentTemperature, 1), "%.", ",")
|
||||||
local temp = '*Wetter in '..city..':*\n'..temperature..' °C'
|
local temp = '*Wetter in '..city..':*\n'..temperature..' °C'
|
||||||
local conditions = ' | '..weather.summary
|
local weather_summary = weather.summary
|
||||||
if weather.icon == 'clear-day' then
|
local conditions = ' | '..weather_summary
|
||||||
|
local weather_icon = weather.icon
|
||||||
|
if weather_icon == 'clear-day' then
|
||||||
conditions = conditions..' ☀️'
|
conditions = conditions..' ☀️'
|
||||||
elseif weather.icon == 'clear-night' then
|
elseif weather_icon == 'clear-night' then
|
||||||
conditions = conditions..' 🌙'
|
conditions = conditions..' 🌙'
|
||||||
elseif weather.icon == 'rain' then
|
elseif weather_icon == 'rain' then
|
||||||
conditions = conditions..' ☔️'
|
conditions = conditions..' ☔️'
|
||||||
elseif weather.icon == 'snow' then
|
elseif weather_icon == 'snow' then
|
||||||
conditions = conditions..' ❄️'
|
conditions = conditions..' ❄️'
|
||||||
elseif weather.icon == 'sleet' then
|
elseif weather_icon == 'sleet' then
|
||||||
conditions = conditions..' 🌨'
|
conditions = conditions..' 🌨'
|
||||||
elseif weather.icon == 'wind' then
|
elseif weather_icon == 'wind' then
|
||||||
conditions = conditions..' 💨'
|
conditions = conditions..' 💨'
|
||||||
elseif weather.icon == 'fog' then
|
elseif weather.icon == 'fog' then
|
||||||
conditions = conditions..' 🌫'
|
conditions = conditions..' 🌫'
|
||||||
elseif weather.icon == 'cloudy' then
|
elseif weather_icon == 'cloudy' then
|
||||||
conditions = conditions..' ☁️☁️'
|
conditions = conditions..' ☁️☁️'
|
||||||
elseif weather.icon == 'partly-cloudy-day' then
|
elseif weather_icon == 'partly-cloudy-day' then
|
||||||
conditions = conditions..' 🌤'
|
conditions = conditions..' 🌤'
|
||||||
elseif weather.icon == 'partly-cloudy-night' then
|
elseif weather_icon == 'partly-cloudy-night' then
|
||||||
conditions = conditions..' 🌙☁️'
|
conditions = conditions..' 🌙☁️'
|
||||||
else
|
else
|
||||||
conditions = conditions..''
|
conditions = conditions..''
|
||||||
@ -98,8 +137,54 @@ function weather:get_weather(lat, lng)
|
|||||||
text = text..'\n(gefühlt: '..feelslike..' °C)'
|
text = text..'\n(gefühlt: '..feelslike..' °C)'
|
||||||
end
|
end
|
||||||
|
|
||||||
cache_data('weather', lat..','..lng, text, tonumber(ttl), 'key')
|
print('Caching data...')
|
||||||
return text
|
redis:hset(hash, 'city', city)
|
||||||
|
redis:hset(hash, 'temperature', temperature)
|
||||||
|
redis:hset(hash, 'weather_icon', weather_icon)
|
||||||
|
redis:hset(hash, 'condition', weather_summary)
|
||||||
|
redis:hset(hash, 'text', text)
|
||||||
|
redis:expire(hash, ttl)
|
||||||
|
|
||||||
|
if is_inline then
|
||||||
|
return city, weather_summary..' bei '..temperature..' °C', weather_icon, text, ttl
|
||||||
|
else
|
||||||
|
return text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function weather:inline_callback(inline_query, config, matches)
|
||||||
|
local user_id = inline_query.from.id
|
||||||
|
if matches[1] ~= 'w' then
|
||||||
|
city = matches[1]
|
||||||
|
else
|
||||||
|
local set_location = get_location(user_id)
|
||||||
|
if not set_location then
|
||||||
|
city = 'Berlin, Deutschland'
|
||||||
|
else
|
||||||
|
city = set_location
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local lat, lng = weather:get_city_coordinates(city, config)
|
||||||
|
if not lat and not lng then utilities.answer_inline_query(self, inline_query) return end
|
||||||
|
|
||||||
|
local title, description, icon, text, ttl = weather:get_weather(lat, lng, true)
|
||||||
|
if not title and not description and not icon and not text and not ttl then utilities.answer_inline_query(self, inline_query) return end
|
||||||
|
|
||||||
|
local text = text:gsub('\n', '\\n')
|
||||||
|
local thumb_url = 'https://anditest.perseus.uberspace.de/inlineQuerys/weather/'
|
||||||
|
if icon == 'clear-day' or icon == 'partly-cloudy-day' then
|
||||||
|
thumb_url = thumb_url..'day.jpg'
|
||||||
|
elseif icon == 'clear-night' or icon == 'partly-cloudy-night' then
|
||||||
|
thumb_url = thumb_url..'night.jpg'
|
||||||
|
elseif icon == 'rain' then
|
||||||
|
thumb_url = thumb_url..'rain.jpg'
|
||||||
|
elseif icon == 'snow' then
|
||||||
|
thumb_url = thumb_url..'snow.jpg'
|
||||||
|
else
|
||||||
|
thumb_url = thumb_url..'cloudy.jpg'
|
||||||
|
end
|
||||||
|
local results = '[{"type":"article","id":"19122006","title":"'..title..'","description":"'..description..'","thumb_url":"'..thumb_url..'","thumb_width":80,"thumb_height":80,"input_message_content":{"message_text":"'..text..'", "parse_mode":"Markdown"}}]'
|
||||||
|
utilities.answer_inline_query(self, inline_query, results, ttl)
|
||||||
end
|
end
|
||||||
|
|
||||||
function weather:action(msg, config, matches)
|
function weather:action(msg, config, matches)
|
||||||
@ -116,22 +201,11 @@ function weather:action(msg, config, matches)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local lat = redis:hget('telegram:cache:weather:'..string.lower(city), 'lat')
|
local lat, lng = weather:get_city_coordinates(city, config)
|
||||||
local lng = redis:hget('telegram:cache:weather:'..string.lower(city), 'lng')
|
|
||||||
if not lat and not lng then
|
if not lat and not lng then
|
||||||
print('Koordinaten nicht eingespeichert, frage Google...')
|
utilities.send_reply(self, msg, '*Diesen Ort gibt es nicht!*', true)
|
||||||
coords = utilities.get_coords(city, config)
|
|
||||||
lat = coords.lat
|
|
||||||
lng = coords.lon
|
|
||||||
end
|
|
||||||
|
|
||||||
if not lat and not lng then
|
|
||||||
utilities.send_reply(self, msg, '*Diesen Ort gibt es nicht!*', true)
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
redis:hset('telegram:cache:weather:'..string.lower(city), 'lat', lat)
|
|
||||||
redis:hset('telegram:cache:weather:'..string.lower(city), 'lng', lng)
|
|
||||||
|
|
||||||
local text = weather:get_weather(lat, lng)
|
local text = weather:get_weather(lat, lng)
|
||||||
if not text then
|
if not text then
|
||||||
|
@ -794,8 +794,8 @@ function get_location(user_id)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function cache_data(plugin, query, data, timeout, typ)
|
function cache_data(plugin, query, data, timeout, typ, hash_field)
|
||||||
-- How to: cache_data(pluginname, query_name, data_to_cache, expire_in_seconds)
|
-- How to: cache_data(pluginname, query_name, data_to_cache, expire_in_seconds, type, hash_field (if hash))
|
||||||
local hash = 'telegram:cache:'..plugin..':'..query
|
local hash = 'telegram:cache:'..plugin..':'..query
|
||||||
if timeout then
|
if timeout then
|
||||||
print('Caching "'..query..'" from plugin '..plugin..' (expires in '..timeout..' seconds)')
|
print('Caching "'..query..'" from plugin '..plugin..' (expires in '..timeout..' seconds)')
|
||||||
@ -813,7 +813,7 @@ function cache_data(plugin, query, data, timeout, typ)
|
|||||||
redis:sadd(hash, str)
|
redis:sadd(hash, str)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
redis:hmset(hash, data)
|
redis:hset(hash, hash_field, data)
|
||||||
end
|
end
|
||||||
if timeout then
|
if timeout then
|
||||||
redis:expire(hash, timeout)
|
redis:expire(hash, timeout)
|
||||||
|
Reference in New Issue
Block a user