private void message(String user_name, CommandArgsIterator args_it)
            throws IOException
    {
        if (args_it.hasNext()) {
            String dest    = args_it.next();
            String message = args_it.remainder();
            
            if (dest.length() >= 1 && !message.isEmpty()) {
                if (dest.charAt(0) == '#') { // Message sur un salon
                    String chan_name = dest.substring(1);
                    if (!chan_name.isEmpty()) {
                        Chan chan;
                        synchronized (this._chans) {
                            chan = this._chans.get(chan_name);
                        }
                        
                        if (chan != null) {
                            this.traceEvent("Message sur #" + chan_name);
                            chan.sendMessage(user_name, message);
                            this.ack();
                        } else
                            this.writeCommand(Errors.ChanNotJoined);
                    } else
                        this.syntaxError();
                } else { // Message privé 
                    Map<String, Client> users = this._server.getUsers();
                    Boolean success; // Pour envoyer le feedback hors du lock
                    synchronized (users) {
                        Client dest_user = users.get(dest);
                        if (users.containsKey(dest)) {
                            dest_user.sendMessage(user_name, message);
                            success = true;
                        } else
                            success = false;
                    }
                    
                    if (success) {
                        this.traceEvent("Message à " + dest);
                        this.ack();
                    } else
                        this.writeCommand(Errors.UnknownUsername);
                }
            } else 
                this.syntaxError();
        } else {
            this.syntaxError();
        }
    }