void ShowSocks(bool bShowHosts) { if (CZNC::Get().GetManager().empty()) { PutStatus("You have no open sockets."); return; } std::priority_queue<CSocketSorter> socks = GetSockets(); CTable Table; Table.AddColumn("Name"); Table.AddColumn("Created"); Table.AddColumn("State"); #ifdef HAVE_LIBSSL Table.AddColumn("SSL"); #endif Table.AddColumn("Local"); Table.AddColumn("Remote"); while (!socks.empty()) { Csock* pSocket = socks.top().GetSock(); socks.pop(); Table.AddRow(); Table.SetCell("Name", pSocket->GetSockName()); Table.SetCell("Created", GetCreatedTime(pSocket)); Table.SetCell("State", GetSocketState(pSocket)); #ifdef HAVE_LIBSSL Table.SetCell("SSL", pSocket->GetSSL() ? "Yes" : "No"); #endif Table.SetCell("Local", GetLocalHost(pSocket, bShowHosts)); Table.SetCell("Remote", GetRemoteHost(pSocket, bShowHosts)); } PutModule(Table); return; }
void List(const CString& sCommand) { CTable Table; unsigned int index = 1; Table.AddColumn(t_s("Id", "list")); Table.AddColumn(t_s("Perform", "list")); Table.AddColumn(t_s("Expanded", "list")); for (const CString& sPerf : m_vPerform) { Table.AddRow(); Table.SetCell(t_s("Id", "list"), CString(index++)); Table.SetCell(t_s("Perform", "list"), sPerf); CString sExpanded = ExpandString(sPerf); if (sExpanded != sPerf) { Table.SetCell(t_s("Expanded", "list"), sExpanded); } } if (PutModule(Table) == 0) { PutModule(t_s("No commands in your perform list.")); } }
void ListTransfersCommand(const CString& sLine) { CTable Table; Table.AddColumn("Type"); Table.AddColumn("State"); Table.AddColumn("Speed"); Table.AddColumn("Nick"); Table.AddColumn("IP"); Table.AddColumn("File"); set<CSocket*>::const_iterator it; for (it = BeginSockets(); it != EndSockets(); ++it) { CDCCSock* pSock = (CDCCSock*) *it; Table.AddRow(); Table.SetCell("Nick", pSock->GetRemoteNick()); Table.SetCell("IP", pSock->GetRemoteIP()); Table.SetCell("File", pSock->GetFileName()); if (pSock->IsSend()) { Table.SetCell("Type", "Sending"); } else { Table.SetCell("Type", "Getting"); } if (pSock->GetType() == Csock::LISTENER) { Table.SetCell("State", "Waiting"); } else { Table.SetCell("State", CString::ToPercent(pSock->GetProgress())); Table.SetCell("Speed", CString((int)(pSock->GetAvgRead() / 1024.0)) + " KiB/s"); } } if (PutModule(Table) == 0) { PutModule("You have no active DCC transfers."); } }
void List(const CString& sCommand) { CTable Table; unsigned int index = 1; Table.AddColumn("Id"); Table.AddColumn("Perform"); Table.AddColumn("Expanded"); for (VCString::const_iterator it = m_vPerform.begin(); it != m_vPerform.end(); ++it, index++) { Table.AddRow(); Table.SetCell("Id", CString(index)); Table.SetCell("Perform", *it); CString sExpanded = ExpandString(*it); if (sExpanded != *it) { Table.SetCell("Expanded", sExpanded); } } if (PutModule(Table) == 0) { PutModule("No commands in your perform list."); } }
void ShowSocks(bool bShowHosts) { CSockManager& m = CZNC::Get().GetManager(); if (!m.size()) { PutStatus("You have no open sockets."); return; } std::priority_queue<CSocketSorter> socks; for (unsigned int a = 0; a < m.size(); a++) { socks.push(m[a]); } CTable Table; Table.AddColumn("Name"); Table.AddColumn("Created"); Table.AddColumn("State"); #ifdef HAVE_LIBSSL Table.AddColumn("SSL"); #endif Table.AddColumn("Local"); Table.AddColumn("Remote"); while (!socks.empty()) { Csock* pSocket = socks.top().GetSock(); socks.pop(); Table.AddRow(); switch (pSocket->GetType()) { case Csock::LISTENER: Table.SetCell("State", "Listen"); break; case Csock::INBOUND: Table.SetCell("State", "Inbound"); break; case Csock::OUTBOUND: if (pSocket->IsConnected()) Table.SetCell("State", "Outbound"); else Table.SetCell("State", "Connecting"); break; default: Table.SetCell("State", "UNKNOWN"); break; } unsigned long long iStartTime = pSocket->GetStartTime(); time_t iTime = iStartTime / 1000; Table.SetCell("Created", FormatTime("%Y-%m-%d %H:%M:%S", iTime)); #ifdef HAVE_LIBSSL if (pSocket->GetSSL()) { Table.SetCell("SSL", "Yes"); } else { Table.SetCell("SSL", "No"); } #endif Table.SetCell("Name", pSocket->GetSockName()); CString sVHost; if (bShowHosts) { sVHost = pSocket->GetBindHost(); } if (sVHost.empty()) { sVHost = pSocket->GetLocalIP(); } Table.SetCell("Local", sVHost + " " + CString(pSocket->GetLocalPort())); CString sHost; if (!bShowHosts) { sHost = pSocket->GetRemoteIP(); } // While connecting, there might be no ip available if (sHost.empty()) { sHost = pSocket->GetHostName(); } u_short uPort; // While connecting, GetRemotePort() would return 0 if (pSocket->GetType() == Csock::OUTBOUND) { uPort = pSocket->GetPort(); } else { uPort = pSocket->GetRemotePort(); } if (uPort != 0) { Table.SetCell("Remote", sHost + " " + CString(uPort)); } else { Table.SetCell("Remote", sHost); } } PutModule(Table); return; }
virtual void OnModCommand(const CString& sCommand) { CString sCom = sCommand.Token(0); CString sArgs = sCommand.Token(1, true); if (sCom.Equals("chat") && !sArgs.empty()) { CString sNick = "(s)" + sArgs; set<CSocket*>::const_iterator it; for (it = BeginSockets(); it != EndSockets(); ++it) { CSChatSock *pSock = (CSChatSock*) *it; if (pSock->GetChatNick().Equals(sNick)) { PutModule("Already Connected to [" + sArgs + "]"); return; } } CSChatSock *pSock = new CSChatSock(this, sNick); pSock->SetCipher("HIGH"); pSock->SetPemLocation(m_sPemFile); u_short iPort = m_pManager->ListenRand(pSock->GetSockName() + "::LISTENER", m_pUser->GetLocalDCCIP(), true, SOMAXCONN, pSock, 60); if (iPort == 0) { PutModule("Failed to start chat!"); return; } stringstream s; s << "PRIVMSG " << sArgs << " :\001"; s << "DCC SCHAT chat "; s << CUtils::GetLongIP(m_pUser->GetLocalDCCIP()); s << " " << iPort << "\001"; PutIRC(s.str()); } else if (sCom.Equals("list")) { CTable Table; Table.AddColumn("Nick"); Table.AddColumn("Created"); Table.AddColumn("Host"); Table.AddColumn("Port"); Table.AddColumn("Status"); Table.AddColumn("Cipher"); set<CSocket*>::const_iterator it; for (it = BeginSockets(); it != EndSockets(); ++it) { Table.AddRow(); CSChatSock *pSock = (CSChatSock*) *it; Table.SetCell("Nick", pSock->GetChatNick()); unsigned long long iStartTime = pSock->GetStartTime(); time_t iTime = iStartTime / 1000; char *pTime = ctime(&iTime); if (pTime) { CString sTime = pTime; sTime.Trim(); Table.SetCell("Created", sTime); } if (pSock->GetType() != CSChatSock::LISTENER) { Table.SetCell("Status", "Established"); Table.SetCell("Host", pSock->GetRemoteIP()); Table.SetCell("Port", CString(pSock->GetRemotePort())); SSL_SESSION *pSession = pSock->GetSSLSession(); if (pSession && pSession->cipher && pSession->cipher->name) Table.SetCell("Cipher", pSession->cipher->name); } else { Table.SetCell("Status", "Waiting"); Table.SetCell("Port", CString(pSock->GetLocalPort())); } } if (Table.size()) { PutModule(Table); } else PutModule("No SDCCs currently in session"); } else if (sCom.Equals("close")) { if (!sArgs.Equals("(s)", false, 3)) sArgs = "(s)" + sArgs; set<CSocket*>::const_iterator it; for (it = BeginSockets(); it != EndSockets(); ++it) { CSChatSock *pSock = (CSChatSock*) *it; if (sArgs.Equals(pSock->GetChatNick())) { pSock->Close(); return; } } PutModule("No Such Chat [" + sArgs + "]"); } else if (sCom.Equals("showsocks") && m_pUser->IsAdmin()) { CTable Table; Table.AddColumn("SockName"); Table.AddColumn("Created"); Table.AddColumn("LocalIP:Port"); Table.AddColumn("RemoteIP:Port"); Table.AddColumn("Type"); Table.AddColumn("Cipher"); set<CSocket*>::const_iterator it; for (it = BeginSockets(); it != EndSockets(); ++it) { Table.AddRow(); Csock *pSock = *it; Table.SetCell("SockName", pSock->GetSockName()); unsigned long long iStartTime = pSock->GetStartTime(); time_t iTime = iStartTime / 1000; char *pTime = ctime(&iTime); if (pTime) { CString sTime = pTime; sTime.Trim(); Table.SetCell("Created", sTime); } if (pSock->GetType() != Csock::LISTENER) { if (pSock->GetType() == Csock::OUTBOUND) Table.SetCell("Type", "Outbound"); else Table.SetCell("Type", "Inbound"); Table.SetCell("LocalIP:Port", pSock->GetLocalIP() + ":" + CString(pSock->GetLocalPort())); Table.SetCell("RemoteIP:Port", pSock->GetRemoteIP() + ":" + CString(pSock->GetRemotePort())); SSL_SESSION *pSession = pSock->GetSSLSession(); if (pSession && pSession->cipher && pSession->cipher->name) Table.SetCell("Cipher", pSession->cipher->name); else Table.SetCell("Cipher", "None"); } else { Table.SetCell("Type", "Listener"); Table.SetCell("LocalIP:Port", pSock->GetLocalIP() + ":" + CString(pSock->GetLocalPort())); Table.SetCell("RemoteIP:Port", "0.0.0.0:0"); } } if (Table.size()) PutModule(Table); else PutModule("Error Finding Sockets"); } else if (sCom.Equals("help")) { PutModule("Commands are:"); PutModule(" help - This text."); PutModule(" chat <nick> - Chat a nick."); PutModule(" list - List current chats."); PutModule(" close <nick> - Close a chat to a nick."); PutModule(" timers - Shows related timers."); if (m_pUser->IsAdmin()) { PutModule(" showsocks - Shows all socket connections."); } } else if (sCom.Equals("timers")) ListTimers(); else PutModule("Unknown command [" + sCom + "] [" + sArgs + "]"); }
void OnModCommand(const CString& sLine) override { CString sCommand = sLine.Token(0).AsLower(); if (sCommand == "help") { PutModule("The following commands are available:"); CTable Table; Table.AddColumn("Command"); Table.AddColumn("Description"); Table.AddRow(); Table.SetCell("Command", "Auth [<username> <password>]"); Table.SetCell("Description", "Tries to authenticate you with Q. Both parameters " "are optional."); Table.AddRow(); Table.SetCell("Command", "Cloak"); Table.SetCell( "Description", "Tries to set usermode +x to hide your real hostname."); Table.AddRow(); Table.SetCell("Command", "Status"); Table.SetCell("Description", "Prints the current status of the module."); Table.AddRow(); Table.SetCell("Command", "Update"); Table.SetCell("Description", "Re-requests the current user information from Q."); Table.AddRow(); Table.SetCell("Command", "Set <setting> <value>"); Table.SetCell("Description", "Changes the value of the given setting. See the " "list of settings below."); Table.AddRow(); Table.SetCell("Command", "Get"); Table.SetCell("Description", "Prints out the current configuration. See the list " "of settings below."); PutModule(Table); PutModule("The following settings are available:"); CTable Table2; Table2.AddColumn("Setting"); Table2.AddColumn("Type"); Table2.AddColumn("Description"); Table2.AddRow(); Table2.SetCell("Setting", "Username"); Table2.SetCell("Type", "String"); Table2.SetCell("Description", "Your Q username."); Table2.AddRow(); Table2.SetCell("Setting", "Password"); Table2.SetCell("Type", "String"); Table2.SetCell("Description", "Your Q password."); Table2.AddRow(); Table2.SetCell("Setting", "UseCloakedHost"); Table2.SetCell("Type", "Boolean"); Table2.SetCell("Description", "Whether to cloak your hostname (+x) automatically " "on connect."); Table2.AddRow(); Table2.SetCell("Setting", "UseChallenge"); Table2.SetCell("Type", "Boolean"); Table2.SetCell("Description", "Whether to use the CHALLENGEAUTH mechanism to " "avoid sending passwords in cleartext."); Table2.AddRow(); Table2.SetCell("Setting", "RequestPerms"); Table2.SetCell("Type", "Boolean"); Table2.SetCell( "Description", "Whether to request voice/op from Q on join/devoice/deop."); Table2.AddRow(); Table2.SetCell("Setting", "JoinOnInvite"); Table2.SetCell("Type", "Boolean"); Table2.SetCell("Description", "Whether to join channels when Q invites you."); Table2.AddRow(); Table2.SetCell("Setting", "JoinAfterCloaked"); Table2.SetCell("Type", "Boolean"); Table2.SetCell("Description", "Whether to delay joining channels until after you " "are cloaked."); PutModule(Table2); PutModule( "This module takes 2 optional parameters: <username> " "<password>"); PutModule("Module settings are stored between restarts."); } else if (sCommand == "set") { CString sSetting = sLine.Token(1).AsLower(); CString sValue = sLine.Token(2); if (sSetting.empty() || sValue.empty()) { PutModule("Syntax: Set <setting> <value>"); } else if (sSetting == "username") { SetUsername(sValue); PutModule("Username set"); } else if (sSetting == "password") { SetPassword(sValue); PutModule("Password set"); } else if (sSetting == "usecloakedhost") { SetUseCloakedHost(sValue.ToBool()); PutModule("UseCloakedHost set"); } else if (sSetting == "usechallenge") { SetUseChallenge(sValue.ToBool()); PutModule("UseChallenge set"); } else if (sSetting == "requestperms") { SetRequestPerms(sValue.ToBool()); PutModule("RequestPerms set"); } else if (sSetting == "joinoninvite") { SetJoinOnInvite(sValue.ToBool()); PutModule("JoinOnInvite set"); } else if (sSetting == "joinaftercloaked") { SetJoinAfterCloaked(sValue.ToBool()); PutModule("JoinAfterCloaked set"); } else PutModule("Unknown setting: " + sSetting); } else if (sCommand == "get" || sCommand == "list") { CTable Table; Table.AddColumn("Setting"); Table.AddColumn("Value"); Table.AddRow(); Table.SetCell("Setting", "Username"); Table.SetCell("Value", m_sUsername); Table.AddRow(); Table.SetCell("Setting", "Password"); Table.SetCell("Value", "*****"); // m_sPassword Table.AddRow(); Table.SetCell("Setting", "UseCloakedHost"); Table.SetCell("Value", CString(m_bUseCloakedHost)); Table.AddRow(); Table.SetCell("Setting", "UseChallenge"); Table.SetCell("Value", CString(m_bUseChallenge)); Table.AddRow(); Table.SetCell("Setting", "RequestPerms"); Table.SetCell("Value", CString(m_bRequestPerms)); Table.AddRow(); Table.SetCell("Setting", "JoinOnInvite"); Table.SetCell("Value", CString(m_bJoinOnInvite)); Table.AddRow(); Table.SetCell("Setting", "JoinAfterCloaked"); Table.SetCell("Value", CString(m_bJoinAfterCloaked)); PutModule(Table); } else if (sCommand == "status") { PutModule("Connected: " + CString(IsIRCConnected() ? "yes" : "no")); PutModule("Cloaked: " + CString(m_bCloaked ? "yes" : "no")); PutModule("Authed: " + CString(m_bAuthed ? "yes" : "no")); } else { // The following commands require an IRC connection. if (!IsIRCConnected()) { PutModule("Error: You are not connected to IRC."); return; } if (sCommand == "cloak") { if (!m_bCloaked) Cloak(); else PutModule("Error: You are already cloaked!"); } else if (sCommand == "auth") { if (!m_bAuthed) Auth(sLine.Token(1), sLine.Token(2)); else PutModule("Error: You are already authed!"); } else if (sCommand == "update") { WhoAmI(); PutModule("Update requested."); } else { PutModule("Unknown command. Try 'help'."); } } }
virtual void OnModCommand(const CString& sLine) { CString sCommand = sLine.Token(0).AsUpper(); if (sCommand.Equals("HELP")) { PutModule("Commands are: ListUsers, AddChans, DelChans, AddUser, DelUser"); } else if (sCommand.Equals("TIMERS")) { ListTimers(); } else if (sCommand.Equals("ADDUSER") || sCommand.Equals("DELUSER")) { CString sUser = sLine.Token(1); CString sHost = sLine.Token(2); CString sKey = sLine.Token(3); if (sCommand.Equals("ADDUSER")) { if (sHost.empty()) { PutModule("Usage: " + sCommand + " <user> <hostmask> <key> [channels]"); } else { CAutoOpUser* pUser = AddUser(sUser, sKey, sHost, sLine.Token(4, true)); if (pUser) { SetNV(sUser, pUser->ToString()); } } } else { DelUser(sUser); DelNV(sUser); } } else if (sCommand.Equals("LISTUSERS")) { if (m_msUsers.empty()) { PutModule("There are no users defined"); return; } CTable Table; Table.AddColumn("User"); Table.AddColumn("Hostmask"); Table.AddColumn("Key"); Table.AddColumn("Channels"); for (map<CString, CAutoOpUser*>::iterator it = m_msUsers.begin(); it != m_msUsers.end(); it++) { Table.AddRow(); Table.SetCell("User", it->second->GetUsername()); Table.SetCell("Hostmask", it->second->GetHostmask()); Table.SetCell("Key", it->second->GetUserKey()); Table.SetCell("Channels", it->second->GetChannels()); } PutModule(Table); } else if (sCommand.Equals("ADDCHANS") || sCommand.Equals("DELCHANS")) { CString sUser = sLine.Token(1); CString sChans = sLine.Token(2, true); if (sChans.empty()) { PutModule("Usage: " + sCommand + " <user> <channel> [channel] ..."); return; } CAutoOpUser* pUser = FindUser(sUser); if (!pUser) { PutModule("No such user"); return; } if (sCommand.Equals("ADDCHANS")) { pUser->AddChans(sChans); PutModule("Channel(s) added to user [" + pUser->GetUsername() + "]"); } else { pUser->DelChans(sChans); PutModule("Channel(s) Removed from user [" + pUser->GetUsername() + "]"); } SetNV(pUser->GetUsername(), pUser->ToString()); } else { PutModule("Unknown command, try HELP"); } }
virtual void OnModCommand(const CString& sCommand) { CString sCmd = sCommand.Token(0); if (sCmd.Equals("show")) { CString sPubKey = GetKey(m_pClient); if (sPubKey.empty()) PutModule("You are not connected with any valid public key"); else PutModule("Your current public key is: " + sPubKey); } else if (sCmd.Equals("add")) { CString sPubKey = GetKey(m_pClient); if (sPubKey.empty()) PutModule("You are not connected with any valid public key"); else { pair<SCString::iterator, bool> res = m_PubKeys[m_pUser->GetUserName()].insert(sPubKey); if (res.second) { PutModule("Added your current public key to the list"); Save(); } else PutModule("Your key was already added"); } } else if (sCmd.Equals("list")) { CTable Table; Table.AddColumn("Id"); Table.AddColumn("Key"); MSCString::iterator it = m_PubKeys.find(m_pUser->GetUserName()); if (it == m_PubKeys.end()) { PutModule("No keys set for your user"); return; } SCString::iterator it2; unsigned int id = 1; for (it2 = it->second.begin(); it2 != it->second.end(); it2++) { Table.AddRow(); Table.SetCell("Id", CString(id++)); Table.SetCell("Key", *it2); } if (PutModule(Table) == 0) // This double check is necessary, because the // set could be empty. PutModule("No keys set for your user"); } else if (sCmd.Equals("del") || sCmd.Equals("remove")) { unsigned int id = sCommand.Token(1, true).ToUInt(); MSCString::iterator it = m_PubKeys.find(m_pUser->GetUserName()); if (it == m_PubKeys.end()) { PutModule("No keys set for your user"); return; } if (id == 0 || id > it->second.size()) { PutModule("Invalid #, check \"list\""); return; } SCString::iterator it2 = it->second.begin(); while (id > 1) { it2++; id--; } it->second.erase(it2); if (it->second.size() == 0) m_PubKeys.erase(it); PutModule("Removed"); Save(); } else { PutModule("Commands: show, list, add, del [no]"); } }
void CClient::UserCommand(CString& sLine) { if (!m_pUser) { return; } if (sLine.empty()) { return; } NETWORKMODULECALL(OnStatusCommand(sLine), m_pUser, m_pNetwork, this, return); const CString sCommand = sLine.Token(0); if (sCommand.Equals("HELP")) { HelpUser(); } else if (sCommand.Equals("LISTNICKS")) { if (!m_pNetwork) { PutStatus("You must be connected with a network to use this command"); return; } CString sChan = sLine.Token(1); if (sChan.empty()) { PutStatus("Usage: ListNicks <#chan>"); return; } CChan* pChan = m_pNetwork->FindChan(sChan); if (!pChan) { PutStatus("You are not on [" + sChan + "]"); return; } if (!pChan->IsOn()) { PutStatus("You are not on [" + sChan + "] [trying]"); return; } const map<CString,CNick>& msNicks = pChan->GetNicks(); CIRCSock* pIRCSock = m_pNetwork->GetIRCSock(); const CString& sPerms = (pIRCSock) ? pIRCSock->GetPerms() : ""; if (!msNicks.size()) { PutStatus("No nicks on [" + sChan + "]"); return; } CTable Table; for (unsigned int p = 0; p < sPerms.size(); p++) { CString sPerm; sPerm += sPerms[p]; Table.AddColumn(sPerm); } Table.AddColumn("Nick"); Table.AddColumn("Ident"); Table.AddColumn("Host"); for (map<CString,CNick>::const_iterator a = msNicks.begin(); a != msNicks.end(); ++a) { Table.AddRow(); for (unsigned int b = 0; b < sPerms.size(); b++) { if (a->second.HasPerm(sPerms[b])) { CString sPerm; sPerm += sPerms[b]; Table.SetCell(sPerm, sPerm); } } Table.SetCell("Nick", a->second.GetNick()); Table.SetCell("Ident", a->second.GetIdent()); Table.SetCell("Host", a->second.GetHost()); } PutStatus(Table); } else if (sCommand.Equals("DETACH")) { if (!m_pNetwork) { PutStatus("You must be connected with a network to use this command"); return; } CString sChan = sLine.Token(1); if (sChan.empty()) { PutStatus("Usage: Detach <#chan>"); return; } const vector<CChan*>& vChans = m_pNetwork->GetChans(); vector<CChan*>::const_iterator it; unsigned int uMatches = 0, uDetached = 0; for (it = vChans.begin(); it != vChans.end(); ++it) { if (!(*it)->GetName().WildCmp(sChan)) continue; uMatches++; if ((*it)->IsDetached()) continue; uDetached++; (*it)->DetachUser(); } PutStatus("There were [" + CString(uMatches) + "] channels matching [" + sChan + "]"); PutStatus("Detached [" + CString(uDetached) + "] channels"); } else if (sCommand.Equals("VERSION")) { PutStatus(CZNC::GetTag()); PutStatus(CZNC::GetCompileOptionsString()); } else if (sCommand.Equals("MOTD") || sCommand.Equals("ShowMOTD")) { if (!SendMotd()) { PutStatus("There is no MOTD set."); } } else if (m_pUser->IsAdmin() && sCommand.Equals("Rehash")) { CString sRet; if (CZNC::Get().RehashConfig(sRet)) { PutStatus("Rehashing succeeded!"); } else { PutStatus("Rehashing failed: " + sRet); } } else if (m_pUser->IsAdmin() && sCommand.Equals("SaveConfig")) { if (CZNC::Get().WriteConfig()) { PutStatus("Wrote config to [" + CZNC::Get().GetConfigFile() + "]"); } else { PutStatus("Error while trying to write config."); } } else if (sCommand.Equals("LISTCLIENTS")) { CUser* pUser = m_pUser; CString sNick = sLine.Token(1); if (!sNick.empty()) { if (!m_pUser->IsAdmin()) { PutStatus("Usage: ListClients"); return; } pUser = CZNC::Get().FindUser(sNick); if (!pUser) { PutStatus("No such user [" + sNick + "]"); return; } } vector<CClient*> vClients = pUser->GetAllClients(); if (vClients.empty()) { PutStatus("No clients are connected"); return; } CTable Table; Table.AddColumn("Host"); Table.AddColumn("Network"); for (unsigned int a = 0; a < vClients.size(); a++) { Table.AddRow(); Table.SetCell("Host", vClients[a]->GetRemoteIP()); if (vClients[a]->GetNetwork()) { Table.SetCell("Network", vClients[a]->GetNetwork()->GetName()); } } PutStatus(Table); } else if (m_pUser->IsAdmin() && sCommand.Equals("LISTUSERS")) { const map<CString, CUser*>& msUsers = CZNC::Get().GetUserMap(); CTable Table; Table.AddColumn("Username"); Table.AddColumn("Networks"); Table.AddColumn("Clients"); for (map<CString, CUser*>::const_iterator it = msUsers.begin(); it != msUsers.end(); ++it) { Table.AddRow(); Table.SetCell("Username", it->first); Table.SetCell("Networks", CString(it->second->GetNetworks().size())); Table.SetCell("Clients", CString(it->second->GetAllClients().size())); } PutStatus(Table); } else if (m_pUser->IsAdmin() && sCommand.Equals("SetMOTD")) { CString sMessage = sLine.Token(1, true); if (sMessage.empty()) { PutStatus("Usage: SetMOTD <Message>"); } else { CZNC::Get().SetMotd(sMessage); PutStatus("MOTD set to [" + sMessage + "]"); } } else if (m_pUser->IsAdmin() && sCommand.Equals("AddMOTD")) { CString sMessage = sLine.Token(1, true); if (sMessage.empty()) { PutStatus("Usage: AddMOTD <Message>"); } else { CZNC::Get().AddMotd(sMessage); PutStatus("Added [" + sMessage + "] to MOTD"); } } else if (m_pUser->IsAdmin() && sCommand.Equals("ClearMOTD")) { CZNC::Get().ClearMotd(); PutStatus("Cleared MOTD"); } else if (m_pUser->IsAdmin() && sCommand.Equals("BROADCAST")) { CZNC::Get().Broadcast(sLine.Token(1, true)); } else if (m_pUser->IsAdmin() && (sCommand.Equals("SHUTDOWN") || sCommand.Equals("RESTART"))) { bool bRestart = sCommand.Equals("RESTART"); CString sMessage = sLine.Token(1, true); bool bForce = false; if (sMessage.Token(0).Equals("FORCE")) { bForce = true; sMessage = sMessage.Token(1, true); } if (sMessage.empty()) { sMessage = (bRestart ? "ZNC is being restarted NOW!" : "ZNC is being shut down NOW!"); } if(!CZNC::Get().WriteConfig() && !bForce) { PutStatus("ERROR: Writing config file to disk failed! Aborting. Use " + sCommand.AsUpper() + " FORCE to ignore."); } else { CZNC::Get().Broadcast(sMessage); throw CException(bRestart ? CException::EX_Restart : CException::EX_Shutdown); } } else if (sCommand.Equals("JUMP") || sCommand.Equals("CONNECT")) { if (!m_pNetwork) { PutStatus("You must be connected with a network to use this command"); return; } if (!m_pNetwork->HasServers()) { PutStatus("You don't have any servers added."); return; } CString sArgs = sLine.Token(1, true); CServer *pServer = NULL; if (!sArgs.empty()) { pServer = m_pNetwork->FindServer(sArgs); if (!pServer) { PutStatus("Server [" + sArgs + "] not found"); return; } m_pNetwork->SetNextServer(pServer); // If we are already connecting to some server, // we have to abort that attempt Csock *pIRCSock = GetIRCSock(); if (pIRCSock && !pIRCSock->IsConnected()) { pIRCSock->Close(); } } if (GetIRCSock()) { GetIRCSock()->Quit(); if (pServer) PutStatus("Connecting to [" + pServer->GetName() + "]..."); else PutStatus("Jumping to the next server in the list..."); } else { if (pServer) PutStatus("Connecting to [" + pServer->GetName() + "]..."); else PutStatus("Connecting..."); } m_pNetwork->SetIRCConnectEnabled(true); return; } else if (sCommand.Equals("DISCONNECT")) { if (!m_pNetwork) { PutStatus("You must be connected with a network to use this command"); return; } if (GetIRCSock()) { CString sQuitMsg = sLine.Token(1, true); GetIRCSock()->Quit(sQuitMsg); } m_pNetwork->SetIRCConnectEnabled(false); PutStatus("Disconnected from IRC. Use 'connect' to reconnect."); return; } else if (sCommand.Equals("ENABLECHAN")) { if (!m_pNetwork) { PutStatus("You must be connected with a network to use this command"); return; } CString sChan = sLine.Token(1, true); if (sChan.empty()) { PutStatus("Usage: EnableChan <channel>"); } else { const vector<CChan*>& vChans = m_pNetwork->GetChans(); vector<CChan*>::const_iterator it; unsigned int uMatches = 0, uEnabled = 0; for (it = vChans.begin(); it != vChans.end(); ++it) { if (!(*it)->GetName().WildCmp(sChan)) continue; uMatches++; if (!(*it)->IsDisabled()) continue; uEnabled++; (*it)->Enable(); } PutStatus("There were [" + CString(uMatches) + "] channels matching [" + sChan + "]"); PutStatus("Enabled [" + CString(uEnabled) + "] channels"); } } else if (sCommand.Equals("LISTCHANS")) { if (!m_pNetwork) { PutStatus("You must be connected with a network to use this command"); return; } CUser* pUser = m_pUser; CIRCNetwork* pNetwork = m_pNetwork; const CString sNick = sLine.Token(1); const CString sNetwork = sLine.Token(2); if (!sNick.empty()) { if (!m_pUser->IsAdmin()) { PutStatus("Usage: ListChans"); return; } pUser = CZNC::Get().FindUser(sNick); if (!pUser) { PutStatus("No such user [" + sNick + "]"); return; } pNetwork = pUser->FindNetwork(sNetwork); if (!pNetwork) { PutStatus("No such network for user [" + sNetwork + "]"); return; } } const vector<CChan*>& vChans = pNetwork->GetChans(); CIRCSock* pIRCSock = pNetwork->GetIRCSock(); const CString& sPerms = (pIRCSock) ? pIRCSock->GetPerms() : ""; if (!vChans.size()) { PutStatus("There are no channels defined."); return; } CTable Table; Table.AddColumn("Name"); Table.AddColumn("Status"); Table.AddColumn("Conf"); Table.AddColumn("Buf"); Table.AddColumn("Modes"); Table.AddColumn("Users"); for (unsigned int p = 0; p < sPerms.size(); p++) { CString sPerm; sPerm += sPerms[p]; Table.AddColumn(sPerm); } unsigned int uNumDetached = 0, uNumDisabled = 0, uNumJoined = 0; for (unsigned int a = 0; a < vChans.size(); a++) { const CChan* pChan = vChans[a]; Table.AddRow(); Table.SetCell("Name", pChan->GetPermStr() + pChan->GetName()); Table.SetCell("Status", ((vChans[a]->IsOn()) ? ((vChans[a]->IsDetached()) ? "Detached" : "Joined") : ((vChans[a]->IsDisabled()) ? "Disabled" : "Trying"))); Table.SetCell("Conf", CString((pChan->InConfig()) ? "yes" : "")); Table.SetCell("Buf", CString((pChan->KeepBuffer()) ? "*" : "") + CString(pChan->GetBufferCount())); Table.SetCell("Modes", pChan->GetModeString()); Table.SetCell("Users", CString(pChan->GetNickCount())); map<char, unsigned int> mPerms = pChan->GetPermCounts(); for (unsigned int b = 0; b < sPerms.size(); b++) { char cPerm = sPerms[b]; Table.SetCell(CString(cPerm), CString(mPerms[cPerm])); } if(pChan->IsDetached()) uNumDetached++; if(pChan->IsOn()) uNumJoined++; if(pChan->IsDisabled()) uNumDisabled++; } PutStatus(Table); PutStatus("Total: " + CString(vChans.size()) + " - Joined: " + CString(uNumJoined) + " - Detached: " + CString(uNumDetached) + " - Disabled: " + CString(uNumDisabled)); } else if (sCommand.Equals("ADDNETWORK")) { #ifndef ENABLE_ADD_NETWORK if (!m_pUser->IsAdmin()) { PutStatus("Permission denied"); return; } #endif CString sNetwork = sLine.Token(1); if (sNetwork.empty()) { PutStatus("Usage: AddNetwork <name>"); return; } if (m_pUser->AddNetwork(sNetwork)) { PutStatus("Network added. Use /znc JumpNetwork " + sNetwork + ", or connect to ZNC with username " + m_pUser->GetUserName() + "/" + sNetwork + " (instead of just " + m_pUser->GetUserName() + ") to connect to it."); } else { PutStatus("Unable to add that network"); PutStatus("Perhaps that network is already added"); } } else if (m_pUser->IsAdmin() && sCommand.Equals("DELNETWORK")) { CString sNetwork = sLine.Token(1); if (sNetwork.empty()) { PutStatus("Usage: DelNetwork <name>"); return; } if (m_pNetwork && m_pNetwork->GetName().Equals(sNetwork)) { SetNetwork(NULL); } if (m_pUser->DeleteNetwork(sNetwork)) { PutStatus("Network deleted"); } else { PutStatus("Failed to delete network"); PutStatus("Perhaps this network doesn't exist"); } } else if (sCommand.Equals("LISTNETWORKS")) { CUser *pUser = m_pUser; if (m_pUser->IsAdmin() && !sLine.Token(1).empty()) { pUser = CZNC::Get().FindUser(sLine.Token(1)); if (!pUser) { PutStatus("User not found " + sLine.Token(1)); return; } } const vector<CIRCNetwork*>& vNetworks = pUser->GetNetworks(); CTable Table; Table.AddColumn("Network"); Table.AddColumn("OnIRC"); Table.AddColumn("IRC Server"); Table.AddColumn("IRC User"); Table.AddColumn("Channels"); for (unsigned int a = 0; a < vNetworks.size(); a++) { CIRCNetwork* pNetwork = vNetworks[a]; Table.AddRow(); Table.SetCell("Network", pNetwork->GetName()); if (pNetwork->IsIRCConnected()) { Table.SetCell("OnIRC", "Yes"); Table.SetCell("IRC Server", pNetwork->GetIRCServer()); Table.SetCell("IRC User", pNetwork->GetIRCNick().GetNickMask()); Table.SetCell("Channels", CString(pNetwork->GetChans().size())); } else { Table.SetCell("OnIRC", "No"); } } if (PutStatus(Table) == 0) { PutStatus("No networks"); } } else if (sCommand.Equals("JUMPNETWORK")) { CString sNetwork = sLine.Token(1); if (sNetwork.empty()) { PutStatus("No network supplied."); return; } if (m_pNetwork && (m_pNetwork->GetName() == sNetwork)) { PutStatus("You are already connected with this network."); return; } CIRCNetwork *pNetwork = m_pUser->FindNetwork(sNetwork); if (pNetwork) { PutStatus("Switched to " + sNetwork); SetNetwork(pNetwork); } else { PutStatus("You don't have a network named " + sNetwork); } } else if (sCommand.Equals("MODE")) { CString sNetwork = sLine.Token(1); if (sNetwork.empty()) { PutStatus("Syntax: MODE <support/default>"); return; } if (m_pNetwork && (m_pNetwork->GetName() == sNetwork)) { PutStatus("You are already in this mode."); return; } CIRCNetwork *pNetwork = m_pUser->FindNetwork(sNetwork); if (pNetwork) { PutStatus("You are now in " + sNetwork + " mode."); SetNetwork(pNetwork); } else { PutStatus("ERROR! Contact GeekBouncer admins immediately"); } } else if (m_pUser->IsAdmin() && sCommand.Equals("ADDSERVER")) { CString sServer = sLine.Token(1); if (!m_pNetwork) { PutStatus("You must be connected with a network to use this command"); return; } if (sServer.empty()) { PutStatus("Usage: AddServer <host> [[+]port] [pass]"); return; } if (m_pNetwork->AddServer(sLine.Token(1, true))) { PutStatus("Server added"); } else { PutStatus("Unable to add that server"); PutStatus("Perhaps the server is already added or openssl is disabled?"); } } else if (m_pUser->IsAdmin() && sCommand.Equals("REMSERVER") || sCommand.Equals("DELSERVER")) { if (!m_pNetwork) { PutStatus("You must be connected with a network to use this command"); return; } CString sServer = sLine.Token(1); unsigned short uPort = sLine.Token(2).ToUShort(); CString sPass = sLine.Token(3); if (sServer.empty()) { PutStatus("Usage: RemServer <host> [port] [pass]"); return; } if (!m_pNetwork->HasServers()) { PutStatus("You don't have any servers added."); return; } if (m_pNetwork->DelServer(sServer, uPort, sPass)) { PutStatus("Server removed"); } else { PutStatus("No such server"); } } else if (sCommand.Equals("LISTSERVERS")) { if (!m_pNetwork) { PutStatus("You must be connected with a network to use this command"); return; } if (m_pNetwork->HasServers()) { const vector<CServer*>& vServers = m_pNetwork->GetServers(); CServer* pCurServ = m_pNetwork->GetCurrentServer(); CTable Table; Table.AddColumn("Host"); Table.AddColumn("Port"); Table.AddColumn("SSL"); Table.AddColumn("Pass"); for (unsigned int a = 0; a < vServers.size(); a++) { CServer* pServer = vServers[a]; Table.AddRow(); Table.SetCell("Host", pServer->GetName() + (pServer == pCurServ ? "*" : "")); Table.SetCell("Port", CString(pServer->GetPort())); Table.SetCell("SSL", (pServer->IsSSL()) ? "SSL" : ""); Table.SetCell("Pass", pServer->GetPass()); } PutStatus(Table); } else { PutStatus("You don't have any servers added."); } } else if (sCommand.Equals("TOPICS")) { if (!m_pNetwork) { PutStatus("You must be connected with a network to use this command"); return; } const vector<CChan*>& vChans = m_pNetwork->GetChans(); CTable Table; Table.AddColumn("Name"); Table.AddColumn("Set By"); Table.AddColumn("Topic"); for (unsigned int a = 0; a < vChans.size(); a++) { CChan* pChan = vChans[a]; Table.AddRow(); Table.SetCell("Name", pChan->GetName()); Table.SetCell("Set By", pChan->GetTopicOwner()); Table.SetCell("Topic", pChan->GetTopic()); } PutStatus(Table); } else if (sCommand.Equals("LISTMODS") || sCommand.Equals("LISTMODULES")) { if (m_pUser->IsAdmin()) { CModules& GModules = CZNC::Get().GetModules(); if (!GModules.size()) { PutStatus("No global modules loaded."); } else { PutStatus("Global modules:"); CTable GTable; GTable.AddColumn("Name"); GTable.AddColumn("Arguments"); for (unsigned int b = 0; b < GModules.size(); b++) { GTable.AddRow(); GTable.SetCell("Name", GModules[b]->GetModName()); GTable.SetCell("Arguments", GModules[b]->GetArgs()); } PutStatus(GTable); } } CModules& Modules = m_pUser->GetModules(); if (!Modules.size()) { PutStatus("Your user has no modules loaded."); } else { PutStatus("User modules:"); CTable Table; Table.AddColumn("Name"); Table.AddColumn("Arguments"); for (unsigned int b = 0; b < Modules.size(); b++) { Table.AddRow(); Table.SetCell("Name", Modules[b]->GetModName()); Table.SetCell("Arguments", Modules[b]->GetArgs()); } PutStatus(Table); } if (m_pNetwork) { CModules& NetworkModules = m_pNetwork->GetModules(); if (NetworkModules.empty()) { PutStatus("This network has no modules loaded."); } else { PutStatus("Network modules:"); CTable Table; Table.AddColumn("Name"); Table.AddColumn("Arguments"); for (unsigned int b = 0; b < NetworkModules.size(); b++) { Table.AddRow(); Table.SetCell("Name", NetworkModules[b]->GetModName()); Table.SetCell("Arguments", NetworkModules[b]->GetArgs()); } PutStatus(Table); } } return; } else if (sCommand.Equals("LISTAVAILMODS") || sCommand.Equals("LISTAVAILABLEMODULES")) { if (m_pUser->DenyLoadMod()) { PutStatus("Access Denied."); return; } if (m_pUser->IsAdmin()) { set<CModInfo> ssGlobalMods; CZNC::Get().GetModules().GetAvailableMods(ssGlobalMods, CModInfo::GlobalModule); if (ssGlobalMods.empty()) { PutStatus("No global modules available."); } else { PutStatus("Global modules:"); CTable GTable; GTable.AddColumn("Name"); GTable.AddColumn("Description"); set<CModInfo>::iterator it; for (it = ssGlobalMods.begin(); it != ssGlobalMods.end(); ++it) { const CModInfo& Info = *it; GTable.AddRow(); GTable.SetCell("Name", (CZNC::Get().GetModules().FindModule(Info.GetName()) ? "*" : " ") + Info.GetName()); GTable.SetCell("Description", Info.GetDescription().Ellipsize(128)); } PutStatus(GTable); } } set<CModInfo> ssUserMods; CZNC::Get().GetModules().GetAvailableMods(ssUserMods); if (!ssUserMods.size()) { PutStatus("No user modules available."); } else { PutStatus("User modules:"); CTable Table; Table.AddColumn("Name"); Table.AddColumn("Description"); set<CModInfo>::iterator it; for (it = ssUserMods.begin(); it != ssUserMods.end(); ++it) { const CModInfo& Info = *it; Table.AddRow(); Table.SetCell("Name", (m_pUser->GetModules().FindModule(Info.GetName()) ? "*" : " ") + Info.GetName()); Table.SetCell("Description", Info.GetDescription().Ellipsize(128)); } PutStatus(Table); } set<CModInfo> ssNetworkMods; CZNC::Get().GetModules().GetAvailableMods(ssNetworkMods, CModInfo::NetworkModule); if (!ssNetworkMods.size()) { PutStatus("No network modules available."); } else { PutStatus("Network modules:"); CTable Table; Table.AddColumn("Name"); Table.AddColumn("Description"); set<CModInfo>::const_iterator it; for (it = ssNetworkMods.begin(); it != ssNetworkMods.end(); ++it) { const CModInfo& Info = *it; Table.AddRow(); Table.SetCell("Name", ((m_pNetwork && m_pNetwork->GetModules().FindModule(Info.GetName())) ? "*" : " ") + Info.GetName()); Table.SetCell("Description", Info.GetDescription().Ellipsize(128)); } PutStatus(Table); } return; } else if (sCommand.Equals("LOADMOD") || sCommand.Equals("LOADMODULE")) { CModInfo::EModuleType eType; CString sType = sLine.Token(1); CString sMod = sLine.Token(2); CString sArgs = sLine.Token(3, true); if (sType.Equals("global")) { eType = CModInfo::GlobalModule; } else if (sType.Equals("user")) { eType = CModInfo::UserModule; } else if (sType.Equals("network")) { eType = CModInfo::NetworkModule; } else { sMod = sType; sArgs = sLine.Token(2, true); sType = "default"; // Will be set correctly later eType = CModInfo::UserModule; } if (m_pUser->DenyLoadMod()) { PutStatus("Unable to load [" + sMod + "]: Access Denied."); return; } if (sMod.empty()) { PutStatus("Usage: LoadMod [type] <module> [args]"); return; } CModInfo ModInfo; CString sRetMsg; if (!CZNC::Get().GetModules().GetModInfo(ModInfo, sMod, sRetMsg)) { PutStatus("Unable to find modinfo [" + sMod + "] [" + sRetMsg + "]"); return; } if (sType.Equals("default")) { eType = ModInfo.GetDefaultType(); } if (eType == CModInfo::GlobalModule && !m_pUser->IsAdmin()) { PutStatus("Unable to load global module [" + sMod + "]: Access Denied."); return; } if (eType == CModInfo::NetworkModule && !m_pNetwork) { PutStatus("Unable to load network module [" + sMod + "] Not connected with a network."); return; } CString sModRet; bool b = false; switch (eType) { case CModInfo::GlobalModule: b = CZNC::Get().GetModules().LoadModule(sMod, sArgs, eType, NULL, NULL, sModRet); break; case CModInfo::UserModule: b = m_pUser->GetModules().LoadModule(sMod, sArgs, eType, m_pUser, NULL, sModRet); break; case CModInfo::NetworkModule: b = m_pNetwork->GetModules().LoadModule(sMod, sArgs, eType, m_pUser, m_pNetwork, sModRet); break; default: sModRet = "Unable to load module [" + sMod + "]: Unknown module type"; } if (b) sModRet = "Loaded module [" + sMod + "] " + sModRet; PutStatus(sModRet); return; } else if (sCommand.Equals("UNLOADMOD") || sCommand.Equals("UNLOADMODULE")) { CModInfo::EModuleType eType = CModInfo::UserModule; CString sType = sLine.Token(1); CString sMod = sLine.Token(2); if (sType.Equals("global")) { eType = CModInfo::GlobalModule; } else if (sType.Equals("user")) { eType = CModInfo::UserModule; } else if (sType.Equals("network")) { eType = CModInfo::NetworkModule; } else { sMod = sType; sType = "default"; } if (m_pUser->DenyLoadMod()) { PutStatus("Unable to unload [" + sMod + "] Access Denied."); return; } if (sMod.empty()) { PutStatus("Usage: UnloadMod [type] <module>"); return; } if (sType.Equals("default")) { CModInfo ModInfo; CString sRetMsg; if (!CZNC::Get().GetModules().GetModInfo(ModInfo, sMod, sRetMsg)) { PutStatus("Unable to find modinfo [" + sMod + "] [" + sRetMsg + "]"); return; } eType = ModInfo.GetDefaultType(); } if (eType == CModInfo::GlobalModule && !m_pUser->IsAdmin()) { PutStatus("Unable to unload global module [" + sMod + "]: Access Denied."); return; } if (eType == CModInfo::NetworkModule && !m_pNetwork) { PutStatus("Unable to unload network module [" + sMod + "] Not connected with a network."); return; } CString sModRet; switch (eType) { case CModInfo::GlobalModule: CZNC::Get().GetModules().UnloadModule(sMod, sModRet); break; case CModInfo::UserModule: m_pUser->GetModules().UnloadModule(sMod, sModRet); break; case CModInfo::NetworkModule: m_pNetwork->GetModules().UnloadModule(sMod, sModRet); break; default: sModRet = "Unable to unload module [" + sMod + "]: Unknown module type"; } PutStatus(sModRet); return; } else if (sCommand.Equals("RELOADMOD") || sCommand.Equals("RELOADMODULE")) { CModInfo::EModuleType eType; CString sType = sLine.Token(1); CString sMod = sLine.Token(2); CString sArgs = sLine.Token(3, true); if (m_pUser->DenyLoadMod()) { PutStatus("Unable to reload modules. Access Denied."); return; } if (sType.Equals("global")) { eType = CModInfo::GlobalModule; } else if (sType.Equals("user")) { eType = CModInfo::UserModule; } else if (sType.Equals("network")) { eType = CModInfo::NetworkModule; } else { sMod = sType; sArgs = sLine.Token(2, true); sType = "default"; // Will be set correctly later eType = CModInfo::UserModule; } if (sMod.empty()) { PutStatus("Usage: ReloadMod [type] <module> [args]"); return; } if (sType.Equals("default")) { CModInfo ModInfo; CString sRetMsg; if (!CZNC::Get().GetModules().GetModInfo(ModInfo, sMod, sRetMsg)) { PutStatus("Unable to find modinfo for [" + sMod + "] [" + sRetMsg + "]"); return; } eType = ModInfo.GetDefaultType(); } if (eType == CModInfo::GlobalModule && !m_pUser->IsAdmin()) { PutStatus("Unable to reload global module [" + sMod + "]: Access Denied."); return; } if (eType == CModInfo::NetworkModule && !m_pNetwork) { PutStatus("Unable to load network module [" + sMod + "] Not connected with a network."); return; } CString sModRet; switch (eType) { case CModInfo::GlobalModule: CZNC::Get().GetModules().ReloadModule(sMod, sArgs, NULL, NULL, sModRet); break; case CModInfo::UserModule: m_pUser->GetModules().ReloadModule(sMod, sArgs, m_pUser, NULL, sModRet); break; case CModInfo::NetworkModule: m_pNetwork->GetModules().ReloadModule(sMod, sArgs, m_pUser, m_pNetwork, sModRet); break; default: sModRet = "Unable to reload module [" + sMod + "]: Unknown module type"; } PutStatus(sModRet); return; } else if ((sCommand.Equals("UPDATEMOD") || sCommand.Equals("UPDATEMODULE")) && m_pUser->IsAdmin() ) { CString sMod = sLine.Token(1); if (sMod.empty()) { PutStatus("Usage: UpdateMod <module>"); return; } PutStatus("Reloading [" + sMod + "] everywhere"); if (CZNC::Get().UpdateModule(sMod)) { PutStatus("Done"); } else { PutStatus("Done, but there were errors, [" + sMod + "] could not be loaded everywhere."); } } else if ((sCommand.Equals("ADDBINDHOST") || sCommand.Equals("ADDVHOST")) && m_pUser->IsAdmin()) { CString sHost = sLine.Token(1); if (sHost.empty()) { PutStatus("Usage: AddBindHost <host>"); return; } if (CZNC::Get().AddBindHost(sHost)) { PutStatus("Done"); } else { PutStatus("The host [" + sHost + "] is already in the list"); } } else if ((sCommand.Equals("REMBINDHOST") || sCommand.Equals("REMVHOST") || sCommand.Equals("DELVHOST")) && m_pUser->IsAdmin()) { CString sHost = sLine.Token(1); if (sHost.empty()) { PutStatus("Usage: RemBindHost <host>"); return; } if (CZNC::Get().RemBindHost(sHost)) { PutStatus("Done"); } else { PutStatus("The host [" + sHost + "] is not in the list"); } } else if ((sCommand.Equals("LISTBINDHOSTS") || sCommand.Equals("LISTVHOSTS")) && (m_pUser->IsAdmin() || !m_pUser->DenySetBindHost())) { const VCString& vsHosts = CZNC::Get().GetBindHosts(); if (vsHosts.empty()) { PutStatus("No bind hosts configured"); return; } CTable Table; Table.AddColumn("Host"); VCString::const_iterator it; for (it = vsHosts.begin(); it != vsHosts.end(); ++it) { Table.AddRow(); Table.SetCell("Host", *it); } PutStatus(Table); } else if ((sCommand.Equals("SETBINDHOST") || sCommand.Equals("SETVHOST")) && (m_pUser->IsAdmin() || !m_pUser->DenySetBindHost())) { CString sHost = sLine.Token(1); if (sHost.empty()) { PutStatus("Usage: SetBindHost <host>"); return; } if (sHost.Equals(m_pUser->GetBindHost())) { PutStatus("You already have this bind host!"); return; } const VCString& vsHosts = CZNC::Get().GetBindHosts(); if (!m_pUser->IsAdmin() && !vsHosts.empty()) { VCString::const_iterator it; bool bFound = false; for (it = vsHosts.begin(); it != vsHosts.end(); ++it) { if (sHost.Equals(*it)) { bFound = true; break; } } if (!bFound) { PutStatus("You may not use this bind host. See [ListBindHosts] for a list"); return; } } m_pUser->SetBindHost(sHost); PutStatus("Set bind host to [" + m_pUser->GetBindHost() + "]"); } else if ((sCommand.Equals("CLEARBINDHOST") || sCommand.Equals("CLEARVHOST")) && (m_pUser->IsAdmin() || !m_pUser->DenySetBindHost())) { m_pUser->SetBindHost(""); PutStatus("Bind Host Cleared"); } else if (sCommand.Equals("PLAYBUFFER")) { if (!m_pNetwork) { PutStatus("You must be connected with a network to use this command"); return; } CString sChan = sLine.Token(1); if (sChan.empty()) { PutStatus("Usage: PlayBuffer <#chan>"); return; } CChan* pChan = m_pNetwork->FindChan(sChan); if (!pChan) { PutStatus("You are not on [" + sChan + "]"); return; } if (!pChan->IsOn()) { PutStatus("You are not on [" + sChan + "] [trying]"); return; } if (pChan->GetBuffer().IsEmpty()) { PutStatus("The buffer for [" + sChan + "] is empty"); return; } pChan->SendBuffer(this); } else if (sCommand.Equals("CLEARBUFFER")) { if (!m_pNetwork) { PutStatus("You must be connected with a network to use this command"); return; } CString sChan = sLine.Token(1); if (sChan.empty()) { PutStatus("Usage: ClearBuffer <#chan>"); return; } CChan* pChan = m_pNetwork->FindChan(sChan); if (!pChan) { PutStatus("You are not on [" + sChan + "]"); return; } const vector<CChan*>& vChans = m_pNetwork->GetChans(); vector<CChan*>::const_iterator it; unsigned int uMatches = 0; for (it = vChans.begin(); it != vChans.end(); ++it) { if (!(*it)->GetName().WildCmp(sChan)) continue; uMatches++; (*it)->ClearBuffer(); } PutStatus("The buffer for [" + CString(uMatches) + "] channels matching [" + sChan + "] has been cleared"); } else if (sCommand.Equals("CLEARALLCHANNELBUFFERS")) { if (!m_pNetwork) { PutStatus("You must be connected with a network to use this command"); return; } vector<CChan*>::const_iterator it; const vector<CChan*>& vChans = m_pNetwork->GetChans(); for (it = vChans.begin(); it != vChans.end(); ++it) { (*it)->ClearBuffer(); } PutStatus("All channel buffers have been cleared"); } else if (sCommand.Equals("SETBUFFER")) { if (!m_pNetwork) { PutStatus("You must be connected with a network to use this command"); return; } CString sChan = sLine.Token(1); if (sChan.empty()) { PutStatus("Usage: SetBuffer <#chan> [linecount]"); return; } unsigned int uLineCount = sLine.Token(2).ToUInt(); const vector<CChan*>& vChans = m_pNetwork->GetChans(); vector<CChan*>::const_iterator it; unsigned int uMatches = 0, uFail = 0; for (it = vChans.begin(); it != vChans.end(); ++it) { if (!(*it)->GetName().WildCmp(sChan)) continue; uMatches++; if (!(*it)->SetBufferCount(uLineCount)) uFail++; } PutStatus("BufferCount for [" + CString(uMatches - uFail) + "] channels was set to [" + CString(uLineCount) + "]"); if (uFail > 0) { PutStatus("Setting BufferCount failed for [" + CString(uFail) + "] channels, " "max buffer count is " + CString(CZNC::Get().GetMaxBufferSize())); } } else if (m_pUser->IsAdmin() && sCommand.Equals("TRAFFIC")) { CZNC::TrafficStatsPair Users, ZNC, Total; CZNC::TrafficStatsMap traffic = CZNC::Get().GetTrafficStats(Users, ZNC, Total); CZNC::TrafficStatsMap::const_iterator it; CTable Table; Table.AddColumn("Username"); Table.AddColumn("In"); Table.AddColumn("Out"); Table.AddColumn("Total"); for (it = traffic.begin(); it != traffic.end(); ++it) { Table.AddRow(); Table.SetCell("Username", it->first); Table.SetCell("In", CString::ToByteStr(it->second.first)); Table.SetCell("Out", CString::ToByteStr(it->second.second)); Table.SetCell("Total", CString::ToByteStr(it->second.first + it->second.second)); } Table.AddRow(); Table.SetCell("Username", "<Users>"); Table.SetCell("In", CString::ToByteStr(Users.first)); Table.SetCell("Out", CString::ToByteStr(Users.second)); Table.SetCell("Total", CString::ToByteStr(Users.first + Users.second)); Table.AddRow(); Table.SetCell("Username", "<ZNC>"); Table.SetCell("In", CString::ToByteStr(ZNC.first)); Table.SetCell("Out", CString::ToByteStr(ZNC.second)); Table.SetCell("Total", CString::ToByteStr(ZNC.first + ZNC.second)); Table.AddRow(); Table.SetCell("Username", "<Total>"); Table.SetCell("In", CString::ToByteStr(Total.first)); Table.SetCell("Out", CString::ToByteStr(Total.second)); Table.SetCell("Total", CString::ToByteStr(Total.first + Total.second)); PutStatus(Table); } else if (sCommand.Equals("UPTIME")) { PutStatus("Running for " + CZNC::Get().GetUptime()); } else if (m_pUser->IsAdmin() && (sCommand.Equals("LISTPORTS") || sCommand.Equals("ADDPORT") || sCommand.Equals("DELPORT"))) { UserPortCommand(sLine); } else { PutStatus("Unknown command [" + sCommand + "] try 'Help'"); } }
void CClient::HelpUser() { CTable Table; Table.AddColumn("Command"); Table.AddColumn("Arguments"); Table.AddColumn("Description"); PutStatus("In the following list all occurences of <#chan> support wildcards (* and ?)"); PutStatus("(Except ListNicks)"); Table.AddRow(); Table.SetCell("Command", "Version"); Table.SetCell("Description", "Print which version of ZNC this is"); Table.AddRow(); Table.SetCell("Command", "ListMods"); Table.SetCell("Description", "List all loaded modules"); Table.AddRow(); Table.SetCell("Command", "ListAvailMods"); Table.SetCell("Description", "List all available modules"); if (!m_pUser->IsAdmin()) { // If they are an admin we will add this command below with an argument Table.AddRow(); Table.SetCell("Command", "ListChans"); Table.SetCell("Description", "List all channels"); } Table.AddRow(); Table.SetCell("Command", "ListNicks"); Table.SetCell("Arguments", "<#chan>"); Table.SetCell("Description", "List all nicks on a channel"); if (!m_pUser->IsAdmin()) { Table.AddRow(); Table.SetCell("Command", "ListClients"); Table.SetCell("Description", "List all clients connected to your ZNC user"); } Table.AddRow(); Table.SetCell("Command", "ListServers"); Table.SetCell("Description", "List all servers"); Table.AddRow(); Table.SetCell("Command", "AddNetwork"); Table.SetCell("Arguments", "<name>"); Table.SetCell("Description", "Add a network to your user"); Table.AddRow(); Table.SetCell("Command", "DelNetwork"); Table.SetCell("Arguments", "<name>"); Table.SetCell("Description", "Delete a network from your user"); Table.AddRow(); Table.SetCell("Command", "ListNetworks"); Table.SetCell("Description", "List all networks"); Table.AddRow(); Table.SetCell("Command", "JumpNetwork"); Table.SetCell("Arguments", "<network>"); Table.SetCell("Description", "Jump to another network"); Table.AddRow(); Table.SetCell("Command", "MODE"); Table.SetCell("Arguments", "<support/default>"); Table.SetCell("Description", "Jump between your default bouncer mode and support mode"); if (!m_pUser->IsAdmin()) { Table.AddRow(); Table.SetCell("Command", "AddServer"); Table.SetCell("Arguments", "<host> [[+]port] [pass]"); Table.SetCell("Description", "Add a server to the list"); } if (!m_pUser->IsAdmin()) { Table.AddRow(); Table.SetCell("Command", "RemServer"); Table.SetCell("Arguments", "<host> [port] [pass]"); Table.SetCell("Description", "Remove a server from the list"); } Table.AddRow(); Table.SetCell("Command", "Enablechan"); Table.SetCell("Arguments", "<#chan>"); Table.SetCell("Description", "Enable the channel"); Table.AddRow(); Table.SetCell("Command", "Detach"); Table.SetCell("Arguments", "<#chan>"); Table.SetCell("Description", "Detach from the channel"); Table.AddRow(); Table.SetCell("Command", "Topics"); Table.SetCell("Description", "Show topics in all your channels"); Table.AddRow(); Table.SetCell("Command", "PlayBuffer"); Table.SetCell("Arguments", "<#chan>"); Table.SetCell("Description", "Play back the buffer for a given channel"); Table.AddRow(); Table.SetCell("Command", "ClearBuffer"); Table.SetCell("Arguments", "<#chan>"); Table.SetCell("Description", "Clear the buffer for a given channel"); Table.AddRow(); Table.SetCell("Command", "ClearAllChannelBuffers"); Table.SetCell("Description", "Clear the channel buffers"); Table.AddRow(); Table.SetCell("Command", "SetBuffer"); Table.SetCell("Arguments", "<#chan> [linecount]"); Table.SetCell("Description", "Set the buffer count for a channel"); if (m_pUser->IsAdmin()) { Table.AddRow(); Table.SetCell("Command", "AddBindHost"); Table.SetCell("Arguments", "<host (IP preferred)>"); Table.SetCell("Description", "Adds a bind host for normal users to use"); Table.AddRow(); Table.SetCell("Command", "RemBindHost"); Table.SetCell("Arguments", "<host>"); Table.SetCell("Description", "Removes a bind host from the list"); } if (m_pUser->IsAdmin() || !m_pUser->DenySetBindHost()) { Table.AddRow(); Table.SetCell("Command", "ListBindHosts"); Table.SetCell("Description", "Shows the configured list of bind hosts"); Table.AddRow(); Table.SetCell("Command", "SetBindHost"); Table.SetCell("Arguments", "<host (IP preferred)>"); Table.SetCell("Description", "Set the bind host for this connection"); Table.AddRow(); Table.SetCell("Command", "ClearBindHost"); Table.SetCell("Description", "Clear the bind host for this connection"); } Table.AddRow(); Table.SetCell("Command", "Jump [server]"); Table.SetCell("Description", "Jump to the next or the specified server"); Table.AddRow(); Table.SetCell("Command", "Disconnect"); Table.SetCell("Arguments", "[message]"); Table.SetCell("Description", "Disconnect from IRC"); Table.AddRow(); Table.SetCell("Command", "Connect"); Table.SetCell("Description", "Reconnect to IRC"); Table.AddRow(); Table.SetCell("Command", "Uptime"); Table.SetCell("Description", "Show for how long ZNC has been running"); if (!m_pUser->DenyLoadMod()) { Table.AddRow(); Table.SetCell("Command", "LoadMod"); Table.SetCell("Arguments", "[type] <module>"); Table.SetCell("Description", "Load a module"); Table.AddRow(); Table.SetCell("Command", "UnloadMod"); Table.SetCell("Arguments", "[type] <module>"); Table.SetCell("Description", "Unload a module"); Table.AddRow(); Table.SetCell("Command", "ReloadMod"); Table.SetCell("Arguments", "[type] <module>"); Table.SetCell("Description", "Reload a module"); if (m_pUser->IsAdmin()) { Table.AddRow(); Table.SetCell("Command", "UpdateMod"); Table.SetCell("Arguments", "<module>"); Table.SetCell("Description", "Reload a module everywhere"); } } Table.AddRow(); Table.SetCell("Command", "ShowMOTD"); Table.SetCell("Description", "Show ZNC's message of the day"); if (m_pUser->IsAdmin()) { Table.AddRow(); Table.SetCell("Command", "SetMOTD"); Table.SetCell("Arguments", "<Message>"); Table.SetCell("Description", "Set ZNC's message of the day"); Table.AddRow(); Table.SetCell("Command", "AddMOTD"); Table.SetCell("Arguments", "<Message>"); Table.SetCell("Description", "Append <Message> to ZNC's MOTD"); Table.AddRow(); Table.SetCell("Command", "ClearMOTD"); Table.SetCell("Description", "Clear ZNC's MOTD"); Table.AddRow(); Table.SetCell("Command", "ListPorts"); Table.SetCell("Description", "Show all active listeners"); Table.AddRow(); Table.SetCell("Command", "AddPort"); Table.SetCell("Arguments", "<arguments>"); Table.SetCell("Description", "Add another port for ZNC to listen on"); Table.AddRow(); Table.SetCell("Command", "DelPort"); Table.SetCell("Arguments", "<arguments>"); Table.SetCell("Description", "Remove a port from ZNC"); Table.AddRow(); Table.SetCell("Command", "Rehash"); Table.SetCell("Description", "Reload znc.conf from disk"); Table.AddRow(); Table.SetCell("Command", "SaveConfig"); Table.SetCell("Description", "Save the current settings to disk"); Table.AddRow(); Table.SetCell("Command", "ListUsers"); Table.SetCell("Description", "List all ZNC users and their connection status"); Table.AddRow(); Table.SetCell("Command", "ListChans"); Table.SetCell("Arguments", "[User <network>]"); Table.SetCell("Description", "List all channels"); Table.AddRow(); Table.SetCell("Command", "ListClients"); Table.SetCell("Arguments", "[User]"); Table.SetCell("Description", "List all connected clients"); Table.AddRow(); Table.SetCell("Command", "Traffic"); Table.SetCell("Description", "Show basic traffic stats for all ZNC users"); Table.AddRow(); Table.SetCell("Command", "Broadcast"); Table.SetCell("Arguments", "[message]"); Table.SetCell("Description", "Broadcast a message to all ZNC users"); Table.AddRow(); Table.SetCell("Command", "Shutdown"); Table.SetCell("Arguments", "[message]"); Table.SetCell("Description", "Shut down ZNC completely"); Table.AddRow(); Table.SetCell("Command", "Restart"); Table.SetCell("Arguments", "[message]"); Table.SetCell("Description", "Restart ZNC"); } PutStatus(Table); }
void CClient::UserPortCommand(CString& sLine) { const CString sCommand = sLine.Token(0); if (sCommand.Equals("LISTPORTS")) { CTable Table; Table.AddColumn("Port"); Table.AddColumn("BindHost"); Table.AddColumn("SSL"); Table.AddColumn("Proto"); Table.AddColumn("IRC/Web"); vector<CListener*>::const_iterator it; const vector<CListener*>& vpListeners = CZNC::Get().GetListeners(); for (it = vpListeners.begin(); it < vpListeners.end(); ++it) { Table.AddRow(); Table.SetCell("Port", CString((*it)->GetPort())); Table.SetCell("BindHost", ((*it)->GetBindHost().empty() ? CString("*") : (*it)->GetBindHost())); Table.SetCell("SSL", CString((*it)->IsSSL())); EAddrType eAddr = (*it)->GetAddrType(); Table.SetCell("Proto", (eAddr == ADDR_ALL ? "All" : (eAddr == ADDR_IPV4ONLY ? "IPv4" : "IPv6"))); CListener::EAcceptType eAccept = (*it)->GetAcceptType(); Table.SetCell("IRC/Web", (eAccept == CListener::ACCEPT_ALL ? "All" : (eAccept == CListener::ACCEPT_IRC ? "IRC" : "Web"))); } PutStatus(Table); return; } CString sPort = sLine.Token(1); CString sAddr = sLine.Token(2); EAddrType eAddr = ADDR_ALL; if (sAddr.Equals("IPV4")) { eAddr = ADDR_IPV4ONLY; } else if (sAddr.Equals("IPV6")) { eAddr = ADDR_IPV6ONLY; } else if (sAddr.Equals("ALL")) { eAddr = ADDR_ALL; } else { sAddr.clear(); } unsigned short uPort = sPort.ToUShort(); if (sCommand.Equals("ADDPORT")) { CListener::EAcceptType eAccept = CListener::ACCEPT_ALL; CString sAccept = sLine.Token(3); if (sAccept.Equals("WEB")) { eAccept = CListener::ACCEPT_HTTP; } else if (sAccept.Equals("IRC")) { eAccept = CListener::ACCEPT_IRC; } else if (sAccept.Equals("ALL")) { eAccept = CListener::ACCEPT_ALL; } else { sAccept.clear(); } if (sPort.empty() || sAddr.empty() || sAccept.empty()) { PutStatus("Usage: AddPort <[+]port> <ipv4|ipv6|all> <web|irc|all> [bindhost]"); } else { bool bSSL = (sPort.Left(1).Equals("+")); const CString sBindHost = sLine.Token(4); CListener* pListener = new CListener(uPort, sBindHost, bSSL, eAddr, eAccept); if (!pListener->Listen()) { delete pListener; PutStatus("Unable to bind [" + CString(strerror(errno)) + "]"); } else { if (CZNC::Get().AddListener(pListener)) PutStatus("Port Added"); else PutStatus("Error?!"); } } } else if (sCommand.Equals("DELPORT")) { if (sPort.empty() || sAddr.empty()) { PutStatus("Usage: DelPort <port> <ipv4|ipv6|all> [bindhost]"); } else { const CString sBindHost = sLine.Token(3); CListener* pListener = CZNC::Get().FindListener(uPort, sBindHost, eAddr); if (pListener) { CZNC::Get().DelListener(pListener); PutStatus("Deleted Port"); } else { PutStatus("Unable to find a matching port"); } } } }
void PrintHelp(const CString&) { CTable CmdTable; CmdTable.AddColumn("Command"); CmdTable.AddColumn("Arguments"); CmdTable.AddColumn("Description"); static const char* help[][3] = { {"Get", "variable [username]", "Prints the variable's value for the given or current user"}, {"Set", "variable username value", "Sets the variable's value for the given user (use $me for the current user)"}, {"GetChan", "variable [username] chan", "Prints the variable's value for the given channel"}, {"SetChan", "variable username chan value", "Sets the variable's value for the given channel"}, {"ListUsers", "", "Lists users"}, {"AddUser", "username password [ircserver]", "Adds a new user"}, {"DelUser", "username", "Deletes a user"}, {"CloneUser", "oldusername newusername", "Clones a user"}, {"AddServer", "[username] server", "Adds a new IRC server for the given or current user"} }; for (unsigned int i = 0; i != ARRAY_SIZE(help); ++i) { CmdTable.AddRow(); CmdTable.SetCell("Command", help[i][0]); CmdTable.SetCell("Arguments", help[i][1]); CmdTable.SetCell("Description", help[i][2]); } PutModule(CmdTable); PutModule("The following variables are available when using the Set/Get commands:"); CTable VarTable; VarTable.AddColumn("Variable"); VarTable.AddColumn("Type"); static const char* string = "String"; static const char* boolean = "Boolean (true/false)"; static const char* integer = "Integer"; static const char* vars[][2] = { {"Nick", string}, {"Altnick", string}, {"Ident", string}, {"RealName", string}, {"VHost", string}, {"MultiClients", boolean}, {"BounceDCCs", boolean}, {"UseClientIP", boolean}, {"DenyLoadMod", boolean}, {"DefaultChanModes", string}, {"QuitMsg", string}, {"BufferCount", integer}, {"KeepBuffer", boolean}, {"Password", string} }; for (unsigned int i = 0; i != ARRAY_SIZE(vars); ++i) { VarTable.AddRow(); VarTable.SetCell("Variable", vars[i][0]); VarTable.SetCell("Type", vars[i][1]); } PutModule(VarTable); PutModule("The following variables are available when using the SetChan/GetChan commands:"); CTable CVarTable; CVarTable.AddColumn("Variable"); CVarTable.AddColumn("Type"); static const char* cvars[][2] = { {"DefModes", string}, {"Buffer", integer}, {"InConfig", boolean}, {"KeepBuffer", boolean}, {"Detached", boolean}, }; for (unsigned int i = 0; i != ARRAY_SIZE(cvars); ++i) { CVarTable.AddRow(); CVarTable.SetCell("Variable", cvars[i][0]); CVarTable.SetCell("Type", cvars[i][1]); } PutModule(CVarTable); PutModule("You can use $me as the user name for modifying your own user."); }
void HandleListCommand(const CString &sLine) { if (m_pUser->IsAdmin() == false) { PutModule("Permission denied"); return; } CTable Table; Table.AddColumn("Device"); Table.AddColumn("User"); Table.AddColumn("Network"); Table.AddColumn("Negotiating"); for (std::vector<CDevice*>::const_iterator it = m_vDevices.begin(); it != m_vDevices.end(); ++it) { CDevice &device = **it; const std::map<CString, VCString> msvsNetworks = device.GetNetworks(); std::map<CString, VCString>::const_iterator it2 = msvsNetworks.begin(); for (;it2 != msvsNetworks.end(); ++it2) { const CString sUsername = it2->first; const VCString &networks = it2->second; for (VCString::const_iterator it3 = networks.begin(); it3 != networks.end(); ++it3) { const CString sNetwork = *it3; Table.AddRow(); Table.SetCell("Device", device.GetToken()); Table.SetCell("User", sUsername); Table.SetCell("Network", sNetwork); Table.SetCell("Negotiating", CString(device.InNegotiation())); } if (networks.size() == 0) { Table.SetCell("Device", device.GetToken()); Table.SetCell("User", sUsername); Table.SetCell("Network", ""); Table.SetCell("Negotiating", CString(device.InNegotiation())); } } if (msvsNetworks.size() == 0) { Table.SetCell("Device", device.GetToken()); Table.SetCell("User", ""); Table.SetCell("Network", ""); Table.SetCell("Negotiating", CString(device.InNegotiation())); } } if (PutModule(Table) == 0) { PutModule("There are no devices registered with this server."); } CDevice *pDevice = DeviceForClient(*m_pClient); if (pDevice) { PutModule("You are connected from Palaver. (" + pDevice->GetToken() + ")"); } else { PutModule("You are not connected from a Palaver client."); } }
void CModCommand::AddHelp(CTable& Table) const { Table.AddRow(); Table.SetCell("Command", GetCommand()); Table.SetCell("Arguments", GetArgs()); Table.SetCell("Description", GetDescription()); }
virtual void OnModCommand(const CString& sLine) { CString sCommand = sLine.Token(0); if (sCommand.Equals("ADD")) { CString sChan = sLine.Token(1); if (AlreadyAdded(sChan)) { PutModule(sChan + " is already added"); } else if (Add(sChan)) { PutModule("Added " + sChan + " to list"); } else { PutModule("Usage: Add [!]<#chan>"); } } else if (sCommand.Equals("DEL")) { CString sChan = sLine.Token(1); if (Del(sChan)) PutModule("Removed " + sChan + " from list"); else PutModule("Usage: Del [!]<#chan>"); } else if (sCommand.Equals("LIST")) { CTable Table; Table.AddColumn("Chan"); for (unsigned int a = 0; a < m_vsChans.size(); a++) { Table.AddRow(); Table.SetCell("Chan", m_vsChans[a]); } for (unsigned int b = 0; b < m_vsNegChans.size(); b++) { Table.AddRow(); Table.SetCell("Chan", "!" + m_vsNegChans[b]); } if (Table.size()) { PutModule(Table); } else { PutModule("You have no entries."); } } else if (sCommand.Equals("HELP")) { CTable Table; Table.AddColumn("Command"); Table.AddColumn("Description"); Table.AddRow(); Table.SetCell("Command", "Add"); Table.SetCell("Description", "Add an entry, use !#chan to negate and * for wildcards"); Table.AddRow(); Table.SetCell("Command", "Del"); Table.SetCell("Description", "Remove an entry, needs to be an exact match"); Table.AddRow(); Table.SetCell("Command", "List"); Table.SetCell("Description", "List all entries"); if (Table.size()) { PutModule(Table); } else { PutModule("You have no entries."); } } }
void CUrlBufferModule::OnModCommand(const CString& sCommand) { CString command = sCommand.Token(0).AsLower().Trim_n(); if (command == "help") { CTable CmdTable; CmdTable.AddColumn("Command"); CmdTable.AddColumn("Description"); CmdTable.AddRow(); CmdTable.SetCell("Command", "ENABLE"); CmdTable.SetCell("Description", "Activates link buffering."); CmdTable.AddRow(); CmdTable.SetCell("Command", "DISABLE"); CmdTable.SetCell("Description", "Deactivates link buffering."); CmdTable.AddRow(); CmdTable.SetCell("Command", "ENABLELOCAL"); CmdTable.SetCell("Description", "Enables downloading of each link to local directory."); CmdTable.AddRow(); CmdTable.SetCell("Command", "DISABLELOCAL"); CmdTable.SetCell("Description", "Disables downloading of each link to local directory."); CmdTable.AddRow(); CmdTable.SetCell("Command","ENABLEPUBLIC"); CmdTable.SetCell("Description", "Enables the usage of !showlinks publicly, by other users."); CmdTable.AddRow(); CmdTable.SetCell("Command","DISABLEPUBLIC"); CmdTable.SetCell("Description", "Disables the usage of !showlinks publicly, by other users."); CmdTable.AddRow(); CmdTable.SetCell("Command", "DIRECTORY <#directory>"); CmdTable.SetCell("Description", "Sets the local directory where the links will be saved."); CmdTable.AddRow(); CmdTable.SetCell("Command", "CLEARBUFFER"); CmdTable.SetCell("Description", "Empties the link buffer."); CmdTable.AddRow(); CmdTable.SetCell("Command", "BUFFERSIZE <#size>"); CmdTable.SetCell("Description", "Sets the size of the link buffer. Only integers >=0."); CmdTable.AddRow(); CmdTable.SetCell("Command", "SHOWSETTINGS"); CmdTable.SetCell("Description", "Prints all the settings."); CmdTable.AddRow(); CmdTable.SetCell("Command", "BUFFERALLLINKS"); CmdTable.SetCell("Description", "Toggles the buffering of all links or only image links."); CmdTable.AddRow(); CmdTable.SetCell("Command", "REUPLOAD"); CmdTable.SetCell("Description", "Toggles the reuploading of image links to imgur."); CmdTable.AddRow(); CmdTable.SetCell("Command", "SHOWLINKS <#number>"); CmdTable.SetCell("Description", "Prints <#number> or <#buffersize> number of cached links."); CmdTable.AddRow(); CmdTable.SetCell("Command", "HELP"); CmdTable.SetCell("Description", "This help."); PutModule(CmdTable); return; } else if (command == "enable") { SetNV("enable","true",true); PutModule("Enabled buffering"); } else if (command == "disable") { SetNV("enable","false",true); PutModule("Disabled buffering"); } else if (command == "enablelocal") { if(GetNV("directory") == "") { PutModule("Directory is not set. First set a directory and then enable local caching"); return; } SetNV("enablelocal","true",true); PutModule("Enabled local caching"); } else if (command == "disablelocal") { SetNV("enablelocal", "false", true); PutModule("Disabled local caching"); } else if (command == "enablepublic") { SetNV("enablepublic", "true", true); PutModule("Enabled public usage of showlinks."); } else if (command == "disablepublic") { SetNV("enablepublic", "false", true); PutModule("Disabled public usage of showlinks."); } else if (command == "directory") { CString dir=sCommand.Token(1).Replace_n("//", "/").TrimRight_n("/") + "/"; if (!isValidDir(dir)) { PutModule("Error in directory name. Avoid using: | ; ! @ # ( ) < > \" ' ` ~ = & ^ <space> <tab>"); return; } // Check if file exists and is directory if (dir.empty() || !CFile::Exists(dir) || !CFile::IsDir(dir, false)) { PutModule("Invalid path or no write access to ["+ sCommand.Token(1) +"]."); return; } SetNV("directory", dir, true); PutModule("Directory for local caching set to " + GetNV("directory")); } else if (command == "clearbuffer") { lastUrls.clear(); nicks.clear(); } else if (command == "buffersize") { unsigned int bufSize = sCommand.Token(1).ToUInt(); if(bufSize==0 || bufSize==UINT_MAX) { PutModule("Error in buffer size. Use only integers >= 0."); return; } SetNV("buffersize", CString(bufSize), true); PutModule("Buffer size set to " + GetNV("buffersize")); } else if (command == "showsettings") { for(MCString::iterator it = BeginNV(); it != EndNV(); it++) { PutModule(it->first.AsUpper() + " : " + it->second); } } else if(command == "bufferalllinks"){ SetNV("bufferalllinks", CString(!GetNV("bufferalllinks").ToBool()), true); PutModule( CString(GetNV("bufferalllinks").ToBool()?"Enabled":"Disabled") + " buffering of all links."); } else if(command == "reupload"){ SetNV("reupload", CString(!GetNV("reupload").ToBool()), true); PutModule( CString(GetNV("reupload").ToBool()?"Enabled":"Disabled") + " reuploading of images."); } else if (command == "showlinks") { if(lastUrls.empty()) PutModule("No links were found..."); else { unsigned int maxLinks = GetNV("buffersize").ToUInt(); unsigned int size = sCommand.Token(1).ToUInt(); if(size!=0 && size<UINT_MAX) //if it was a valid number maxLinks = size; unsigned int maxSize = lastUrls.size()-1; for(unsigned int i=0; i<=maxSize && i< maxLinks; i++) { PutModule(nicks[maxSize-i] + ": " + lastUrls[maxSize-i]); } } } else { PutModule("Unknown command! Try HELP."); } }