mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-06-11 08:34:52 -07:00
initial commit for improved deck list submission
This commit is contained in:
parent
34d2649f65
commit
fdf921e718
13 changed files with 499 additions and 71 deletions
|
|
@ -87,6 +87,20 @@ bool Servatrice::openDatabase()
|
|||
return true;
|
||||
}
|
||||
|
||||
void Servatrice::checkSql()
|
||||
{
|
||||
if (!QSqlDatabase::database().exec("select 1").isActive())
|
||||
openDatabase();
|
||||
}
|
||||
|
||||
bool Servatrice::execSqlQuery(QSqlQuery &query)
|
||||
{
|
||||
if (query.exec())
|
||||
return true;
|
||||
qCritical(QString("Database error: %1").arg(query.lastError().text()).toLatin1());
|
||||
return false;
|
||||
}
|
||||
|
||||
void Servatrice::newConnection()
|
||||
{
|
||||
QTcpSocket *socket = tcpServer->nextPendingConnection();
|
||||
|
|
@ -100,16 +114,14 @@ AuthenticationResult Servatrice::checkUserPassword(const QString &user, const QS
|
|||
if (method == "none")
|
||||
return UnknownUser;
|
||||
else if (method == "sql") {
|
||||
if (!QSqlDatabase::database().exec("select 1").isActive())
|
||||
openDatabase();
|
||||
checkSql();
|
||||
|
||||
QSqlQuery query;
|
||||
query.prepare("select password from players where name = :name");
|
||||
query.bindValue(":name", user);
|
||||
if (!query.exec()) {
|
||||
qCritical(QString("Database error: %1").arg(query.lastError().text()).toLatin1());
|
||||
if (!execSqlQuery(query))
|
||||
return PasswordWrong;
|
||||
}
|
||||
|
||||
if (query.next()) {
|
||||
if (query.value(0).toString() == password)
|
||||
return PasswordRight;
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
|
||||
class QSqlDatabase;
|
||||
class QSettings;
|
||||
class QSqlQuery;
|
||||
|
||||
class Servatrice : public Server
|
||||
{
|
||||
|
|
@ -36,6 +37,8 @@ public:
|
|||
Servatrice(QObject *parent = 0);
|
||||
~Servatrice();
|
||||
bool openDatabase();
|
||||
void checkSql();
|
||||
bool execSqlQuery(QSqlQuery &query);
|
||||
AuthenticationResult checkUserPassword(const QString &user, const QString &password);
|
||||
QString getLoginMessage() const { return loginMessage; }
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -20,13 +20,14 @@
|
|||
|
||||
#include <QXmlStreamReader>
|
||||
#include <QXmlStreamWriter>
|
||||
#include <QtSql>
|
||||
#include "serversocketinterface.h"
|
||||
#include "servatrice.h"
|
||||
#include "protocol.h"
|
||||
#include "protocol_items.h"
|
||||
|
||||
ServerSocketInterface::ServerSocketInterface(Server *_server, QTcpSocket *_socket, QObject *parent)
|
||||
: Server_ProtocolHandler(_server, parent), socket(_socket), currentItem(0)
|
||||
ServerSocketInterface::ServerSocketInterface(Servatrice *_server, QTcpSocket *_socket, QObject *parent)
|
||||
: Server_ProtocolHandler(_server, parent), servatrice(_server), socket(_socket), currentItem(0)
|
||||
{
|
||||
xmlWriter = new QXmlStreamWriter;
|
||||
xmlWriter->setDevice(socket);
|
||||
|
|
@ -101,3 +102,92 @@ void ServerSocketInterface::sendProtocolItem(ProtocolItem *item, bool deleteItem
|
|||
if (deleteItem)
|
||||
delete item;
|
||||
}
|
||||
|
||||
int ServerSocketInterface::getDeckPathId(int basePathId, QStringList path)
|
||||
{
|
||||
if (path.isEmpty())
|
||||
return 0;
|
||||
if (path[0].isEmpty())
|
||||
return 0;
|
||||
|
||||
servatrice->checkSql();
|
||||
|
||||
QSqlQuery query;
|
||||
query.prepare("select id from decklist_folders where id_parent = :id_parent and name = :name");
|
||||
query.bindValue(":id_parent", basePathId);
|
||||
query.bindValue(":name", path.takeFirst());
|
||||
if (!servatrice->execSqlQuery(query))
|
||||
return -1;
|
||||
if (!query.next())
|
||||
return -1;
|
||||
int id = query.value(0).toInt();
|
||||
if (path.isEmpty())
|
||||
return id;
|
||||
else
|
||||
return getDeckPathId(id, path);
|
||||
}
|
||||
|
||||
void ServerSocketInterface::deckListHelper(Response_DeckList::Directory *folder)
|
||||
{
|
||||
QSqlQuery query;
|
||||
query.prepare("select id, name from decklist_folders where id_parent = :id_parent and user = :user");
|
||||
query.bindValue(":id_parent", folder->getId());
|
||||
query.bindValue(":user", playerName);
|
||||
servatrice->execSqlQuery(query);
|
||||
|
||||
while (query.next()) {
|
||||
Response_DeckList::Directory *newFolder = new Response_DeckList::Directory(query.value(1).toString(), query.value(0).toInt());
|
||||
folder->append(newFolder);
|
||||
deckListHelper(newFolder);
|
||||
}
|
||||
}
|
||||
|
||||
ResponseCode ServerSocketInterface::cmdDeckList(Command_DeckList *cmd)
|
||||
{
|
||||
Response_DeckList::Directory *root = new Response_DeckList::Directory(QString());
|
||||
|
||||
servatrice->checkSql();
|
||||
QSqlQuery query;
|
||||
deckListHelper(root);
|
||||
|
||||
sendProtocolItem(new Response_DeckList(cmd->getCmdId(), RespOk, root));
|
||||
|
||||
return RespNothing;
|
||||
}
|
||||
|
||||
ResponseCode ServerSocketInterface::cmdDeckNewDir(Command_DeckNewDir *cmd)
|
||||
{
|
||||
int folderId = getDeckPathId(0, cmd->getPath().split("/"));
|
||||
qDebug() << "folderId" << folderId;
|
||||
if (folderId == -1)
|
||||
return RespNameNotFound;
|
||||
|
||||
QSqlQuery query;
|
||||
query.prepare("insert into decklist_folders (id_parent, user, name) values(:id_parent, :user, :name)");
|
||||
query.bindValue(":id_parent", folderId);
|
||||
query.bindValue(":user", playerName);
|
||||
query.bindValue(":name", cmd->getName());
|
||||
if (!servatrice->execSqlQuery(query))
|
||||
return RespContextError;
|
||||
return RespOk;
|
||||
}
|
||||
|
||||
ResponseCode ServerSocketInterface::cmdDeckDelDir(Command_DeckDelDir *cmd)
|
||||
{
|
||||
}
|
||||
|
||||
ResponseCode ServerSocketInterface::cmdDeckNew(Command_DeckNew *cmd)
|
||||
{
|
||||
}
|
||||
|
||||
ResponseCode ServerSocketInterface::cmdDeckDel(Command_DeckDel *cmd)
|
||||
{
|
||||
}
|
||||
|
||||
ResponseCode ServerSocketInterface::cmdDeckUpload(Command_DeckUpload *cmd)
|
||||
{
|
||||
}
|
||||
|
||||
ResponseCode ServerSocketInterface::cmdDeckDownload(Command_DeckDownload *cmd)
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@
|
|||
#include "server_protocolhandler.h"
|
||||
|
||||
class QTcpSocket;
|
||||
class Server;
|
||||
class Servatrice;
|
||||
class QXmlStreamReader;
|
||||
class QXmlStreamWriter;
|
||||
|
||||
|
|
@ -35,12 +35,23 @@ private slots:
|
|||
void readClient();
|
||||
void catchSocketError(QAbstractSocket::SocketError socketError);
|
||||
private:
|
||||
Servatrice *servatrice;
|
||||
QTcpSocket *socket;
|
||||
QXmlStreamWriter *xmlWriter;
|
||||
QXmlStreamReader *xmlReader;
|
||||
ProtocolItem *currentItem;
|
||||
|
||||
int getDeckPathId(int basePathId, QStringList path);
|
||||
void deckListHelper(Response_DeckList::Directory *folder);
|
||||
ResponseCode cmdDeckList(Command_DeckList *cmd);
|
||||
ResponseCode cmdDeckNewDir(Command_DeckNewDir *cmd);
|
||||
ResponseCode cmdDeckDelDir(Command_DeckDelDir *cmd);
|
||||
ResponseCode cmdDeckNew(Command_DeckNew *cmd);
|
||||
ResponseCode cmdDeckDel(Command_DeckDel *cmd);
|
||||
ResponseCode cmdDeckUpload(Command_DeckUpload *cmd);
|
||||
ResponseCode cmdDeckDownload(Command_DeckDownload *cmd);
|
||||
public:
|
||||
ServerSocketInterface(Server *_server, QTcpSocket *_socket, QObject *parent = 0);
|
||||
ServerSocketInterface(Servatrice *_server, QTcpSocket *_socket, QObject *parent = 0);
|
||||
~ServerSocketInterface();
|
||||
|
||||
void sendProtocolItem(ProtocolItem *item, bool deleteItem = true);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue