1
Fork 0
mirror of https://github.com/redstrate/Astra.git synced 2025-04-24 21:37:46 +00:00
astra/src/gameparser.cpp
redstrate 63faea21cb Add Watchdog
Helps you get through the queue with instant access to your place,
as well as giving you notifications on lobby errors and what else.

At the moment, only supported under X11 and Linux but will grow in
the future assuming the queues are still terrible.
2021-12-06 21:15:31 -05:00

83 lines
No EOL
2.6 KiB
C++

#include "gameparser.h"
#include <QDebug>
#include <QRegularExpression>
#include <QBuffer>
GameParser::GameParser() {
api = new tesseract::TessBaseAPI();
if (api->Init(nullptr, "eng")) {
qDebug() << "Could not initialize tesseract!";
return;
}
api->SetPageSegMode(tesseract::PageSegMode::PSM_SINGLE_BLOCK);
}
GameParser::~GameParser() {
api->End();
delete api;
}
GameParseResult GameParser::parseImage(QImage img) {
QBuffer buf;
img = img.convertToFormat(QImage::Format_Grayscale8);
img.save(&buf, "PNG", 100);
Pix* image = pixReadMem((const l_uint8 *) buf.data().data(), buf.size());
api->SetImage(image);
api->SetSourceResolution(300);
const QString text = api->GetUTF8Text();
// TODO: clean up these names
const bool hasWorldFullText = text.contains("This World is currently full.") || text.contains("Players in queue");
const bool hasLobbyErrorText = text.contains("The lobby server connection has encountered an error.");
const bool hasCONFIGURATIONText = text.contains("CONFIGURATION") || text.contains("ONLINE");
const bool hasConnectingToData = text.contains("Connecting to data center");
const bool worldTotallyFull = text.contains("3001");
if(hasLobbyErrorText) {
qDebug() << "LOBBY ERROR";
return {ScreenState::LobbyError, -1};
} else {
if(worldTotallyFull) {
qDebug() << "TOTALLY FULL WORLD (CLOSED BY SQENIX)";
return {ScreenState::WorldFull, -1};
} else {
if(hasConnectingToData) {
qDebug() << "CONNECTING TO DATA CENTER";
return {ScreenState::ConnectingToDataCenter, -1};
} else {
if(hasWorldFullText) {
qDebug() << "FULL WORLD";
// attempt to extract number of players in queue
QRegularExpression exp("(?:Players in queue: )([\\d|,]*)");
auto match = exp.match(text);
if(match.isValid()) {
return {ScreenState::InLoginQueue, match.captured(1).remove(',').toInt()};
}
return {ScreenState::InLoginQueue, -1};
} else {
if(hasCONFIGURATIONText) {
qDebug() << "TITLE SCREEN";
return {ScreenState::EnteredTitleScreen, -1};
}
}
}
}
}
// TODO: figure out how to properly clear tesseract data
api->Clear();
api->ClearAdaptiveClassifier();
return {ScreenState::Splash, -1};
}