Added new command: /SERVER

master
Tomatix 5 years ago
parent 468ee3c0dd
commit 29bd6f3d8a
  1. 1
      ICommand/CMakeLists.txt
  2. 1
      ICommand/Commands.h
  3. 25
      ICommand/ICommand.cpp
  4. 1
      ICommand/ICommandPriv.h
  5. 47
      ICommand/Internal/server.cpp
  6. 24
      IdealIRC/IRC.cpp
  7. 9
      IdealIRC/IRC.h
  8. 3
      IdealIRC/MdiManager.cpp

@ -15,6 +15,7 @@ list(APPEND ${component}_SOURCES_Internal
${CMAKE_CURRENT_SOURCE_DIR}/Internal/ctcpreply.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Internal/me.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Internal/echo.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Internal/server.cpp
)

@ -33,6 +33,7 @@ namespace Command::Internal {
constexpr auto* MSG = "MSG";
constexpr auto* QUOTE = "QUOTE";
constexpr auto* RAW = "RAW";
constexpr auto* SERVER = "SERVER";
}
#endif // ICOMMAND_COMMANDS_H

@ -572,6 +572,31 @@ bool ICommand::tryParseInternal(QString cmdLine)
return true;
}
else if (command == SERVER) {
CommandData argv(cmdLine, { &ICommand::prd_Switch, &ICommand::prd_AnyWord });
if (!argv[1]) {
print_notEnoughParameters(command);
return true;
}
bool ssl{ false };
bool newstatus{ false };
bool activate{ false };
if (argv[0]) {
ssl = argv[0]->find('s') != std::string::npos;
newstatus = argv[0]->find('n') != std::string::npos;
activate = argv[0]->find('a') != std::string::npos;
}
QStringList serverport = QString::fromStdString(*argv[1]).split(':');
auto host = serverport[0].toStdString();
auto port = serverport.size() > 1 ? serverport[1].toStdString() : "6667";
mp->cmd_server(ssl, newstatus, activate, host, port);
return true;
}
return false;
}

@ -26,6 +26,7 @@ struct ICommandPriv
void cmd_ctcpreply(const std::string& target, const std::string& command, const std::string& message);
void cmd_me(const std::string& target, const std::string& message);
void cmd_echo(const std::string& arg1, const std::string& arg2, const std::string& text);
void cmd_server(bool ssl, bool newstatus, bool activate, const std::string& host, const std::string& port);
};
#endif // ICOMMANDPRIV_H

@ -0,0 +1,47 @@
#include "ICommand/ICommandPriv.h"
#include "ConfigMgr.h"
#include <chrono>
void ICommandPriv::cmd_server(bool ssl, bool newstatus, bool activate, const std::string& host, const std::string& port)
{
auto& mdi = MdiManager::instance();
IWinStatus* sw = newstatus ? static_cast<IWinStatus*>(mdi.createSubwindow(nullptr, "Status", IWin::Type::Status, activate))
: mdi.currentStatus();
const auto& conf = ConfigMgr::instance();
auto& con = sw->getConnection();
if (con.isConnected()) {
const auto quitMsg = conf.common("QuitMessage").toStdString();
con.setReconnectDetails(ssl, host, port);
auto e = con.disconnectFromServer(quitMsg);
if (e != IRCError::NoError)
sw->print(PrintType::ProgramInfo, IRCErrorToString(e).c_str());
}
else {
QString nickname = conf.connection("Nickname");
QString realname = conf.connection("Realname");
QString username = conf.connection("Username");
con.setHostname(host, ssl);
con.setPort(port);
con.setRealname(realname.toStdString());
con.setIdent(username.toStdString());
con.setNickname(nickname.toStdString());
bool manualKeepaliveEnabled = conf.common("ManualKeepaliveEnabled").toInt();
int manualKeepalive = manualKeepaliveEnabled ? conf.common("ManualKeepalive").toInt() : 0;
con.setManualKeepalive(std::chrono::seconds(manualKeepalive));
const auto cfgSSLExcept_Expired = conf.common("SSLExpired");
const auto cfgSSLExcept_Selfsigned = conf.common("SSLSelfsigned");
const auto cfgSSLExcept_CNMismatch = conf.common("SSLCNMismatch");
con.exceptSSL_Expired(cfgSSLExcept_Expired == "1");
con.exceptSSL_SelfSigned(cfgSSLExcept_Selfsigned == "1");
con.exceptSSL_CNMismatch(cfgSSLExcept_CNMismatch == "1");
auto e = con.tryConnect();
if (e != IRCError::NoError)
sw->print(PrintType::ProgramInfo, IRCErrorToString(e).c_str());
}
}

@ -84,6 +84,14 @@ bool IRC::ignoreVerbosity(const std::string& cmd)
return m_ignoreVerbosity.contains(qcmd.toUpper());
}
void IRC::setReconnectDetails(bool ssl, const std::string& host, const std::string& port)
{
m_reconnectDetails.emplace();
m_reconnectDetails->ssl = ssl;
m_reconnectDetails->host = host;
m_reconnectDetails->port = port;
}
void IRC::rejoinChannels()
{
QStringList targetList;
@ -128,10 +136,18 @@ void IRC::onDisconnected()
emit readyForExit();
contextualScriptEvent(&m_status, ScriptEvent::Disconnected);
auto& conf = ConfigMgr::instance();
bool reconnect = conf.common("Reconnect").toInt();
if (reconnect && !m_expectDisconnect)
tryConnect();
if (m_reconnectDetails.has_value()) {
setHostname(m_reconnectDetails->host, m_reconnectDetails->ssl);
setPort(m_reconnectDetails->port);
m_reconnectDetails.reset();
tryConnect();
}
else {
auto& conf = ConfigMgr::instance();
bool reconnect = conf.common("Reconnect").toInt();
if (reconnect && !m_expectDisconnect)
tryConnect();
}
m_expectDisconnect = false;
}

@ -28,6 +28,8 @@ public:
void expectDisconnect() { m_expectDisconnect = true; }
void dontExpectDisconnect() { m_expectDisconnect = false; }
void setReconnectDetails(bool ssl, const std::string& host, const std::string& port);
signals:
void readyForExit();
void disconnected();
@ -42,6 +44,13 @@ signals:
void memberRemoved(const QString& channel, const IRCMemberEntry& entry);
private:
struct ReconnectDetails {
bool ssl;
std::string host;
std::string port;
};
std::optional<ReconnectDetails> m_reconnectDetails;
bool m_disconnectForExit{ false };
bool m_expectDisconnect{ false };
IWinStatus& m_status;

@ -80,7 +80,8 @@ IWin* MdiManager::createSubwindow(IWin* parent, const QString& buttonText, IWin:
switch (windowType) {
case IWin::Type::Status:
basePtr = new IWinStatus(buttonText);
m_activeStatus = dynamic_cast<IWinStatus*>(basePtr);
if (!m_activeStatus || activate)
m_activeStatus = dynamic_cast<IWinStatus*>(basePtr);
iconPath = ":/Icons/serverwindow.png";
break;

Loading…
Cancel
Save