summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordaniel-Jones <daniel@danieljon.es>2016-08-16 08:20:06 +0930
committerdaniel-Jones <daniel@danieljon.es>2016-08-16 08:25:42 +0930
commita2cbf0f5948c89334511aff60df12f4a77b4bb5e (patch)
tree338a56696894e8f5f633a99ee0afce2a4b2b466e
parentca548026050c9643c82640cb46926545c2114949 (diff)
downloadcsgo_stats-a2cbf0f5948c89334511aff60df12f4a77b4bb5e.tar.gz
csgo_stats-a2cbf0f5948c89334511aff60df12f4a77b4bb5e.zip
Many changes to the stat viewer - work on the stat viewer halted for now. I have added CS:GO game integration. You can now view live game information. Uses port 3000 (see the CS:GO wiki for setting up game integration).
-rw-r--r--csgo_images.qrc27
-rw-r--r--csgo_stats.pro19
-rw-r--r--csgo_stats.pro.user2
-rw-r--r--file_download.cpp3
-rw-r--r--file_download.h2
-rw-r--r--game_integration_window.cpp153
-rw-r--r--game_integration_window.h60
-rw-r--r--game_integration_window.ui148
-rw-r--r--graphical_stats.cpp54
-rw-r--r--graphical_stats.h33
-rw-r--r--graphical_stats.ui31
-rw-r--r--icons/CT.pngbin0 -> 10743 bytes
-rw-r--r--icons/T.pngbin0 -> 16137 bytes
-rw-r--r--maps/images/ar_baggage.pngbin0 -> 71656 bytes
-rw-r--r--maps/images/ar_monastery.pngbin0 -> 73961 bytes
-rw-r--r--maps/images/ar_shoots.pngbin0 -> 72751 bytes
-rw-r--r--maps/images/cs_assault.pngbin0 -> 74883 bytes
-rw-r--r--maps/images/cs_italy.pngbin0 -> 72665 bytes
-rw-r--r--maps/images/cs_militia.pngbin0 -> 79212 bytes
-rw-r--r--maps/images/cs_office.pngbin0 -> 74271 bytes
-rw-r--r--maps/images/de_aztec.pngbin0 -> 70933 bytes
-rw-r--r--maps/images/de_bank.pngbin0 -> 85829 bytes
-rw-r--r--maps/images/de_cache.pngbin0 -> 80526 bytes
-rw-r--r--maps/images/de_cbble.pngbin0 -> 69662 bytes
-rw-r--r--maps/images/de_dust.pngbin0 -> 72376 bytes
-rw-r--r--maps/images/de_dust2.pngbin0 -> 71462 bytes
-rw-r--r--maps/images/de_inferno.pngbin0 -> 75376 bytes
-rw-r--r--maps/images/de_lake.pngbin0 -> 71540 bytes
-rw-r--r--maps/images/de_mirage.pngbin0 -> 75841 bytes
-rw-r--r--maps/images/de_nuke.pngbin0 -> 83632 bytes
-rw-r--r--maps/images/de_overpass.pngbin0 -> 73014 bytes
-rw-r--r--maps/images/de_safehouse.pngbin0 -> 87045 bytes
-rw-r--r--maps/images/de_shortdust.pngbin0 -> 76646 bytes
-rw-r--r--maps/images/de_shorttrain.pngbin0 -> 69004 bytes
-rw-r--r--maps/images/de_stmarc.pngbin0 -> 75710 bytes
-rw-r--r--maps/images/de_sugarcane.pngbin0 -> 75946 bytes
-rw-r--r--maps/images/de_train.pngbin0 -> 69004 bytes
-rw-r--r--maps/images/de_vertigo.pngbin0 -> 74322 bytes
-rw-r--r--message_box.cpp26
-rw-r--r--message_box.h13
-rw-r--r--parse_file.h2
-rw-r--r--stats_display_window.cpp27
-rw-r--r--stats_display_window.h23
-rw-r--r--stats_display_window.ui196
-rw-r--r--user_management.cpp16
-rw-r--r--user_management.h2
-rw-r--r--user_select_dialog.cpp4
47 files changed, 735 insertions, 106 deletions
diff --git a/csgo_images.qrc b/csgo_images.qrc
index 5ae9dad..7c4dd35 100644
--- a/csgo_images.qrc
+++ b/csgo_images.qrc
@@ -4,6 +4,8 @@
<file>icons/avatar.jpg</file>
<file>icons/domination.png</file>
<file>icons/suicide.png</file>
+ <file>icons/CT.png</file>
+ <file>icons/T.png</file>
</qresource>
<qresource prefix="/weapons">
<file>weapons/ak47.png</file>
@@ -82,5 +84,30 @@
<file>maps/de_sugarcane.png</file>
<file>maps/de_train.png</file>
<file>maps/de_vertigo.png</file>
+ <file>maps/images/ar_baggage.png</file>
+ <file>maps/images/ar_monastery.png</file>
+ <file>maps/images/ar_shoots.png</file>
+ <file>maps/images/cs_assault.png</file>
+ <file>maps/images/cs_italy.png</file>
+ <file>maps/images/cs_militia.png</file>
+ <file>maps/images/cs_office.png</file>
+ <file>maps/images/de_aztec.png</file>
+ <file>maps/images/de_bank.png</file>
+ <file>maps/images/de_cache.png</file>
+ <file>maps/images/de_cbble.png</file>
+ <file>maps/images/de_dust.png</file>
+ <file>maps/images/de_dust2.png</file>
+ <file>maps/images/de_inferno.png</file>
+ <file>maps/images/de_lake.png</file>
+ <file>maps/images/de_mirage.png</file>
+ <file>maps/images/de_nuke.png</file>
+ <file>maps/images/de_overpass.png</file>
+ <file>maps/images/de_safehouse.png</file>
+ <file>maps/images/de_shortdust.png</file>
+ <file>maps/images/de_shorttrain.png</file>
+ <file>maps/images/de_stmarc.png</file>
+ <file>maps/images/de_sugarcane.png</file>
+ <file>maps/images/de_train.png</file>
+ <file>maps/images/de_vertigo.png</file>
</qresource>
</RCC>
diff --git a/csgo_stats.pro b/csgo_stats.pro
index bc584ff..8f33dd8 100644
--- a/csgo_stats.pro
+++ b/csgo_stats.pro
@@ -3,8 +3,7 @@
# Project created by QtCreator 2016-07-21T13:21:39
#
#-------------------------------------------------
-
-QT += core gui network
+QT += core gui network datavisualization charts
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
@@ -17,17 +16,27 @@ SOURCES += main.cpp\
file_download.cpp \
stats_display_window.cpp \
parse_file.cpp \
- user_management.cpp
+ user_management.cpp \
+ message_box.cpp \
+ graphical_stats.cpp \
+ game_integration_window.cpp
HEADERS += user_select_dialog.h \
file_download.h \
stats_display_window.h \
parse_file.h \
- user_management.h
+ user_management.h \
+ message_box.h \
+ graphical_stats.h \
+ game_integration_window.h
FORMS += user_select_dialog.ui \
stats_display_window.ui \
- user_management.ui
+ user_management.ui \
+ graphical_stats.ui \
+ game_integration_window.ui
RESOURCES += \
csgo_images.qrc
+
+DISTFILES +=
diff --git a/csgo_stats.pro.user b/csgo_stats.pro.user
index 85df869..b44f029 100644
--- a/csgo_stats.pro.user
+++ b/csgo_stats.pro.user
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.0.3, 2016-07-30T08:47:12. -->
+<!-- Written by QtCreator 4.0.3, 2016-08-14T16:55:30. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
diff --git a/file_download.cpp b/file_download.cpp
index c155f8b..add1207 100644
--- a/file_download.cpp
+++ b/file_download.cpp
@@ -24,5 +24,8 @@ int file_download::file_download::download_file(QString url, QString save_locati
if (QFile::exists(save_location) && file.size() > 0)
return 1; /* file downloaded - could just be a blank file at this point */
else
+ {
+ msgbox.info_box("Unable to download file", "Notice");
return 0; /* file did not download */
+ }
}
diff --git a/file_download.h b/file_download.h
index f8e1a94..d8ebd37 100644
--- a/file_download.h
+++ b/file_download.h
@@ -5,6 +5,7 @@
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QFile>
+#include "message_box.h"
class file_download
{
@@ -14,6 +15,7 @@ public:
private:
QNetworkAccessManager http;
QEventLoop loop;
+ message_box msgbox;
};
#endif // FILE_DOWNLOAD_H
diff --git a/game_integration_window.cpp b/game_integration_window.cpp
new file mode 100644
index 0000000..b929b41
--- /dev/null
+++ b/game_integration_window.cpp
@@ -0,0 +1,153 @@
+#include "game_integration_window.h"
+#include "ui_game_integration_window.h"
+
+game_integration_window::game_integration_window(QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::game_integration_window)
+{
+ ui->setupUi(this);
+ server = new QTcpServer(this); /* create our server */
+ connect(this, SIGNAL(window_loaded()), this, SLOT(window_open()));
+ connect(server, SIGNAL(newConnection()), this, SLOT(new_connection()));
+ ui->map_picture_label->setTextFormat(Qt::RichText);
+ ui->ct_label->setTextFormat(Qt::RichText);
+ ui->t_label->setTextFormat(Qt::RichText);
+ ui->ct_label->setText("<center><img src=:/icons/icons/CT.png></center>");
+ ui->t_label->setText("<center><img src=:/icons/icons/T.png></center>");
+}
+
+game_integration_window::~game_integration_window()
+{
+ server->close();
+ delete ui;
+}
+
+void game_integration_window::write_console(QString color, QString line)
+{
+ ui->console->append("<font color=" + color + ">" + line + "</font>");
+}
+
+void game_integration_window::handle_data(QString data)
+{
+ /*
+ * here we will handle our JSON data
+ * first, split it so we only have the JSON data, no post headers
+ * then we setup our json parser
+ * we need to create a qvariantmap for each section we are subscribed to:
+ * - map
+ * - round
+ * - player_id
+ * - player_state
+ * - match_stats
+ */
+ data = "{" + data.section('{', 1);
+ game.json_doc = QJsonDocument::fromJson(data.toUtf8());
+ if (!game.json_doc.isEmpty())
+ {
+ game.json_object = game.json_doc.object();
+ game.main_map = game.json_object.toVariantMap();
+ game.map_map = game.main_map["map"].toMap();
+ game.player_map = game.main_map["player"].toMap();
+ game.round_map = game.player_map["round"].toMap();
+ game.weapon_map = game.player_map["weapons"].toMap();
+ game.stats_map = game.player_map["match_stats"].toMap();
+ game.ct_score_map = game.map_map["team_ct"].toMap();
+ game.t_score_map = game.map_map["team_t"].toMap();
+ display_data();
+ }
+}
+
+void game_integration_window::display_data()
+{
+ /* in this function we dynamically display the user data on the GUI */
+ if (game.current_user_id != game.player_map["steam_id"].toString()) /* if our name has not changed, don't update it */
+ {
+ write_console("red", "changing user ID");
+ game.current_user_id = game.player_map["steam_id"].toString();
+ }
+ if (game.current_map != game.map_map["name"].toString()) /* if our map has not changed, don't update it */
+ {
+ game.current_map = game.map_map["name"].toString();
+ ui->map_picture_label->setText("<img src=:/maps/maps/images/" + game.current_map + ".png /> <br />" + game.current_map);
+ }
+ if (game.current_team != game.player_map["team"].toString()) /* if our team has not changed, don't update */
+ {
+ game.current_team = game.player_map["team"].toString();
+ if (game.current_team == "T")
+ ui->player_team_label->setText("Terrorist");
+ if (game.current_team == "CT")
+ ui->player_team_label->setText("Counter Terrorist");
+ }
+ ui->player_name_label->setText("<font size = 15>" + game.player_map["name"].toString() + "</font>");
+ ui->player_score_label->setText("Score: " + game.stats_map["score"].toString());
+ ui->ct_score_label->setText("<center>" + game.ct_score_map["score"].toString() + "</center>");
+ ui->t_score_label->setText("<center>" + game.t_score_map["score"].toString() + "</center>");
+ ui->round_number_label->setText("<center><font size = 10> Round <br />" + game.map_map["round"].toString() + "</font></center>");
+ ui->kills_label->setText("Kills: " + game.stats_map["kills"].toString());
+ ui->deaths_label->setText("Deaths: " + game.stats_map["deaths"].toString());
+}
+
+void game_integration_window::showEvent(QShowEvent *ev)
+{
+ emit window_loaded();
+}
+
+void game_integration_window::window_open()
+{
+ write_console("green", "Game Integration window open");
+ ui->start_server_button->setEnabled(true);
+ ui->stop_server_button->setEnabled(false);
+}
+
+void game_integration_window::new_connection()
+{
+ /* this is ugly code - it just works, I believe this is a HORRIBLE way to do it */
+ /*
+ * new connection found, things to do:
+ * - create socket
+ * - wait for it to be ready to read
+ * - read all data
+ * - send it to be handled elsewhere
+ * - close our socket
+ */
+ QTcpSocket *socket; /* our socket instance */
+ socket = server->nextPendingConnection();
+ socket->waitForReadyRead(1000); /* one second of tolerence */
+ handle_data(QString(socket->readAll()));
+ socket->close();
+ delete socket;
+}
+
+void game_integration_window::on_start_server_button_clicked()
+{
+ /* here we start our server */
+ if (server->listen(QHostAddress::LocalHost, 3000))
+ {
+ /* start the server */
+ write_console("blue", "Server started, waiting for data");
+ ui->start_server_button->setEnabled(false);
+ ui->stop_server_button->setEnabled(true);
+ } else
+ {
+ /* server msut be running or some other error */
+ write_console("red", "Server cannot be started");
+ }
+}
+
+void game_integration_window::on_stop_server_button_clicked()
+{
+ if (server->isListening())
+ {
+ /* close our server */
+ server->close();
+ ui->start_server_button->setEnabled(true);
+ ui->stop_server_button->setEnabled(false);
+ write_console("blue", "Server stopped");
+ }
+}
+
+void game_integration_window::on_close_window_button_clicked()
+{
+ server->close();
+ this->close();
+}
diff --git a/game_integration_window.h b/game_integration_window.h
new file mode 100644
index 0000000..80eae3e
--- /dev/null
+++ b/game_integration_window.h
@@ -0,0 +1,60 @@
+#ifndef GAME_INTEGRATION_WINDOW_H
+#define GAME_INTEGRATION_WINDOW_H
+
+#include <QWidget>
+#include <QDebug>
+#include <QTcpServer>
+#include <QTcpSocket>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QJsonArray>
+
+namespace Ui {
+class game_integration_window;
+}
+
+class game_integration_window : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit game_integration_window(QWidget *parent = 0);
+ ~game_integration_window();
+
+private:
+ Ui::game_integration_window *ui;
+ void write_console(QString color, QString line);
+ void handle_data(QString data);
+ void display_data();
+ QTcpServer *server; /* our server instance */
+ struct game_data {
+ QJsonDocument json_doc;
+ QJsonObject json_object;
+ QVariantMap main_map;
+ QVariantMap map_map;
+ QVariantMap player_map;
+ QVariantMap round_map;
+ QVariantMap weapon_map;
+ QVariantMap stats_map;
+ QVariantMap ct_score_map;
+ QVariantMap t_score_map;
+ QString current_user_id;
+ QString current_map;
+ QString current_team;
+ } game;
+
+protected:
+ void showEvent(QShowEvent *ev);
+
+signals:
+ void window_loaded();
+
+private slots:
+ void window_open();
+ void new_connection();
+ void on_start_server_button_clicked();
+ void on_stop_server_button_clicked();
+ void on_close_window_button_clicked();
+};
+
+#endif // GAME_INTEGRATION_WINDOW_H
diff --git a/game_integration_window.ui b/game_integration_window.ui
new file mode 100644
index 0000000..07776a5
--- /dev/null
+++ b/game_integration_window.ui
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>game_integration_window</class>
+ <widget class="QWidget" name="game_integration_window">
+ <property name="windowModality">
+ <enum>Qt::WindowModal</enum>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Game Integration</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QFormLayout" name="player_layout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="map_picture_label">
+ <property name="text">
+ <string>map_picture</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <layout class="QFormLayout" name="player_info_layout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="player_name_label">
+ <property name="text">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:14pt;&quot;&gt;player_name&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="player_team_label">
+ <property name="text">
+ <string>player_team</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="player_score_label">
+ <property name="text">
+ <string>player_score</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="kills_label">
+ <property name="text">
+ <string>kills_count</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="deaths_label">
+ <property name="text">
+ <string>deaths_count</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="team_icon_layout">
+ <item>
+ <widget class="QLabel" name="ct_label">
+ <property name="text">
+ <string>CT_label</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="round_number_label">
+ <property name="text">
+ <string>round_number</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="t_label">
+ <property name="text">
+ <string>T_label</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="team_score_layout">
+ <item row="0" column="2">
+ <widget class="QLabel" name="t_score_label">
+ <property name="text">
+ <string>T_score</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="buffer_label">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="ct_score_label">
+ <property name="text">
+ <string>CT_score</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QTextEdit" name="console"/>
+ </item>
+ <item>
+ <widget class="QPushButton" name="start_server_button">
+ <property name="text">
+ <string>Start server</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="stop_server_button">
+ <property name="text">
+ <string>Stop server</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="close_window_button">
+ <property name="text">
+ <string>Close window</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/graphical_stats.cpp b/graphical_stats.cpp
new file mode 100644
index 0000000..e88d7bb
--- /dev/null
+++ b/graphical_stats.cpp
@@ -0,0 +1,54 @@
+#include "graphical_stats.h"
+#include "ui_graphical_stats.h"
+
+graphical_stats::graphical_stats(QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::graphical_stats)
+{
+ ui->setupUi(this);
+
+ connect(this, SIGNAL(window_loaded()), this, SLOT(window_open()), Qt::ConnectionType(Qt::QueuedConnection | Qt::UniqueConnection));
+}
+
+graphical_stats::~graphical_stats()
+{
+ delete ui;
+}
+
+void graphical_stats::weapon_use_graph()
+{
+ QPieSeries *series = new QPieSeries();
+ for (int x = 0; x < 5; x ++)
+ {
+ series->append(QString::number(x), 1000);
+ QPieSlice *slice = series->slices().at(x);
+ slice->setExploded();
+ slice->setLabelVisible();
+ slice->setPen(QPen(Qt::darkGreen, 2));
+ slice->setBrush(Qt::green);
+ }
+
+
+ QChart *chart = new QChart();
+ chart->addSeries(series);
+ chart->setTitle("Simple chart");
+ chart->legend()->hide();
+ QGraphicsScene *scene = new QGraphicsScene;
+ scene->addItem(chart);
+ scene->addText("test");
+ ui->graphicsView->setScene(scene);
+}
+
+void graphical_stats::window_open()
+{
+ /*
+ * our graphicals stats are ready to be done
+ * setup our first graph
+ */
+ weapon_use_graph();
+}
+
+void graphical_stats::showEvent(QShowEvent *ev)
+{
+ emit window_loaded();
+}
diff --git a/graphical_stats.h b/graphical_stats.h
new file mode 100644
index 0000000..948d8de
--- /dev/null
+++ b/graphical_stats.h
@@ -0,0 +1,33 @@
+#ifndef GRAPHICAL_STATS_H
+#define GRAPHICAL_STATS_H
+#include <QWidget>
+#include <QtCharts/QChartView>
+#include <QtCharts/QPieSeries>
+#include <QtCharts/QPieSlice>
+#include <QtCharts>
+#include <QDebug>
+
+namespace Ui {
+class graphical_stats;
+}
+
+class graphical_stats : public QWidget
+{
+ Q_OBJECT
+protected:
+ void showEvent(QShowEvent *ev);
+signals:
+ void window_loaded();
+public:
+ explicit graphical_stats(QWidget *parent = 0);
+ ~graphical_stats();
+
+private:
+ Ui::graphical_stats *ui;
+ void weapon_use_graph();
+
+private slots:
+ void window_open();
+};
+
+#endif // GRAPHICAL_STATS_H
diff --git a/graphical_stats.ui b/graphical_stats.ui
new file mode 100644
index 0000000..da8cf48
--- /dev/null
+++ b/graphical_stats.ui
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>graphical_stats</class>
+ <widget class="QWidget" name="graphical_stats">
+ <property name="windowModality">
+ <enum>Qt::WindowModal</enum>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Graphical stats</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QGraphicsView" name="graphicsView">
+ <property name="sizeAdjustPolicy">
+ <enum>QAbstractScrollArea::AdjustToContents</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/icons/CT.png b/icons/CT.png
new file mode 100644
index 0000000..be58703
--- /dev/null
+++ b/icons/CT.png
Binary files differ
diff --git a/icons/T.png b/icons/T.png
new file mode 100644
index 0000000..8e83fb8
--- /dev/null
+++ b/icons/T.png
Binary files differ
diff --git a/maps/images/ar_baggage.png b/maps/images/ar_baggage.png
new file mode 100644
index 0000000..8ed7c67
--- /dev/null
+++ b/maps/images/ar_baggage.png
Binary files differ
diff --git a/maps/images/ar_monastery.png b/maps/images/ar_monastery.png
new file mode 100644
index 0000000..3767f8b
--- /dev/null
+++ b/maps/images/ar_monastery.png
Binary files differ
diff --git a/maps/images/ar_shoots.png b/maps/images/ar_shoots.png
new file mode 100644
index 0000000..69565cf
--- /dev/null
+++ b/maps/images/ar_shoots.png
Binary files differ
diff --git a/maps/images/cs_assault.png b/maps/images/cs_assault.png
new file mode 100644
index 0000000..8a5f873
--- /dev/null
+++ b/maps/images/cs_assault.png
Binary files differ
diff --git a/maps/images/cs_italy.png b/maps/images/cs_italy.png
new file mode 100644
index 0000000..6c1f0a3
--- /dev/null
+++ b/maps/images/cs_italy.png
Binary files differ
diff --git a/maps/images/cs_militia.png b/maps/images/cs_militia.png
new file mode 100644
index 0000000..5fa26d1
--- /dev/null
+++ b/maps/images/cs_militia.png
Binary files differ
diff --git a/maps/images/cs_office.png b/maps/images/cs_office.png
new file mode 100644
index 0000000..026b730
--- /dev/null
+++ b/maps/images/cs_office.png
Binary files differ
diff --git a/maps/images/de_aztec.png b/maps/images/de_aztec.png
new file mode 100644
index 0000000..e5c7fb8
--- /dev/null
+++ b/maps/images/de_aztec.png
Binary files differ
diff --git a/maps/images/de_bank.png b/maps/images/de_bank.png
new file mode 100644
index 0000000..3dbc27f
--- /dev/null
+++ b/maps/images/de_bank.png
Binary files differ
diff --git a/maps/images/de_cache.png b/maps/images/de_cache.png
new file mode 100644
index 0000000..e9eead1
--- /dev/null
+++ b/maps/images/de_cache.png
Binary files differ
diff --git a/maps/images/de_cbble.png b/maps/images/de_cbble.png
new file mode 100644
index 0000000..e7bb381
--- /dev/null
+++ b/maps/images/de_cbble.png
Binary files differ
diff --git a/maps/images/de_dust.png b/maps/images/de_dust.png
new file mode 100644
index 0000000..0e4f0a9
--- /dev/null
+++ b/maps/images/de_dust.png
Binary files differ
diff --git a/maps/images/de_dust2.png b/maps/images/de_dust2.png
new file mode 100644
index 0000000..a855b22
--- /dev/null
+++ b/maps/images/de_dust2.png
Binary files differ
diff --git a/maps/images/de_inferno.png b/maps/images/de_inferno.png
new file mode 100644
index 0000000..8736477
--- /dev/null
+++ b/maps/images/de_inferno.png
Binary files differ
diff --git a/maps/images/de_lake.png b/maps/images/de_lake.png
new file mode 100644
index 0000000..6cc1f99
--- /dev/null
+++ b/maps/images/de_lake.png
Binary files differ
diff --git a/maps/images/de_mirage.png b/maps/images/de_mirage.png
new file mode 100644
index 0000000..582199e
--- /dev/null
+++ b/maps/images/de_mirage.png
Binary files differ
diff --git a/maps/images/de_nuke.png b/maps/images/de_nuke.png
new file mode 100644
index 0000000..23f643e
--- /dev/null
+++ b/maps/images/de_nuke.png
Binary files differ
diff --git a/maps/images/de_overpass.png b/maps/images/de_overpass.png
new file mode 100644
index 0000000..ff6a97c
--- /dev/null
+++ b/maps/images/de_overpass.png
Binary files differ
diff --git a/maps/images/de_safehouse.png b/maps/images/de_safehouse.png
new file mode 100644
index 0000000..eb0fd9c
--- /dev/null
+++ b/maps/images/de_safehouse.png
Binary files differ
diff --git a/maps/images/de_shortdust.png b/maps/images/de_shortdust.png
new file mode 100644
index 0000000..de8d47a
--- /dev/null
+++ b/maps/images/de_shortdust.png
Binary files differ
diff --git a/maps/images/de_shorttrain.png b/maps/images/de_shorttrain.png
new file mode 100644
index 0000000..b053c75
--- /dev/null
+++ b/maps/images/de_shorttrain.png
Binary files differ
diff --git a/maps/images/de_stmarc.png b/maps/images/de_stmarc.png
new file mode 100644
index 0000000..05acba9
--- /dev/null
+++ b/maps/images/de_stmarc.png
Binary files differ
diff --git a/maps/images/de_sugarcane.png b/maps/images/de_sugarcane.png
new file mode 100644
index 0000000..13ced9c
--- /dev/null
+++ b/maps/images/de_sugarcane.png
Binary files differ
diff --git a/maps/images/de_train.png b/maps/images/de_train.png
new file mode 100644
index 0000000..b053c75
--- /dev/null
+++ b/maps/images/de_train.png
Binary files differ
diff --git a/maps/images/de_vertigo.png b/maps/images/de_vertigo.png
new file mode 100644
index 0000000..ece0fe4
--- /dev/null
+++ b/maps/images/de_vertigo.png
Binary files differ
diff --git a/message_box.cpp b/message_box.cpp
new file mode 100644
index 0000000..65ef798
--- /dev/null
+++ b/message_box.cpp
@@ -0,0 +1,26 @@
+#include "message_box.h"
+
+message_box::message_box()
+{
+
+}
+
+void message_box::info_box(QString message, QString title)
+{
+ QMessageBox msgbox;
+ msgbox.setWindowTitle(title);
+ msgbox.setText(message);
+ msgbox.exec();
+}
+
+int message_box::confirm_box(QString warning, QString message, QString title)
+{
+ /* returns 1 for yes, 0 for no */
+ QMessageBox msgbox;
+ msgbox.setWindowTitle(title);
+ msgbox.setText(warning);
+ msgbox.setInformativeText(message);
+ msgbox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
+ msgbox.setDefaultButton(QMessageBox::No);
+ return msgbox.exec();
+}
diff --git a/message_box.h b/message_box.h
new file mode 100644
index 0000000..cf1cf08
--- /dev/null
+++ b/message_box.h
@@ -0,0 +1,13 @@
+#ifndef MESSAGE_BOX_H
+#define MESSAGE_BOX_H
+#include <QMessageBox>
+
+class message_box
+{
+public:
+ message_box();
+ void info_box(QString message, QString title);
+ int confirm_box(QString warning, QString message, QString title);
+};
+
+#endif // MESSAGE_BOX_H
diff --git a/parse_file.h b/parse_file.h
index 25b0aa6..9c2faae 100644
--- a/parse_file.h
+++ b/parse_file.h
@@ -3,6 +3,7 @@
#include <QFile>
#include <QDebug>
#include <QTextStream>
+#include "message_box.h"
class parse_file
{
@@ -16,6 +17,7 @@ public:
QStringList usernames;
QStringList userids;
void delete_user(QString user);
+ message_box msgbox;
void add_user(QString user);
};
diff --git a/stats_display_window.cpp b/stats_display_window.cpp
index 577586e..5e9b570 100644
--- a/stats_display_window.cpp
+++ b/stats_display_window.cpp
@@ -7,6 +7,7 @@ stats_display_window::stats_display_window(QWidget *parent) :
{
ui->setupUi(this);
connect(this, SIGNAL(window_loaded()), this, SLOT(window_open()), Qt::ConnectionType(Qt::QueuedConnection | Qt::UniqueConnection));
+ ui->graphical_view_button->hide(); /* will i ever do this? */
}
stats_display_window::~stats_display_window()
@@ -14,6 +15,13 @@ stats_display_window::~stats_display_window()
delete ui;
}
+QStringList stats_display_window::get_most_kills_gun()
+{
+ QStringList ret;
+ ret << "1" << "2";
+ return ret;
+}
+
void stats_display_window::setup_user()
{
/*
@@ -27,7 +35,11 @@ void stats_display_window::setup_user()
user.user_64id = parse.parse_user_data("\"steamid\":", ": ");
download.download_file(user.avatar_url, "avatar.jpg");
/* now we have to deal with our user account details */
- ui->username_label->setText(user.username.left(15));
+ if (user.username.length() > 15)
+ {
+ ui->username_label->setText(user.username.left(15) + "[...]");
+ } else
+ ui->username_label->setText(user.username);
if (user.realname == "null")
ui->realname_label->setText("Real name not set");
else
@@ -222,3 +234,16 @@ void stats_display_window::on_manage_users_button_clicked()
{
manage.show();
}
+
+void stats_display_window::on_graphical_view_button_clicked()
+{
+ graphs.show();
+}
+
+void stats_display_window::on_game_integration_button_clicked()
+{
+ /*
+ * game state integration
+ */
+ game.show();
+}
diff --git a/stats_display_window.h b/stats_display_window.h
index 7748097..5da3bc9 100644
--- a/stats_display_window.h
+++ b/stats_display_window.h
@@ -4,9 +4,16 @@
#include <QWidget>
#include <QDebug>
#include <QLabel>
+#include <message_box.h>
#include "file_download.h"
#include "parse_file.h"
#include "user_management.h"
+#include "game_integration_window.h"
+#include <graphical_stats.h>
+#include <QtCharts/QChartView>
+#include <QtCharts/QPieSeries>
+#include <QtCharts/QPieSlice>
+#include <QtCharts>
namespace Ui {
class stats_display_window;
@@ -23,6 +30,7 @@ protected:
public:
explicit stats_display_window(QWidget *parent = 0);
~stats_display_window();
+ QStringList get_most_kills_gun();
private:
Ui::stats_display_window *ui;
@@ -55,14 +63,14 @@ private:
{"de_nuke", ":/maps/maps/de_nuke.png", "", "", "", ""},
{"de_train", ":/maps/maps/de_train.png", "", "", "", ""},
{"de_lake", ":/maps/maps/de_lake.png", "", "", "", ""},
- {"de_stmarc", ":/maps/maps/de_stmarc.png", "", "", "", ""},
+ {"de_stmarc", ":/maps/maps/images/de_stmarc.png", "", "", "", ""},
{"de_safehouse", ":/maps/maps/de_safehouse.png", "" "", "" , ""},
{"ar_baggage", ":/maps/maps/ar_baggage.png", "", "", "", ""},
- {"ar_shoots", ":/maps/maps/ar_shoots.png", "", "", "", ""},
+ {"ar_shoots", ":/maps/maps/images/ar_shoots.png", "", "", "", ""},
{"de_bank", ":/maps/maps/de_bank.png", "", "", "", ""},
- {"ar_monas", ":/maps/maps/ar_monastery.png", "" "", "", ""},
- {"de_vertigo", ":/maps/maps/de_vertigo.png", "", "", "", ""},
- {"de_sugarcane", ":/maps/maps/de_sugarcane.png", "", "", "", ""},
+ {"ar_monas", ":/maps/maps/images/ar_monastery.png", "" "", "", ""},
+ {"de_vertigo", ":/maps/maps/images/de_vertigo.png", "", "", "", ""},
+ {"de_sugarcane", ":/maps/maps/images/de_sugarcane.png", "", "", "", ""},
{"cs_militia", ":/maps/maps/cs_militia.png", "", "", "", ""},
};
QList<QLabel *> map_labels;
@@ -111,6 +119,9 @@ private:
QStringList usernames;
QStringList userids;
user_management manage;
+ message_box msgbox;
+ graphical_stats graphs;
+ game_integration_window game;
signals:
void window_loaded();
@@ -120,6 +131,8 @@ private slots:
void on_new_id_button_clicked();
void on_users_dropdown_currentIndexChanged(int index);
void on_manage_users_button_clicked();
+ void on_graphical_view_button_clicked();
+ void on_game_integration_button_clicked();
};
#endif // STATS_DISPLAY_WINDOW_H
diff --git a/stats_display_window.ui b/stats_display_window.ui
index 9274368..de88674 100644
--- a/stats_display_window.ui
+++ b/stats_display_window.ui
@@ -9,14 +9,103 @@
<rect>
<x>0</x>
<y>0</y>
- <width>643</width>
- <height>402</height>
+ <width>645</width>
+ <height>587</height>
</rect>
</property>
<property name="windowTitle">
<string>CS:GO Statistics</string>
</property>
<layout class="QGridLayout" name="gridLayout">
+ <item row="2" column="2">
+ <widget class="QPushButton" name="manage_users_button">
+ <property name="text">
+ <string>Manage users</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="2">
+ <widget class="QPushButton" name="new_id_button">
+ <property name="text">
+ <string>New user</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <layout class="QFormLayout" name="stats_layout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="avatar_label">
+ <property name="text">
+ <string>avatar</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="username_label">
+ <property name="font">
+ <font>
+ <family>Arial [Mono]</family>
+ <pointsize>14</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>username</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="realname_label">
+ <property name="text">
+ <string>realname</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="status_label">
+ <property name="text">
+ <string>status</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="time_in_label">
+ <property name="text">
+ <string>Time in CS:GO</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="mvp_number_label">
+ <property name="text">
+ <string>MVPs</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="total_kills_label">
+ <property name="text">
+ <string>total kills</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0">
+ <widget class="QLabel" name="total_deaths_label">
+ <property name="text">
+ <string>total deaths</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0">
+ <widget class="QLabel" name="kd_ratio_label">
+ <property name="text">
+ <string>K/D ratio</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
<item row="0" column="2">
<layout class="QGridLayout" name="base_grid">
<item row="0" column="0">
@@ -146,12 +235,8 @@
</item>
</layout>
</item>
- <item row="7" column="0">
- <widget class="QPushButton" name="close_button">
- <property name="text">
- <string>Close</string>
- </property>
- </widget>
+ <item row="1" column="2">
+ <widget class="QComboBox" name="users_dropdown"/>
</item>
<item row="6" column="2">
<widget class="QLineEdit" name="new_steam_id">
@@ -160,90 +245,19 @@
</property>
</widget>
</item>
- <item row="1" column="2">
- <widget class="QComboBox" name="users_dropdown"/>
- </item>
- <item row="7" column="2">
- <widget class="QPushButton" name="new_id_button">
+ <item row="8" column="0">
+ <widget class="QPushButton" name="close_button">
<property name="text">
- <string>New user</string>
+ <string>Close</string>
</property>
</widget>
</item>
- <item row="0" column="0">
- <layout class="QFormLayout" name="stats_layout">
- <item row="0" column="0">
- <widget class="QLabel" name="avatar_label">
- <property name="text">
- <string>avatar</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="username_label">
- <property name="font">
- <font>
- <family>Arial [Mono]</family>
- <pointsize>14</pointsize>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>username</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="realname_label">
- <property name="text">
- <string>realname</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QLabel" name="status_label">
- <property name="text">
- <string>status</string>
- </property>
- </widget>
- </item>
- <item row="4" column="0">
- <widget class="QLabel" name="time_in_label">
- <property name="text">
- <string>Time in CS:GO</string>
- </property>
- </widget>
- </item>
- <item row="5" column="0">
- <widget class="QLabel" name="mvp_number_label">
- <property name="text">
- <string>MVPs</string>
- </property>
- </widget>
- </item>
- <item row="6" column="0">
- <widget class="QLabel" name="total_kills_label">
- <property name="text">
- <string>total kills</string>
- </property>
- </widget>
- </item>
- <item row="7" column="0">
- <widget class="QLabel" name="total_deaths_label">
- <property name="text">
- <string>total deaths</string>
- </property>
- </widget>
- </item>
- <item row="8" column="0">
- <widget class="QLabel" name="kd_ratio_label">
- <property name="text">
- <string>K/D ratio</string>
- </property>
- </widget>
- </item>
- </layout>
+ <item row="3" column="0">
+ <widget class="QPushButton" name="graphical_view_button">
+ <property name="text">
+ <string>Graphical view</string>
+ </property>
+ </widget>
</item>
<item row="6" column="0">
<widget class="QPushButton" name="refresh_button">
@@ -252,10 +266,10 @@
</property>
</widget>
</item>
- <item row="2" column="2">
- <widget class="QPushButton" name="manage_users_button">
+ <item row="4" column="0">
+ <widget class="QPushButton" name="game_integration_button">
<property name="text">
- <string>Manage users</string>
+ <string>Game integration</string>
</property>
</widget>
</item>
diff --git a/user_management.cpp b/user_management.cpp
index 21058b0..488773b 100644
--- a/user_management.cpp
+++ b/user_management.cpp
@@ -35,9 +35,19 @@ void user_management::on_refresh_users_button_clicked()
void user_management::on_delete_user_button_clicked()
{
- QString to_remove = ui->user_dropdown->currentText() + "=" + userids.at(ui->user_dropdown->currentIndex());
- parse.delete_user(to_remove);
- load_players();
+ int opt = msgbox.confirm_box("You are about to delete a user", "Are you sure?", "Warning");
+ switch (opt) {
+ case QMessageBox::Yes: {
+ QString to_remove = ui->user_dropdown->currentText() + "=" + userids.at(ui->user_dropdown->currentIndex());
+ parse.delete_user(to_remove);
+ load_players();
+ break;
+ }
+ case QMessageBox::No:
+ break;
+ default:
+ break;
+ }
}
void user_management::on_add_user_button_clicked()
diff --git a/user_management.h b/user_management.h
index 88e2bd0..a1209b5 100644
--- a/user_management.h
+++ b/user_management.h
@@ -4,6 +4,7 @@
#include <QWidget>
#include <QDebug>
#include "parse_file.h"
+#include "message_box.h"
namespace Ui {
class user_management;
@@ -30,6 +31,7 @@ private:
QStringList usernames;
QStringList userids;
void load_players();
+ message_box msgbox;
};
#endif // USER_MANAGEMENT_H
diff --git a/user_select_dialog.cpp b/user_select_dialog.cpp
index 8431417..c071fd7 100644
--- a/user_select_dialog.cpp
+++ b/user_select_dialog.cpp
@@ -35,6 +35,8 @@ void user_select_dialog::download_info()
ui->select_account_button->setEnabled(false);
ui->steam_url_text->setEnabled(false);
ui->player_dropdown->setEnabled(false);
+ ui->manage_users_button->setEnabled(false);
+ ui->refresh_users_button->setEnabled(false);
ui->info_label->setText("Downloading data..");
/* user data was a last second thought when designing this fucntion, clean it up one day, error checking etc */
qDebug() << "Attempting to download user data";
@@ -60,6 +62,8 @@ void user_select_dialog::download_info()
ui->close_button->setEnabled(true);
ui->select_account_button->setEnabled(true);
ui->steam_url_text->setEnabled(true);
+ ui->player_dropdown->setEnabled(true);
+ ui->manage_users_button->setEnabled(true);
ui->info_label->setText("Failed to download, try again.");
}
}