static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg, const char *nick, const char *address, const char *target) { void *item; const char *oldtarget; char *freemsg = NULL; int level; int own = FALSE; oldtarget = target; target = fe_channel_skip_prefix(IRC_SERVER(server), target); level = MSGLEVEL_ACTIONS | (server_ischannel(SERVER(server), target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); if (ignore_check_plus(SERVER(server), nick, address, target, msg, &level, TRUE)) return; if (server_ischannel(SERVER(server), target)) { item = irc_channel_find(server, target); } else { own = (!g_strcmp0(nick, server->nick)); item = privmsg_get_query(SERVER(server), own ? target : nick, FALSE, level); } if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis(item, msg); if (server_ischannel(SERVER(server), target)) { /* channel action */ if (window_item_is_active(item) && target == oldtarget) { /* message to active channel in window */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC, nick, msg); } else { /* message to not existing/active channel, or to @/+ */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC_CHANNEL, nick, oldtarget, msg); } } else { if (own) { /* own action bounced */ printformat(server, target, MSGLEVEL_ACTIONS | MSGLEVEL_MSGS, item != NULL && oldtarget == target ? IRCTXT_OWN_ACTION : IRCTXT_OWN_ACTION_TARGET, server->nick, msg, oldtarget); } else { /* private action */ printformat(server, nick, MSGLEVEL_ACTIONS | MSGLEVEL_MSGS, item == NULL ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY, nick, address == NULL ? "" : address, msg); } } g_free_not_null(freemsg); }
static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg, const char *nick, const char *address, const char *target) { void *item; const char *oldtarget; char *freemsg = NULL; int level; oldtarget = target; target = skip_target(IRC_SERVER(server), target); level = MSGLEVEL_ACTIONS | (ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); if (ignore_check(SERVER(server), nick, address, target, msg, level)) return; if (ignore_check(SERVER(server), nick, address, target, msg, level | MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; if (ischannel(*target)) item = irc_channel_find(server, target); else item = privmsg_get_query(SERVER(server), nick, FALSE, level); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis(item, msg); if (ischannel(*target)) { /* channel action */ if (window_item_is_active(item) && target == oldtarget) { /* message to active channel in window */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC, nick, msg); } else { /* message to not existing/active channel, or to @/+ */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC_CHANNEL, nick, oldtarget, msg); } } else { /* private action */ printformat(server, nick, MSGLEVEL_ACTIONS | MSGLEVEL_MSGS, item == NULL ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY, nick, address == NULL ? "" : address, msg); } g_free_not_null(freemsg); }
static void sig_history(SERVER_REC *server, const char *msg, const char *nick, const char *target, const char *stamp, gpointer gpointer_type) { void *item; char *text, *freemsg = NULL; int level, type; g_return_if_fail(server != NULL); g_return_if_fail(msg != NULL); g_return_if_fail(nick != NULL); g_return_if_fail(target != NULL); type = GPOINTER_TO_INT(gpointer_type); level = MSGLEVEL_NO_ACT | MSGLEVEL_NOHILIGHT | (type == SEND_TARGET_CHANNEL ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); item = type == SEND_TARGET_CHANNEL ? (void *)channel_find(server, target) : query_find(server, nick); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis(item, msg); /* MUC */ if (type == SEND_TARGET_CHANNEL) { CHANNEL_REC *chanrec = item; int print_channel; char *nickmode; 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; nickmode = channel_get_nickmode(chanrec, nick); text = !print_channel ? format_get_text(CORE_MODULE_NAME, NULL, server, target, TXT_PUBMSG, nick, msg, nickmode) : format_get_text(CORE_MODULE_NAME, NULL, server, target, TXT_PUBMSG_CHANNEL, nick, target, msg, nickmode); g_free(nickmode); /* General */ } else text = format_get_text(CORE_MODULE_NAME, NULL, server, target, item == NULL ? TXT_MSG_PRIVATE : TXT_MSG_PRIVATE_QUERY, nick, nick, msg); printformat_module(MODULE_NAME, server, target, level, XMPPTXT_MESSAGE_TIMESTAMP, stamp, text); g_free_not_null(freemsg); g_free(text); }
static void sig_message_delay_action(SERVER_REC *server, const char *msg, const char *nick, const char *target, time_t *t, gpointer gpointer_type) { void *item; char *text, *freemsg = NULL; char stamp[BUFSIZ]; int level, type; g_return_if_fail(server != NULL); g_return_if_fail(msg != NULL); g_return_if_fail(nick != NULL); g_return_if_fail(target != NULL); type = GPOINTER_TO_INT(gpointer_type); level = MSGLEVEL_ACTIONS | MSGLEVEL_NO_ACT | MSGLEVEL_NOHILIGHT | (type == SEND_TARGET_CHANNEL ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); item = type == SEND_TARGET_CHANNEL ? (void *)get_muc((XMPP_SERVER_REC *)server, target) : query_find(server, nick); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis(item, msg); /* MUC */ if (type == SEND_TARGET_CHANNEL) { if (item && window_item_is_active(item)) text = format_get_text(IRC_MODULE_NAME, NULL, server, target, IRCTXT_ACTION_PUBLIC, nick, msg); else text = format_get_text(IRC_MODULE_NAME, NULL, server, target, IRCTXT_ACTION_PUBLIC_CHANNEL, nick, target, msg); /* General */ } else text = format_get_text(IRC_MODULE_NAME, NULL, server, nick, (item == NULL) ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY, nick, nick, msg); if (strftime(stamp, sizeof(stamp)-1, settings_get_str("xmpp_timestamp_format"), localtime(t)) == 0) stamp[sizeof(stamp)-1] = '\0'; printformat_module(MODULE_NAME, server, target, level, XMPPTXT_MESSAGE_TIMESTAMP, stamp, text); g_free(freemsg); }
/* we use "ctcp msg" here because "ctcp msg action" can be ignored with /IGNORE * CTCPS, and we don't want that.. */ static void ctcp_msg_check_action(const char *data, IRC_SERVER_REC *server, const char *nick, const char *addr, const char *target) { void *item; int level; g_return_if_fail(data != NULL); if (g_strncasecmp(data, "ACTION ", 7) != 0) return; data += 7; level = MSGLEVEL_ACTIONS | (ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); if (ignore_check(SERVER(server), nick, addr, target, data, level)) return; if (ischannel(*target)) { /* channel action */ item = irc_channel_find(server, target); if (window_item_is_active(item)) { /* message to active channel in window */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC, nick, data); } else { /* message to not existing/active channel */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC_CHANNEL, nick, target, data); } } else { /* private action */ item = privmsg_get_query(SERVER(server), nick, FALSE, MSGLEVEL_MSGS); printformat(server, nick, level, item == NULL ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY, nick, addr == NULL ? "" : addr, data); } }
static void sig_history_action(SERVER_REC *server, const char *msg, const char *nick, const char *target, const char *stamp, gpointer gpointer_type) { void *item; char *text, *freemsg = NULL; int level, type; g_return_if_fail(server != NULL); g_return_if_fail(msg != NULL); g_return_if_fail(nick != NULL); g_return_if_fail(target != NULL); type = GPOINTER_TO_INT(gpointer_type); level = MSGLEVEL_ACTIONS | MSGLEVEL_NO_ACT | MSGLEVEL_NOHILIGHT | (type == SEND_TARGET_CHANNEL ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); item = type == SEND_TARGET_CHANNEL ? (void *)channel_find(server, target) : query_find(server, nick); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis(item, msg); /* MUC */ if (type == SEND_TARGET_CHANNEL) { if (item && window_item_is_active(item)) text = format_get_text(IRC_MODULE_NAME, NULL, server, target, IRCTXT_ACTION_PUBLIC, nick, msg); else text = format_get_text(IRC_MODULE_NAME, NULL, server, target, IRCTXT_ACTION_PUBLIC_CHANNEL, nick, target, msg); /* General */ } else text = format_get_text(IRC_MODULE_NAME, NULL, server, nick, (item == NULL) ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY, nick, nick, msg); printformat_module(MODULE_NAME, server, target, level, XMPPTXT_MESSAGE_TIMESTAMP, stamp, text); g_free(freemsg); }
static void sig_action(SERVER_REC *server, const char *msg, const char *nick, const char *target, gpointer gpointer_type) { void *item; char *freemsg = NULL; int level, type; g_return_if_fail(server != NULL); g_return_if_fail(msg != NULL); g_return_if_fail(nick != NULL); g_return_if_fail(target != NULL); type = GPOINTER_TO_INT(gpointer_type); level = MSGLEVEL_ACTIONS | (type == SEND_TARGET_CHANNEL ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); item = type == SEND_TARGET_CHANNEL ? (void *)channel_find(server, target) : privmsg_get_query(SERVER(server), nick, FALSE, level); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis(item, msg); /* MUC */ if (type == SEND_TARGET_CHANNEL) { if (item && window_item_is_active(item)) printformat_module(IRC_MODULE_NAME, server, target, level, IRCTXT_ACTION_PUBLIC, nick, msg); else printformat_module(IRC_MODULE_NAME, server, target, level, IRCTXT_ACTION_PUBLIC_CHANNEL, nick, target, msg); /* General */ } else printformat_module(IRC_MODULE_NAME, server, nick, level, (item == NULL) ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY, nick, nick, msg); g_free(freemsg); }
static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg, const char *nick, const char *address, const char *target) { void *item; int level; level = MSGLEVEL_ACTIONS | (ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); if (ignore_check(SERVER(server), nick, address, target, msg, level)) return; if (ischannel(*target)) { /* channel action */ item = irc_channel_find(server, target); if (window_item_is_active(item)) { /* message to active channel in window */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC, nick, msg); } else { /* message to not existing/active channel */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC_CHANNEL, nick, target, msg); } } else { /* private action */ item = privmsg_get_query(SERVER(server), nick, FALSE, MSGLEVEL_MSGS); printformat(server, nick, MSGLEVEL_ACTIONS | MSGLEVEL_MSGS, item == NULL ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY, nick, address == NULL ? "" : address, msg); } }
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); }
/* * Print a message using the public message format (to channel) * Can be from others or ourselves */ void print_message_public(SERVER_REC* server_rec, CHANNEL_REC* channel_rec, char* target, char* nick, char* address, char* msg) { // See fe-common/core/fe-messages.c, sig_message_public() // and fe-common/irc/fe-irc-messages.c, sig_message_irc_op_public() // for the below. char* nickmode = channel_get_nickmode(channel_rec, nick); // Check if hilight by someone referring to me int for_me = nick_match_msg(channel_rec, msg, server_rec->nick); // Also can hilight based on address? int hilight; if (address != NULL) { hilight = for_me || hilight_match_nick(server_rec, target, nick, address, MSGLEVEL_PUBLIC, msg); } else { hilight = for_me; } // If channel is active, we don't need to use the format which includes // channel name, such as <@nick:#channel> int should_print_channel = channel_rec == NULL || !window_item_is_active((WI_ITEM_REC*) channel_rec); // Check if it was us that said this int from_me = strcmp(nick, server_rec->nick) == 0; // Fix up the message level int msg_level = MSGLEVEL_PUBLIC; // We don't want to hilight ourselves if (!from_me && hilight) { msg_level |= MSGLEVEL_HILIGHT; } if (should_print_channel) { if (from_me) { printformat_module("fe-common/core", server_rec, target, msg_level, TXT_OWN_MSG_CHANNEL, nick, target, msg, nickmode); } else { printformat_module("fe-common/core", server_rec, target, msg_level, hilight ? TXT_PUBMSG_ME_CHANNEL : TXT_PUBMSG_CHANNEL, nick, target, msg, nickmode); } } else { if (from_me) { printformat_module("fe-common/core", server_rec, target, msg_level, TXT_OWN_MSG, nick, msg, nickmode); } else { printformat_module("fe-common/core", server_rec, target, msg_level, hilight ? TXT_PUBMSG_ME : TXT_PUBMSG, nick, msg, nickmode); } } g_free_not_null(nickmode); }
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 *nickmode, *printnick; int for_me, print_channel, level; char *color, *freemsg = NULL; /* 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 = nick_match_msg(chanrec, msg, server->nick); color = for_me ? NULL : hilight_match_nick(server, target, nick, address, MSGLEVEL_PUBLIC, msg); 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 || color != NULL) level |= MSGLEVEL_HILIGHT; 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; if (!print_channel) { /* message to active channel in window */ if (color != NULL) { /* highlighted nick */ printformat(server, target, level, TXT_PUBMSG_HILIGHT, color, printnick, msg, nickmode); } else { printformat(server, target, level, for_me ? TXT_PUBMSG_ME : TXT_PUBMSG, printnick, msg, nickmode); } } else { /* message to not existing/active channel */ if (color != NULL) { /* highlighted nick */ printformat(server, target, level, TXT_PUBMSG_HILIGHT_CHANNEL, color, printnick, target, msg, nickmode); } else { printformat(server, target, level, for_me ? TXT_PUBMSG_ME_CHANNEL : TXT_PUBMSG_CHANNEL, printnick, target, msg, nickmode); } } g_free_not_null(freemsg); g_free_not_null(color); }