Skip to content

Commit 6cfa16f

Browse files
committed
[0.1.0][enhancement][0][细化room表的列,以便查询][core|network]
1 parent 658a814 commit 6cfa16f

File tree

13 files changed

+306
-230
lines changed

13 files changed

+306
-230
lines changed

data/lobby.sql

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
CREATE TABLE `room` (
2+
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
3+
`hostaddress` varchar(21),
4+
`playernum` int,
5+
`name` varchar(50),
6+
`gamemode` varchar(20),
7+
`banpackages` text,
8+
`operationtimeout` int,
9+
`nullificationcountdown` int,
10+
`randomseat` boolean,
11+
`enablecheat` boolean,
12+
`freechoose` boolean,
13+
`forbidaddingrobot` boolean,
14+
`disablechat` boolean,
15+
`firstshowingreward` boolean,
16+
`requirepassword` boolean
17+
);

src/client/client.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -365,19 +365,18 @@ void Client::checkVersion(const QVariant &server_version) {
365365
emit version_checked(version_number, mod_name);
366366
}
367367

368-
void Client::setup(const QVariant &setup_json) {
368+
void Client::setup(const QVariant &setup) {
369369
if (socket && !socket->isConnected())
370370
return;
371371

372-
QString setup_str = setup_json.toString();
373-
if (ServerInfo.parse(setup_str)) {
372+
if (ServerInfo.parse(setup)) {
374373
if (replayer) {
375374
ServerInfo.OperationTimeout = 0;
376375
} else {
377376
recorder = new Recorder(this);
378377

379378
Packet setup_packet(S_SRC_ROOM | S_TYPE_NOTIFICATION | S_DEST_CLIENT, S_COMMAND_SETUP);
380-
setup_packet.setMessageBody(setup_json);
379+
setup_packet.setMessageBody(setup);
381380
recorder->recordLine(setup_packet.toJson());
382381
}
383382

@@ -392,6 +391,8 @@ void Client::setup(const QVariant &setup_json) {
392391
emit roomServerConnected();
393392
notifyServer(S_COMMAND_TOGGLE_READY);
394393
} else {
394+
JsonDocument doc(setup);
395+
QString setup_str = QString::fromUtf8(doc.toJson());
395396
QMessageBox::warning(NULL, tr("Warning"), tr("Setup string can not be parsed: %1").arg(setup_str));
396397
}
397398
}

src/client/client.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ class Client : public QObject {
115115
typedef void (Client::*Callback) (const QVariant &);
116116

117117
void checkVersion(const QVariant &server_version);
118-
void setup(const QVariant &setup_str);
118+
void setup(const QVariant &setup);
119119
void networkDelayTest(const QVariant &);
120120
void addPlayer(const QVariant &player_info);
121121
void removePlayer(const QVariant &player_name);

src/client/clientstruct.cpp

Lines changed: 5 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -24,91 +24,13 @@
2424
#include "settings.h"
2525
#include "json.h"
2626

27-
ServerInfoStruct ServerInfo;
27+
RoomInfoStruct ServerInfo;
2828

2929
#include <QFormLayout>
3030
#include <QLabel>
3131
#include <QListWidget>
3232
#include <QCheckBox>
3333

34-
time_t ServerInfoStruct::getCommandTimeout(QSanProtocol::CommandType command, QSanProtocol::ProcessInstanceType instance) {
35-
time_t timeOut;
36-
if (OperationTimeout == 0)
37-
return 0;
38-
else if (command == QSanProtocol::S_COMMAND_CHOOSE_GENERAL)
39-
timeOut = OperationTimeout * 1500;
40-
else if (command == QSanProtocol::S_COMMAND_SKILL_GUANXING
41-
|| command == QSanProtocol::S_COMMAND_ARRANGE_GENERAL)
42-
timeOut = OperationTimeout * 2000;
43-
else if (command == QSanProtocol::S_COMMAND_NULLIFICATION)
44-
timeOut = NullificationCountDown * 1000;
45-
else
46-
timeOut = OperationTimeout * 1000;
47-
48-
if (instance == QSanProtocol::S_SERVER_INSTANCE)
49-
timeOut += Config.S_SERVER_TIMEOUT_GRACIOUS_PERIOD;
50-
return timeOut;
51-
}
52-
53-
bool ServerInfoStruct::parse(const QString &str) {
54-
QRegExp rx("(.*):(@?\\w+):(\\d+):(\\d+):([\\w-]+(?:\\+[\\w-]+)*)?:([RCFAMSP]*)");
55-
if (!rx.exactMatch(str)) {
56-
// older version, just take the player count
57-
int count = str.split(":").at(1).toInt();
58-
GameMode = QString("%1p").arg(count, 2, 10, QChar('0'));
59-
return false;
60-
}
61-
62-
QStringList texts = rx.capturedTexts();
63-
if (texts.isEmpty()) {
64-
DuringGame = false;
65-
}
66-
else {
67-
DuringGame = true;
68-
69-
Name = texts.at(1);
70-
71-
GameMode = texts.at(2);
72-
OperationTimeout = texts.at(3).toInt();
73-
NullificationCountDown = texts.at(4).toInt();
74-
75-
QStringList ban_packages = texts.at(5).split("+");
76-
const QList<const Package *> &packages = Sanguosha->getPackages();
77-
Extensions.clear();
78-
foreach(const Package *package, packages) {
79-
QString package_name = package->objectName();
80-
if (ban_packages.contains(package_name))
81-
package_name = "!" + package_name;
82-
83-
Extensions << package_name;
84-
}
85-
86-
QString flags = texts.at(6);
87-
88-
RandomSeat = flags.contains("R");
89-
EnableCheat = flags.contains("C");
90-
FreeChoose = EnableCheat && flags.contains("F");
91-
ForbidAddingRobot = flags.contains("A");
92-
DisableChat = flags.contains("M");
93-
FirstShowingReward = flags.contains("S");
94-
RequirePassword = flags.contains("P");
95-
}
96-
97-
return true;
98-
}
99-
100-
bool RoomInfoStruct::parse(const QVariant &data)
101-
{
102-
JsonArray args = data.value<JsonArray>();
103-
if (args.size() != 4 || !ServerInfoStruct::parse(args.at(1).toString())) {
104-
return false;
105-
}
106-
RoomId = args.at(0).toLongLong();
107-
HostAddress = args.at(2).toString();
108-
PlayerNum = args.at(3).toInt();
109-
return true;
110-
}
111-
11234
ServerInfoWidget::ServerInfoWidget(bool show_lack) {
11335
name_label = new QLabel;
11436
address_label = new QLabel;
@@ -150,7 +72,7 @@ ServerInfoWidget::ServerInfoWidget(bool show_lack) {
15072
setLayout(layout);
15173
}
15274

153-
void ServerInfoWidget::fill(const ServerInfoStruct &info, const QString &address) {
75+
void ServerInfoWidget::fill(const RoomInfoStruct &info, const QString &address) {
15476
name_label->setText(info.Name);
15577
address_label->setText(address);
15678
game_mode_label->setText(Sanguosha->getModeName(info.GameMode));
@@ -174,11 +96,9 @@ void ServerInfoWidget::fill(const ServerInfoStruct &info, const QString &address
17496
static QIcon enabled_icon("image/system/enabled.png");
17597
static QIcon disabled_icon("image/system/disabled.png");
17698

177-
foreach(QString extension, info.Extensions) {
178-
bool checked = !extension.startsWith("!");
179-
if (!checked)
180-
extension.remove("!");
181-
99+
QStringList extentions = Sanguosha->getExtensions();
100+
foreach (const QString &extension, extentions) {
101+
bool checked = !info.BanPackages.contains(extension);
182102
QString package_name = Sanguosha->translate(extension);
183103
QCheckBox *checkbox = new QCheckBox(package_name);
184104
checkbox->setChecked(checked);

src/client/clientstruct.h

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -24,50 +24,22 @@
2424
#include "player.h"
2525
#include "qsanselectableitem.h"
2626
#include "protocol.h"
27+
#include "roomconfig.h"
28+
2729
#include <QMap>
2830
#include <QWidget>
2931

30-
struct ServerInfoStruct {
31-
bool parse(const QString &str);
32-
//Get the timeout allowance for a command. Server countdown is more lenient than the client.
33-
//@param command: type of command
34-
//@return countdown for command in milliseconds.
35-
time_t getCommandTimeout(QSanProtocol::CommandType command, QSanProtocol::ProcessInstanceType instance);
36-
37-
QString Name;
38-
QString GameMode;
39-
int OperationTimeout;
40-
int NullificationCountDown;
41-
QStringList Extensions;
42-
bool RandomSeat;
43-
bool EnableCheat;
44-
bool FreeChoose;
45-
bool ForbidAddingRobot;
46-
bool DisableChat;
47-
bool FirstShowingReward;
48-
bool RequirePassword;
49-
bool DuringGame;
50-
};
51-
52-
extern ServerInfoStruct ServerInfo;
53-
54-
struct RoomInfoStruct : public ServerInfoStruct {
55-
qlonglong RoomId;
56-
QString HostAddress;
57-
int PlayerNum;
58-
59-
bool parse(const QVariant &data);
60-
};
61-
6232
class QLabel;
6333
class QListWidget;
6434

35+
extern RoomInfoStruct ServerInfo;
36+
6537
class ServerInfoWidget : public QWidget {
6638
Q_OBJECT
6739

6840
public:
6941
ServerInfoWidget(bool show_lack = false);
70-
void fill(const ServerInfoStruct &info, const QString &address);
42+
void fill(const RoomInfoStruct &info, const QString &address);
7143
void updateLack(int count);
7244
void clear();
7345

src/core/record-analysis.cpp

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -62,33 +62,25 @@ void RecAnalysis::initialize(const QString &dir) {
6262
continue;
6363

6464
if (packet.getCommandType() == S_COMMAND_SETUP){
65-
const QVariant &body = packet.getMessageBody();
66-
if (JsonUtils::isString(body)){
67-
QString l = body.toString();
68-
QRegExp rx("(.*):(@?\\w+):(\\d+):(\\d+):([+\\w-]*):([RCFSTBHAMNP123a-r]*)(\\s+)?");
69-
if (!rx.exactMatch(l))
70-
continue;
71-
72-
QStringList texts = rx.capturedTexts();
73-
m_recordGameMode = texts.at(2);
74-
m_recordPlayers = texts.at(2).split("_").first().remove(QRegExp("[^0-9]")).toInt();
75-
QStringList ban_packages = texts.at(5).split("+");
65+
RoomInfoStruct config;
66+
if (config.parse(packet.getMessageBody())){
67+
m_recordGameMode = config.GameMode;
68+
m_recordPlayers = m_recordGameMode.split("_").first().remove(QRegExp("[^0-9]")).toInt();
7669
foreach(const Package *package, Sanguosha->getPackages()) {
77-
if (!ban_packages.contains(package->objectName())
70+
if (!config.BanPackages.contains(package->objectName())
7871
&& Sanguosha->getScenario(package->objectName()) == NULL)
7972
m_recordPackages << Sanguosha->translate(package->objectName());
8073
}
8174

82-
QString flags = texts.at(6);
83-
if (flags.contains("R")) m_recordServerOptions << tr("RandomSeats");
84-
if (flags.contains("C")) m_recordServerOptions << tr("EnableCheat");
85-
if (flags.contains("F")) m_recordServerOptions << tr("FreeChoose");
86-
if (flags.contains("S")) m_recordServerOptions << tr("Enable2ndGeneral");
87-
if (flags.contains("T")) m_recordServerOptions << tr("EnableSame");
88-
if (flags.contains("N")) m_recordServerOptions << tr("EnableScene");
89-
if (flags.contains("B")) m_recordServerOptions << tr("EnableBasara");
90-
if (flags.contains("H")) m_recordServerOptions << tr("EnableHegemony");
91-
if (flags.contains("A")) m_recordServerOptions << tr("EnableAI");
75+
if (config.RandomSeat) m_recordServerOptions << tr("RandomSeats");
76+
if (config.EnableCheat) m_recordServerOptions << tr("EnableCheat");
77+
if (config.FreeChoose) m_recordServerOptions << tr("FreeChoose");
78+
//if (config.EnableCheat) m_recordServerOptions << tr("Enable2ndGeneral");
79+
//if (flags.contains("T")) m_recordServerOptions << tr("EnableSame");
80+
//if (flags.contains("N")) m_recordServerOptions << tr("EnableScene");
81+
//if (flags.contains("B")) m_recordServerOptions << tr("EnableBasara");
82+
//if (flags.contains("H")) m_recordServerOptions << tr("EnableHegemony");
83+
if (!config.ForbidAddingRobot) m_recordServerOptions << tr("EnableAI");
9284

9385
continue;
9486
}

0 commit comments

Comments
 (0)