]> arthur.barton.de Git - ngircd.git/commitdiff
Create local &SERVER channel and log server messages to it
authorAlexander Barton <alex@barton.de>
Mon, 17 Nov 2008 22:27:06 +0000 (23:27 +0100)
committerAlexander Barton <alex@barton.de>
Mon, 17 Nov 2008 22:27:06 +0000 (23:27 +0100)
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.

src/ngircd/channel.c
src/ngircd/channel.h
src/ngircd/log.c

index 7c3360acb088ebf4690f5796fa5287226473a961..609bbf5b5e976c19a30f2ba7e32103b482ee5cbb 100644 (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 )
 {
index 91cc278e2ffe773609fcc30ca6787ba5f6db6a8e..91d1e21de6e2bea2c1db75c8e09bef2edca09430 100644 (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] == '&')
 
 
index 5edbf368a53bfbc87b3b9e4e81c2d766610cd324..d450bd0a2ee543e58bd448c10c87f15e04b4beee 100644 (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 */