+static int
+nickserv_ignore(struct userNode *user, struct handle_info *hi, const char *mask)
+{
+ unsigned int i;
+ struct userNode *target;
+ char *new_mask = pretty_mask(strdup(mask));
+ for (i=0; i<hi->ignores->used; i++) {
+ if (!irccasecmp(new_mask, hi->ignores->list[i])) {
+ send_message(user, nickserv, "NSMSG_ADDIGNORE_ALREADY", new_mask);
+/* free(new_mask); i hate glibc */
+ return 0;
+ }
+ }
+ string_list_append(hi->ignores, new_mask);
+ send_message(user, nickserv, "NSMSG_ADDIGNORE_SUCCESS", new_mask);
+
+ for (target = hi->users; target; target = target->next_authed) {
+ irc_silence(target, new_mask, 1);
+ }
+ return 1;
+}
+
+static NICKSERV_FUNC(cmd_addignore)
+{
+ NICKSERV_MIN_PARMS(2);
+
+ return nickserv_ignore(user, user->handle_info, argv[1]);
+}
+
+static NICKSERV_FUNC(cmd_oaddignore)
+{
+ struct handle_info *hi;
+
+ NICKSERV_MIN_PARMS(3);
+ if (!(hi = get_victim_oper(user, argv[1])))
+ return 0;
+
+ return nickserv_ignore(user, hi, argv[2]);
+}
+
+static int
+nickserv_delignore(struct userNode *user, struct handle_info *hi, const char *del_mask)
+{
+ unsigned int i;
+ struct userNode *target;
+ char *dmask = pretty_mask(strdup(del_mask));
+ for (i=0; i<hi->ignores->used; i++) {
+ if (!strcmp(dmask, hi->ignores->list[i])) {
+ char *old_mask = hi->ignores->list[i];
+ hi->ignores->list[i] = hi->ignores->list[--hi->ignores->used];
+ send_message(user, nickserv, "NSMSG_DELMASK_SUCCESS", old_mask);
+ for (target = hi->users; target; target = target->next_authed) {
+ irc_silence(user, old_mask, 0);
+ }
+/* free(old_mask); i hate glibc */
+ return 1;
+ }
+ }
+ send_message(user, nickserv, "NSMSG_DELMASK_NOT_FOUND");
+ return 0;
+}
+
+static NICKSERV_FUNC(cmd_delignore)
+{
+ NICKSERV_MIN_PARMS(2);
+ return nickserv_delignore(user, user->handle_info, argv[1]);
+}
+
+static NICKSERV_FUNC(cmd_odelignore)
+{
+ struct handle_info *hi;
+ NICKSERV_MIN_PARMS(3);
+ if (!(hi = get_victim_oper(user, argv[1])))
+ return 0;
+ return nickserv_delignore(user, hi, argv[2]);
+}
+