Skip to content

Commit a6cf7c1

Browse files
authored
♻️ backup: added backup & restore functionality
Backup & Restore
2 parents 3ab69b6 + f406ba1 commit a6cf7c1

File tree

9 files changed

+185
-3
lines changed

9 files changed

+185
-3
lines changed

CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ set(SOURCE_SETUPWIZARD_DIR "${CMAKE_SOURCE_DIR}/src/setupwizard")
2121
set(SOURCE_PREFERENCES_DIR "${CMAKE_SOURCE_DIR}/src/preferences")
2222
set(SOURCE_SKINSURL_DIR "${CMAKE_SOURCE_DIR}/src/skinsurl")
2323
set(SOURCE_COMMANDS_DIR "${CMAKE_SOURCE_DIR}/src/commands")
24+
set(SOURCE_BACKUP_DIR "${CMAKE_SOURCE_DIR}/src/backup")
2425

2526
include_directories(${FORMS_DIR})
2627
include_directories(${SOURCE_DIR})
@@ -32,6 +33,7 @@ include_directories(${SOURCE_SETUPWIZARD_DIR})
3233
include_directories(${SOURCE_PREFERENCES_DIR})
3334
include_directories(${SOURCE_SKINSURL_DIR})
3435
include_directories(${SOURCE_COMMANDS_DIR})
36+
include_directories(${SOURCE_BACKUP_DIR})
3537

