File indexing completed on 2024-05-05 16:49:22
0001 /* 0002 * SPDX-FileCopyrightText: 2020-2021 Han Young <hanyoung@protonmail.com> 0003 * SPDX-FileCopyrightText: 2020 Devin Lin <espidev@gmail.com> 0004 * 0005 * SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 #pragma once 0008 #include <iomanip> 0009 #include <sstream> 0010 #include <KLocalizedString> 0011 #include <QHash> 0012 #include <QString> 0013 #include <QUrl> 0014 0015 #include "alertinfo.h" 0016 namespace KWeatherCore 0017 { 0018 static const QString VERSION_NUMBER = QStringLiteral("0.1.0"); 0019 using Polygon = std::vector<std::pair<float, float>>; 0020 static constexpr auto stringToPolygon = [](const QString &str) -> Polygon { 0021 Polygon res; 0022 const auto pairList = str.split(QLatin1Char(' ')); 0023 for (auto &pair : pairList) { 0024 auto coordinate = pair.split(QLatin1Char(',')); 0025 res.push_back( 0026 {coordinate.front().toFloat(), coordinate.back().toFloat()}); 0027 } 0028 return res; 0029 }; 0030 static constexpr auto toFixedString = [](double num) { 0031 std::ostringstream oss; 0032 oss << std::fixed << std::setprecision(2) << num; 0033 return QString::fromStdString(oss.str()); 0034 }; 0035 static constexpr auto urgencyStrToEnum = [](const QString &str) { 0036 if (str == QStringLiteral("Immediate")) 0037 return AlertInfo::Urgency::Immediate; 0038 else if (str == QStringLiteral("Expected")) 0039 return AlertInfo::Urgency::Expected; 0040 else if (str == QStringLiteral("Future")) 0041 return AlertInfo::Urgency::Future; 0042 else if (str == QStringLiteral("Past")) 0043 return AlertInfo::Urgency::Past; 0044 else 0045 return AlertInfo::Urgency::Unknown; 0046 }; 0047 static constexpr auto severityStrToEnum = [](const QString &str) { 0048 if (str == QStringLiteral("Extreme")) 0049 return AlertInfo::Severity::Extreme; 0050 else if (str == QStringLiteral("Severe")) 0051 return AlertInfo::Severity::Severe; 0052 else if (str == QStringLiteral("Moderate")) 0053 return AlertInfo::Severity::Moderate; 0054 else if (str == QStringLiteral("Minor")) 0055 return AlertInfo::Severity::Minor; 0056 else 0057 return AlertInfo::Severity::Unknown; 0058 }; 0059 static constexpr auto certaintyStrToEnum = [](const QString &str) { 0060 if (str == QStringLiteral("Observed")) 0061 return AlertInfo::Certainty::Observed; 0062 else if (str == QStringLiteral("Likely")) 0063 return AlertInfo::Certainty::Likely; 0064 else if (str == QStringLiteral("Possible")) 0065 return AlertInfo::Certainty::Possible; 0066 else if (str == QStringLiteral("Unlikely")) 0067 return AlertInfo::Certainty::Unlikely; 0068 else 0069 return AlertInfo::Certainty::Unknown; 0070 }; 0071 static constexpr auto severityToString = [](AlertInfo::Severity severity) { 0072 QString res; 0073 switch (severity) { 0074 case AlertInfo::Severity::Extreme: 0075 res = i18n("Extreme"); 0076 break; 0077 case AlertInfo::Severity::Severe: 0078 res = i18n("Severe"); 0079 break; 0080 case AlertInfo::Severity::Moderate: 0081 res = i18n("Moderate"); 0082 break; 0083 case AlertInfo::Severity::Minor: 0084 res = i18n("Minor"); 0085 break; 0086 case AlertInfo::Severity::Unknown: 0087 res = i18n("Unknown"); 0088 } 0089 return res; 0090 }; 0091 static constexpr auto urgencyToString = [](AlertInfo::Urgency urgency) { 0092 QString res; 0093 switch (urgency) { 0094 case AlertInfo::Urgency::Immediate: 0095 res = i18n("Immediate"); 0096 break; 0097 case AlertInfo::Urgency::Expected: 0098 res = i18n("Expected"); 0099 break; 0100 case AlertInfo::Urgency::Future: 0101 res = i18n("Future"); 0102 break; 0103 case AlertInfo::Urgency::Past: 0104 res = i18n("Past"); 0105 break; 0106 case AlertInfo::Urgency::Unknown: 0107 res = i18n("Unknown"); 0108 } 0109 return res; 0110 }; 0111 static constexpr auto certaintyToString = [](AlertInfo::Certainty certainty) { 0112 QString res; 0113 switch (certainty) { 0114 case AlertInfo::Certainty::Observed: 0115 res = i18n("Observed"); 0116 break; 0117 case AlertInfo::Certainty::Likely: 0118 res = i18n("Likely"); 0119 break; 0120 case AlertInfo::Certainty::Possible: 0121 res = i18n("Possible"); 0122 break; 0123 case AlertInfo::Certainty::Unlikely: 0124 res = i18n("Unlikely"); 0125 break; 0126 case AlertInfo::Certainty::Unknown: 0127 res = i18n("Unknown"); 0128 } 0129 return res; 0130 }; 0131 // rank weather (for what best describes the day overall) 0132 static const QHash<QString, int> rank = { // only need neutral icons 0133 {QStringLiteral("weather-none-available"), -1}, 0134 {QStringLiteral("weather-clear"), 0}, 0135 {QStringLiteral("weather-few-clouds"), 1}, 0136 {QStringLiteral("weather-clouds"), 2}, 0137 {QStringLiteral("weather-fog"), 3}, 0138 {QStringLiteral("weather-mist"), 3}, 0139 {QStringLiteral("weather-showers-scattered"), 4}, 0140 {QStringLiteral("weather-snow-scattered"), 4}, 0141 {QStringLiteral("weather-showers"), 5}, 0142 {QStringLiteral("weather-hail"), 5}, 0143 {QStringLiteral("weather-snow"), 5}, 0144 {QStringLiteral("weather-freezing-rain"), 6}, 0145 {QStringLiteral("weather-freezing-storm"), 6}, 0146 {QStringLiteral("weather-snow-rain"), 6}, 0147 {QStringLiteral("weather-storm"), 7}}; 0148 0149 struct ResolvedWeatherDesc { 0150 QString icon = QStringLiteral("weather-none-available"), desc = i18n("Unknown"); 0151 ResolvedWeatherDesc() = default; 0152 ResolvedWeatherDesc(QString icon, QString desc) 0153 { 0154 this->icon = icon; 0155 this->desc = desc; 0156 } 0157 }; 0158 0159 // https://api.met.no/weatherapi/weathericon/2.0/legends 0160 static const QMap<QString, ResolvedWeatherDesc> apiDescMap = { 0161 {QStringLiteral("heavyrainandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-storm"), i18n("Storm"))}, 0162 {QStringLiteral("heavyrainandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-storm-day"), i18n("Storm"))}, 0163 {QStringLiteral("heavyrainandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-storm-night"), i18n("Storm"))}, 0164 {QStringLiteral("heavysleetandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-storm"), i18n("Storm"))}, 0165 {QStringLiteral("heavysleetandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-storm-day"), i18n("Storm"))}, 0166 {QStringLiteral("heavysleetandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-storm-night"), i18n("Storm"))}, 0167 {QStringLiteral("heavysnowshowersandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-storm"), i18n("Storm"))}, 0168 {QStringLiteral("heavysnowshowersandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-storm-day"), i18n("Storm"))}, 0169 {QStringLiteral("heavysnowshowersandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-storm-night"), i18n("Storm"))}, 0170 {QStringLiteral("heavysnow_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-snow"), i18n("Heavy Snow"))}, 0171 {QStringLiteral("heavysnow_day"), ResolvedWeatherDesc(QStringLiteral("weather-snow"), i18n("Heavy Snow"))}, 0172 {QStringLiteral("heavysnow_night"), ResolvedWeatherDesc(QStringLiteral("weather-snow"), i18n("Heavy Snow"))}, 0173 {QStringLiteral("rainandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-storm"), i18n("Storm"))}, 0174 {QStringLiteral("rainandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-storm-day"), i18n("Storm"))}, 0175 {QStringLiteral("rainandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-storm-night"), i18n("Storm"))}, 0176 {QStringLiteral("heavysleetshowersandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-storm"), i18n("Storm"))}, 0177 {QStringLiteral("heavysleetshowersandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-storm-day"), i18n("Storm"))}, 0178 {QStringLiteral("heavysleetshowersandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-storm-night"), i18n("Storm"))}, 0179 {QStringLiteral("rainshowers_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-showers"), i18n("Rain"))}, 0180 {QStringLiteral("rainshowers_day"), ResolvedWeatherDesc(QStringLiteral("weather-showers-day"), i18n("Rain"))}, 0181 {QStringLiteral("rainshowers_night"), ResolvedWeatherDesc(QStringLiteral("weather-showers-night"), i18n("Rain"))}, 0182 {QStringLiteral("fog_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-fog"), i18n("Fog"))}, 0183 {QStringLiteral("fog_day"), ResolvedWeatherDesc(QStringLiteral("weather-fog"), i18n("Fog"))}, 0184 {QStringLiteral("fog_night"), ResolvedWeatherDesc(QStringLiteral("weather-fog"), i18n("Fog"))}, 0185 {QStringLiteral("heavysleetshowers_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-freezing-rain"), i18n("Heavy Sleet"))}, 0186 {QStringLiteral("heavysleetshowers_day"), ResolvedWeatherDesc(QStringLiteral("weather-freezing-rain"), i18n("Heavy Sleet"))}, 0187 {QStringLiteral("heavysleetshowers_night"), ResolvedWeatherDesc(QStringLiteral("weather-freezing-rain"), i18n("Heavy Sleet"))}, 0188 {QStringLiteral("lightssnowshowersandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-storm"), i18n("Storm"))}, 0189 {QStringLiteral("lightssnowshowersandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-storm-day"), i18n("Storm"))}, 0190 {QStringLiteral("lightssnowshowersandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-storm-night"), i18n("Storm"))}, 0191 {QStringLiteral("cloudy_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-clouds"), i18n("Cloudy"))}, 0192 {QStringLiteral("cloudy_day"), ResolvedWeatherDesc(QStringLiteral("weather-clouds"), i18n("Cloudy"))}, 0193 {QStringLiteral("cloudy_night"), ResolvedWeatherDesc(QStringLiteral("weather-clouds-night"), i18n("Cloudy"))}, 0194 {QStringLiteral("snowshowersandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-storm"), i18n("Storm"))}, 0195 {QStringLiteral("snowshowersandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-storm-day"), i18n("Storm"))}, 0196 {QStringLiteral("snowshowersandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-storm-night"), i18n("Storm"))}, 0197 {QStringLiteral("lightsnowshowers_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-snow-scattered"), i18n("Light Snow"))}, 0198 {QStringLiteral("lightsnowshowers_day"), ResolvedWeatherDesc(QStringLiteral("weather-snow-scattered-day"), i18n("Light Snow"))}, 0199 {QStringLiteral("lightsnowshowers_night"), ResolvedWeatherDesc(QStringLiteral("weather-snow-scattered-night"), i18n("Light Snow"))}, 0200 {QStringLiteral("heavysleet_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-freezing-rain"), i18n("Heavy Sleet"))}, 0201 {QStringLiteral("heavysleet_day"), ResolvedWeatherDesc(QStringLiteral("weather-freezing-rain"), i18n("Heavy Sleet"))}, 0202 {QStringLiteral("heavysleet_night"), ResolvedWeatherDesc(QStringLiteral("weather-freezing-rain"), i18n("Heavy Sleet"))}, 0203 {QStringLiteral("lightsnowandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-storm"), i18n("Storm"))}, 0204 {QStringLiteral("lightsnowandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-storm-day"), i18n("Storm"))}, 0205 {QStringLiteral("lightsnowandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-storm-night"), i18n("Storm"))}, 0206 {QStringLiteral("sleetshowersandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-storm"), i18n("Storm"))}, 0207 {QStringLiteral("sleetshowersandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-storm-day"), i18n("Storm"))}, 0208 {QStringLiteral("sleetshowersandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-storm-night"), i18n("Storm"))}, 0209 {QStringLiteral("rainshowersandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-storm"), i18n("Storm"))}, 0210 {QStringLiteral("rainshowersandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-storm-day"), i18n("Storm"))}, 0211 {QStringLiteral("rainshowersandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-storm-night"), i18n("Storm"))}, 0212 {QStringLiteral("lightsleet_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-showers-scattered"), i18n("Light Sleet"))}, 0213 {QStringLiteral("lightsleet_day"), ResolvedWeatherDesc(QStringLiteral("weather-showers-scattered-day"), i18n("Light Sleet"))}, 0214 {QStringLiteral("lightsleet_night"), ResolvedWeatherDesc(QStringLiteral("weather-showers-scattered-night"), i18n("Light Sleet"))}, 0215 {QStringLiteral("lightssleetshowersandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-storm"), i18n("Storm"))}, 0216 {QStringLiteral("lightssleetshowersandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-storm-day"), i18n("Storm"))}, 0217 {QStringLiteral("lightssleetshowersandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-storm-night"), i18n("Storm"))}, 0218 {QStringLiteral("sleetandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-storm"), i18n("Storm"))}, 0219 {QStringLiteral("sleetandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-storm-day"), i18n("Storm"))}, 0220 {QStringLiteral("sleetandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-storm-night"), i18n("Storm"))}, 0221 {QStringLiteral("lightsnow_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-snow-scattered"), i18n("Light Snow"))}, 0222 {QStringLiteral("lightsnow_day"), ResolvedWeatherDesc(QStringLiteral("weather-snow-scattered-day"), i18n("Light Snow"))}, 0223 {QStringLiteral("lightsnow_night"), ResolvedWeatherDesc(QStringLiteral("weather-snow-scattered-night"), i18n("Light Snow"))}, 0224 {QStringLiteral("sleet_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-freezing-rain"), i18n("Sleet"))}, 0225 {QStringLiteral("sleet_day"), ResolvedWeatherDesc(QStringLiteral("weather-freezing-rain"), i18n("Sleet"))}, 0226 {QStringLiteral("sleet_night"), ResolvedWeatherDesc(QStringLiteral("weather-freezing-rain"), i18n("Sleet"))}, 0227 {QStringLiteral("heavyrainshowers_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-showers"), i18n("Heavy Rain"))}, 0228 {QStringLiteral("heavyrainshowers_day"), ResolvedWeatherDesc(QStringLiteral("weather-showers-day"), i18n("Heavy Rain"))}, 0229 {QStringLiteral("heavyrainshowers_night"), ResolvedWeatherDesc(QStringLiteral("weather-showers-night"), i18n("Heavy Rain"))}, 0230 {QStringLiteral("lightsleetshowers_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-showers-scattered"), i18n("Light Sleet"))}, 0231 {QStringLiteral("lightsleetshowers_day"), ResolvedWeatherDesc(QStringLiteral("weather-showers-scattered-day"), i18n("Light Sleet"))}, 0232 {QStringLiteral("lightsleetshowers_night"), ResolvedWeatherDesc(QStringLiteral("weather-showers-scattered-night"), i18n("Light Sleet"))}, 0233 {QStringLiteral("snowshowers_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-snow"), i18n("Snow"))}, 0234 {QStringLiteral("snowshowers_day"), ResolvedWeatherDesc(QStringLiteral("weather-snow"), i18n("Snow"))}, 0235 {QStringLiteral("snowshowers_night"), ResolvedWeatherDesc(QStringLiteral("weather-snow"), i18n("Snow"))}, 0236 {QStringLiteral("snowandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-snow"), i18n("Snow"))}, 0237 {QStringLiteral("snowandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-snow"), i18n("Snow"))}, 0238 {QStringLiteral("snowandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-snow"), i18n("Snow"))}, 0239 {QStringLiteral("lightsleetandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-storm"), i18n("Storm"))}, 0240 {QStringLiteral("lightsleetandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-storm-day"), i18n("Storm"))}, 0241 {QStringLiteral("lightsleetandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-storm-night"), i18n("Storm"))}, 0242 {QStringLiteral("snow_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-snow"), i18n("Snow"))}, 0243 {QStringLiteral("snow_day"), ResolvedWeatherDesc(QStringLiteral("weather-snow"), i18n("Snow"))}, 0244 {QStringLiteral("snow_night"), ResolvedWeatherDesc(QStringLiteral("weather-snow"), i18n("Snow"))}, 0245 {QStringLiteral("heavyrainshowersandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-storm"), i18n("Storm"))}, 0246 {QStringLiteral("heavyrainshowersandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-storm-day"), i18n("Storm"))}, 0247 {QStringLiteral("heavyrainshowersandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-storm-night"), i18n("Storm"))}, 0248 {QStringLiteral("rain_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-showers"), i18n("Rain"))}, 0249 {QStringLiteral("rain_day"), ResolvedWeatherDesc(QStringLiteral("weather-showers-day"), i18n("Rain"))}, 0250 {QStringLiteral("rain_night"), ResolvedWeatherDesc(QStringLiteral("weather-showers-night"), i18n("Rain"))}, 0251 {QStringLiteral("heavysnowshowers_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-snow"), i18n("Heavy Snow"))}, 0252 {QStringLiteral("heavysnowshowers_day"), ResolvedWeatherDesc(QStringLiteral("weather-snow"), i18n("Heavy Snow"))}, 0253 {QStringLiteral("heavysnowshowers_night"), ResolvedWeatherDesc(QStringLiteral("weather-snow"), i18n("Heavy Snow"))}, 0254 {QStringLiteral("lightrain_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-showers-scattered"), i18n("Light Rain"))}, 0255 {QStringLiteral("lightrain_day"), ResolvedWeatherDesc(QStringLiteral("weather-showers-scattered-day"), i18n("Light Rain"))}, 0256 {QStringLiteral("lightrain_night"), ResolvedWeatherDesc(QStringLiteral("weather-showers-scattered-night"), i18n("Light Rain"))}, 0257 {QStringLiteral("fair_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-few-clouds"), i18n("Light Clouds"))}, 0258 {QStringLiteral("fair_day"), ResolvedWeatherDesc(QStringLiteral("weather-few-clouds"), i18n("Partly Sunny"))}, 0259 {QStringLiteral("fair_night"), ResolvedWeatherDesc(QStringLiteral("weather-few-clouds-night"), i18n("Light Clouds"))}, 0260 {QStringLiteral("partlycloudy_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-clouds"), i18n("Partly Cloudy"))}, 0261 {QStringLiteral("partlycloudy_day"), ResolvedWeatherDesc(QStringLiteral("weather-clouds"), i18n("Partly Cloudy"))}, 0262 {QStringLiteral("partlycloudy_night"), ResolvedWeatherDesc(QStringLiteral("weather-clouds-night"), i18n("Partly Cloudy"))}, 0263 {QStringLiteral("clearsky_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-clear"), i18n("Clear"))}, 0264 {QStringLiteral("clearsky_day"), ResolvedWeatherDesc(QStringLiteral("weather-clear"), i18n("Clear"))}, 0265 {QStringLiteral("clearsky_night"), ResolvedWeatherDesc(QStringLiteral("weather-clear-night"), i18n("Clear"))}, 0266 {QStringLiteral("lightrainshowers_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-showers-scattered"), i18n("Light Rain"))}, 0267 {QStringLiteral("lightrainshowers_day"), ResolvedWeatherDesc(QStringLiteral("weather-showers-scattered-day"), i18n("Light Rain"))}, 0268 {QStringLiteral("lightrainshowers_night"), ResolvedWeatherDesc(QStringLiteral("weather-showers-scattered-night"), i18n("Light Rain"))}, 0269 {QStringLiteral("sleetshowers_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-freezing-rain"), i18n("Sleet"))}, 0270 {QStringLiteral("sleetshowers_day"), ResolvedWeatherDesc(QStringLiteral("weather-freezing-rain"), i18n("Sleet"))}, 0271 {QStringLiteral("sleetshowers_night"), ResolvedWeatherDesc(QStringLiteral("weather-freezing-rain"), i18n("Sleet"))}, 0272 {QStringLiteral("lightrainandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-storm"), i18n("Storm"))}, 0273 {QStringLiteral("lightrainandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-storm-day"), i18n("Storm"))}, 0274 {QStringLiteral("lightrainandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-storm-night"), i18n("Storm"))}, 0275 {QStringLiteral("lightrainshowersandthunder_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-storm"), i18n("Storm"))}, 0276 {QStringLiteral("lightrainshowersandthunder_day"), ResolvedWeatherDesc(QStringLiteral("weather-storm-day"), i18n("Storm"))}, 0277 {QStringLiteral("lightrainshowersandthunder_night"), ResolvedWeatherDesc(QStringLiteral("weather-storm-night"), i18n("Storm"))}, 0278 {QStringLiteral("heavyrain_neutral"), ResolvedWeatherDesc(QStringLiteral("weather-showers"), i18n("Heavy Rain"))}, 0279 {QStringLiteral("heavyrain_day"), ResolvedWeatherDesc(QStringLiteral("weather-showers-day"), i18n("Heavy Rain"))}, 0280 {QStringLiteral("heavyrain_night"), ResolvedWeatherDesc(QStringLiteral("weather-showers-night"), i18n("Heavy Rain"))}, 0281 }; 0282 0283 // URLs for CAP alerts for different countries. 0284 // Country codes according to https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3 0285 static const QMap<QString, QUrl> capUrls = { 0286 {QStringLiteral("NOR"), QUrl(QStringLiteral("https://api.met.no/weatherapi/metalerts/1.1/"))} 0287 }; 0288 0289 // Parameters supported by different CAP providers. Key is the country shorthand 0290 static const QMap<QString, QVector<QString>> capParams = { 0291 {QStringLiteral("NOR"), 0292 { 0293 QStringLiteral("county"), 0294 QStringLiteral("cap"), 0295 QStringLiteral("lang"), 0296 QStringLiteral("event"), 0297 QStringLiteral("incidentName"), 0298 QStringLiteral("geographicDomain"), 0299 QStringLiteral("municipality"), 0300 QStringLiteral("lat"), 0301 QStringLiteral("long"), 0302 QStringLiteral("show"), 0303 } 0304 } 0305 }; 0306 }