Create local &SERVER channel and log server messages to it

ngIRCd now creates a server-local channel &SERVER with channel modes
+mnPt (moderated, no messages from outside the channel, persistent and
with the topic locked) and logs all the messages to it that a user with
mode +s ("server messages") receives.

If an IRC operator withdraws the +P ("persistent") mode and the &SERVER
channel is freed because of no members, nothing special happens. The
channel can be recerated any time later and ngIRCd would begin logging
to it again.
This commit is contained in:
Alexander Barton 2008-11-17 23:27:06 +01:00
parent 2cc21caf32
commit 0eda085f1e
3 changed files with 42 additions and 7 deletions

View File

@ -63,8 +63,16 @@ static bool Delete_Channel PARAMS(( CHANNEL *Chan ));
GLOBAL void
Channel_Init( void )
{
CHANNEL *sc;
My_Channels = NULL;
My_Cl2Chan = NULL;
sc = Channel_Create("&SERVER");
if (sc) {
Channel_SetModes(sc, "mnPt");
Channel_SetTopic(sc, Client_ThisServer(), "Server Messages");
}
} /* Channel_Init */
@ -747,6 +755,10 @@ Can_Send_To_Channel(CHANNEL *Chan, CLIENT *From)
is_member = has_voice = is_op = false;
/* The server itself always can send messages :-) */
if (Client_ThisServer() == From)
return true;
if (Channel_IsMemberOf(Chan, From)) {
is_member = true;
if (strchr(Channel_UserModes(Chan, From), 'v'))
@ -1013,6 +1025,26 @@ Channel_ShowInvites( CLIENT *Client, CHANNEL *Channel )
}
/**
* Log a message to the local &SERVER channel, if it exists.
*/
GLOBAL void
Channel_LogServer(char *msg)
{
CHANNEL *sc;
CLIENT *c;
assert(msg != NULL);
sc = Channel_Search("&SERVER");
if (!sc)
return;
c = Client_ThisServer();
Channel_Write(sc, c, c, "PRIVMSG", false, msg);
} /* Channel_LogServer */
static CL2CHAN *
Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
{

View File

@ -125,6 +125,8 @@ GLOBAL bool Channel_AddBan PARAMS((CHANNEL *c, const char *Mask ));
GLOBAL bool Channel_ShowBans PARAMS((CLIENT *client, CHANNEL *c));
GLOBAL bool Channel_ShowInvites PARAMS((CLIENT *client, CHANNEL *c));
GLOBAL void Channel_LogServer PARAMS((char *msg));
#define Channel_IsLocal(c) (Channel_Name(c)[0] == '&')

View File

@ -61,7 +61,7 @@ Log_Init( bool Daemon_Mode )
Is_Daemon = Daemon_Mode;
#ifdef SYSLOG
#ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS/LOG_LOCAL5 */
#ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS/LOG_LOCAL5 */
#define LOG_CONS 0
#endif
#ifndef LOG_LOCAL5
@ -202,6 +202,8 @@ va_dcl
* Logging function of ngIRCd.
* This function logs messages to the console and/or syslog, whichever is
* suitable for the mode ngIRCd is running in (daemon vs. non-daemon).
* If LOG_snotice is set, the log messages goes to all user with the mode +s
* set and the local &SERVER channel, too.
* Please note: you sould use LogDebug(...) for debug messages!
* @param Level syslog level (LOG_xxx)
* @param Format Format string like printf().
@ -218,7 +220,6 @@ const char *Format;
va_dcl
#endif
{
/* Eintrag in Logfile(s) schreiben */
char msg[MAX_LOG_MSG_LEN];
bool snotice;
va_list ap;
@ -239,7 +240,6 @@ va_dcl
if( Level == LOG_DEBUG ) return;
#endif
/* String mit variablen Argumenten zusammenbauen ... */
#ifdef PROTOTYPES
va_start( ap, Format );
#else
@ -269,10 +269,11 @@ va_dcl
fflush( stderr );
}
if( snotice )
{
/* NOTICE an lokale User mit "s"-Mode */
Wall_ServerNotice( msg );
if (snotice) {
/* Send NOTICE to all local users with mode +s and to the
* local &SERVER channel */
Wall_ServerNotice(msg);
Channel_LogServer(msg);
}
} /* Log */