4 Copyright (C) 1999-2000 Timo Sirainen
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "module-formats.h"
30 #include "printtext.h"
32 static char *ignore_get_key(IGNORE_REC *rec)
36 if (rec->channels == NULL)
37 return g_strdup(rec->mask != NULL ? rec->mask : "*" );
39 chans = g_strjoinv(",", rec->channels);
40 if (rec->mask == NULL) return chans;
42 ret = g_strdup_printf("%s %s", rec->mask, chans);
47 static void ignore_print(int index, IGNORE_REC *rec)
52 key = ignore_get_key(rec);
53 levels = bits2level(rec->level);
55 options = g_string_new(NULL);
56 if (rec->exception) g_string_append(options, "-except ");
58 g_string_append(options, "-regexp ");
60 if (!rec->regexp_compiled)
61 g_string_append(options, "[INVALID!] ");
64 if (rec->fullword) g_string_append(options, "-full ");
65 if (rec->replies) g_string_append(options, "-replies ");
66 if (rec->pattern != NULL)
67 g_string_sprintfa(options, "-pattern %s ", rec->pattern);
69 if (options->len > 1) g_string_truncate(options, options->len-1);
72 printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP,
73 TXT_IGNORE_LINE, index, key != NULL ? key : "",
74 levels != NULL ? levels : "", options->str);
76 printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP,
77 options->len > 0 ? TXT_IGNORED_OPTIONS : TXT_IGNORED,
78 key != NULL ? key : "",
79 levels != NULL ? levels : "", options->str);
81 g_string_free(options, TRUE);
86 static void cmd_ignore_show(void)
91 if (ignores == NULL) {
92 printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP,
93 TXT_IGNORE_NO_IGNORES);
97 printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, TXT_IGNORE_HEADER);
99 for (tmp = ignores; tmp != NULL; tmp = tmp->next, index++) {
100 IGNORE_REC *rec = tmp->data;
102 ignore_print(index, rec);
104 printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, TXT_IGNORE_FOOTER);
107 /* SYNTAX: IGNORE [-regexp | -full] [-pattern <pattern>] [-except] [-replies]
108 [-channels <channel>] [-time <secs>] <mask> [<levels>]
109 IGNORE [-regexp | -full] [-pattern <pattern>] [-except] [-replies]
110 [-time <secs>] <channels> [<levels>] */
111 static void cmd_ignore(const char *data)
115 char *patternarg, *chanarg, *mask, *levels, *timestr;
125 if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTIONS | PARAM_FLAG_GETREST,
126 "ignore", &optlist, &mask, &levels))
129 patternarg = g_hash_table_lookup(optlist, "pattern");
130 chanarg = g_hash_table_lookup(optlist, "channels");
132 if (*mask == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
133 if (*levels == '\0') levels = "ALL";
135 if (active_win->active_server != NULL &&
136 server_ischannel(active_win->active_server, mask)) {
140 channels = (chanarg == NULL || *chanarg == '\0') ? NULL :
141 g_strsplit(replace_chars(chanarg, ',', ' '), " ", -1);
143 rec = patternarg != NULL ? NULL: ignore_find(NULL, mask, channels);
144 new_ignore = rec == NULL;
147 rec = g_new0(IGNORE_REC, 1);
149 rec->mask = mask == NULL || *mask == '\0' ||
150 strcmp(mask, "*") == 0 ? NULL : g_strdup(mask);
151 rec->channels = channels;
153 g_free_and_null(rec->pattern);
154 g_strfreev(channels);
157 rec->level = combine_level(rec->level, levels);
159 if (new_ignore && rec->level == 0) {
160 /* tried to unignore levels from nonexisting ignore */
161 printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
162 TXT_IGNORE_NOT_FOUND, rec->mask);
164 g_strfreev(rec->channels);
166 cmd_params_free(free_arg);
170 rec->pattern = (patternarg == NULL || *patternarg == '\0') ?
171 NULL : g_strdup(patternarg);
172 rec->exception = g_hash_table_lookup(optlist, "except") != NULL;
173 rec->regexp = g_hash_table_lookup(optlist, "regexp") != NULL;
174 rec->fullword = g_hash_table_lookup(optlist, "full") != NULL;
175 rec->replies = g_hash_table_lookup(optlist, "replies") != NULL;
176 timestr = g_hash_table_lookup(optlist, "time");
178 rec->unignore_time = time(NULL)+atoi(timestr);
183 ignore_update_rec(rec);
185 cmd_params_free(free_arg);
188 /* SYNTAX: UNIGNORE <id>|<mask> */
189 static void cmd_unignore(const char *data)
196 if (!cmd_get_params(data, &free_arg, 1, &mask))
200 cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS);
202 if (is_numeric(mask, ' ')) {
203 /* with index number */
204 tmp = g_slist_nth(ignores, atoi(mask)-1);
205 rec = tmp == NULL ? NULL : tmp->data;
208 const char *chans[2] = { "*", NULL };
210 if (active_win->active_server != NULL &&
211 server_ischannel(active_win->active_server, mask)) {
215 rec = ignore_find("*", mask, (char **) chans);
220 ignore_update_rec(rec);
222 printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
223 TXT_IGNORE_NOT_FOUND, mask);
225 cmd_params_free(free_arg);
228 static void sig_ignore_created(IGNORE_REC *rec)
230 ignore_print(-1, rec);
233 static void sig_ignore_destroyed(IGNORE_REC *rec)
237 key = ignore_get_key(rec);
238 printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_UNIGNORED, key);
242 void fe_ignore_init(void)
244 command_bind("ignore", NULL, (SIGNAL_FUNC) cmd_ignore);
245 command_bind("unignore", NULL, (SIGNAL_FUNC) cmd_unignore);
247 signal_add("ignore destroyed", (SIGNAL_FUNC) sig_ignore_destroyed);
248 signal_add("ignore created", (SIGNAL_FUNC) sig_ignore_created);
249 signal_add("ignore changed", (SIGNAL_FUNC) sig_ignore_created);
251 command_set_options("ignore", "regexp full except replies -time -pattern -channels");
254 void fe_ignore_deinit(void)
256 command_unbind("ignore", (SIGNAL_FUNC) cmd_ignore);
257 command_unbind("unignore", (SIGNAL_FUNC) cmd_unignore);
259 signal_remove("ignore destroyed", (SIGNAL_FUNC) sig_ignore_destroyed);
260 signal_remove("ignore created", (SIGNAL_FUNC) sig_ignore_created);
261 signal_remove("ignore changed", (SIGNAL_FUNC) sig_ignore_created);