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 <QTimer>
 | 
			
		||||
#include <QFileDialog>
 | 
			
		||||
#include <QMessageBox>
 | 
			
		||||
 | 
			
		||||
class DemoServer : public QObject
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -252,6 +252,56 @@ void DemoServer::load_demo(QString filename)
 | 
			
		||||
        demo_data.enqueue(line);
 | 
			
		||||
        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()
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user