summaryrefslogtreecommitdiff
path: root/harmaccuweather/harmaccuweather.cpp
blob: c4daeb956d9f32a2439ee3181dac005bce29444b (plain)
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
TARGET = notificationswatchlet
TEMPLATE = lib
CONFIG   += plugin

SOURCES += notificationswatchletplugin.cpp notificationswatchlet.cpp

HEADERS += notificationswatchletplugin.h notificationswatchlet.h

qml_files.files = metawatch-digital.qml icon.png

win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../libsowatch/release/ -lsowatch
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../libsowatch/debug/ -lsowatch
pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
#include "harmaccuweather.h"

using namespace sowatch;

#define ACCUWEATHER_FILE_PATH "/home/user/.config/AccuWeather, Inc./awxapp.conf"

HarmAccuWeather::HarmAccuWeather(QObject *parent) :
	WeatherNotification(parent),
	_watcher(new QFileSystemWatcher(this)),
	_timer(new QTimer(this)),
	_lastUpdate(QDateTime::fromTime_t(0))
{
	// This only works on Harmattan either way, so I guess
	// hardcoding the path is OK.
	_watcher->addPath(ACCUWEATHER_FILE_PATH);
	connect(_watcher, SIGNAL(fileChanged(QString)), SLOT(fileChanged(QString)));

	_timer->setInterval(5000);
	_timer->setSingleShot(true);
	connect(_timer, SIGNAL(timeout()), SLOT(update()));

	// Perform an initial update
	update();
}

QSettings* HarmAccuWeather::getAccuweatherData()
{
	return new QSettings(ACCUWEATHER_FILE_PATH, QSettings::IniFormat);
}

Notification::Type HarmAccuWeather::type() const
{
	return Notification::WeatherNotification;
}

uint HarmAccuWeather::count() const
{
	return 1;
}

QDateTime HarmAccuWeather::dateTime() const
{
	return _lastUpdate;
}

QString HarmAccuWeather::title() const
{
	return _lastLocation;
}

QString HarmAccuWeather::body() const
{
	switch (_lastWxCode) {
	case 1:
	case 2:
		return tr("Sunny");

	case 3:
	case 4:
	case 5:
		return tr("Partly cloudy");
	case 6:
		return tr("Mostly cloudy");
	case 7:
	case 8:
		return tr("Cloudy");

	case 11:
		return tr("Fog");

	case 12:
		return tr("Light rain");
	case 13:
	case 14:
		return tr("Light rain with sun");
	case 18:
	case 26:
		return tr("Heavy rain");

	case 15:
	case 16:
		return tr("Thunderstorm");
	case 17:
		return tr("Thunderstorm with sun");

	case 19:
		return tr("Light snow");
	case 20:
	case 21:
		return tr("Light snow with sun");
	case 22:
		return tr("Heavy snow");
	case 29:
		return tr("Heavy rain and snow");

	case 25:
		return tr("Blizzard");

	case 30:
		return tr("Hot");
	case 31:
		return tr("Cold");
	case 32:
		return tr("Wind");


	// Night versions
	case 33:
	case 34:
		return tr("Clear");
	case 35:
		return tr("Partly cloudy");
	case 36:
	case 37:
		return tr("Mostly cloudy");
	case 38:
		return tr("Cloudy");
	case 39:
	case 40:
		return tr("Light rain");
	case 41:
	case 42:
		return tr("Thunderstorm");
	case 43:
		return tr("Light snow");
	case 44:
		return tr("Heavy snow");

	default:
		return QString("? %1").arg(_lastWxCode);
	}
}

WeatherNotification::WeatherType HarmAccuWeather::forecast()
{
	switch (_lastWxCode) {
	case 1:
	case 2:
		return Sunny;

	case 3:
	case 4:
	case 5:
		return PartlyCloudy;

	case 6:
	case 7:
	case 8:
		return Cloudy;

	case 11:
		return Fog;

	case 12:
	case 13:
	case 14:
	case 18:
	case 26:
		return Rain;

	case 15:
	case 16:
	case 17:
		return Thunderstorm;

	case 19:
	case 20:
	case 21:
	case 22:
	case 23:
	case 24:
	case 25:
	case 29:
		return Snow;

	// Night versions
	case 33:
	case 34:
		return Sunny;
	case 35:
		return PartlyCloudy;
	case 36:
	case 37:
	case 38:
		return Cloudy;
	case 39:
	case 40:
		return Rain;
	case 41:
	case 42:
		return Thunderstorm;
	case 43:
	case 44:
		return Snow;

	default:
		return UnknownWeather;
	}
}

int HarmAccuWeather::temperature()
{
	return _lastTemp;
}

WeatherNotification::Unit HarmAccuWeather::temperatureUnits()
{
	return _metric ? Celsius : Fahrenheit;
}

void HarmAccuWeather::activate()
{
	// Launch accuweather?
}

void HarmAccuWeather::dismiss()
{
	// Do nothing
}

void HarmAccuWeather::fileChanged(const QString &path)
{
	Q_UNUSED(path);
	qDebug() << "accuweather config file changed";
	_timer->start();
}

void HarmAccuWeather::update()
{
	QSettings* s = getAccuweatherData();

	qDebug() << "reading accuweather config file";

	QDateTime lastUpdate = s->value("LastUpdate").toDateTime();
	if (lastUpdate > _lastUpdate) {
		_lastUpdate = lastUpdate;
		bool anythingChanged = false;

		qDebug() << "reading weather info at" << _lastUpdate;

		bool useMetric = s->value("useMetric").toBool();
		if (useMetric != _metric) {
			_metric = useMetric;
			anythingChanged = true;
		}

		int temp = s->value("LastTemp").toInt();
		if (_lastTemp != temp) {
			_lastTemp = temp;
			anythingChanged = true;
		}

		QString location = s->value("LastLocation").toString();
		if (_lastLocation != location) {
			_lastLocation = location;
			anythingChanged = true;
		}

		int wxCode = s->value("LastWxCode").toInt();
		if (_lastWxCode != wxCode) {
			_lastWxCode = wxCode;
			anythingChanged = true;
		}

		if (anythingChanged) {
			qDebug() << "weather info changed wxcode=" << wxCode;
			emit changed();
		}
	}

	delete s;
}