3638
file(GLOB_RECURSE SOURCES
3739
${FORMS_DIR}/*.cpp
@@ -51,6 +53,8 @@ file(GLOB_RECURSE SOURCES
5153
${SOURCE_SKINSURL_DIR}/*.cpp
5254
${SOURCE_COMMANDS_DIR}/*.h
5355
${SOURCE_COMMANDS_DIR}/*.cpp
56+
${SOURCE_BACKUP_DIR}/*.h
57+
${SOURCE_BACKUP_DIR}/*.cpp
5458
${SOURCE_DIR}/*.h
5559
${SOURCE_DIR}/*.cpp
5660
resources.qrc

forms/preferences.ui

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,15 @@
6868
<normaloff>:/images/resources/images/osu_logo.png</normaloff>:/images/resources/images/osu_logo.png</iconset>
6969
</property>
7070
</item>
71+
<item>
72+
<property name="text">
73+
<string>Backup &amp; Restore</string>
74+
</property>
75+
<property name="icon">
76+
<iconset resource="../resources.qrc">
77+
<normaloff>:/images/resources/images/backup_and_restore.png</normaloff>:/images/resources/images/backup_and_restore.png</iconset>
78+
</property>
79+
</item>
7180
<item>
7281
<property name="text">
7382
<string>Themes</string>
@@ -310,6 +319,24 @@
310319
</item>
311320
</layout>
312321
</widget>
322+
<widget class="QWidget" name="page">
323+
<layout class="QGridLayout" name="gridLayout_2">
324+
<item row="0" column="0">
325+
<widget class="QPushButton" name="backupBtn">
326+
<property name="text">
327+
<string>Backup</string>
328+
</property>
329+
</widget>
330+
</item>
331+
<item row="0" column="1">
332+
<widget class="QPushButton" name="restoreBtn">
333+
<property name="text">
334+
<string>Restore</string>
335+
</property>
336+
</widget>
337+
</item>
338+
</layout>
339+
</widget>
313340
<widget class="QWidget" name="themesPage">
314341
<layout class="QGridLayout" name="gridLayout_6">
315342
<item row="0" column="0" colspan="4">

resources.qrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44
<file>resources/images/gosumemory.ico</file>
55
<file>resources/images/twitch_logo.png</file>
66
<file>resources/images/osu_logo.png</file>
7+
<file>resources/images/backup_and_restore.png</file>
78
</qresource>
89
</RCC>
903 Bytes
Loading

src/backup/backup.cpp

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#include "backup.h"
2+
3+
Backup::Backup(QObject *parent)
4+
: QObject{parent}
5+
{
6+
}
7+
8+
void Backup::backup(QString filePath, bool includeSensitiveInfo)
9+
{
10+
11+
if (filePath.isEmpty()) {
12+
return;
13+
}
14+
15+
// adding .json if needed
16+
if(!filePath.endsWith(".json")) {
17+
filePath.append(".json");
18+
}
19+
20+
QFile file(filePath);
21+
if (!(file.open(QIODevice::WriteOnly | QIODevice::Text))) {
22+
qDebug() << "[Backup] Cannot open file in write mode";
23+
file.close();
24+
return;
25+
}
26+
27+
qDebug() << "[Backup] Starting backup...";
28+
// adding all the keys in a json object and converting it into a string
29+
QJsonObject jsonObject;
30+
QSettings settings;
31+
QStringList keys = settings.allKeys();
32+
33+
// sensitive info must be excluded
34+
if(!includeSensitiveInfo) {
35+
keys.removeIf([](const QString& key){
36+
return key.startsWith("osuirc") || key.startsWith("twitch");
37+
});
38+
}
39+
40+
for(const QString& key: keys){
41+
QString value = settings.value(key).toString();
42+
jsonObject.insert(key, QJsonValue(value));
43+
}
44+
QString jsonString = QJsonDocument(jsonObject).toJson();
45+
46+
// saving the backup
47+
QTextStream stream(&file);
48+
stream << jsonString;
49+
file.close();
50+
qDebug() << "[Backup] Backup completed";
51+
}
52+
53+
void Backup::restore(QString filePath)
54+
{
55+
if (filePath.isEmpty()) {
56+
return;
57+
}
58+
59+
QFile file(filePath);
60+
if (!(file.open(QIODevice::ReadOnly | QIODevice::Text))) {
61+
qDebug() << "[Backup] Cannot open file in read mode";
62+
file.close();
63+
return;
64+
}
65+
66+
qDebug() << "[Backup] Starting backup restore...";
67+
QTextStream stream(&file);
68+
QString jsonString = stream.readAll();
69+
file.close();
70+
71+
QSettings settings;
72+
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());
73+
if (!jsonDoc.isNull()){
74+
QJsonObject jsonObject = jsonDoc.object();
75+
for (auto it = jsonObject.begin(); it != jsonObject.end(); ++it) {
76+
QString key = it.key();
77+
QJsonValue value = it.value();
78+
79+
settings.setValue(key, value.toString());
80+
}
81+
}
82+
qDebug() << "[Backup] Backup restored successfully";
83+
}

src/backup/backup.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#ifndef BACKUP_H
2+
#define BACKUP_H
3+
4+
#include <QDebug>
5+
#include <QFile>
6+
#include <QJsonDocument>
7+
#include <QJsonObject>
8+
#include <QJsonValue>
9+
#include <QMessageBox>
10+
#include <QObject>
11+
#include <QSettings>
12+
13+
class Backup : public QObject
14+
{
15+
Q_OBJECT
16+
public:
17+
explicit Backup(QObject *parent = nullptr);
18+
static void backup(QString filePath, bool includeSensitiveInfo);
19+
static void restore(QString filePath);
20+
21+
};
22+
23+
#endif // BACKUP_H

src/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ int main(int argc, char **argv) {
77
app.setOrganizationName("miraya");
88
app.setOrganizationDomain("github.com/MirayaProject");
99
app.setApplicationName("bot");
10-
app.setApplicationVersion("1.2.0-alpha.1");
10+
app.setApplicationVersion("1.2.0-alpha.2");
1111
MainWindow mw;
1212
mw.show();
1313
return app.exec();

src/preferences/preferences.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ Preferences::Preferences(QWidget *parent) :
88
ui->setupUi(this);
99
connect(ui->listWidget, &QListWidget::currentItemChanged, this, &Preferences::on_listWidget_currentItemChanged);
1010
connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &Preferences::on_saveBtnClicked);
11+
connect(ui->backupBtn, &QPushButton::clicked, this, &Preferences::on_backupBtn_clicked);
12+
connect(ui->restoreBtn, &QPushButton::clicked, this, &Preferences::on_restoreBtn_clicked);
1113
ui->listWidget->setCurrentRow(0);
1214
loadSettings();
1315
setupUi();
@@ -123,6 +125,37 @@ void Preferences::saveSettings()
123125
}
124126

125127

128+
void Preferences::on_backupBtn_clicked()
129+
{
130+
QString message = QString("%1<br>%2").arg(
131+
"Would you like to include sensitive informations in your backup file?",
132+
"Anyone that has this information <b>will be able to access your accounts!</b>"
133+
);
134+
135+
auto buttonAnswer = QMessageBox().question(
136+
this,
137+
"Sensitive information",
138+
message,
139+
QMessageBox::No | QMessageBox::Yes,
140+
QMessageBox::No
141+
);
142+
bool includeSensitiveInfo = buttonAnswer == QMessageBox::Yes;
143+
144+
QString filePath = QFileDialog::getSaveFileName(nullptr, "Export Settings", QString(), "JSON Files (*.json)");
145+
Backup::backup(filePath, includeSensitiveInfo);
146+
}
147+
148+
149+
void Preferences::on_restoreBtn_clicked()
150+
{
151+
QString filePath = QFileDialog::getOpenFileName(nullptr, "Import Settings", QString(), "JSON Files (*.json)");
152+
Backup::restore(filePath);
153+
// reloading
154+
loadSettings();
155+
QMessageBox().information(this, "Backup Restored", "Backup restored successfully");
156+
}
157+
158+
126159
void Preferences::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
127160
{
128161
if (current == nullptr)

src/preferences/preferences.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,17 @@
22
#define PREFERENCES_H
33

44
#include <QDialog>
5-
#include <QSettings>
6-
#include <QMessageBox>
5+
#include <QFile>
6+
#include <QFileDialog>
7+
#include <QJsonDocument>
8+
#include <QJsonObject>
9+
#include <QJsonValue>
710
#include <QListWidgetItem>
11+
#include <QMessageBox>
12+
#include <QSettings>
13+
#include <QTextStream>
14+
15+
#include "backup.h"
816

917
namespace Ui {
1018
class Preferences;
@@ -28,7 +36,10 @@ class Preferences : public QDialog
2836
void loadThemeSettings();
2937
void setupUi();
3038
void saveSettings();
39+
3140
void on_saveBtnClicked();
41+
void on_backupBtn_clicked();
42+
void on_restoreBtn_clicked();
3243
void on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
3344

3445
signals:

0 commit comments

Comments
 (0)