Portable Half-Life SDK. GoldSource and Xash3D. Crossplatform.
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

// 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
}