예제 #1
0
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();
}
예제 #2
0
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);
}
예제 #3
0
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();
}