]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/irc.c
IRC_HELP(): Code cleanup
[ngircd-alex.git] / src / ngircd / irc.c
index efc34d4b2e087f8e3742c1d44ea6a820e2073f92..1a0d725f92eca1069805e04bc8865d0f6b0cbecc 100644 (file)
@@ -25,6 +25,7 @@
 #include "conn-func.h"
 #include "conf.h"
 #include "channel.h"
+#include "conn-encoding.h"
 #include "defines.h"
 #include "irc-write.h"
 #include "log.h"
@@ -303,25 +304,35 @@ IRC_TRACE( CLIENT *Client, REQUEST *Req )
 } /* IRC_TRACE */
 
 
+/**
+ * Handler for the IRC "HELP" command.
+ *
+ * @param Client The client from which this command has been received.
+ * @param Req Request structure with prefix and all parameters.
+ * @return CONNECTED or DISCONNECTED.
+ */
 GLOBAL bool
-IRC_HELP( CLIENT *Client, REQUEST *Req )
+IRC_HELP(CLIENT *Client, REQUEST *Req)
 {
        COMMAND *cmd;
 
-       assert( Client != NULL );
-       assert( Req != NULL );
+       assert(Client != NULL);
+       assert(Req != NULL);
 
        /* Bad number of arguments? */
-       if( Req->argc > 0 ) return IRC_WriteStrClient( Client, ERR_NORECIPIENT_MSG, Client_ID( Client ), Req->command );
+       if (Req->argc > 0)
+               return IRC_WriteStrClient(Client, ERR_NORECIPIENT_MSG,
+                                         Client_ID(Client), Req->command);
 
-       cmd = Parse_GetCommandStruct( );
-       while( cmd->name )
-       {
-               if( ! IRC_WriteStrClient( Client, "NOTICE %s :%s", Client_ID( Client ), cmd->name )) return DISCONNECTED;
+       cmd = Parse_GetCommandStruct();
+       while(cmd->name) {
+               if (!IRC_WriteStrClient(Client, "NOTICE %s :%s",
+                                       Client_ID(Client), cmd->name))
+                       return DISCONNECTED;
                cmd++;
        }
-       
-       IRC_SetPenalty( Client, 2 );
+
+       IRC_SetPenalty(Client, 2);
        return CONNECTED;
 } /* IRC_HELP */
 
@@ -359,6 +370,7 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
        CHANNEL *chan;
        char *currentTarget = Req->argv[0];
        char *lastCurrentTarget = NULL;
+       char *message = NULL;
 
        assert(Client != NULL);
        assert(Req != NULL);
@@ -390,6 +402,13 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
                return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
                                          Client_ID(Client), Req->prefix);
 
+#ifdef ICONV
+       if (Client_Conn(Client) > NONE)
+               message = Conn_EncodingFrom(Client_Conn(Client), Req->argv[1]);
+       else
+#endif
+               message = Req->argv[1];
+
        /* handle msgtarget = msgto *("," msgto) */
        currentTarget = strtok_r(currentTarget, ",", &lastCurrentTarget);
        ngt_UpperStr(Req->command);
@@ -448,7 +467,7 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
                                if (nick != NULL && host != NULL) {
                                        if (strcasecmp(nick, Client_ID(cl)) == 0 &&
                                            strcasecmp(user, Client_User(cl)) == 0 &&
-                                           strcasecmp(host, Client_HostnameCloaked(cl)) == 0)
+                                           strcasecmp(host, Client_HostnameDisplayed(cl)) == 0)
                                                break;
                                        else
                                                continue;
@@ -456,7 +475,7 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
                                if (strcasecmp(user, Client_User(cl)) != 0)
                                        continue;
                                if (host != NULL && strcasecmp(host,
-                                               Client_HostnameCloaked(cl)) != 0)
+                                               Client_HostnameDisplayed(cl)) != 0)
                                        continue;
                                if (server != NULL && strcasecmp(server,
                                                Client_ID(Client_Introducer(cl))) != 0)
@@ -491,6 +510,17 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
                                Req->command = "PRIVMSG";
                        }
 #endif
+                       if (Client_HasMode(cl, 'b') &&
+                           !Client_HasMode(from, 'R') &&
+                           !Client_HasMode(from, 'o') &&
+                           !(Client_Type(from) == CLIENT_SERVER) &&
+                           !(Client_Type(from) == CLIENT_SERVICE)) {
+                               if (SendErrors && !IRC_WriteStrClient(from,
+                                               ERR_NONONREG_MSG,
+                                               Client_ID(from), Client_ID(cl)))
+                                       return DISCONNECTED;
+                               goto send_next_target;
+                       }
 
                        if (Client_HasMode(cl, 'C')) {
                                cl2chan = Channel_FirstChannelOf(cl);
@@ -523,12 +553,12 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
                        }
                        if (!IRC_WriteStrClientPrefix(cl, from, "%s %s :%s",
                                                      Req->command, Client_ID(cl),
-                                                     Req->argv[1]))
+                                                     message))
                                return DISCONNECTED;
                } else if (ForceType != CLIENT_SERVICE
                           && (chan = Channel_Search(currentTarget))) {
                        if (!Channel_Write(chan, from, Client, Req->command,
-                                          SendErrors, Req->argv[1]))
+                                          SendErrors, message))
                                        return DISCONNECTED;
                } else if (ForceType != CLIENT_SERVICE
                        /* $#: server/target mask, RFC 2812, sec. 3.3.1 */
@@ -536,7 +566,7 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
                           && strchr(currentTarget, '.')) {
                        /* targetmask */
                        if (!Send_Message_Mask(from, Req->command, currentTarget,
-                                              Req->argv[1], SendErrors))
+                                              message, SendErrors))
                                return DISCONNECTED;
                } else {
                        if (!SendErrors)