static void read_ignores(void) { IGNORE_REC *rec; CONFIG_NODE *node; GSList *tmp; while (ignores != NULL) ignore_destroy(ignores->data); node = iconfig_node_traverse("ignores", FALSE); if (node == NULL) return; for (tmp = node->value; tmp != NULL; tmp = tmp->next) { node = tmp->data; if (node->type != NODE_TYPE_BLOCK) continue; rec = g_new0(IGNORE_REC, 1); ignores = g_slist_append(ignores, rec); rec->mask = g_strdup(config_node_get_str(node, "mask", NULL)); rec->pattern = g_strdup(config_node_get_str(node, "pattern", NULL)); rec->level = level2bits(config_node_get_str(node, "level", "")); rec->except_level = level2bits(config_node_get_str(node, "except_level", "")); 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); node = config_node_section(node, "channels", -1); if (node != NULL) rec->channels = config_node_get_list(node); } }
/* SYNTAX: LOG OPEN [-noopen] [-autoopen] [-window] [-<server tag>] [-targets <targets>] [-colors] <fname> [<levels>] */ static void cmd_log_open(const char *data) { SERVER_REC *server; GHashTable *optlist; char *targetarg, *fname, *levels, *servertag; void *free_arg; char window[MAX_INT_STRLEN]; LOG_REC *log; int level; if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST | PARAM_FLAG_UNKNOWN_OPTIONS | PARAM_FLAG_OPTIONS, "log open", &optlist, &fname, &levels)) return; if (*fname == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); level = level2bits(levels); log = log_create_rec(fname, level != 0 ? level : MSGLEVEL_ALL); /* -<server tag> */ server = cmd_options_get_server("log open", optlist, NULL); servertag = server == NULL ? NULL : server->tag; if (g_hash_table_lookup(optlist, "window")) { /* log by window ref# */ targetarg = g_hash_table_lookup(optlist, "targets"); if (targetarg == NULL || !is_numeric(targetarg, '\0')) { ltoa(window, active_win->refnum); targetarg = window; } log_item_add(log, LOG_ITEM_WINDOW_REFNUM, targetarg, servertag); } else { targetarg = g_hash_table_lookup(optlist, "targets"); if (targetarg != NULL && *targetarg != '\0') log_add_targets(log, targetarg, servertag); else if (servertag != NULL) log_add_targets(log, "*", servertag); } if (g_hash_table_lookup(optlist, "autoopen")) log->autoopen = TRUE; if (g_hash_table_lookup(optlist, "colors") == NULL) log->colorizer = log_colorizer_strip; log_update(log); if (log->handle == -1 && g_hash_table_lookup(optlist, "noopen") == NULL) { /* start logging */ if (log_start_logging(log)) { printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_LOG_OPENED, fname); } else { log_close(log); } } cmd_params_free(free_arg); }
void windows_layout_restore(void) { WINDOW_REC *window; CONFIG_NODE *node; GSList *tmp; node = iconfig_node_traverse("windows", FALSE); if (node == NULL) return; for (tmp = node->value; tmp != NULL; tmp = tmp->next) { CONFIG_NODE *node = tmp->data; window = window_create(NULL, TRUE); window_set_refnum(window, atoi(node->key)); window->sticky_refnum = config_node_get_bool(node, "sticky_refnum", FALSE); window_set_name(window, config_node_get_str(node, "name", NULL)); window_set_level(window, level2bits(config_node_get_str(node, "level", ""))); window->servertag = g_strdup(config_node_get_str(node, "servertag", NULL)); window->theme_name = g_strdup(config_node_get_str(node, "theme", NULL)); if (window->theme_name != NULL) window->theme = theme_load(window->theme_name); window_add_items(window, config_node_section(node, "items", -1)); signal_emit("window restore", 2, window, node); } signal_emit("windows restored", 0); }
static void awaylog_open(void) { const char *fname, *levelstr; LOG_REC *log; int level; fname = settings_get_str("awaylog_file"); levelstr = settings_get_str("awaylog_level"); if (*fname == '\0' || *levelstr == '\0') return; level = level2bits(levelstr); if (level == 0) return; log = log_find(fname); if (log != NULL && log->handle != -1) return; /* already open */ if (log == NULL) { log = log_create_rec(fname, level); log->temp = TRUE; log_update(log); } if (!log_start_logging(log)) { /* creating log file failed? close it. */ log_close(log); return; } awaylog = log; away_filepos = lseek(log->handle, 0, SEEK_CUR); away_msgs = 0; }
/* SYNTAX: ECHO [-current] [-window <name>] [-level <level>] <text> */ static void cmd_echo(const char *data, void *server, WI_ITEM_REC *item) { WINDOW_REC *window; GHashTable *optlist; char *msg, *levelstr, *winname; void *free_arg; int level; g_return_if_fail(data != NULL); if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS | PARAM_FLAG_GETREST, "echo", &optlist, &msg)) return; levelstr = g_hash_table_lookup(optlist, "level"); level = levelstr == NULL ? 0 : level2bits(g_hash_table_lookup(optlist, "level"), NULL); if (level == 0) level = MSGLEVEL_CRAP; winname = g_hash_table_lookup(optlist, "window"); window = winname == NULL ? NULL : is_numeric(winname, '\0') ? window_find_refnum(atoi(winname)) : window_find_item(NULL, winname); if (window == NULL) window = active_win; printtext_window(window, level, "%s", msg); cmd_params_free(free_arg); }
static void sig_layout_restore(void) { WINDOW_REC *window; CONFIG_NODE *node; GSList *tmp; node = iconfig_node_traverse("windows", FALSE); if (node == NULL) return; tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) { CONFIG_NODE *node = tmp->data; window = window_find_refnum(atoi(node->key)); if (window == NULL) window = window_create(NULL, TRUE); window_set_refnum(window, atoi(node->key)); window->sticky_refnum = config_node_get_bool(node, "sticky_refnum", FALSE); window->immortal = config_node_get_bool(node, "immortal", FALSE); window_set_name(window, config_node_get_str(node, "name", NULL)); window_set_history(window, config_node_get_str(node, "history_name", NULL)); window_set_level(window, level2bits(config_node_get_str(node, "level", ""))); window->servertag = g_strdup(config_node_get_str(node, "servertag", NULL)); window->theme_name = g_strdup(config_node_get_str(node, "theme", NULL)); if (window->theme_name != NULL) window->theme = theme_load(window->theme_name); window_add_items(window, config_node_section(node, "items", -1)); signal_emit("layout restore window", 2, window, node); } }
int settings_get_level(const char *key) { const char *str; str = settings_get_str_type(key, SETTING_TYPE_LEVEL); return str == NULL ? 0 : level2bits(str, NULL); }
static void read_settings(void) { int level; level = level2bits(settings_get_str("autocreate_query_level")); autocreate_dccquery = (level & MSGLEVEL_DCCMSGS) != 0; }
static void read_settings(void) { const char *targets; if (hide_targets != NULL) g_strfreev(hide_targets); targets = settings_get_str("activity_hide_targets"); hide_targets = *targets == '\0' ? NULL : g_strsplit(targets, " ", -1); hide_level = MSGLEVEL_NEVER | MSGLEVEL_NO_ACT | level2bits(settings_get_str("activity_hide_level")); msg_level = level2bits(settings_get_str("activity_msg_level")); hilight_level = MSGLEVEL_HILIGHT | level2bits(settings_get_str("activity_hilight_level")); }
static void sig_flood(IRC_SERVER_REC *server, const char *nick, const char *host, gpointer levelp) { int level, check_level; level = GPOINTER_TO_INT(levelp); check_level = level2bits(settings_get_str("autoignore_levels")); if (level & check_level) autoignore_add(server, nick, level); }
static void read_settings(void) { int old_autolog = autolog_level; autolog_path = settings_get_str("autolog_path"); autolog_level = !settings_get_bool("autolog") ? 0 : level2bits(settings_get_str("autolog_level")); if (old_autolog && !autolog_level) autologs_close_all(); }
gboolean settings_set_level(const char *key, const char *value) { int iserror; (void)level2bits(value, &iserror); if (iserror) return FALSE; iconfig_node_set_str(settings_get_node(key), key, value); return TRUE; }
static void read_settings(void) { querycreate_level = level2bits(settings_get_str("autocreate_query_level")); query_auto_close = settings_get_int("autoclose_query"); if (query_auto_close > 0 && queryclose_tag == -1) queryclose_tag = g_timeout_add(5000, (GSourceFunc) sig_query_autoclose, NULL); else if (query_auto_close <= 0 && queryclose_tag != -1) { g_source_remove(queryclose_tag); queryclose_tag = -1; } }
static void log_read_config(void) { CONFIG_NODE *node; LOG_REC *log; GSList *tmp, *next, *fnames; /* close old logs, save list of open logs */ fnames = NULL; for (tmp = logs; tmp != NULL; tmp = next) { log = tmp->data; next = tmp->next; if (log->temp) continue; if (log->handle != -1) fnames = g_slist_append(fnames, g_strdup(log->fname)); log_destroy(log); } node = iconfig_node_traverse("logs", FALSE); if (node == NULL) return; tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) { node = tmp->data; if (node->type != NODE_TYPE_BLOCK) continue; log = g_new0(LOG_REC, 1); logs = g_slist_append(logs, log); log->handle = -1; log->fname = g_strdup(node->key); log->autoopen = config_node_get_bool(node, "auto_open", FALSE); log->level = level2bits(config_node_get_str(node, "level", 0)); signal_emit("log config read", 2, log, node); node = config_node_section(node, "items", -1); if (node != NULL) log_items_read_config(node, log); if (log->autoopen || gslist_find_string(fnames, log->fname)) log_start_logging(log); } g_slist_foreach(fnames, (GFunc) g_free, NULL); g_slist_free(fnames); }
static void cmd_log_open(const char *data) { /* /LOG OPEN [-noopen] [-autoopen] [-targets <targets>] [-window] [-rotate hour|day|week|month] <fname> [<levels>] */ char *params, *args, *targetarg, *rotatearg, *fname, *levels; char window[MAX_INT_STRLEN]; LOG_REC *log; int level, rotate; args = "targets rotate"; params = cmd_get_params(data, 5 | PARAM_FLAG_MULTIARGS | PARAM_FLAG_GETREST, &args, &targetarg, &rotatearg, &fname, &levels); if (*fname == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); rotate = LOG_ROTATE_NEVER; if (stristr(args, "-rotate")) { rotate = log_str2rotate(rotatearg); if (rotate < 0) rotate = LOG_ROTATE_NEVER; } level = level2bits(levels); if (level == 0) level = MSGLEVEL_ALL; if (stristr(args, "-window")) { /* log by window ref# */ ltoa(window, active_win->refnum); targetarg = window; } log = log_create_rec(fname, level, targetarg); if (log != NULL) { if (stristr(args, "-autoopen")) log->autoopen = TRUE; log->rotate = rotate; log_update(log); if (log->handle == -1 && stristr(args, "-noopen") == NULL) { /* start logging */ if (log_start_logging(log)) { printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, IRCTXT_LOG_OPENED, fname); } else { log_close(log); } } } g_free(params); }
static void read_ignores(void) { IGNORE_REC *rec; CONFIG_NODE *node; GSList *tmp; while (ignores != NULL) ignore_destroy(ignores->data, FALSE); node = iconfig_node_traverse("ignores", FALSE); if (node == NULL) { nickmatch_rebuild(nickmatch); return; } tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) { node = tmp->data; if (node->type != NODE_TYPE_BLOCK) continue; rec = g_new0(IGNORE_REC, 1); ignores = g_slist_append(ignores, rec); rec->mask = g_strdup(config_node_get_str(node, "mask", NULL)); rec->pattern = g_strdup(config_node_get_str(node, "pattern", NULL)); rec->level = level2bits(config_node_get_str(node, "level", ""), NULL); rec->exception = config_node_get_bool(node, "exception", FALSE); 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 = iconfig_node_section(node, "channels", -1); if (node != NULL) rec->channels = config_node_get_list(node); ignore_init_rec(rec); } nickmatch_rebuild(nickmatch); }
WINDOW_REC *window_create(WI_ITEM_REC *item, int automatic) { WINDOW_REC *rec; rec = g_new0(WINDOW_REC, 1); rec->refnum = window_get_new_refnum(); rec->level = level2bits(settings_get_str("window_default_level")); windows = g_slist_prepend(windows, rec); signal_emit("window created", 2, rec, GINT_TO_POINTER(automatic)); if (item != NULL) window_item_add(rec, item, automatic); if (windows->next == NULL || !automatic || settings_get_bool("window_auto_change")) { if (automatic && windows->next != NULL) signal_emit("window changed automatic", 1, rec); window_set_active(rec); } return rec; }
/* SYNTAX: SCROLLBACK LEVELCLEAR [-all] [-level <level>] [<refnum>] */ static void cmd_scrollback_levelclear(const char *data) { WINDOW_REC *window; GHashTable *optlist; char *refnum; void *free_arg; GSList *tmp; int level; char *levelarg; g_return_if_fail(data != NULL); if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS, "scrollback levelclear", &optlist, &refnum)) return; levelarg = g_hash_table_lookup(optlist, "level"); level = (levelarg == NULL || *levelarg == '\0') ? 0 : level2bits(replace_chars(levelarg, ',', ' '), NULL); if (level == 0) { cmd_params_free(free_arg); return; } if (g_hash_table_lookup(optlist, "all") != NULL) { /* clear all windows */ for (tmp = windows; tmp != NULL; tmp = tmp->next) { window = tmp->data; textbuffer_view_remove_lines_by_level(WINDOW_GUI(window)->view, level); } } else if (*refnum != '\0') { /* clear specified window */ window = window_find_refnum(atoi(refnum)); if (window != NULL) textbuffer_view_remove_lines_by_level(WINDOW_GUI(window)->view, level); } else { /* clear active window */ textbuffer_view_remove_lines_by_level(WINDOW_GUI(active_win)->view, level); } cmd_params_free(free_arg); }
/* NOTE: -network replaces the old -ircnet flag. */ static void cmd_ignore(const char *data) { GHashTable *optlist; IGNORE_REC *rec; char *patternarg, *chanarg, *mask, *levels, *timestr, *servertag; char **channels; void *free_arg; int new_ignore, msecs, level, flags; if (*data == '\0') { cmd_ignore_show(); return; } if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTIONS | PARAM_FLAG_GETREST | PARAM_FLAG_STRIP_TRAILING_WS, "ignore", &optlist, &mask, &levels)) return; patternarg = g_hash_table_lookup(optlist, "pattern"); chanarg = g_hash_table_lookup(optlist, "channels"); servertag = g_hash_table_lookup(optlist, "network"); /* Allow -ircnet for backwards compatibility */ if (!servertag) servertag = g_hash_table_lookup(optlist, "ircnet"); if (*mask == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); if (*levels == '\0') levels = "ALL"; level = level2bits(levels, NULL); msecs = 0; timestr = g_hash_table_lookup(optlist, "time"); if (timestr != NULL) { if (!parse_time_interval(timestr, &msecs)) cmd_param_error(CMDERR_INVALID_TIME); } if (active_win->active_server != NULL && server_ischannel(active_win->active_server, mask)) { chanarg = mask; mask = NULL; } channels = (chanarg == NULL || *chanarg == '\0') ? NULL : g_strsplit(chanarg, ",", -1); flags = IGNORE_FIND_PATTERN; if (level & MSGLEVEL_NO_ACT) flags |= IGNORE_FIND_NOACT; if (level & MSGLEVEL_HIDDEN) flags |= IGNORE_FIND_HIDDEN; rec = ignore_find_full(servertag, mask, patternarg, channels, flags); new_ignore = rec == NULL; if (rec == NULL) { rec = g_new0(IGNORE_REC, 1); rec->mask = mask == NULL || *mask == '\0' || g_strcmp0(mask, "*") == 0 ? NULL : g_strdup(mask); rec->channels = channels; } else { g_free_and_null(rec->pattern); g_strfreev(channels); } rec->level = combine_level(rec->level, levels); if (rec->level == MSGLEVEL_NO_ACT) { /* If only NO_ACT was specified add all levels; it makes no * sense on its own. */ rec->level |= MSGLEVEL_ALL; } if (rec->level == MSGLEVEL_HIDDEN) { /* If only HIDDEN was specified add all levels; it makes no * sense on its own. */ rec->level |= MSGLEVEL_ALL; } if (new_ignore && rec->level == 0) { /* tried to unignore levels from nonexisting ignore */ printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_IGNORE_NOT_FOUND, rec->mask); g_free(rec->mask); g_strfreev(rec->channels); g_free(rec); cmd_params_free(free_arg); return; } rec->servertag = (servertag == NULL || *servertag == '\0') ? NULL : g_strdup(servertag); rec->pattern = (patternarg == NULL || *patternarg == '\0') ? NULL : g_strdup(patternarg); rec->exception = g_hash_table_lookup(optlist, "except") != NULL; rec->regexp = g_hash_table_lookup(optlist, "regexp") != NULL; rec->fullword = g_hash_table_lookup(optlist, "full") != NULL; rec->replies = g_hash_table_lookup(optlist, "replies") != NULL; if (msecs != 0) rec->unignore_time = time(NULL)+msecs/1000; if (new_ignore) ignore_add_rec(rec); else ignore_update_rec(rec); cmd_params_free(free_arg); }
static void read_settings(void) { beep_msg_level = level2bits(settings_get_str("beep_msg_level")); beep_when_away = settings_get_bool("beep_when_away"); beep_when_window_active = settings_get_bool("beep_when_window_active"); }
static void handle_exec(const char *args, GHashTable *optlist, WI_ITEM_REC *item) { PROCESS_REC *rec; char *target, *level; int notice, signum, interactive, target_nick, target_channel; /* check that there's no unknown options. we allowed them because signals can be used as options, but there should be only one unknown option: the signal name/number. */ signum = cmd_options_get_signal("exec", optlist); if (signum == -2) return; if (*args == '\0') { exec_show_list(); return; } target = NULL; notice = FALSE; if (g_hash_table_lookup(optlist, "in") != NULL) { rec = process_find(g_hash_table_lookup(optlist, "in"), TRUE); if (rec != NULL) { net_sendbuffer_send(rec->out, args, strlen(args)); net_sendbuffer_send(rec->out, "\n", 1); } return; } /* check if args is a process ID or name. if it's ID but not found, complain about it and fail immediately */ rec = process_find(args, *args == '%'); if (*args == '%' && rec == NULL) return; /* common options */ target_channel = target_nick = FALSE; if (g_hash_table_lookup(optlist, "out") != NULL) { /* redirect output to active channel/query */ if (item == NULL) cmd_return_error(CMDERR_NOT_JOINED); target = (char *) window_item_get_target(item); target_channel = IS_CHANNEL(item); target_nick = IS_QUERY(item); } else if (g_hash_table_lookup(optlist, "msg") != NULL) { /* redirect output to /msg <nick> */ target = g_hash_table_lookup(optlist, "msg"); } else if (g_hash_table_lookup(optlist, "notice") != NULL) { target = g_hash_table_lookup(optlist, "notice"); notice = TRUE; } /* options that require process ID/name as argument */ if (rec == NULL && (signum != -1 || g_hash_table_lookup(optlist, "close") != NULL)) { printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, "Unknown process name: %s", args); return; } if (g_hash_table_lookup(optlist, "close") != NULL) { /* forcibly close the process */ process_destroy(rec, -1); return; } if (signum != -1) { /* send a signal to process */ kill(rec->pid, signum); return; } interactive = g_hash_table_lookup(optlist, "interactive") != NULL; if (*args == '%') { /* do something to already existing process */ char *name; if (target != NULL) { /* redirect output to target */ g_free_and_null(rec->target); rec->target = g_strdup(target); rec->notice = notice; } name = g_hash_table_lookup(optlist, "name"); if (name != NULL) { /* change window name */ g_free_not_null(rec->name); rec->name = *name == '\0' ? NULL : g_strdup(name); } else if (target == NULL && (rec->target_item == NULL || interactive)) { /* no parameters given, redirect output to the active window */ g_free_and_null(rec->target); rec->target_win = active_win; if (rec->target_item != NULL) exec_wi_destroy(rec->target_item); if (interactive) { rec->target_item = exec_wi_create(active_win, rec); } } return; } /* starting a new process */ rec = g_new0(PROCESS_REC, 1); rec->pid = -1; rec->shell = g_hash_table_lookup(optlist, "nosh") == NULL; process_exec(rec, args); if (rec->pid == -1) { /* pipe() or fork() failed */ g_free(rec); cmd_return_error(CMDERR_ERRNO); } rec->id = process_get_new_id(); rec->target = g_strdup(target); rec->target_win = active_win; rec->target_channel = target_channel; rec->target_nick = target_nick; rec->args = g_strdup(args); rec->notice = notice; rec->silent = g_hash_table_lookup(optlist, "-") != NULL; rec->quiet = g_hash_table_lookup(optlist, "quiet") != NULL; rec->name = g_strdup(g_hash_table_lookup(optlist, "name")); level = g_hash_table_lookup(optlist, "level"); rec->level = level == NULL ? MSGLEVEL_CLIENTCRAP : level2bits(level); rec->read_tag = g_input_add(rec->in, G_INPUT_READ, (GInputFunction) sig_exec_input_reader, rec); processes = g_slist_append(processes, rec); if (rec->target == NULL && interactive) rec->target_item = exec_wi_create(active_win, rec); signal_emit("exec new", 1, rec); }
/* SYNTAX: HILIGHT [-nick | -word | -line] [-mask | -full | -regexp] [-color <color>] [-actcolor <color>] [-level <level>] [-network <network>] [-channels <channels>] <text> */ static void cmd_hilight(const char *data) { GHashTable *optlist; HILIGHT_REC *rec; char *colorarg, *actcolorarg, *levelarg, *priorityarg, *chanarg, *text, *servertag; char **channels; void *free_arg; g_return_if_fail(data != NULL); if (*data == '\0') { cmd_hilight_show(); return; } if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS | PARAM_FLAG_GETREST, "hilight", &optlist, &text)) return; chanarg = g_hash_table_lookup(optlist, "channels"); levelarg = g_hash_table_lookup(optlist, "level"); priorityarg = g_hash_table_lookup(optlist, "priority"); colorarg = g_hash_table_lookup(optlist, "color"); actcolorarg = g_hash_table_lookup(optlist, "actcolor"); servertag = g_hash_table_lookup(optlist, "network"); if (*text == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); channels = (chanarg == NULL || *chanarg == '\0') ? NULL : g_strsplit(chanarg, ",", -1); rec = hilight_find(text, channels); if (rec == NULL) { rec = g_new0(HILIGHT_REC, 1); /* default to nick/word hilighting */ rec->nick = TRUE; rec->word = TRUE; rec->text = g_strdup(text); rec->channels = channels; } else { g_strfreev(channels); } rec->level = (levelarg == NULL || *levelarg == '\0') ? 0 : level2bits(replace_chars(levelarg, ',', ' '), NULL); rec->priority = priorityarg == NULL ? 0 : atoi(priorityarg); if (g_hash_table_lookup(optlist, "line") != NULL) { rec->word = FALSE; rec->nick = FALSE; } if (g_hash_table_lookup(optlist, "word") != NULL) { rec->word = TRUE; rec->nick = FALSE; } if (g_hash_table_lookup(optlist, "nick") != NULL) rec->nick = TRUE; rec->nickmask = g_hash_table_lookup(optlist, "mask") != NULL; rec->fullword = g_hash_table_lookup(optlist, "full") != NULL; rec->regexp = g_hash_table_lookup(optlist, "regexp") != NULL; if (colorarg != NULL) { g_free_and_null(rec->color); if (*colorarg != '\0') rec->color = g_strdup(colorarg); } if (actcolorarg != NULL) { g_free_and_null(rec->act_color); if (*actcolorarg != '\0') rec->act_color = g_strdup(actcolorarg); } if (servertag != NULL) { g_free_and_null(rec->servertag); if (*servertag != '\0') rec->servertag = g_strdup(servertag); } hilight_create(rec); hilight_print(g_slist_index(hilights, rec)+1, rec); cmd_params_free(free_arg); reset_cache(); }
/* SYNTAX: HILIGHT [-nick | -nonick] [-mask | -regexp | -word] [-color <color>] [-level <level>] [-channels <channels>] <text> */ static void cmd_hilight(const char *data) { GHashTable *optlist; HILIGHT_REC *rec; char *colorarg, *levelarg, *chanarg, *text; char **channels; void *free_arg; g_return_if_fail(data != NULL); if (*data == '\0') { cmd_hilight_show(); return; } if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS | PARAM_FLAG_GETREST, "hilight", &optlist, &text)) return; chanarg = g_hash_table_lookup(optlist, "channels"); levelarg = g_hash_table_lookup(optlist, "level"); colorarg = g_hash_table_lookup(optlist, "color"); if (*text == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); channels = (chanarg == NULL || *chanarg == '\0') ? NULL : g_strsplit(replace_chars(chanarg, ',', ' '), " ", -1); rec = hilight_find(text, channels); if (rec == NULL) { rec = g_new0(HILIGHT_REC, 1); rec->text = g_strdup(text); rec->channels = channels; } else { g_free_and_null(rec->color); g_strfreev(channels); hilight_remove_config(rec); hilights = g_slist_remove(hilights, rec); } rec->level = (levelarg == NULL || *levelarg == '\0') ? 0 : level2bits(replace_chars(levelarg, ',', ' ')); rec->nick = settings_get_bool("hilight_only_nick") && (rec->level == 0 || (rec->level & DEFAULT_HILIGHT_LEVEL) == rec->level) ? g_hash_table_lookup(optlist, "nonick") == NULL : g_hash_table_lookup(optlist, "nick") != NULL; rec->nickmask = g_hash_table_lookup(optlist, "mask") != NULL; rec->fullword = g_hash_table_lookup(optlist, "word") != NULL; rec->regexp = g_hash_table_lookup(optlist, "regexp") != NULL; if (colorarg != NULL && *colorarg != '\0') rec->color = g_strdup(colorarg); hilights = g_slist_append(hilights, rec); hilight_add_config(rec); hilight_print(g_slist_index(hilights, rec)+1, rec); cmd_params_free(free_arg); }