+/** Send a (prefixed) command to all users on this channel, except for
+ * \a one and those matching \a skip.
+ * @warning \a pattern must not contain %v.
+ * @param[in] from Client originating the command.
+ * @param[in] cmd Long name of command.
+ * @param[in] tok Short name of command.
+ * @param[in] to Destination channel.
+ * @param[in] one Client direction to skip (or NULL).
+ * @param[in] skip Bitmask of SKIP_NONOPS, SKIP_NONVOICES, SKIP_DEAF, SKIP_BURST.
+ * @param[in] pattern Format string for command arguments.
+ */
+void sendcmdto_channel_butone(struct Client *from, const char *cmd,
+ const char *tok, struct Channel *to,
+ struct Client *one, unsigned int skip,
+ const char *pattern, ...)
+{
+ struct Membership *member;
+ struct VarData vd;
+ struct MsgBuf *user_mb;
+ struct MsgBuf *serv_mb;
+
+ vd.vd_format = pattern;
+
+ /* Build buffer to send to users */
+ va_start(vd.vd_args, pattern);
+ user_mb = msgq_make(0, skip & (SKIP_NONOPS | SKIP_NONVOICES) ? "%:#C %s @%v" : "%:#C %s %v",
+ from, skip & (SKIP_NONOPS | SKIP_NONVOICES) ? MSG_NOTICE : cmd, &vd);
+ va_end(vd.vd_args);
+
+ /* Build buffer to send to servers */
+ va_start(vd.vd_args, pattern);
+ serv_mb = msgq_make(&me, "%C %s %v", from, tok, &vd);
+ va_end(vd.vd_args);
+
+ /* send buffer along! */
+ bump_sentalong(one);
+ for (member = to->members; member; member = member->next_member) {
+ /* skip one, zombies, and deaf users... */
+ if (IsZombie(member) ||
+ (skip & SKIP_DEAF && IsDeaf(member->user)) ||
+ (skip & SKIP_NONOPS && !IsChanOp(member)) ||
+ (skip & SKIP_NONVOICES && !IsChanOp(member) && !HasVoice(member)) ||
+ (skip & SKIP_BURST && IsBurstOrBurstAck(cli_from(member->user))) ||
+ cli_fd(cli_from(member->user)) < 0 ||
+ cli_sentalong(member->user) == sentalong_marker)
+ continue;
+ cli_sentalong(member->user) = sentalong_marker;