Added SILC Thread Queue API
[crypto.git] / apps / irssi / src / core / ignore.c
index 69460c5b359694fcf9823ccf4f27ee3069bc666d..99986dd27ce979c488d97b63dd873a85a5cab8ba 100644 (file)
@@ -161,9 +161,8 @@ int ignore_check(SERVER_REC *server, const char *nick, const char *host,
        g_return_val_if_fail(server != NULL, 0);
         if (nick == NULL) nick = "";
 
-       chanrec = (channel != NULL && server != NULL &&
-                  server->ischannel(channel)) ?
-               channel_find(server, channel) : NULL;
+       chanrec = server == NULL || channel == NULL ? NULL :
+               channel_find(server, channel);
        if (chanrec != NULL && nick != NULL &&
            (nickrec = nicklist_find(chanrec, nick)) != NULL) {
                 /* nick found - check only ignores in nickmatch cache */
@@ -265,7 +264,7 @@ static void ignore_set_config(IGNORE_REC *rec)
        CONFIG_NODE *node;
        char *levelstr;
 
-       if (rec->level == 0 || rec->unignore_time > 0)
+       if (rec->level == 0)
                return;
 
        node = iconfig_node_traverse("(ignores", TRUE);
@@ -282,6 +281,9 @@ static void ignore_set_config(IGNORE_REC *rec)
        if (rec->regexp) iconfig_node_set_bool(node, "regexp", TRUE);
        if (rec->fullword) iconfig_node_set_bool(node, "fullword", TRUE);
        if (rec->replies) iconfig_node_set_bool(node, "replies", TRUE);
+       if (rec->unignore_time != 0)
+               iconfig_node_set_int(node, "unignore_time", rec->unignore_time);
+       iconfig_node_set_str(node, "servertag", rec->servertag);
 
        if (rec->channels != NULL && *rec->channels != NULL) {
                node = config_node_section(node, "channels", NODE_TYPE_LIST);
@@ -298,9 +300,6 @@ static int ignore_index(IGNORE_REC *find)
        for (tmp = ignores; tmp != NULL; tmp = tmp->next) {
                IGNORE_REC *rec = tmp->data;
 
-               if (rec->servertag != NULL)
-                       continue;
-
                if (rec == find)
                        return index;
                index++;
@@ -317,18 +316,25 @@ static void ignore_remove_config(IGNORE_REC *rec)
        if (node != NULL) iconfig_node_list_remove(node, ignore_index(rec));
 }
 
-void ignore_add_rec(IGNORE_REC *rec)
+static void ignore_init_rec(IGNORE_REC *rec)
 {
 #ifdef HAVE_REGEX_H
+       if (rec->regexp_compiled) regfree(&rec->preg);
        rec->regexp_compiled = !rec->regexp || rec->pattern == NULL ? FALSE :
                regcomp(&rec->preg, rec->pattern,
                        REG_EXTENDED|REG_ICASE|REG_NOSUB) == 0;
 #endif
+}
+
+void ignore_add_rec(IGNORE_REC *rec)
+{
+       ignore_init_rec(rec);
 
        ignores = g_slist_append(ignores, rec);
        ignore_set_config(rec);
 
        signal_emit("ignore created", 1, rec);
+       nickmatch_rebuild(nickmatch);
 }
 
 static void ignore_destroy(IGNORE_REC *rec, int send_signal)
@@ -363,6 +369,7 @@ void ignore_update_rec(IGNORE_REC *rec)
                ignores = g_slist_append(ignores, rec);
                ignore_set_config(rec);
 
+                ignore_init_rec(rec);
                signal_emit("ignore changed", 1, rec);
                nickmatch_rebuild(nickmatch);
        }
@@ -402,7 +409,8 @@ static void read_ignores(void)
                return;
        }
 
-       for (tmp = node->value; tmp != NULL; tmp = tmp->next) {
+       tmp = config_node_first(node->value);
+       for (; tmp != NULL; tmp = config_node_next(tmp)) {
                node = tmp->data;
 
                if (node->type != NODE_TYPE_BLOCK)
@@ -412,25 +420,19 @@ static void read_ignores(void)
                ignores = g_slist_append(ignores, rec);
 
                rec->mask = g_strdup(config_node_get_str(node, "mask", NULL));
-               if (rec->mask != NULL && strcmp(rec->mask, "*") == 0) {
-                       /* FIXME: remove after .98 */
-                        g_free(rec->mask);
-                       rec->mask = NULL;
-               }
                rec->pattern = g_strdup(config_node_get_str(node, "pattern", NULL));
                rec->level = level2bits(config_node_get_str(node, "level", ""));
                 rec->exception = config_node_get_bool(node, "exception", FALSE);
-               if (*config_node_get_str(node, "except_level", "") != '\0') {
-                       /* FIXME: remove after .98 */
-                       rec->level = level2bits(config_node_get_str(node, "except_level", ""));
-                        rec->exception = TRUE;
-               }
                rec->regexp = config_node_get_bool(node, "regexp", FALSE);
                rec->fullword = config_node_get_bool(node, "fullword", FALSE);
                rec->replies = config_node_get_bool(node, "replies", FALSE);
+               rec->unignore_time = config_node_get_int(node, "unignore_time", 0);
+               rec->servertag = g_strdup(config_node_get_str(node, "servertag", 0));
 
                node = config_node_section(node, "channels", -1);
                if (node != NULL) rec->channels = config_node_get_list(node);
+
+               ignore_init_rec(rec);
        }
 
        nickmatch_rebuild(nickmatch);