Skip to content

Commit

Permalink
♻️ backup: added backup & restore functionality
Browse files Browse the repository at this point in the history
Backup & Restore
  • Loading branch information
Sclafus authored May 29, 2023
2 parents 3ab69b6 + f406ba1 commit a6cf7c1
Show file tree
Hide file tree
Showing 9 changed files with 185 additions and 3 deletions.
4 changes: 4 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ set(SOURCE_SETUPWIZARD_DIR "${CMAKE_SOURCE_DIR}/src/setupwizard")
set(SOURCE_PREFERENCES_DIR "${CMAKE_SOURCE_DIR}/src/preferences")
set(SOURCE_SKINSURL_DIR "${CMAKE_SOURCE_DIR}/src/skinsurl")
set(SOURCE_COMMANDS_DIR "${CMAKE_SOURCE_DIR}/src/commands")
set(SOURCE_BACKUP_DIR "${CMAKE_SOURCE_DIR}/src/backup")

include_directories(${FORMS_DIR})
include_directories(${SOURCE_DIR})
Expand All @@ -32,6 +33,7 @@ include_directories(${SOURCE_SETUPWIZARD_DIR})
include_directories(${SOURCE_PREFERENCES_DIR})
include_directories(${SOURCE_SKINSURL_DIR})
include_directories(${SOURCE_COMMANDS_DIR})
include_directories(${SOURCE_BACKUP_DIR})

