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_sprintfa(options, "-except ");
57 if (rec->regexp) g_string_sprintfa(options, "-regexp ");
58 if (rec->fullword) g_string_sprintfa(options, "-full ");
59 if (rec->replies) g_string_sprintfa(options, "-replies ");
60 if (options->len > 1) g_string_truncate(options, options->len-1);
62 printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP,
63 TXT_IGNORE_LINE, index,
64 key != NULL ? key : "",
65 levels != NULL ? levels : "", options->str);
66 g_string_free(options, TRUE);
71 static void cmd_ignore_show(void)
76 printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, TXT_IGNORE_HEADER);
78 for (tmp = ignores; tmp != NULL; tmp = tmp->next, index++) {
79 IGNORE_REC *rec = tmp->data;
81 ignore_print(index, rec);
83 printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, TXT_IGNORE_FOOTER);
86 /* SYNTAX: IGNORE [-regexp | -full] [-pattern <pattern>] [-except] [-replies]
87 [-channels <channel>] [-time <secs>] <mask> [<levels>]
88 IGNORE [-regexp | -full] [-pattern <pattern>] [-except] [-replies]
89 [-time <secs>] <channels> [<levels>] */
90 static void cmd_ignore(const char *data)
94 char *patternarg, *chanarg, *mask, *levels, *timestr;
104 if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTIONS | PARAM_FLAG_GETREST,
105 "ignore", &optlist, &mask, &levels))
108 patternarg = g_hash_table_lookup(optlist, "pattern");
109 chanarg = g_hash_table_lookup(optlist, "channels");
111 if (*mask == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
112 if (*levels == '\0') levels = "ALL";
114 if (active_win->active_server != NULL &&
115 active_win->active_server->ischannel(mask)) {
119 channels = (chanarg == NULL || *chanarg == '\0') ? NULL :
120 g_strsplit(replace_chars(chanarg, ',', ' '), " ", -1);
122 rec = ignore_find(NULL, mask, channels);
123 new_ignore = rec == NULL;
126 rec = g_new0(IGNORE_REC, 1);
128 rec->mask = mask == NULL || *mask == '\0' ||
129 strcmp(mask, "*") == 0 ? NULL : g_strdup(mask);
130 rec->channels = channels;
132 g_free_and_null(rec->pattern);
133 g_strfreev(channels);
136 rec->level = combine_level(rec->level, levels);
137 rec->pattern = (patternarg == NULL || *patternarg == '\0') ?
138 NULL : g_strdup(patternarg);
139 rec->exception = g_hash_table_lookup(optlist, "except") != NULL;
140 rec->regexp = g_hash_table_lookup(optlist, "regexp") != NULL;
141 rec->fullword = g_hash_table_lookup(optlist, "full") != NULL;
142 rec->replies = g_hash_table_lookup(optlist, "replies") != NULL;
143 timestr = g_hash_table_lookup(optlist, "time");
145 rec->unignore_time = time(NULL)+atoi(timestr);
147 if (rec->level == 0) {
148 printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_UNIGNORED,
149 rec->mask == NULL ? "*" : rec->mask);
155 ignore_update_rec(rec);
157 cmd_params_free(free_arg);
160 /* SYNTAX: UNIGNORE <id>|<mask> */
161 static void cmd_unignore(const char *data)
167 cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS);
169 if (is_numeric(data, ' ')) {
170 /* with index number */
171 tmp = g_slist_nth(ignores, atoi(data)-1);
172 rec = tmp == NULL ? NULL : tmp->data;
175 const char *chans[2] = { "*", NULL };
177 if (active_win->active_server != NULL &&
178 active_win->active_server->ischannel(data)) {
182 rec = ignore_find("*", data, (char **) chans);
187 ignore_update_rec(rec);
189 printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
190 TXT_IGNORE_NOT_FOUND, data);
194 static void sig_ignore_created(IGNORE_REC *rec)
198 key = ignore_get_key(rec);
199 levels = bits2level(rec->level);
200 printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
201 TXT_IGNORED, key, levels);
206 static void sig_ignore_destroyed(IGNORE_REC *rec)
210 key = ignore_get_key(rec);
211 printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_UNIGNORED, key);
215 void fe_ignore_init(void)
217 command_bind("ignore", NULL, (SIGNAL_FUNC) cmd_ignore);
218 command_bind("unignore", NULL, (SIGNAL_FUNC) cmd_unignore);
220 signal_add("ignore destroyed", (SIGNAL_FUNC) sig_ignore_destroyed);
221 signal_add("ignore created", (SIGNAL_FUNC) sig_ignore_created);
222 signal_add("ignore changed", (SIGNAL_FUNC) sig_ignore_created);
224 command_set_options("ignore", "regexp full except replies -time -pattern -channels");
227 void fe_ignore_deinit(void)
229 command_unbind("ignore", (SIGNAL_FUNC) cmd_ignore);
230 command_unbind("unignore", (SIGNAL_FUNC) cmd_unignore);
232 signal_remove("ignore destroyed", (SIGNAL_FUNC) sig_ignore_destroyed);
233 signal_remove("ignore created", (SIGNAL_FUNC) sig_ignore_created);
234 signal_remove("ignore changed", (SIGNAL_FUNC) sig_ignore_created);