/** * LogUser * * Logs something in the bouncer's main log and also sends it to a specific user. * * @param User the user * @param Format a format string * @param ... additional parameters which are used by the format string */ void CCore::LogUser(CUser *User, const char *Format, ...) { char *Out; int Ret; va_list marker; bool DoneUser = false; va_start(marker, Format); Ret = vasprintf(&Out, Format, marker); va_end(marker); if (AllocFailed(Out)) { return; } m_Log->WriteLine("%s", Out); for (int i = 0; i < m_AdminUsers.GetLength(); i++) { CUser *ThisUser = m_AdminUsers[i]; if (ThisUser->GetSystemNotices() && ThisUser->GetClientConnectionMultiplexer()) { ThisUser->GetClientConnectionMultiplexer()->Privmsg(Out); if (ThisUser == User) { DoneUser = true; } } } if (!DoneUser && User->GetClientConnectionMultiplexer() != NULL) { User->GetClientConnectionMultiplexer()->Privmsg(Out); } free(Out); }
/** * Log * * Logs something in the bouncer's main log. * * @param Format a format string * @param ... additional parameters which are used by the format string */ void CCore::Log(const char *Format, ...) { char *Out; int Ret; va_list marker; va_start(marker, Format); Ret = vasprintf(&Out, Format, marker); va_end(marker); if (AllocFailed(Out)) { return; } if (m_Log == NULL) { fprintf(stderr, "%s\n", Out); } else { m_Log->WriteLine("%s", Out); } for (int i = 0; i < m_AdminUsers.GetLength(); i++) { CUser *User = m_AdminUsers.Get(i); if (User->GetSystemNotices() && User->GetClientConnectionMultiplexer() != NULL) { User->GetClientConnectionMultiplexer()->Privmsg(Out); } } free(Out); }
/** * NickCatchTimer * * Used to regain a user's nickname * * @param Now current time * @param IRCConnection irc connection */ bool NickCatchTimer(time_t Now, void *IRCConnection) { CIRCConnection *IRC = (CIRCConnection *)IRCConnection; CUser *Owner = IRC->GetOwner(); const char *AwayNick; if (Owner != NULL) { AwayNick = IRC->GetOwner()->GetAwayNick(); } else { AwayNick = NULL; } if (Owner && Owner->GetClientConnectionMultiplexer() != NULL) { IRC->m_NickCatchTimer = NULL; return false; } if (IRC->GetCurrentNick() != NULL && AwayNick != NULL && strcmp(IRC->GetCurrentNick(), AwayNick) != 0) { IRC->WriteLine("NICK %s", AwayNick); } IRC->m_NickCatchTimer = NULL; return false; }
/** * ParseLine * * Tokenizes, parses and processes a line which was sent by the IRC server. * * @param Line the line */ void CIRCConnection::ParseLine(const char *Line) { const char *RealLine = Line; char *Out; if (GetOwner() == NULL) { return; } if (Line[0] == ':') { RealLine = Line + 1; } else { RealLine = Line; } tokendata_t Args = ArgTokenize2(RealLine); const char **argv = ArgToArray2(Args); int argc = ArgCount2(Args); if (argv == NULL) { g_Bouncer->Log("ArgToArray2 returned NULL. Could not parse line (%s).", Line); return; } if (ParseLineArgV(argc, argv)) { if (strcasecmp(argv[0], "ping") == 0 && argc > 1) { int rc = asprintf(&Out, "PONG :%s", argv[1]); if (!RcFailed(rc)) { m_QueueHigh->QueueItem(Out); free(Out); } if (m_State != State_Connected) { m_State = State_Pong; if (GetOwner()->GetClientConnectionMultiplexer() == NULL) { WriteUnformattedLine("VERSION"); } } } else { CUser *User = GetOwner(); if (User) { CClientConnection *Client = User->GetClientConnectionMultiplexer(); if (Client != NULL) { if (argc > 2 && strcasecmp(argv[1], "303") == 0) { Client->WriteLine("%s -sBNC", Line); } else { Client->WriteUnformattedLine(Line); } } } } } #ifdef _WIN32 OutputDebugString(Line); OutputDebugString("\n"); #endif //puts(Line); ArgFreeArray(argv); }