Triggers updating (syntax and url substitute

master
const an teen 2022-01-04 12:12:17 -05:00
parent 72bfbd2e8b
commit 70f46b0f87
3 changed files with 42 additions and 25 deletions

View File

@ -29,9 +29,10 @@ void ApplicationData::createConfigExample(const QString &pathToConfig)
"# If password is empty logging in without password.\n" "# If password is empty logging in without password.\n"
"password = password_for_NickServ\n\n" "password = password_for_NickServ\n\n"
"# This triggers available in all chats.\n" "# This triggers available in all chats.\n"
"# 'request' and 'answer' must be splitted by ':::'\n" "# Request and answer must be splitted by \":::\". Triggers splitting by \"<!>\".\n"
"# triggers splitting by '<!>'\n" "# You can use \"%CHANNEL_FOR_URL%\" to automatically substitute the address for the chat,\n"
"triggers = request = version ::: answer = " + IRCABOT_VERSION + " <!> request=hello:::answer=hi\n\n" "# from which the link to the web interface is requested.\n"
"triggers = version ::: " + IRCABOT_VERSION + " <!> webui ::: http://example.com/%CHANNEL_FOR_URL%\n\n"
"# Web interface options\n" "# Web interface options\n"
"bind_to_address = 127.0.0.1\n" "bind_to_address = 127.0.0.1\n"
@ -44,9 +45,7 @@ void ApplicationData::createConfigExample(const QString &pathToConfig)
"# Default channel for the web interface marked with an '@' at the end (globally only one).\n" "# Default channel for the web interface marked with an '@' at the end (globally only one).\n"
"channels = #general@,#acetonevideo\n" "channels = #general@,#acetonevideo\n"
"# This triggers available in current server only.\n" "# This triggers available in current server only.\n"
"# 'request' and 'answer' must be splitted by ':::'\n" "triggers = hi ::: hello <!> developer ::: acetone\n\n"
"# triggers splitting by '<!>'\n"
"triggers = request = hi ::: answer = hello <!> request=developer:::answer=acetone\n\n"
"# Optional parameters if global is defined:\n" "# Optional parameters if global is defined:\n"
"#nick = unique_nickname_for_this_server\n" "#nick = unique_nickname_for_this_server\n"
"#user = unique_ident_for_this_server\n" "#user = unique_ident_for_this_server\n"
@ -180,11 +179,18 @@ void ApplicationData::readConfig()
QString triggersLine = global::getValue(globalSection, "triggers"); QString triggersLine = global::getValue(globalSection, "triggers");
if (not triggersLine.isEmpty()) { if (not triggersLine.isEmpty()) {
QStringList triggersPair = triggersLine.split("<!>"); QStringList triggersPair = triggersLine.split("<!>");
for (auto &pair: triggersPair) { for (auto &p: triggersPair) {
QString request = global::getValue(pair, "request", global::Type::eForTriggers); QStringList pair = p.split(":::");
if (request.isEmpty()) continue; if (pair.size() != 2) continue;
QString answer = global::getValue(pair, "answer", global::Type::eForTriggers); QString request = pair.first();
if (answer.isEmpty()) continue; QString answer = pair.last();
if (request.startsWith(' ')) request.remove(QRegularExpression("^\\s*"));
if (request.endsWith(' ')) request.remove(QRegularExpression("\\s*$"));
if (answer.startsWith(' ')) answer.remove(QRegularExpression("^\\s*"));
if (answer.endsWith(' ')) answer.remove(QRegularExpression("\\s*$"));
if (request.isEmpty() or answer.isEmpty()) continue;
globalTriggers[request] = answer; globalTriggers[request] = answer;
qInfo().noquote() << "[GLOBAL] Trigger (" << request << ":::" << answer << ")"; qInfo().noquote() << "[GLOBAL] Trigger (" << request << ":::" << answer << ")";
} }
@ -295,14 +301,20 @@ void ApplicationData::readConfig()
QString triggersLine = global::getValue(currentSection, "triggers"); QString triggersLine = global::getValue(currentSection, "triggers");
if (not triggersLine.isEmpty()) { if (not triggersLine.isEmpty()) {
QStringList triggersPair = triggersLine.split("<!>"); QStringList triggersPair = triggersLine.split("<!>");
for (auto &pair: triggersPair) { for (auto &p: triggersPair) {
QString request = global::getValue(pair, "request", global::Type::eForTriggers); QStringList pair = p.split(":::");
if (request.isEmpty()) continue; if (pair.size() != 2) continue;
QString answer = global::getValue(pair, "answer", global::Type::eForTriggers); QString request = pair.first();
if (answer.isEmpty()) continue; QString answer = pair.last();
if (request.startsWith(' ')) request.remove(QRegularExpression("^\\s*"));
if (request.endsWith(' ')) request.remove(QRegularExpression("\\s*$"));
if (answer.startsWith(' ')) answer.remove(QRegularExpression("^\\s*"));
if (answer.endsWith(' ')) answer.remove(QRegularExpression("\\s*$"));
if (request.isEmpty() or answer.isEmpty()) continue;
newConnection.triggers[request] = answer; newConnection.triggers[request] = answer;
qInfo().noquote() << "[" + newConnection.displayName + "] Trigger (" << qInfo().noquote() << "["+newConnection.displayName+"] Trigger (" << request << ":::" << answer << ")";
request << ":::" << answer << ")";
} }
} }
for (auto &glob: globalTriggers) { for (auto &glob: globalTriggers) {

View File

@ -8,12 +8,6 @@
#include <QTimer> #include <QTimer>
#include <QFile> #include <QFile>
const int NICK_RECOVER_TIMER = 60000; // 1 minute
const int THREAD_SLEEP_ON_RECONNECT = 3; // seconds
const int USER_LIST_ACTIALIZE = 5000;// 1800000; // 30 minutes
const int WRITING_STOP_TIMER = 1100; // 1.1 second
const int PING_TIMEOUT = 361000; // 361 seconds
IrcClient::IrcClient(const ConnectionData& config, QObject *parent) : IrcClient::IrcClient(const ConnectionData& config, QObject *parent) :
QObject(parent), QObject(parent),
m_socket(nullptr), m_socket(nullptr),
@ -193,7 +187,10 @@ void IrcClient::toTrigger(const QString& channel, const QString &nickname, const
for (auto trigger: m_connectionData.triggers) { for (auto trigger: m_connectionData.triggers) {
if (message.contains(m_connectionData.triggers.key(trigger), Qt::CaseInsensitive)) { if (message.contains(m_connectionData.triggers.key(trigger), Qt::CaseInsensitive)) {
write("PRIVMSG " + channel + " " + nickname + ", " + trigger); QString response {trigger};
response.replace(TRIGGER_CHANNEL_FOR_URL_PATTERN,
global::toLowerAndNoSpaces(m_connectionData.displayName) + "/" + channel.mid(1, channel.size()-1));
write("PRIVMSG " + channel + " " + nickname + ", " + response);
return; return;
} }
} }

View File

@ -10,6 +10,14 @@
#include <QTimer> #include <QTimer>
#include <map> #include <map>
constexpr int NICK_RECOVER_TIMER = 60000; // 1 minute
constexpr int THREAD_SLEEP_ON_RECONNECT = 3; // seconds
constexpr int USER_LIST_ACTIALIZE = 1800000; // 30 minutes
constexpr int WRITING_STOP_TIMER = 1100; // 1.1 second
constexpr int PING_TIMEOUT = 361000; // 361 seconds
const QString TRIGGER_CHANNEL_FOR_URL_PATTERN = "%CHANNEL_FOR_URL%";
class IrcClient : public QObject class IrcClient : public QObject
{ {
Q_OBJECT Q_OBJECT