mirror of
https://github.com/osmarks/ngircd.git
synced 2024-12-12 09:50:29 +00:00
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:
parent
2cc21caf32
commit
0eda085f1e
@ -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 )
|
||||
{
|
||||
|
@ -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] == '&')
|
||||
|
||||
|
||||
|
@ -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 */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user