+
+ chan = Channel_Search(channame);
+ assert(chan != NULL);
+
+ if (is_owner)
+ Channel_UserModeAdd(chan, c, 'q');
+ if (is_chanadmin)
+ Channel_UserModeAdd(chan, c, 'a');
+ if (is_op)
+ Channel_UserModeAdd(chan, c, 'o');
+ if (is_halfop)
+ Channel_UserModeAdd(chan, c, 'h');
+ if (is_voiced)
+ Channel_UserModeAdd(chan, c, 'v');
+
+ /* Announce client to the channel */
+ IRC_WriteStrChannelPrefix(Client, chan, c, false,
+ "JOIN :%s", channame);
+
+ /* Announce "channel user modes" to the channel, if any */
+ strlcpy(modes, Channel_UserModes(chan, c), sizeof(modes));
+ if (modes[0])
+ IRC_WriteStrChannelPrefix(Client, chan, Client, false,
+ "MODE %s +%s %s", channame,
+ modes, Client_ID(c));
+
+ /* Build nick list for forwarding command */
+ if (nick_out[0] != '\0')
+ strlcat(nick_out, ",", sizeof(nick_out));
+ if (is_owner)
+ strlcat(nick_out, "~", sizeof(nick_out));
+ if (is_chanadmin)
+ strlcat(nick_out, "&", sizeof(nick_out));
+ if (is_op)
+ strlcat(nick_out, "@", sizeof(nick_out));
+ if (is_halfop)
+ strlcat(nick_out, "%", sizeof(nick_out));
+ if (is_voiced)
+ strlcat(nick_out, "+", sizeof(nick_out));
+ strlcat(nick_out, ptr, sizeof(nick_out));
+
+ skip_njoin:
+ /* Get next nick, if any ... */
+ ptr = strtok(NULL, ",");