Initial commit

This commit is contained in:
2023-03-28 08:37:35 +02:00
commit 7a929eb757
22 changed files with 1128 additions and 0 deletions

122
services/beerservice.cpp Normal file
View File

@@ -0,0 +1,122 @@
#include "beerservice.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QStandardPaths>
#include <QFile>
#include <QDebug>
namespace {
constexpr auto GuestUserId = "2641ffe8cd4311eda27f0242ac120002";
}
BeerService::BeerService(QObject *parent)
: QObject{parent}
{
restoreStash();
connect(&m_socket, &QWebSocket::textMessageReceived, this, [this](QString message) {
QJsonParseError err;
QJsonDocument doc = QJsonDocument::fromJson(message.toLocal8Bit(), &err);
if (err.error != QJsonParseError::NoError) {
qWarning() << "Json parse error:" << err.errorString() << message;
return;
}
QString entity = doc.object().value("entity").toString();
const QList<QObject *> listeners = m_listeners.values(entity);
for (QObject *listener : listeners) {
QString event = doc.object().value("event").toString();
QVariant data = doc.object().value("data").toVariant();
QMetaObject::invokeMethod(listener, event.toLatin1(), Qt::QueuedConnection, Q_ARG(QVariant, data));
}
});
connect(&m_socket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error), this, [this](QAbstractSocket::SocketError error) {
qInfo() << error << m_socket.errorString();
});
connect(&m_socket, &QWebSocket::connected, this, [this]() {
while (!m_commandStash.isEmpty()) {
sendCommand(m_commandStash.takeFirst().toMap());
}
});
}
BeerService::~BeerService()
{
saveStash();
m_socket.close();
}
void BeerService::connectSrv(const QString &userId)
{
if (QAbstractSocket::ConnectedState == m_socket.state()) {
m_socket.close();
}
QNetworkRequest request(QUrl("ws://195.133.196.161:8000"));
QString authString = QString("%1:pass").arg(userId.isEmpty() ? GuestUserId : userId);
request.setRawHeader("Authorization", "Basic " + authString.toLatin1().toBase64());
m_socket.open(request);
}
void BeerService::sendCommand(const QString &entity, const QString &action, const QVariantMap &data)
{
sendCommand(QVariantMap {
{ "entity", entity },
{ "action", action },
{ "data", data }
});
}
void BeerService::connectListener(QObject *listener)
{
QString entity = listener->property("entity").toString();
m_listeners.insert(entity, listener);
}
QString BeerService::stashFileName() const
{
return QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/command.stash";
}
void BeerService::saveStash() const
{
if (m_commandStash.isEmpty()) {
return;
}
QFile stash(stashFileName());
if (stash.open(QIODevice::WriteOnly)) {
stash.write(QJsonDocument::fromVariant(m_commandStash).toJson(QJsonDocument::Compact));
stash.close();
} else {
qWarning() << stash.errorString();
}
}
void BeerService::restoreStash()
{
QFile stash(stashFileName());
if (stash.open(QIODevice::ReadOnly)) {
QJsonDocument doc = QJsonDocument::fromJson(stash.readAll());
m_commandStash = doc.array().toVariantList();
stash.close();
} else {
qWarning() << stash.errorString();
}
}
void BeerService::sendCommand(const QVariantMap &command)
{
if (QAbstractSocket::ConnectedState == m_socket.state()) {
QJsonDocument doc = QJsonDocument::fromVariant(command);
m_socket.sendTextMessage(doc.toJson(QJsonDocument::Compact));
} else {
m_commandStash << command;
}
}

31
services/beerservice.h Normal file
View File

@@ -0,0 +1,31 @@
#ifndef BEERSERVICE_H
#define BEERSERVICE_H
#include <QObject>
#include <QtWebSockets/QWebSocket>
class BeerService : public QObject
{
Q_OBJECT
public:
explicit BeerService(QObject *parent = nullptr);
~BeerService();
Q_INVOKABLE void connectSrv(const QString &userId = QString());
Q_INVOKABLE void sendCommand(const QString &entity, const QString &action, const QVariantMap &data = QVariantMap());
Q_INVOKABLE void connectListener(QObject *listener);
private:
QString stashFileName() const;
void saveStash() const;
void restoreStash();
void sendCommand(const QVariantMap &command);
QMultiMap<QString, QObject *> m_listeners;
QWebSocket m_socket;
QVariantList m_commandStash;
};
#endif // BEERSERVICE_H

View File

@@ -0,0 +1,11 @@
#include "settingsservice.h"
QVariant SettingsService::value(const QString &key, const QVariant &defaultValue) const
{
return m_settings.value(key, defaultValue);
}
void SettingsService::setValue(const QString &key, const QVariant &value)
{
m_settings.setValue(key, value);
}

View File

@@ -0,0 +1,16 @@
#ifndef SETTINGSSERVICE_H
#define SETTINGSSERVICE_H
#include <QSettings>
class SettingsService
{
public:
QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const;
void setValue(const QString &key, const QVariant &value);
private:
QSettings m_settings = QSettings("DedSoft", "BeerLog");
};
#endif // SETTINGSSERVICE_H