aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt5
-rw-r--r--irc/CMakeLists.txt76
-rw-r--r--irc/Readme.md25
-rw-r--r--irc/botircdiceparser.cpp174
-rw-r--r--irc/botircdiceparser.h24
-rw-r--r--irc/irc.pri9
-rw-r--r--irc/main.cpp1
7 files changed, 189 insertions, 125 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index af3816b..21b4596 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -9,6 +9,7 @@ enable_testing(true)
include_directories(${CMAKE_CURRENT_SOURCE_DIR} result node)
option(BUILD_CLI OFF)
+option(BUILD_IRC OFF)
SET( dice_sources
${CMAKE_CURRENT_SOURCE_DIR}/diceparser.cpp
@@ -86,6 +87,10 @@ IF(BUILD_CLI)
add_subdirectory(cli)
ENDIF()
+IF(BUILD_IRC)
+ add_subdirectory(irc)
+ENDIF()
+
add_subdirectory( tests )
include(GNUInstallDirs)
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();
}