static void sig_print_text(TEXT_DEST_REC *dest, const char *text, const char *stripped) { HILIGHT_REC *hilight; char *color, *newstr; int old_level, hilight_start, hilight_end, hilight_len; int nick_match; if (dest->level & MSGLEVEL_NOHILIGHT) return; hilight_start = hilight_end = 0; hilight = hilight_match(dest->server, dest->target, NULL, NULL, dest->level, stripped, &hilight_start, &hilight_end); if (hilight == NULL) return; nick_match = hilight->nick && (dest->level & (MSGLEVEL_PUBLIC|MSGLEVEL_ACTIONS)) == MSGLEVEL_PUBLIC; old_level = dest->level; if (!nick_match || (dest->level & MSGLEVEL_HILIGHT)) { /* update the level / hilight info */ hilight_update_text_dest(dest, hilight); /* Remove NO_ACT, this means explicitly defined hilights will bypass * /IGNORE ... NO_ACT. * (It's still possible to use /hilight -actcolor %n to hide * hilight/beep). */ dest->level &= ~MSGLEVEL_NO_ACT; } if (nick_match) return; /* fe-messages.c should have taken care of this */ if (old_level & MSGLEVEL_HILIGHT) { /* nick is highlighted, just set priority */ return; } color = hilight_get_color(hilight); hilight_len = hilight_end-hilight_start; if (!hilight->word) { /* hilight whole line */ char *tmp = strip_codes(text); newstr = g_strconcat(color, tmp, NULL); g_free(tmp); } else { /* hilight part of the line */ GString *tmp; char *middle; int pos, color_pos, color_len; tmp = g_string_new(NULL); /* start of the line */ pos = strip_real_length(text, hilight_start, NULL, NULL); g_string_append(tmp, text); g_string_truncate(tmp, pos); /* color */ g_string_append(tmp, color); /* middle of the line, stripped */ middle = strip_codes(text+pos); pos = tmp->len; g_string_append(tmp, middle); g_string_truncate(tmp, pos+hilight_len); g_free(middle); /* end of the line */ pos = strip_real_length(text, hilight_end, &color_pos, &color_len); if (color_pos > 0) g_string_append_len(tmp, text+color_pos, color_len); else { /* no colors in line, change back to default */ g_string_append_c(tmp, 4); g_string_append_c(tmp, FORMAT_STYLE_DEFAULTS); } g_string_append(tmp, text+pos); newstr = tmp->str; g_string_free(tmp, FALSE); } signal_emit("print text", 3, dest, newstr, stripped); g_free(color); g_free(newstr); signal_stop(); }
static void sig_message_public(SERVER_REC *server, const char *msg, const char *nick, const char *address, const char *target, NICK_REC *nickrec) { CHANNEL_REC *chanrec; const char *printnick; int for_me, print_channel, level; char *nickmode, *color, *freemsg = NULL; HILIGHT_REC *hilight; TEXT_DEST_REC dest; /* NOTE: this may return NULL if some channel is just closed with /WINDOW CLOSE and server still sends the few last messages */ chanrec = channel_find(server, target); if (nickrec == NULL && chanrec != NULL) nickrec = nicklist_find(chanrec, nick); for_me = !settings_get_bool("hilight_nick_matches") ? FALSE : !settings_get_bool("hilight_nick_matches_everywhere") ? nick_match_msg(chanrec, msg, server->nick) : nick_match_msg_everywhere(chanrec, msg, server->nick); hilight = for_me ? NULL : hilight_match_nick(server, target, nick, address, MSGLEVEL_PUBLIC, msg); color = (hilight == NULL) ? NULL : hilight_get_color(hilight); print_channel = chanrec == NULL || !window_item_is_active((WI_ITEM_REC *) chanrec); if (!print_channel && settings_get_bool("print_active_channel") && window_item_window((WI_ITEM_REC *) chanrec)->items->next != NULL) print_channel = TRUE; level = MSGLEVEL_PUBLIC; if (for_me) level |= MSGLEVEL_HILIGHT; ignore_check_plus(server, nick, address, target, msg, &level, FALSE); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis((WI_ITEM_REC *) chanrec, msg); /* get nick mode & nick what to print the msg with (in case there's multiple identical nicks) */ nickmode = channel_get_nickmode_rec(nickrec); printnick = nickrec == NULL ? nick : g_hash_table_lookup(printnicks, nickrec); if (printnick == NULL) printnick = nick; format_create_dest(&dest, server, target, level, NULL); dest.address = address; dest.nick = nick; if (color != NULL) { /* highlighted nick */ hilight_update_text_dest(&dest,hilight); if (!print_channel) /* message to active channel in window */ printformat_dest(&dest, TXT_PUBMSG_HILIGHT, color, printnick, msg, nickmode); else /* message to not existing/active channel */ printformat_dest(&dest, TXT_PUBMSG_HILIGHT_CHANNEL, color, printnick, target, msg, nickmode); } else { if (!print_channel) printformat_dest(&dest, for_me ? TXT_PUBMSG_ME : TXT_PUBMSG, printnick, msg, nickmode); else printformat_dest(&dest, for_me ? TXT_PUBMSG_ME_CHANNEL : TXT_PUBMSG_CHANNEL, printnick, target, msg, nickmode); } g_free_not_null(nickmode); g_free_not_null(freemsg); g_free_not_null(color); }
static void sig_print_text(TEXT_DEST_REC *dest, const char *text, const char *stripped) { HILIGHT_REC *hilight; char *color, *newstr; int old_level, hilight_start, hilight_end, hilight_len; int nick_match; if (dest->level & MSGLEVEL_NOHILIGHT) return; hilight_start = hilight_end = 0; hilight = hilight_match(dest->server, dest->target, NULL, NULL, dest->level, stripped, &hilight_start, &hilight_end); if (hilight == NULL) return; nick_match = hilight->nick && (dest->level & (MSGLEVEL_PUBLIC|MSGLEVEL_ACTIONS)) == MSGLEVEL_PUBLIC; old_level = dest->level; if (!nick_match || (dest->level & MSGLEVEL_HILIGHT)) { /* update the level / hilight info */ hilight_update_text_dest(dest, hilight); } if (nick_match) return; /* fe-messages.c should have taken care of this */ if (old_level & MSGLEVEL_HILIGHT) { /* nick is highlighted, just set priority */ return; } color = hilight_get_color(hilight); hilight_len = hilight_end-hilight_start; if (!hilight->word) { /* hilight whole line */ char *tmp = strip_codes(text); newstr = g_strconcat(color, tmp, NULL); g_free(tmp); } else { /* hilight part of the line */ GString *tmp; char *middle, *lastcolor; int pos, color_pos, color_len; tmp = g_string_new(NULL); /* start of the line */ pos = strip_real_length(text, hilight_start, NULL, NULL); g_string_append(tmp, text); g_string_truncate(tmp, pos); /* color */ g_string_append(tmp, color); /* middle of the line, stripped */ middle = strip_codes(text+pos); pos = tmp->len; g_string_append(tmp, middle); g_string_truncate(tmp, pos+hilight_len); g_free(middle); /* end of the line */ pos = strip_real_length(text, hilight_end, &color_pos, &color_len); if (color_pos > 0) lastcolor = g_strndup(text+color_pos, color_len); else { /* no colors in line, change back to default */ lastcolor = g_malloc0(3); lastcolor[0] = 4; lastcolor[1] = FORMAT_STYLE_DEFAULTS; } g_string_append(tmp, lastcolor); g_string_append(tmp, text+pos); g_free(lastcolor); newstr = tmp->str; g_string_free(tmp, FALSE); } signal_emit("print text", 3, dest, newstr, stripped); g_free(color); g_free(newstr); signal_stop(); }