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 */
if (strlen(Name) <= 1)
return false;
#endif
- if (strchr("+#", Name[0]) == NULL)
+ if (strchr("#&+", Name[0]) == NULL)
return false;
if (strlen(Name) >= CHANNEL_NAME_LEN)
return false;
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'))
assert( Origin != NULL );
assert( Reason != NULL );
+ /* Do not inform other servers if the channel is local to this server,
+ * regardless of what the caller requested! */
+ if(InformServer)
+ InformServer = !Channel_IsLocal(Chan);
+
last_cl2chan = NULL;
cl2chan = My_Cl2Chan;
while( cl2chan )
switch( Type )
{
case REMOVE_QUIT:
- /* QUIT: other servers have already been notified, see Client_Destroy();
- * so only inform other clients in same channel. */
+ /* QUIT: other servers have already been notified,
+ * see Client_Destroy(); so only inform other clients
+ * in same channel. */
assert( InformServer == false );
LogDebug("User \"%s\" left channel \"%s\" (%s).",
Client_Mask( Client ), c->name, Reason );
break;
case REMOVE_KICK:
- /* User was KICKed: inform other servers and all users in channel */
+ /* User was KICKed: inform other servers (public
+ * channels) and all users in the channel */
if( InformServer )
IRC_WriteStrServersPrefix( Client_NextHop( Origin ),
Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason);
}
+/**
+ * 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 )
{
return true;
} /* Delete_Channel */
-
/* -eof- */