mirror of
https://github.com/znc/znc.git
synced 2026-03-28 17:42:41 +01:00
Some cleanup and fixes to schat
- schat now works again (yay) - it now uses CSocket instead of Csock directly - list only displays schat's own sockets - other minor stuff git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@1303 726aef4b-f618-498e-8847-2d620e286838
This commit is contained in:
@@ -38,32 +38,17 @@ protected:
|
||||
CString m_sNick;
|
||||
};
|
||||
|
||||
class CSChatSock : public Csock
|
||||
class CSChatSock : public CSocket
|
||||
{
|
||||
public:
|
||||
CSChatSock(CSChat *pMod) : Csock()
|
||||
{
|
||||
m_pModule = pMod;
|
||||
}
|
||||
|
||||
CSChatSock(int itimeout = 60) : Csock(itimeout)
|
||||
{
|
||||
m_pModule = NULL;
|
||||
EnableReadLine();
|
||||
}
|
||||
CSChatSock(const CS_STRING & sHost, u_short iPort, int iTimeout = 60)
|
||||
: Csock(sHost, iPort, iTimeout)
|
||||
{
|
||||
m_pModule = NULL;
|
||||
EnableReadLine();
|
||||
}
|
||||
CSChatSock(CSChat *pMod, const CString& sChatNick);
|
||||
CSChatSock(CSChat *pMod, const CString& sChatNick, const CString& sHost,
|
||||
u_short iPort, int iTimeout = 60);
|
||||
~CSChatSock() {}
|
||||
|
||||
virtual Csock *GetSockObj(const CS_STRING & sHostname, u_short iPort)
|
||||
{
|
||||
CSChatSock *p = new CSChatSock(sHostname, iPort);
|
||||
p->SetModule(m_pModule);
|
||||
p->SetChatNick(m_sChatNick);
|
||||
p->SetSockName(GetSockName() + "::" + m_sChatNick);
|
||||
CSChatSock *p = new CSChatSock(m_pModule, m_sChatNick, sHostname, iPort);
|
||||
return(p);
|
||||
}
|
||||
|
||||
@@ -76,18 +61,10 @@ public:
|
||||
virtual void Connected();
|
||||
virtual void Timeout();
|
||||
|
||||
void SetModule(CSChat *p)
|
||||
{
|
||||
m_pModule = p;
|
||||
}
|
||||
|
||||
void SetChatNick(const CString & sNick)
|
||||
{
|
||||
m_sChatNick = sNick;
|
||||
}
|
||||
|
||||
const CString & GetChatNick() const { return(m_sChatNick); }
|
||||
|
||||
void PutQuery(const CString& sText);
|
||||
|
||||
virtual void ReadLine(const CS_STRING & sLine);
|
||||
virtual void Disconnected();
|
||||
|
||||
@@ -124,7 +101,7 @@ class CSChat : public CModule
|
||||
{
|
||||
public:
|
||||
MODCONSTRUCTOR(CSChat) {}
|
||||
virtual ~CSChat() { CleanSocks(); }
|
||||
virtual ~CSChat() {}
|
||||
|
||||
virtual bool OnLoad(const CString & sArgs, CString & sMessage)
|
||||
{
|
||||
@@ -144,26 +121,17 @@ public:
|
||||
|
||||
virtual void OnClientLogin()
|
||||
{
|
||||
CString sName = "SCHAT::" + m_pUser->GetUserName();
|
||||
for (u_int a = 0; a < m_pManager->size(); a++) {
|
||||
if ((*m_pManager)[a]->GetSockName() != sName ||
|
||||
(*m_pManager)[a]->GetType() == CSChatSock::LISTENER)
|
||||
vector<CSocket*>::const_iterator it;
|
||||
for (it = BeginSockets(); it != EndSockets(); it++) {
|
||||
CSChatSock *p = (CSChatSock*) *it;
|
||||
|
||||
if (p->GetType() == CSChatSock::LISTENER)
|
||||
continue;
|
||||
|
||||
CSChatSock *p = (CSChatSock *)(*m_pManager)[a];
|
||||
p->DumpBuffer();
|
||||
}
|
||||
}
|
||||
|
||||
void CleanSocks()
|
||||
{
|
||||
CString sName = "SCHAT::" + m_pUser->GetUserName();
|
||||
for (u_int a= 0; a < m_pManager->size(); a++) {
|
||||
if ((*m_pManager)[a]->GetSockName() == sName)
|
||||
m_pManager->DelSock(a--);
|
||||
}
|
||||
}
|
||||
|
||||
virtual EModRet OnUserRaw(CString & sLine)
|
||||
{
|
||||
if (sLine.Equals("schat ", false, 6)) {
|
||||
@@ -185,27 +153,23 @@ public:
|
||||
CString sArgs = sCommand.Token(1, true);
|
||||
|
||||
if (sCom.Equals("chat") && !sArgs.empty()) {
|
||||
CString sSockName = "SCHAT::" + m_pUser->GetUserName();
|
||||
CString sNick = "(s)" + sArgs;
|
||||
for (u_int a= 0; a < m_pManager->size(); a++) {
|
||||
if ((*m_pManager)[a]->GetSockName() != sSockName)
|
||||
continue;
|
||||
vector<CSocket*>::const_iterator it;
|
||||
for (it = BeginSockets(); it != EndSockets(); it++) {
|
||||
CSChatSock *pSock = (CSChatSock*) *it;
|
||||
|
||||
CSChatSock *pSock = (CSChatSock *)(*m_pManager)[a];
|
||||
if (pSock->GetChatNick().Equals(sNick)) {
|
||||
PutModule("Already Connected to [" + sArgs + "]");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
CSChatSock *pSock = new CSChatSock;
|
||||
CSChatSock *pSock = new CSChatSock(this, sNick);
|
||||
pSock->SetCipher("HIGH");
|
||||
pSock->SetPemLocation(m_sPemFile);
|
||||
pSock->SetModule(this);
|
||||
pSock->SetChatNick(sNick);
|
||||
|
||||
u_short iPort = m_pManager->ListenRand(sSockName, m_pUser->GetLocalIP(), true,
|
||||
SOMAXCONN, pSock, 60);
|
||||
u_short iPort = m_pManager->ListenRand(pSock->GetSockName() + "::LISTENER",
|
||||
m_pUser->GetLocalIP(), true, SOMAXCONN, pSock, 60);
|
||||
|
||||
if (iPort == 0) {
|
||||
PutModule("Failed to start chat!");
|
||||
@@ -221,7 +185,6 @@ public:
|
||||
PutIRC(s.str());
|
||||
|
||||
} else if (sCom.Equals("list")) {
|
||||
CString sName = "SCHAT::" + m_pUser->GetUserName();
|
||||
CTable Table;
|
||||
Table.AddColumn("Nick");
|
||||
Table.AddColumn("Created");
|
||||
@@ -229,13 +192,12 @@ public:
|
||||
Table.AddColumn("Port");
|
||||
Table.AddColumn("Status");
|
||||
Table.AddColumn("Cipher");
|
||||
for (u_int a= 0; a < m_pManager->size(); a++) {
|
||||
if ((*m_pManager)[a]->GetSockName() != sName)
|
||||
continue;
|
||||
|
||||
vector<CSocket*>::const_iterator it;
|
||||
for (it = BeginSockets(); it != EndSockets(); it++) {
|
||||
Table.AddRow();
|
||||
|
||||
CSChatSock *pSock = (CSChatSock *)(*m_pManager)[a];
|
||||
CSChatSock *pSock = (CSChatSock*) *it;
|
||||
Table.SetCell("Nick", pSock->GetChatNick());
|
||||
unsigned long long iStartTime = pSock->GetStartTime();
|
||||
time_t iTime = iStartTime / 1000;
|
||||
@@ -265,14 +227,12 @@ public:
|
||||
PutModule("No SDCCs currently in session");
|
||||
|
||||
} else if (sCom.Equals("close")) {
|
||||
CString sName = "SCHAT::" + m_pUser->GetUserName();
|
||||
for (u_int a = 0; a < m_pManager->size(); a++) {
|
||||
if ((*m_pManager)[a]->GetSockName() != sName)
|
||||
continue;
|
||||
if (!sArgs.Equals("(s)", false, 3))
|
||||
sArgs = "(s)" + sArgs;
|
||||
|
||||
CSChatSock *pSock = (CSChatSock *)(*m_pManager)[a];
|
||||
if (!sArgs.Equals("(s)", false, 3))
|
||||
sArgs = "(s)" + sArgs;
|
||||
vector<CSocket*>::const_iterator it;
|
||||
for (it = BeginSockets(); it != EndSockets(); it++) {
|
||||
CSChatSock *pSock = (CSChatSock*) *it;
|
||||
|
||||
if (sArgs.Equals(pSock->GetChatNick())) {
|
||||
pSock->Close();
|
||||
@@ -288,9 +248,11 @@ public:
|
||||
Table.AddColumn("RemoteIP:Port");
|
||||
Table.AddColumn("Type");
|
||||
Table.AddColumn("Cipher");
|
||||
for (u_int a = 0; a < m_pManager->size(); a++) {
|
||||
|
||||
vector<CSocket*>::const_iterator it;
|
||||
for (it = BeginSockets(); it != EndSockets(); it++) {
|
||||
Table.AddRow();
|
||||
Csock *pSock = (*m_pManager)[a];
|
||||
Csock *pSock = *it;
|
||||
Table.SetCell("SockName", pSock->GetSockName());
|
||||
unsigned long long iStartTime = pSock->GetStartTime();
|
||||
time_t iTime = iStartTime / 1000;
|
||||
@@ -376,19 +338,17 @@ public:
|
||||
|
||||
void AcceptSDCC(const CString & sNick, u_long iIP, u_short iPort)
|
||||
{
|
||||
CSChatSock *p = new CSChatSock(CUtils::GetIP(iIP), iPort, 60);
|
||||
p->SetModule(this);
|
||||
p->SetChatNick(sNick);
|
||||
CString sSockName = "SCHAT::" + m_pUser->GetUserName() + "::" + sNick;
|
||||
m_pManager->Connect(CUtils::GetIP(iIP), iPort, sSockName, 60, true, m_pUser->GetLocalIP(), p);
|
||||
CSChatSock *p = new CSChatSock(this, sNick, CUtils::GetIP(iIP), iPort, 60);
|
||||
m_pManager->Connect(CUtils::GetIP(iIP), iPort, p->GetSockName(), 60,
|
||||
true, m_pUser->GetLocalIP(), p);
|
||||
RemTimer("Remove " + sNick); // delete any associated timer to this nick
|
||||
}
|
||||
|
||||
virtual EModRet OnUserMsg(CString& sTarget, CString& sMessage)
|
||||
{
|
||||
if (sTarget.Left(3) == "(s)") {
|
||||
CString sSockName = "SCHAT::" + m_pUser->GetUserName() + "::" + sTarget;
|
||||
CSChatSock *p = (CSChatSock *)m_pManager->FindSockByName(sSockName);
|
||||
CString sSockName = GetModName().AsUpper() + "::" + sTarget;
|
||||
CSChatSock *p = (CSChatSock *)FindSocket(sSockName);
|
||||
if (!p) {
|
||||
map< CString,pair< u_long,u_short > >::iterator it;
|
||||
it = m_siiWaitingChats.find(sTarget);
|
||||
@@ -440,35 +400,49 @@ private:
|
||||
|
||||
//////////////////// methods ////////////////
|
||||
|
||||
CSChatSock::CSChatSock(CSChat *pMod, const CString& sChatNick) : CSocket(pMod) {
|
||||
m_pModule = pMod;
|
||||
m_sChatNick = sChatNick;
|
||||
SetSockName(pMod->GetModName().AsUpper() + "::" + m_sChatNick);
|
||||
}
|
||||
|
||||
CSChatSock::CSChatSock(CSChat *pMod, const CString& sChatNick, const CString& sHost,
|
||||
u_short iPort, int iTimeout) : CSocket(pMod, sHost, iPort, iTimeout) {
|
||||
m_pModule = pMod;
|
||||
EnableReadLine();
|
||||
m_sChatNick = sChatNick;
|
||||
SetSockName(pMod->GetModName().AsUpper() + "::" + m_sChatNick);
|
||||
}
|
||||
|
||||
void CSChatSock::PutQuery(const CString& sText) {
|
||||
m_pModule->SendToUser(m_sChatNick + "!" + m_sChatNick + "@" + GetRemoteIP(), sText);
|
||||
}
|
||||
|
||||
void CSChatSock::ReadLine(const CS_STRING & sLine)
|
||||
{
|
||||
if (m_pModule) {
|
||||
CString sText = sLine;
|
||||
if (sText[sText.length()-1] == '\n')
|
||||
sText.erase(sText.length()-1, 1);
|
||||
|
||||
if (sText[sText.length()-1] == '\r')
|
||||
sText.erase(sText.length()-1, 1);
|
||||
sText.TrimRight("\r\n");
|
||||
|
||||
if (m_pModule->IsAttached())
|
||||
m_pModule->SendToUser(m_sChatNick + "!" + m_sChatNick + "@" + GetRemoteIP(), sText);
|
||||
PutQuery(sText);
|
||||
else
|
||||
AddLine(sText);
|
||||
AddLine(m_pModule->GetUser()->AddTimestamp(sText));
|
||||
}
|
||||
}
|
||||
|
||||
void CSChatSock::Disconnected()
|
||||
{
|
||||
if (m_pModule)
|
||||
m_pModule->SendToUser(m_sChatNick + "!" + m_sChatNick + "@" + GetRemoteIP(),
|
||||
"*** Disconnected.");
|
||||
PutQuery("*** Disconnected.");
|
||||
}
|
||||
|
||||
void CSChatSock::Connected()
|
||||
{
|
||||
SetTimeout(0);
|
||||
if (m_pModule)
|
||||
m_pModule->SendToUser(m_sChatNick + "!" + m_sChatNick + "@" + GetRemoteIP(), "*** Connected.");
|
||||
PutQuery("*** Connected.");
|
||||
}
|
||||
|
||||
void CSChatSock::Timeout()
|
||||
@@ -477,8 +451,7 @@ void CSChatSock::Timeout()
|
||||
if (GetType() == LISTENER)
|
||||
m_pModule->PutModule("Timeout while waiting for [" + m_sChatNick + "]");
|
||||
else
|
||||
m_pModule->SendToUser(m_sChatNick + "!" + m_sChatNick + "@" + GetRemoteIP(),
|
||||
"*** Connection Timed out.");
|
||||
PutQuery("*** Connection Timed out.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user