You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
306 lines
6.4 KiB
306 lines
6.4 KiB
8 years ago
|
// AgIRC.cpp: implementation of the AgIRC class.
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include "hud.h"
|
||
|
#include "cl_util.h"
|
||
|
#include "irc.h"
|
||
|
#include "AgIRC.h"
|
||
|
#include "vgui_TeamFortressViewport.h"
|
||
|
#include "AGVGuiIRC.h"
|
||
|
#include "aghudsettings.h"
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
// Construction/Destruction
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
extern irc::CIrcSession g_ircSession;
|
||
|
|
||
|
DECLARE_IRC_MAP(AgIRC, CIrcDefaultMonitor)
|
||
|
|
||
|
AgIRC::AgIRC()
|
||
|
: irc::CIrcDefaultMonitor(g_ircSession)
|
||
|
{
|
||
|
m_bSilent = false;
|
||
|
IRC_MAP_ENTRY(AgIRC, "JOIN", OnIrc_JOIN)
|
||
|
IRC_MAP_ENTRY(AgIRC, "KICK", OnIrc_KICK)
|
||
|
IRC_MAP_ENTRY(AgIRC, "MODE", OnIrc_MODE)
|
||
|
IRC_MAP_ENTRY(AgIRC, "NICK", OnIrc_NICK)
|
||
|
IRC_MAP_ENTRY(AgIRC, "PART", OnIrc_PART)
|
||
|
IRC_MAP_ENTRY(AgIRC, "PRIVMSG", OnIrc_PRIVMSG)
|
||
|
IRC_MAP_ENTRY(AgIRC, "002", OnIrc_YOURHOST)
|
||
|
IRC_MAP_ENTRY(AgIRC, "QUIT", OnIrc_QUIT)
|
||
|
IRC_MAP_ENTRY(AgIRC, "MODE", OnIrc_MODE)
|
||
|
}
|
||
|
|
||
|
AgIRC::~AgIRC()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
bool AgIRC::Connect(const CIrcSessionInfo* psi)
|
||
|
{
|
||
|
g_ircSession.AddMonitor(this);
|
||
|
return g_ircSession.Connect(*psi);
|
||
|
|
||
|
}
|
||
|
|
||
|
bool AgIRC::Disconnect(const AgString& sMessage)
|
||
|
{
|
||
|
g_ircSession.Disconnect(sMessage.c_str());
|
||
|
g_ircSession.RemoveMonitor(this);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool AgIRC::Command(AgString sCommand)
|
||
|
{
|
||
|
if( sCommand[0] != '/' )
|
||
|
sCommand = "PRIVMSG " + m_sChannel + " :" + sCommand;
|
||
|
else if (0 == strnicmp(sCommand.c_str(),"/msg", 4))
|
||
|
{
|
||
|
//Need to fix up privmsg command so that it adds : for last command.
|
||
|
AgString sUser,sText;
|
||
|
char* pszCommand = (char*)(const char*)&sCommand[4];
|
||
|
pszCommand++;
|
||
|
|
||
|
while ('\0' != *pszCommand && !isspace(*pszCommand))
|
||
|
{
|
||
|
sUser += *pszCommand;
|
||
|
pszCommand++;
|
||
|
}
|
||
|
|
||
|
if ('\0' != *pszCommand)
|
||
|
{
|
||
|
pszCommand++;
|
||
|
sText = pszCommand;
|
||
|
}
|
||
|
|
||
|
sCommand = "PRIVMSG " + sUser + " :" + sText;
|
||
|
}
|
||
|
else
|
||
|
sCommand = sCommand.substr(1);
|
||
|
|
||
|
g_ircSession << irc::CIrcMessage(sCommand.c_str());
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void AgIRC::PrintMessage(AgString sMessage)
|
||
|
{
|
||
|
if (m_bSilent)
|
||
|
return;
|
||
|
|
||
|
AgTrim(sMessage);
|
||
|
if (sMessage.size())
|
||
|
{
|
||
|
ConsolePrint(("IRC: " + sMessage + "\n").c_str());
|
||
|
if (gViewPort && gViewPort->m_pIRC)
|
||
|
gViewPort->m_pIRC->PrintMessage(sMessage.c_str());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void AgIRC::OnMessage(const CIrcMessage* pmsg)
|
||
|
{
|
||
|
AgString sMessage;
|
||
|
sMessage = pmsg->prefix.sNick + " ";
|
||
|
|
||
|
//sMessage = pmsg->prefix.sNick + " " + pmsg->sCommand + " ";
|
||
|
|
||
|
for (unsigned int i = 1; i < pmsg->parameters.size(); i++)
|
||
|
{
|
||
|
sMessage += pmsg->parameters[i] + " ";
|
||
|
}
|
||
|
|
||
|
PrintMessage(sMessage.c_str());
|
||
|
}
|
||
|
|
||
|
|
||
|
bool AgIRC::OnIrc_YOURHOST(const CIrcMessage* pmsg)
|
||
|
{
|
||
|
CIrcDefaultMonitor::OnIrc_YOURHOST(pmsg);
|
||
|
|
||
|
AgString sMessage;
|
||
|
sMessage = "Your host is ";
|
||
|
sMessage += pmsg->parameters[1];
|
||
|
|
||
|
PrintMessage(sMessage.c_str());
|
||
|
|
||
|
AgString sChannel = gEngfuncs.pfnGetCvarString("irc_autojoin");
|
||
|
if (sChannel.length())
|
||
|
{
|
||
|
AgString sJoin;
|
||
|
sJoin = "/JOIN " + sChannel;
|
||
|
Command(sJoin);
|
||
|
}
|
||
|
|
||
|
AgString sCommand = gEngfuncs.pfnGetCvarString("irc_autocommand");
|
||
|
if (sCommand.length())
|
||
|
Command(sCommand);
|
||
|
|
||
|
AgString sCommand2 = gEngfuncs.pfnGetCvarString("irc_autocommand2");
|
||
|
if (sCommand2.length())
|
||
|
Command(sCommand2);
|
||
|
|
||
|
AgString sCommand3 = gEngfuncs.pfnGetCvarString("irc_autocommand3");
|
||
|
if (sCommand3.length())
|
||
|
Command(sCommand3);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool AgIRC::OnIrc_NICK(const CIrcMessage* pmsg)
|
||
|
{
|
||
|
CIrcDefaultMonitor::OnIrc_NICK(pmsg);
|
||
|
|
||
|
if( pmsg->prefix.sNick == m_session.GetInfo().sNick && (pmsg->parameters.size() > 0) )
|
||
|
{
|
||
|
}
|
||
|
else if (pmsg->prefix.sNick.size())
|
||
|
{
|
||
|
AgString sMessage;
|
||
|
sMessage = pmsg->prefix.sNick + " is now known as " + pmsg->parameters[0];
|
||
|
PrintMessage(sMessage.c_str());
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool AgIRC::OnIrc_PRIVMSG(const CIrcMessage* pmsg)
|
||
|
{
|
||
|
if (0 == pmsg->prefix.sNick.size() && pmsg->m_bIncoming || AgIsMatch() && 0 == g_iUser1)
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
AgString sName;
|
||
|
if (!pmsg->m_bIncoming)
|
||
|
sName = m_session.GetInfo().sNick;
|
||
|
else
|
||
|
sName = pmsg->prefix.sNick;
|
||
|
|
||
|
|
||
|
AgString sMessage;
|
||
|
|
||
|
sMessage = sName + " ";
|
||
|
|
||
|
for (unsigned int i = 1; i < pmsg->parameters.size(); i++)
|
||
|
{
|
||
|
sMessage += pmsg->parameters[i] + " ";
|
||
|
}
|
||
|
|
||
|
AgTrim(sMessage);
|
||
|
|
||
|
if (gViewPort && gViewPort->m_pIRC)
|
||
|
gViewPort->m_pIRC->PrintMessage(sMessage.c_str());
|
||
|
|
||
|
sMessage = "IRC: " + sMessage;
|
||
|
sMessage += "\n";
|
||
|
|
||
|
if (!m_bSilent)
|
||
|
gHUD.m_SayText.SayTextPrint( sMessage.c_str(), sMessage.size());
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool AgIRC::OnIrc_JOIN(const CIrcMessage* pmsg)
|
||
|
{
|
||
|
if (!pmsg->prefix.sNick.size())
|
||
|
{
|
||
|
if (0 != m_sChannel.size() && m_sChannel != pmsg->parameters[0].c_str())
|
||
|
{
|
||
|
AgString sPart;
|
||
|
sPart = "/PART " + m_sChannel;
|
||
|
Command(sPart);
|
||
|
}
|
||
|
m_sChannel = pmsg->parameters[0].c_str();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
AgString sMessage;
|
||
|
|
||
|
sMessage = pmsg->prefix.sNick + " has joined " + pmsg->parameters[0];
|
||
|
PrintMessage(sMessage.c_str());
|
||
|
}
|
||
|
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool AgIRC::OnIrc_PART(const CIrcMessage* pmsg)
|
||
|
{
|
||
|
if( !pmsg->prefix.sNick.length())
|
||
|
return false;
|
||
|
|
||
|
AgString sMessage;
|
||
|
sMessage = pmsg->prefix.sNick + " has left " + pmsg->parameters[0];
|
||
|
PrintMessage(sMessage.c_str());
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool AgIRC::OnIrc_KICK(const CIrcMessage* pmsg)
|
||
|
{
|
||
|
if( !pmsg->prefix.sNick.length() )
|
||
|
return false;
|
||
|
|
||
|
AgString sMessage;
|
||
|
sMessage = pmsg->prefix.sNick + " was kicked by " + pmsg->parameters[0];
|
||
|
PrintMessage(sMessage.c_str());
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool AgIRC::OnIrc_MODE(const CIrcMessage* pmsg)
|
||
|
{
|
||
|
if( !pmsg->prefix.sNick.length() )
|
||
|
return false;
|
||
|
if( pmsg->prefix.sNick == m_session.GetInfo().sNick )
|
||
|
return false;
|
||
|
|
||
|
AgString sMessage;
|
||
|
sMessage = pmsg->prefix.sNick + " sets mode: ";
|
||
|
for (unsigned int i = 1; i < pmsg->parameters.size(); i++)
|
||
|
{
|
||
|
sMessage += pmsg->parameters[i] + " ";
|
||
|
}
|
||
|
|
||
|
PrintMessage(sMessage.c_str());
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool AgIRC::OnIrc_QUIT(const CIrcMessage* pmsg)
|
||
|
{
|
||
|
if( !pmsg->prefix.sNick.length() )
|
||
|
return false;
|
||
|
|
||
|
AgString sMessage;
|
||
|
sMessage = pmsg->prefix.sNick + " has quit IRC ";
|
||
|
if (pmsg->parameters[0].size())
|
||
|
sMessage += "(" + pmsg->parameters[0] + ")";
|
||
|
PrintMessage(sMessage.c_str());
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
void AgIRC::OnIrcDefault(const CIrcMessage* pmsg)
|
||
|
{
|
||
|
CIrcDefaultMonitor::OnIrcDefault(pmsg);
|
||
|
|
||
|
OnMessage(pmsg);
|
||
|
}
|
||
|
|
||
|
void AgIRC::OnIrcDisconnected()
|
||
|
{
|
||
|
AgString sMessage;
|
||
|
sMessage = "Disconnected from " + m_session.GetInfo().sServerName;
|
||
|
PrintMessage(sMessage.c_str());
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void AgIRC::SilentMode()
|
||
|
{
|
||
|
#ifndef AG_TESTCHEAT
|
||
|
m_bSilent = true;
|
||
|
#endif
|
||
|
}
|