From 50d293716d9f4baaebef04ac572f2bf6cca14703 Mon Sep 17 00:00:00 2001 From: prozacx Date: Wed, 12 Oct 2005 06:39:16 +0000 Subject: [PATCH] Added List command, enforce <= 32 char chans that start with ~#, and send 005 OnLoad() git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@568 726aef4b-f618-498e-8847-2d620e286838 --- modules/partyline.cpp | 57 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/modules/partyline.cpp b/modules/partyline.cpp index 8492060a..ae8894ba 100644 --- a/modules/partyline.cpp +++ b/modules/partyline.cpp @@ -18,6 +18,17 @@ public: } virtual bool OnLoad(const CString& sArgs) { + const map& msUsers = CZNC::Get().GetUserMap(); + + for (map::const_iterator it = msUsers.begin(); it != msUsers.end(); it++) { + CUser* pUser = it->second; + if (pUser->GetIRCSock()) { + if (pUser->GetChanPrefixes().find("~") == CString::npos) { + pUser->PutUser(":" + pUser->GetIRCServer() + " 005 " + pUser->GetIRCNick().GetNick() + " CHANTYPES=" + pUser->GetChanPrefixes() + "~ :are supported by this server."); + } + } + } + return true; } @@ -72,6 +83,11 @@ public: return CONTINUE; } + if (sChannel.Left(2) != "~#") { + m_pUserSock->PutServ(":" + m_pUser->GetIRCServer() + " 403 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :No such channel"); + return HALT; + } + set& ssNicks = m_msChans[sChannel.AsLower()]; const CString& sNick = m_pUser->GetUserName(); @@ -99,6 +115,12 @@ public: return CONTINUE; } + if (sChannel.Left(2) != "~#") { + m_pUserSock->PutServ(":" + m_pUser->GetIRCServer() + " 403 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :Channels look like ~#znc"); + return HALT; + } + + sChannel = sChannel.Left(32); set& ssNicks = m_msChans[sChannel.AsLower()]; const CString& sNick = m_pUser->GetUserName(); @@ -141,6 +163,11 @@ public: } if (cPrefix == '~') { + if (m_msChans.find(sTarget.AsLower()) == m_msChans.end()) { + m_pUserSock->PutServ(":" + m_pUser->GetIRCServer() + " 403 " + m_pUser->GetIRCNick().GetNick() + " " + sTarget + " :No such channel"); + return HALT; + } + PutChan(sTarget, ":?" + m_pUser->GetUserName() + "!" + m_pUser->GetIdent() + "@" + sHost + " PRIVMSG " + sTarget + " :" + sMessage, true, false); } else { CString sNick = sTarget.LeftChomp_n(1); @@ -156,6 +183,36 @@ public: return HALT; } + virtual void OnModCommand(const CString& sLine) { + CString sCommand = sLine.Token(0); + + if (sCommand.CaseCmp("LIST") == 0) { + if (!m_msChans.size()) { + PutModule("There are no open channels."); + return; + } + + CTable Table; + + Table.AddColumn("Channel"); + Table.AddColumn("Users"); + + for (map >::const_iterator a = m_msChans.begin(); a != m_msChans.end(); a++) { + Table.AddRow(); + + Table.SetCell("Channel", a->first); + Table.SetCell("Users", CString::ToString(a->second.size())); + } + + unsigned int uTableIdx = 0; + CString sLine; + + while (Table.GetLine(uTableIdx++, sLine)) { + PutModule(sLine); + } + } + } + bool PutChan(const CString& sChan, const CString& sLine, bool bIncludeCurUser = true, bool bIncludeClient = true) { map >::iterator it = m_msChans.find(sChan.AsLower());