Automatically fix desynced demo files with issues pre-#496 PR (#532)
* Implement a demo auto-fixing solution. If the client detects a pre-2.9.1 demo file, it will prompt the user if they wish to correct it, since otherwise the demo will be desynched from reality. The aforementioned issue was fixed in https://github.com/AttorneyOnline/AO2-Client/pull/496 however 2.9.0 still has incorrect demo recording. Fix potential memory leak by not flushing and closing the demo file after opening it for reading. * backup broken demo file before fixing it * comments ahoy Co-authored-by: in1tiate <radwoodward@vikings.grayson.edu>
This commit is contained in:
parent
3e4de5da62
commit
9fbe899c0e
@ -10,6 +10,7 @@
|
|||||||
#include <QTcpSocket>
|
#include <QTcpSocket>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
class DemoServer : public QObject
|
class DemoServer : public QObject
|
||||||
{
|
{
|
||||||
|
@ -252,6 +252,56 @@ void DemoServer::load_demo(QString filename)
|
|||||||
demo_data.enqueue(line);
|
demo_data.enqueue(line);
|
||||||
line = demo_stream.readLine();
|
line = demo_stream.readLine();
|
||||||
}
|
}
|
||||||
|
demo_file.flush();
|
||||||
|
demo_file.close();
|
||||||
|
|
||||||
|
// No-shenanigans 2.9.0 demo file with the dreaded demo desync bug detected https://github.com/AttorneyOnline/AO2-Client/pull/496
|
||||||
|
// If we don't start with the SC packet this means user-edited weirdo shenanigans. Don't screw around with those.
|
||||||
|
if (demo_data.head().startsWith("SC#") && demo_data.last().startsWith("wait#")) {
|
||||||
|
qDebug() << "Loaded a broken pre-2.9.1 demo file, with the wait desync issue!";
|
||||||
|
QMessageBox *msgBox = new QMessageBox;
|
||||||
|
msgBox->setAttribute(Qt::WA_DeleteOnClose);
|
||||||
|
msgBox->setTextFormat(Qt::RichText);
|
||||||
|
msgBox->setText("This appears to be a <b>broken</b> pre-2.9.1 demo file with the <a href=https://github.com/AttorneyOnline/AO2-Client/pull/496>wait desync issue</a>!<br>Do you want to correct this file? <i>If you refuse, this demo will be desynchronized!</i>");
|
||||||
|
msgBox->setWindowTitle("Pre-2.9.1 demo detected!");
|
||||||
|
msgBox->setStandardButtons(QMessageBox::NoButton);
|
||||||
|
QTimer::singleShot(2000, msgBox, std::bind(&QMessageBox::setStandardButtons,msgBox,QMessageBox::Yes|QMessageBox::No));
|
||||||
|
int ret = msgBox->exec();
|
||||||
|
QQueue <QString> p_demo_data;
|
||||||
|
switch (ret) {
|
||||||
|
case QMessageBox::Yes:
|
||||||
|
qDebug() << "Making a backup of the broken demo...";
|
||||||
|
QFile::copy(filename, filename + ".backup");
|
||||||
|
while (!demo_data.isEmpty()) {
|
||||||
|
QString current_packet = demo_data.dequeue();
|
||||||
|
// TODO: faster way of doing this, maybe with QtConcurrent's MapReduce methods?
|
||||||
|
if (!current_packet.startsWith("SC#") && current_packet.startsWith("wait#")) {
|
||||||
|
p_demo_data.insert(qMax(1, p_demo_data.size()-1), current_packet);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
p_demo_data.enqueue(current_packet);
|
||||||
|
}
|
||||||
|
if (demo_file.open(QIODevice::WriteOnly | QIODevice::Text |
|
||||||
|
QIODevice::Truncate)) {
|
||||||
|
QTextStream out(&demo_file);
|
||||||
|
out.setCodec("UTF-8");
|
||||||
|
out << p_demo_data.dequeue();
|
||||||
|
for (QString line : p_demo_data) {
|
||||||
|
out << "\n" << line;
|
||||||
|
}
|
||||||
|
demo_file.flush();
|
||||||
|
demo_file.close();
|
||||||
|
}
|
||||||
|
load_demo(filename);
|
||||||
|
break;
|
||||||
|
case QMessageBox::No:
|
||||||
|
// No was clicked
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// should never be reached
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DemoServer::playback()
|
void DemoServer::playback()
|
||||||
|
Loading…
Reference in New Issue
Block a user