DelChannelUser call and semantic fixups
[srvx.git] / src / proto-common.c
index 6ddd23f4a7b1bb6e5f29d9bd65ad1888658b78c7..a8b2888a14bfd4d1dc096ce1b5bb593bed20d3f8 100644 (file)
@@ -464,10 +464,30 @@ privmsg_invalid(char *name, void *data)
     irc_numeric(pd->user, ERR_NOSUCHNICK, "%s@%s :No such nick", name, self->name);
 }
 
+struct part_desc {
+    struct userNode *user;
+    const char *text;
+};
+
 static void
 part_helper(struct chanNode *cn, void *data)
 {
-    DelChannelUser(data, cn, false, 0);
+    struct part_desc *desc = data;
+    DelChannelUser(desc->user, cn, desc->text, false);
+}
+
+static CMD_FUNC(cmd_part)
+{
+    struct part_desc desc;
+
+    if (argc < 2)
+        return 0;
+    desc.user = GetUserH(origin);
+    if (!desc.user)
+        return 0;
+    desc.text = (argc > 2) ? argv[argc - 1] : NULL;
+    parse_foreach(argv[1], part_helper, NULL, NULL, NULL, &desc);
+    return 1;
 }
 
 void
@@ -694,8 +714,9 @@ generate_hostmask(struct userNode *user, int options)
     } else if (IsHiddenHost(user) && user->handle_info && hidden_host_suffix && !(options & GENMASK_NO_HIDING)) {
         hostname = alloca(strlen(user->handle_info->handle) + strlen(hidden_host_suffix) + 2);
         sprintf(hostname, "%s.%s", user->handle_info->handle, hidden_host_suffix);
-    } else if (options & GENMASK_STRICT_HOST && options & GENMASK_BYIP) {
-        hostname = (char*)irc_ntoa(&user->ip);
+    } else if (options & GENMASK_STRICT_HOST) {
+        if (options & GENMASK_BYIP)
+            hostname = (char*)irc_ntoa(&user->ip);
     } else if ((options & GENMASK_BYIP) || irc_pton(&ip, NULL, hostname)) {
         /* Should generate an IP-based hostmask. */
         hostname = alloca(IRC_NTOP_MAX_SIZE);