diff options
| author | 2022-04-29 10:48:09 +0200 | |
|---|---|---|
| committer | 2022-04-29 10:48:09 +0200 | |
| commit | 07c5f6ec23fcf9237a24e71adcfacabce677f818 (patch) | |
| tree | 588e8c5f82b9163181fad3581f610e6f1d88cba4 /src/bin/webserver/diceserver.cpp | |
| parent | a9153f1615a842cfb9e9bcda4d9071e202618569 (diff) | |
| download | OneRoll-07c5f6ec23fcf9237a24e71adcfacabce677f818.tar.gz OneRoll-07c5f6ec23fcf9237a24e71adcfacabce677f818.zip | |
Change file organization.
Diffstat (limited to 'src/bin/webserver/diceserver.cpp')
| -rw-r--r-- | src/bin/webserver/diceserver.cpp | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/src/bin/webserver/diceserver.cpp b/src/bin/webserver/diceserver.cpp new file mode 100644 index 0000000..a3f094d --- /dev/null +++ b/src/bin/webserver/diceserver.cpp @@ -0,0 +1,237 @@ +#include "diceserver.h" +#include "qhttp/src/qhttpfwd.hpp" +#include "qhttp/src/qhttpserver.hpp" +#include "qhttp/src/qhttpserverrequest.hpp" +#include "qhttp/src/qhttpserverresponse.hpp" +#include <QHostAddress> +#include <QUrl> + +DiceServer::DiceServer(int port) : QObject(), m_diceParser(new DiceParser()) +{ + m_diceParser->setPathToHelp( + "<span><a href=\"https://github.com/Rolisteam/DiceParser/blob/master/HelpMe.md\">Documentation</a>"); + // using namespace ; + m_server= new qhttp::server::QHttpServer(this); + m_server->listen( // listening on 0.0.0.0:8080 + QHostAddress::Any, port, [=](qhttp::server::QHttpRequest* req, qhttp::server::QHttpResponse* res) { + req->collectData(1024); + + // qhttp::THeaderHash hash = req->headers(); + // qDebug() << hash << res->headers() << qhttp::Stringify::toString(req->method()) << + // qPrintable(req->url().toString()) << req->collectedData().constData(); + QString getArg= req->url().toString(); + getArg= getArg.replace("/?", ""); + QStringList args= getArg.split('&'); + QHash<QString, QString> m_hashArgs; + for(auto argument : args) + { + QStringList keyValue= argument.split('='); + if(keyValue.size() == 2) + { + m_hashArgs.insert(keyValue[0], keyValue[1]); + } + } + + if(m_hashArgs.contains("cmd")) + { + qDebug() << QUrl::fromPercentEncoding(m_hashArgs["cmd"].toLocal8Bit()); + QString result= startDiceParsing(QUrl::fromPercentEncoding(m_hashArgs["cmd"].toLocal8Bit())); + qDebug() << result; + + res->setStatusCode(qhttp::ESTATUS_OK); + res->addHeader("Access-Control-Allow-Origin", "*"); + res->addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS"); + res->addHeader("Access-Control-Allow-Headers", "x-requested-with"); + + QString html("<!doctype html>\n" + "<html>\n" + "<head>\n" + " <meta charset=\"utf-8\">\n" + " <title>Rolisteam Dice System Webservice</title>\n" + " <style>.dice {color:#FF0000;font-weight: bold;}</style>" + "</head>\n" + "<body>\n" + "%1\n" + "</body>\n" + "</html>\n"); + + res->end(html.arg(result).toLocal8Bit()); + } + else + { + res->setStatusCode(qhttp::ESTATUS_OK); + res->end("No Command found!\n"); + } + }); + if(!m_server->isListening()) + { + qDebug() << "failed to listen"; + } + else + { + qDebug() << "Server is On!!"; + } +} + +DiceServer::~DiceServer() +{ + qDebug() << "destructor"; +} +QString DiceServer::diceToText(ExportedDiceResult& dice, bool highlight, bool homogeneous) +{ + QStringList resultGlobal; + foreach(int face, dice.keys()) + { + QStringList result; + QStringList currentStreak; + QList<QStringList> allStreakList; + ListDiceResult diceResult= dice.value(face); + bool previousHighlight= false; + QString previousColor; + QString patternColor("<span class=\"dice\">"); + foreach(HighLightDice tmp, diceResult) + { + if(previousColor != tmp.getColor()) + { + if(!currentStreak.isEmpty()) + { + QStringList list; + list << patternColor + currentStreak.join(',') + "</span>"; + allStreakList.append(list); + currentStreak.clear(); + } + if(tmp.getColor().isEmpty()) + { + patternColor= QStringLiteral("<span class=\"dice\">"); + } + else + { + patternColor= QStringLiteral("<span style=\"color:%1;font-weight:bold\">").arg(tmp.getColor()); + } + } + QStringList diceListStr; + if((previousHighlight) && (!tmp.isHighlighted())) + { + if(!currentStreak.isEmpty()) + { + QStringList list; + list << patternColor + currentStreak.join(',') + "</span>"; + allStreakList.append(list); + currentStreak.clear(); + } + } + else if((!previousHighlight) && (tmp.isHighlighted())) + { + if(!currentStreak.isEmpty()) + { + QStringList list; + list << currentStreak.join(','); + allStreakList.append(list); + currentStreak.clear(); + } + } + previousHighlight= tmp.isHighlighted(); + previousColor= tmp.getColor(); + for(int i= 0; i < tmp.getResult().size(); ++i) + { + qint64 dievalue= tmp.getResult()[i]; + diceListStr << QString::number(dievalue); + } + if(diceListStr.size() > 1) + { + QString first= diceListStr.takeFirst(); + first= QString("%1 [%2]").arg(first).arg(diceListStr.join(',')); + diceListStr.clear(); + diceListStr << first; + } + currentStreak << diceListStr.join(' '); + } + + if(previousHighlight) + { + QStringList list; + list << patternColor + currentStreak.join(',') + "</span>"; + allStreakList.append(list); + } + else + { + if(!currentStreak.isEmpty()) + { + QStringList list; + list << currentStreak.join(','); + allStreakList.append(list); + } + } + foreach(QStringList a, allStreakList) + { + result << a; + } + if(dice.keys().size() > 1) + { + resultGlobal << QString(" d%2:(%1)").arg(result.join(",")).arg(face); + } + else + { + resultGlobal << result.join(","); + } + } + return resultGlobal.join(""); +} + +QString DiceServer::startDiceParsing(QString cmd) +{ + QString result(""); + bool highlight= true; + if(m_diceParser->parseLine(cmd)) + { + m_diceParser->Start(); + if(!m_diceParser->getErrorMap().isEmpty()) + { + result+= "<span style=\"color: #FF0000\">Error:</span>" + m_diceParser->humanReadableError() + "<br/>"; + } + else + { + ExportedDiceResult list; + bool homogeneous= true; + m_diceParser->getLastDiceResult(list, homogeneous); + QString diceText= diceToText(list, highlight, homogeneous); + QString scalarText; + QString str; + + if(m_diceParser->hasIntegerResultNotInFirst()) + { + scalarText= QString("%1").arg(m_diceParser->getLastIntegerResult()); + } + else if(!list.isEmpty()) + { + scalarText= QString("%1").arg(m_diceParser->getSumOfDiceResult()); + } + if(highlight) + { + str= QString("Result: <span class=\"dice\">%1</span>, details:[%3 (%2)]") + .arg(scalarText) + .arg(diceText) + .arg(m_diceParser->getDiceCommand()); + } + else + { + str= QString("Result: %1, details:[%3 (%2)]") + .arg(scalarText) + .arg(diceText) + .arg(m_diceParser->getDiceCommand()); + } + + if(m_diceParser->hasStringResult()) + { + str= m_diceParser->getStringResult(); + } + result+= str + "<br/>"; + } + } + else + { + result+= "<span style=\"color: #00FF00\">Error:</span>" + m_diceParser->humanReadableError() + "<br/>"; + } + + return result; +} |