diff options
Diffstat (limited to 'irc')
| -rw-r--r-- | irc/CMakeLists.txt | 76 | ||||
| -rw-r--r-- | irc/Readme.md | 25 | ||||
| -rw-r--r-- | irc/botircdiceparser.cpp | 174 | ||||
| -rw-r--r-- | irc/botircdiceparser.h | 24 | ||||
| -rw-r--r-- | irc/irc.pri | 9 | ||||
| -rw-r--r-- | irc/main.cpp | 1 |
6 files changed, 184 insertions, 125 deletions
diff --git a/irc/CMakeLists.txt b/irc/CMakeLists.txt index 990e0eb..2019224 100644 --- a/irc/CMakeLists.txt +++ b/irc/CMakeLists.txt @@ -1,85 +1,37 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.5) -SET(CMAKE_AUTOUIC ON) project(irc) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC ON) +set(EXECUTABLE_OUTPUT_PATH bin/) # Find the QtWidgets library -find_package(Qt5Core) -#fsind_package(Qt5Gui) -#find_package(Qt5Widgets) -find_package(Qt5Network) +set(QT_REQUIRED_VERSION "5.12.0") -#SET(mainwindow_SOURCES mainwindow.cpp) -#SET(mainwindow_HEADERS mainwindow.h) -#SET(mainwindow_FORMS mainwindow.ui) +set(irc_SOURCES botircdiceparser.cpp main.cpp) +set(irc_HEADERS botircdiceparser.h) -set(EXECUTABLE_OUTPUT_PATH bin/) -include_directories(${Qt5Core_INCLUDES} ${Qt5Network_INCLUDES} ../) -add_definitions(${Qt5Core_DEFINITIONS} ${Qt5Network_DEFINITIONS}) +find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED COMPONENTS Core Widgets Gui Svg LinguistTools Network) -#qt5_wrap_ui(UI_HEADERS mainwindow.ui) set(MODE "cli") - ADD_DEFINITIONS( - -std=c++11 # Or -std=c++0x - # Other flags + -std=c++11 ) -add_executable( - irc - ../diceparser.cpp - ../range.cpp - ../highlightdice.cpp - ../booleancondition.cpp - ../validator.cpp - ../compositevalidator.cpp - ../operationcondition.cpp - ../die.cpp - ../parsingtoolbox.cpp - ../dicealias.cpp - ../result/result.cpp - ../result/scalarresult.cpp - ../result/stringresult.cpp - ../result/diceresult.cpp - ../node/countexecutenode.cpp - ../node/dicerollernode.cpp - ../node/executionnode.cpp - ../node/explodedicenode.cpp - ../node/helpnode.cpp - ../node/mergenode.cpp - ../node/jumpbackwardnode.cpp - ../node/keepdiceexecnode.cpp - ../node/listaliasnode.cpp - ../node/listsetrollnode.cpp - ../node/numbernode.cpp - ../node/parenthesesnode.cpp - ../node/paintnode.cpp - ../node/rerolldicenode.cpp - ../node/scalaroperatornode.cpp - ../node/sortresult.cpp - ../node/startingnode.cpp - ../node/ifnode.cpp - ../node/stringnode.cpp - ../node/filternode.cpp - ../node/splitnode.cpp - ../node/groupnode.cpp - ../node/uniquenode.cpp - ../node/bind.cpp - botircdiceparser.cpp - ../node/variablenode.cpp - main.cpp) +add_executable(dirc ${irc_SOURCES} ${irc_HEADERS} ${irc_FORMS}) +set(diceparser_shared_INCLUDE_DIRS "../diceparser") +target_include_directories(dirc PRIVATE ../include ../ ../result ../node) +link_directories(BEFORE ${CMAKE_BINARY_DIR}) -target_link_libraries(irc ${Qt5Core_LIBRARIES} ${Qt5Network_LIBRARIES}) -INSTALL_TARGETS(/bin irc) -#qt5_use_modules() +target_link_libraries(dirc PUBLIC Qt5::Core Qt5::Gui Qt5::Svg Qt5::Widgets Qt5::Network PRIVATE diceparser_shared) +INSTALL_TARGETS(/bin dirc) diff --git a/irc/Readme.md b/irc/Readme.md new file mode 100644 index 0000000..4e9f8f8 --- /dev/null +++ b/irc/Readme.md @@ -0,0 +1,25 @@ +# Change IRC Connection info + +In order to make the bot connect to your irc server/channel you must edit the main.cpp file at line: 41. + + +# Compile + +``` +cd source/diceparser +mkdir build +cd build + +cmake .. -DBUILD_IRC=ON +make -j8 +``` + + + +# Run it + +after 30second the bot must appears in the list of member of the channel. + + +# The IRC protocol +IRC is managed by hand and its support is very limited. diff --git a/irc/botircdiceparser.cpp b/irc/botircdiceparser.cpp index 44ac60a..42ec4cc 100644 --- a/irc/botircdiceparser.cpp +++ b/irc/botircdiceparser.cpp @@ -24,6 +24,18 @@ #include <QDebug> #include <QString> #include <math.h> +#include <QJsonArray> +#include <QJsonDocument> +#include <QJsonObject> + +QString colorToIrcCode(QString str) +{ + if(str == QStringLiteral("reset")) + { + return {}; + } + return str; +} BotIrcDiceParser::BotIrcDiceParser(QObject* parent) : QObject(parent) { @@ -34,7 +46,7 @@ BotIrcDiceParser::BotIrcDiceParser(QObject* parent) : QObject(parent) // Connect signals and slots! connect(m_socket, SIGNAL(readyRead()), this, SLOT(readData())); - connect(m_socket, SIGNAL(connected()), this, SLOT(authentificationProcess())); + //connect(m_socket, SIGNAL(connected()), this, SLOT(authentificationProcess())); connect(m_socket, SIGNAL(disconnected()), this, SLOT(connectToServer())); connect( m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(errorOccurs(QAbstractSocket::SocketError))); @@ -47,7 +59,15 @@ BotIrcDiceParser::~BotIrcDiceParser() void BotIrcDiceParser::connectToServer() { qDebug() << "start connection"; - m_socket->connectToHost(QString("irc.freenode.net"), 8001); + m_socket->connectToHost(m_info.m_host, m_info.m_port); +} + +void BotIrcDiceParser::setInfo(const ConnectionInfo &info) +{ + if(info.m_host == m_info.m_host && info.m_channel == m_info.m_channel) + return; + m_info = info; + emit infoChanged(); } void BotIrcDiceParser::errorOccurs(QAbstractSocket::SocketError) { @@ -56,7 +76,6 @@ void BotIrcDiceParser::errorOccurs(QAbstractSocket::SocketError) void BotIrcDiceParser::readData() { - qDebug() << "Reply"; QString readLine= m_socket->readLine(); if(readLine.startsWith("!")) @@ -80,8 +99,8 @@ void BotIrcDiceParser::readData() QString result= startDiceParsing(cmd, true); if(!result.isEmpty()) { - QString msg("PRIVMSG #RolisteamOfficial :%1 \r\n"); - m_socket->write(msg.arg(result).toLatin1()); + QString msg("PRIVMSG %2 :%1 \r\n"); + m_socket->write(msg.arg(result, m_info.m_channel).toLatin1()); } } } @@ -121,28 +140,97 @@ void BotIrcDiceParser::readData() } void BotIrcDiceParser::setRegisterName() { + qDebug() << "IRC BOT register name"; m_socket->write(QLatin1String("msg NickServ identify \r\n").data()); joinChannel(); } void BotIrcDiceParser::disconnectFromServer() { - // Disconnect from IRC server + qDebug() << "IRC BOT disconnect"; m_socket->write("QUIT Good bye \r\n"); // Good bye is optional message m_socket->flush(); m_socket->disconnect(); // Now we can try it :-) } void BotIrcDiceParser::authentificationProcess() { - qDebug() << "authentification"; - m_socket->write(QLatin1String("NICK rolisteamDice \r\n").data()); - m_socket->write(QLatin1String("USER rolisteamDice rolisteamDice rolisteamDice :rolisteamDice BOT \r\n").data()); + qDebug() << "IRC BOT authentification"; + auto nick = QStringLiteral("NICK %1 \r\n").arg(m_info.m_nickname); + auto user = QStringLiteral("USER %1 %1 %1 :%1 BOT \r\n").arg(m_info.m_nickname); + m_socket->write(nick.toLocal8Bit().data()); + m_socket->write(user.toLocal8Bit().data()); + joinChannel(); } void BotIrcDiceParser::joinChannel() { - m_socket->write(QLatin1String("JOIN #RolisteamOfficial \r\n").data()); + qDebug() << "IRC BOT Join channel"; + auto text = QStringLiteral("JOIN %1 \r\n").arg(m_info.m_channel); + m_socket->write(text.toLocal8Bit().data()); } -QString BotIrcDiceParser::diceToText(QList<ExportedDiceResult>& diceList, bool highlight, bool homogeneous) + +QString displayCommandResult(QString json, bool withColor) +{ + QString result; + QTextStream out(&result); + QJsonDocument doc= QJsonDocument::fromJson(json.toUtf8()); + auto obj= doc.object(); + auto error= obj["error"].toString(); + auto warning= obj["warning"].toString(); + auto comment= obj["comment"].toString(); + auto arrayInst= obj["instructions"].toArray(); + QStringList diceResults; + for(const auto &inst : qAsConst(arrayInst)) + { + auto obj= inst.toObject(); + auto diceVals= obj["diceval"].toArray(); + for(const auto & diceval : qAsConst(diceVals)) + { + auto objval= diceval.toObject(); + auto resultStr= objval["string"].toString(); + diceResults << resultStr; + } + } + auto diceList= diceResults.join(","); + auto scalarText= obj["scalar"].toString(); + auto cmd= obj["command"].toString(); + auto resultStr= obj["string"].toString(); + + if(!error.isEmpty()) + { + out << "Error" << error << "\n"; + out.flush(); + return result; + } + + if(!warning.isEmpty()) + out << "Warning: " << warning << "\n"; + + QString str; + + if(withColor) + str= QString("Result: %1 - details:[%3 (%2)]").arg(scalarText, diceList, cmd); + else + str= QString("Result: %1 - details:[%3 (%2)]").arg(scalarText, diceList, cmd); + + if(!resultStr.isEmpty() && resultStr != scalarText) + { + resultStr.replace("%2", diceList.trimmed()); + str= resultStr; + } + + if(!comment.isEmpty()) + { + out << comment << " "; + } + out << str << "\n"; + + out.flush(); + return result; +} + + + +/*QString BotIrcDiceParser::diceToText(QList<ExportedDiceResult>& diceList, bool highlight, bool homogeneous) { QStringList global; for(auto dice : diceList) @@ -153,7 +241,7 @@ QString BotIrcDiceParser::diceToText(QList<ExportedDiceResult>& diceList, bool h QStringList result; ListDiceResult diceResult= dice.value(face); // patternColor = patternColorarg(); - foreach(HighLightDice tmp, diceResult) + for(HighLightDice tmp: qAsConst(diceResult)) { QStringList diceListStr; QStringList diceListChildren; @@ -213,7 +301,7 @@ QString BotIrcDiceParser::diceToText(QList<ExportedDiceResult>& diceList, bool h global << resultGlobal.join(' '); } return global.join(' '); -} +}*/ QString BotIrcDiceParser::startDiceParsing(QString& cmd, bool highlight) { @@ -222,55 +310,41 @@ QString BotIrcDiceParser::startDiceParsing(QString& cmd, bool highlight) if(m_parser->parseLine(cmd)) { m_parser->start(); - if(!m_parser->getErrorMap().isEmpty()) + + if(!m_parser->humanReadableError().isEmpty()) { out << "Error" << m_parser->humanReadableError() << "\n"; return QString(); } + auto allSameColor= true; + QString colorP; + auto json= m_parser->resultAsJSon( + [&colorP, &allSameColor](const QString& result, const QString& color, bool hightlight) { + auto trueColor= color; + if(color.isEmpty()) + trueColor= "red"; - QList<ExportedDiceResult> list; - bool homogeneous= true; - m_parser->getLastDiceResult(list, homogeneous); - QString diceText= diceToText(list, highlight, homogeneous); - QString scalarText; - QString str; + if(colorP.isEmpty()) + colorP= trueColor; + else if(colorP != trueColor) + allSameColor= false; - if(m_parser->hasIntegerResultNotInFirst()) - { - auto values= m_parser->getLastIntegerResults(); - QStringList strLst; - for(auto val : values) - { - strLst << QString::number(val); - } - scalarText= QString("%1").arg(strLst.join(',')); - } - else if(!list.isEmpty()) - { - auto values= m_parser->getSumOfDiceResult(); - QStringList strLst; - for(auto val : values) - { - strLst << QString::number(val); - } - scalarText= QString("%1").arg(strLst.join(',')); - } - if(highlight) - str= QString("Result: %1, details:[%3 (%2)]").arg(scalarText).arg(diceText).arg(m_parser->getDiceCommand()); - else - str= QString("Result: %1, details:[%3 (%2)]").arg(scalarText).arg(diceText).arg(m_parser->getDiceCommand()); + auto front= colorToIrcCode(trueColor); + auto end= front.isEmpty() ? "" : colorToIrcCode("reset"); + return hightlight ? QString("%1%2%3").arg(front).arg(result).arg(end) : result; + }); - if(m_parser->hasStringResult()) - { - str= m_parser->getStringResult().join(","); - } - out << str << "\n"; + out << displayCommandResult(json, allSameColor); } else { out << m_parser->humanReadableError() << "\n"; - ; } return result; } + +ConnectionInfo BotIrcDiceParser::info() const +{ + return m_info; +} diff --git a/irc/botircdiceparser.h b/irc/botircdiceparser.h index 848c200..4509646 100644 --- a/irc/botircdiceparser.h +++ b/irc/botircdiceparser.h @@ -26,9 +26,17 @@ #include <QTcpSocket> +struct ConnectionInfo { + QString m_host; + QString m_channel; + QString m_nickname; + int m_port; +}; + class BotIrcDiceParser : public QObject { Q_OBJECT + Q_PROPERTY(ConnectionInfo info READ info WRITE setInfo NOTIFY infoChanged) public: explicit BotIrcDiceParser(QObject* parent= 0); @@ -36,14 +44,13 @@ public: QString diceToText(QList<ExportedDiceResult>& dice, bool highlight, bool homogeneous); QString startDiceParsing(QString& cmd, bool highlight); + ConnectionInfo info() const; + public slots: void errorOccurs(QAbstractSocket::SocketError); void connectToServer(); + void setInfo(const ConnectionInfo & info); -private: - // Ui::BotIrcDiceParser *ui; - QTcpSocket* m_socket; - DiceParser* m_parser; private slots: void readData(); @@ -51,6 +58,15 @@ private slots: void authentificationProcess(); void joinChannel(); void setRegisterName(); + + +signals: + void infoChanged(); + +private: + QTcpSocket* m_socket; + DiceParser* m_parser; + ConnectionInfo m_info; }; #endif // MAINWINDOW_H diff --git a/irc/irc.pri b/irc/irc.pri deleted file mode 100644 index c987e1e..0000000 --- a/irc/irc.pri +++ /dev/null @@ -1,9 +0,0 @@ -QT += widgets gui network -FORMS += \ - irc/mainwindow.ui - -HEADERS += \ - irc/mainwindow.h - -SOURCES += \ - irc/mainwindow.cpp diff --git a/irc/main.cpp b/irc/main.cpp index 5989a94..8647f14 100644 --- a/irc/main.cpp +++ b/irc/main.cpp @@ -38,6 +38,7 @@ int main(int argc, char* argv[]) { QCoreApplication app(argc, argv); BotIrcDiceParser bot; + bot.setInfo({"host", "#channel", "dice", 8001}); bot.connectToServer(); return app.exec(); } |