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