file(GLOB_RECURSE SOURCES
${FORMS_DIR}/*.cpp
Expand All @@ -51,6 +53,8 @@ file(GLOB_RECURSE SOURCES
${SOURCE_SKINSURL_DIR}/*.cpp
${SOURCE_COMMANDS_DIR}/*.h
${SOURCE_COMMANDS_DIR}/*.cpp
${SOURCE_BACKUP_DIR}/*.h
${SOURCE_BACKUP_DIR}/*.cpp
${SOURCE_DIR}/*.h
${SOURCE_DIR}/*.cpp
resources.qrc
Expand Down
27 changes: 27 additions & 0 deletions forms/preferences.ui
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,15 @@
<normaloff>:/images/resources/images/osu_logo.png</normaloff>:/images/resources/images/osu_logo.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>Backup &amp; Restore</string>
</property>
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/images/resources/images/backup_and_restore.png</normaloff>:/images/resources/images/backup_and_restore.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>Themes</string>
Expand Down Expand Up @@ -310,6 +319,24 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="page">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QPushButton" name="backupBtn">
<property name="text">
<string>Backup</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="restoreBtn">
<property name="text">
<string>Restore</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="themesPage">
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="0" colspan="4">
Expand Down
1 change: 1 addition & 0 deletions resources.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
<file>resources/images/gosumemory.ico</file>
<file>resources/images/twitch_logo.png</file>
<file>resources/images/osu_logo.png</file>
<file>resources/images/backup_and_restore.png</file>
</qresource>
</RCC>
Binary file added resources/images/backup_and_restore.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
83 changes: 83 additions & 0 deletions src/backup/backup.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#include "backup.h"

Backup::Backup(QObject *parent)
: QObject{parent}
{
}

void Backup::backup(QString filePath, bool includeSensitiveInfo)
{

if (filePath.isEmpty()) {
return;
}

// adding .json if needed
if(!filePath.endsWith(".json")) {
filePath.append(".json");
}

QFile file(filePath);
if (!(file.open(QIODevice::WriteOnly | QIODevice::Text))) {
qDebug() << "[Backup] Cannot open file in write mode";
file.close();
return;
}

qDebug() << "[Backup] Starting backup...";
// adding all the keys in a json object and converting it into a string
QJsonObject jsonObject;
QSettings settings;
QStringList keys = settings.allKeys();

// sensitive info must be excluded
if(!includeSensitiveInfo) {
keys.removeIf([](const QString& key){
return key.startsWith("osuirc") || key.startsWith("twitch");
});
}

for(const QString& key: keys){
QString value = settings.value(key).toString();
jsonObject.insert(key, QJsonValue(value));
}
QString jsonString = QJsonDocument(jsonObject).toJson();

// saving the backup
QTextStream stream(&file);
stream << jsonString;
file.close();
qDebug() << "[Backup] Backup completed";
}

void Backup::restore(QString filePath)
{
if (filePath.isEmpty()) {
return;
}

QFile file(filePath);
if (!(file.open(QIODevice::ReadOnly | QIODevice::Text))) {
qDebug() << "[Backup] Cannot open file in read mode";
file.close();
return;
}

qDebug() << "[Backup] Starting backup restore...";
QTextStream stream(&file);
QString jsonString = stream.readAll();
file.close();

QSettings settings;
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());
if (!jsonDoc.isNull()){
QJsonObject jsonObject = jsonDoc.object();
for (auto it = jsonObject.begin(); it != jsonObject.end(); ++it) {
QString key = it.key();
QJsonValue value = it.value();

settings.setValue(key, value.toString());
}
}
qDebug() << "[Backup] Backup restored successfully";
}
23 changes: 23 additions & 0 deletions src/backup/backup.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#ifndef BACKUP_H
#define BACKUP_H

#include <QDebug>
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QMessageBox>
#include <QObject>
#include <QSettings>

class Backup : public QObject
{
Q_OBJECT
public:
explicit Backup(QObject *parent = nullptr);
static void backup(QString filePath, bool includeSensitiveInfo);
static void restore(QString filePath);

};

#endif // BACKUP_H
2 changes: 1 addition & 1 deletion src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ int main(int argc, char **argv) {
app.setOrganizationName("miraya");
app.setOrganizationDomain("github.com/MirayaProject");
app.setApplicationName("bot");
app.setApplicationVersion("1.2.0-alpha.1");
app.setApplicationVersion("1.2.0-alpha.2");
MainWindow mw;
mw.show();
return app.exec();
Expand Down
33 changes: 33 additions & 0 deletions src/preferences/preferences.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ Preferences::Preferences(QWidget *parent) :
ui->setupUi(this);
connect(ui->listWidget, &QListWidget::currentItemChanged, this, &Preferences::on_listWidget_currentItemChanged);
connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &Preferences::on_saveBtnClicked);
connect(ui->backupBtn, &QPushButton::clicked, this, &Preferences::on_backupBtn_clicked);
connect(ui->restoreBtn, &QPushButton::clicked, this, &Preferences::on_restoreBtn_clicked);
ui->listWidget->setCurrentRow(0);
loadSettings();
setupUi();
Expand Down Expand Up @@ -123,6 +125,37 @@ void Preferences::saveSettings()
}


void Preferences::on_backupBtn_clicked()
{
QString message = QString("%1<br>%2").arg(
"Would you like to include sensitive informations in your backup file?",
"Anyone that has this information <b>will be able to access your accounts!</b>"
);

auto buttonAnswer = QMessageBox().question(
this,
"Sensitive information",
message,
QMessageBox::No | QMessageBox::Yes,
QMessageBox::No
);
bool includeSensitiveInfo = buttonAnswer == QMessageBox::Yes;

QString filePath = QFileDialog::getSaveFileName(nullptr, "Export Settings", QString(), "JSON Files (*.json)");
Backup::backup(filePath, includeSensitiveInfo);
}


void Preferences::on_restoreBtn_clicked()
{
QString filePath = QFileDialog::getOpenFileName(nullptr, "Import Settings", QString(), "JSON Files (*.json)");
Backup::restore(filePath);
// reloading
loadSettings();
QMessageBox().information(this, "Backup Restored", "Backup restored successfully");
}


void Preferences::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
if (current == nullptr)
Expand Down
15 changes: 13 additions & 2 deletions src/preferences/preferences.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,17 @@
#define PREFERENCES_H

#include <QDialog>
#include <QSettings>
#include <QMessageBox>
#include <QFile>
#include <QFileDialog>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QListWidgetItem>
#include <QMessageBox>
#include <QSettings>
#include <QTextStream>

#include "backup.h"

namespace Ui {
class Preferences;
Expand All @@ -28,7 +36,10 @@ class Preferences : public QDialog
void loadThemeSettings();
void setupUi();
void saveSettings();

void on_saveBtnClicked();
void on_backupBtn_clicked();
void on_restoreBtn_clicked();
void on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);

signals:
Expand Down

0 comments on commit a6cf7c1

Please sign in to comment.