void ui_show_software_version(const char *const jid, const char *const presence, const char *const name, const char *const version, const char *const os) { Jid *jidp = jid_create(jid); ProfWin *window = NULL; ProfWin *chatwin = (ProfWin*)wins_get_chat(jidp->barejid); ProfWin *mucwin = (ProfWin*)wins_get_muc(jidp->barejid); ProfWin *privwin = (ProfWin*)wins_get_private(jidp->fulljid); ProfWin *console = wins_get_console(); jid_destroy(jidp); if (chatwin) { if (wins_is_current(chatwin)) { window = chatwin; } else { window = console; } } else if (privwin) { if (wins_is_current(privwin)) { window = privwin; } else { window = console; } } else if (mucwin) { if (wins_is_current(mucwin)) { window = mucwin; } else { window = console; } } else { window = console; } if (name || version || os) { win_println(window, THEME_DEFAULT, '-', ""); theme_item_t presence_colour = theme_main_presence_attrs(presence); win_print(window, presence_colour, '-', "%s", jid); win_appendln(window, THEME_DEFAULT, ":"); } if (name) { win_println(window, THEME_DEFAULT, '-', "Name : %s", name); } if (version) { win_println(window, THEME_DEFAULT, '-', "Version : %s", version); } if (os) { win_println(window, THEME_DEFAULT, '-', "OS : %s", os); } }
void ui_print_system_msg_from_recipient(const char * const from, const char *message) { int num = 0; char from_cpy[strlen(from) + 1]; char *bare_jid; if (from == NULL || message == NULL) return; strcpy(from_cpy, from); bare_jid = strtok(from_cpy, "/"); ProfWin *window = wins_get_by_recipient(bare_jid); if (window == NULL) { window = wins_new(bare_jid, WIN_CHAT); if (window != NULL) { num = wins_get_num(window); status_bar_active(num); } else { num = 0; window = wins_get_console(); status_bar_active(1); } } win_print_time(window, '-'); wprintw(window->win, "*%s %s\n", bare_jid, message); // this is the current window if (wins_is_current(window)) { wins_refresh_current(); } }
void ui_recipient_gone(const char * const barejid) { if (barejid == NULL) return; PContact contact = roster_get_contact(barejid); const char * display_usr = NULL; if (p_contact_name(contact) != NULL) { display_usr = p_contact_name(contact); } else { display_usr = barejid; } ProfWin *window = wins_get_by_recipient(barejid); if (window != NULL) { win_print_time(window, '!'); wattron(window->win, COLOUR_GONE); wprintw(window->win, "<- %s ", display_usr); wprintw(window->win, "has left the conversation."); wprintw(window->win, "\n"); wattroff(window->win, COLOUR_GONE); if (wins_is_current(window)) { wins_refresh_current(); } } }
void ui_focus_win(ProfWin *window) { assert(window != NULL); if (wins_is_current(window)) { return; } ProfWin *old_current = wins_get_current(); if (old_current->type == WIN_MUC_CONFIG) { ProfMucConfWin *confwin = (ProfMucConfWin*)old_current; cmd_ac_remove_form_fields(confwin->form); } if (window->type == WIN_MUC_CONFIG) { ProfMucConfWin *confwin = (ProfMucConfWin*)window; cmd_ac_add_form_fields(confwin->form); } int i = wins_get_num(window); wins_set_current_by_num(i); if (i == 1) { title_bar_console(); rosterwin_roster(); } else { title_bar_switch(); } status_bar_current(i); status_bar_active(i); }
void mucwin_requires_config(ProfMucWin *mucwin) { assert(mucwin != NULL); ProfWin *window = (ProfWin*)mucwin; int num = wins_get_num(window); int ui_index = num; if (ui_index == 10) { ui_index = 0; } win_print(window, '-', 0, NULL, 0, 0, "", ""); win_vprint(window, '!', 0, NULL, 0, THEME_ROOMINFO, "", "Room locked, requires configuration."); win_vprint(window, '!', 0, NULL, 0, THEME_ROOMINFO, "", "Use '/room accept' to accept the defaults"); win_vprint(window, '!', 0, NULL, 0, THEME_ROOMINFO, "", "Use '/room destroy' to cancel and destroy the room"); win_vprint(window, '!', 0, NULL, 0, THEME_ROOMINFO, "", "Use '/room config' to edit the room configuration"); win_print(window, '-', 0, NULL, 0, 0, "", ""); // currently in groupchat window if (wins_is_current(window)) { status_bar_active(num); // not currently on groupchat window } else { status_bar_new(num); } }
void mucwin_subject(ProfMucWin *mucwin, const char *const nick, const char *const subject) { assert(mucwin != NULL); ProfWin *window = (ProfWin*)mucwin; int num = wins_get_num(window); if (subject) { if (nick) { win_vprint(window, '!', 0, NULL, NO_EOL, THEME_ROOMINFO, "", "*%s has set the room subject: ", nick); win_vprint(window, '!', 0, NULL, NO_DATE, 0, "", "%s", subject); } else { win_vprint(window, '!', 0, NULL, NO_EOL, THEME_ROOMINFO, "", "Room subject: "); win_vprint(window, '!', 0, NULL, NO_DATE, 0, "", "%s", subject); } } else { if (nick) { win_vprint(window, '!', 0, NULL, 0, THEME_ROOMINFO, "", "*%s has cleared the room subject.", nick); } else { win_vprint(window, '!', 0, NULL, 0, THEME_ROOMINFO, "", "Room subject cleared"); } } // currently in groupchat window if (wins_is_current(window)) { status_bar_active(num); // not currently on groupchat window } else { status_bar_active(num); } }
void chatwin_otr_secured(ProfChatWin *chatwin, gboolean trusted) { assert(chatwin != NULL); chatwin->is_otr = TRUE; chatwin->otr_is_trusted = trusted; ProfWin *window = (ProfWin*) chatwin; if (trusted) { win_print(window, '!', 0, NULL, 0, THEME_OTR_STARTED_TRUSTED, "", "OTR session started (trusted)."); } else { win_print(window, '!', 0, NULL, 0, THEME_OTR_STARTED_UNTRUSTED, "", "OTR session started (untrusted)."); } if (wins_is_current(window)) { title_bar_switch(); } else { int num = wins_get_num(window); status_bar_new(num); int ui_index = num; if (ui_index == 10) { ui_index = 0; } cons_show("%s started an OTR session (%d).", chatwin->barejid, ui_index); cons_alert(); } }
void ui_room_history(const char * const room_jid, const char * const nick, GTimeVal tv_stamp, const char * const message) { ProfWin *window = wins_get_by_recipient(room_jid); GDateTime *time = g_date_time_new_from_timeval_utc(&tv_stamp); gchar *date_fmt = g_date_time_format(time, "%H:%M:%S"); wprintw(window->win, "%s - ", date_fmt); g_date_time_unref(time); g_free(date_fmt); if (strncmp(message, "/me ", 4) == 0) { wprintw(window->win, "*%s ", nick); waddstr(window->win, message + 4); wprintw(window->win, "\n"); } else { wprintw(window->win, "%s: ", nick); _win_show_message(window->win, message); } if (wins_is_current(window)) { wins_refresh_current(); } }
void privwin_incoming_msg(ProfPrivateWin *privatewin, const char *const message, GDateTime *timestamp) { assert(privatewin != NULL); ProfWin *window = (ProfWin*) privatewin; int num = wins_get_num(window); Jid *jidp = jid_create(privatewin->fulljid); if (jidp == NULL) { return; } gboolean is_current = wins_is_current(window); gboolean notify = prefs_do_chat_notify(is_current); // currently viewing chat window with sender if (wins_is_current(window)) { win_print_incoming_message(window, timestamp, jidp->resourcepart, message, PROF_MSG_PLAIN); title_bar_set_typing(FALSE); status_bar_active(num); // not currently viewing chat window with sender } else { status_bar_new(num); cons_show_incoming_private_message(jidp->resourcepart, jidp->barejid, num, privatewin->unread); win_print_incoming_message(window, timestamp, jidp->resourcepart, message, PROF_MSG_PLAIN); privatewin->unread++; if (prefs_get_boolean(PREF_FLASH)) { flash(); } } if (prefs_get_boolean(PREF_BEEP)) { beep(); } if (notify) { notify_message(jidp->resourcepart, num, message); } jid_destroy(jidp); }
void ui_contact_typing(const char *const barejid, const char *const resource) { ProfChatWin *chatwin = wins_get_chat(barejid); ProfWin *window = (ProfWin*) chatwin; ChatSession *session = chat_session_get(barejid); if (prefs_get_boolean(PREF_INTYPE)) { // no chat window for user if (chatwin == NULL) { cons_show_typing(barejid); // have chat window but not currently in it } else if (!wins_is_current(window)) { cons_show_typing(barejid); // in chat window with user, no session or session with resource } else if (!session || (session && g_strcmp0(session->resource, resource) == 0)) { title_bar_set_typing(TRUE); int num = wins_get_num(window); status_bar_active(num); } } if (prefs_get_boolean(PREF_NOTIFY_TYPING)) { gboolean is_current = FALSE; if (window) { is_current = wins_is_current(window); } if ( !is_current || (is_current && prefs_get_boolean(PREF_NOTIFY_TYPING_CURRENT)) ) { PContact contact = roster_get_contact(barejid); char const *display_usr = NULL; if (p_contact_name(contact)) { display_usr = p_contact_name(contact); } else { display_usr = barejid; } notify_typing(display_usr); } } }
void ui_room_roster(const char * const room, GList *roster, const char * const presence) { ProfWin *window = wins_get_by_recipient(room); win_print_time(window, '!'); if ((roster == NULL) || (g_list_length(roster) == 0)) { wattron(window->win, COLOUR_ROOMINFO); if (presence == NULL) { wprintw(window->win, "Room is empty.\n"); } else { wprintw(window->win, "No participants %s.\n", presence); } wattroff(window->win, COLOUR_ROOMINFO); } else { int length = g_list_length(roster); wattron(window->win, COLOUR_ROOMINFO); if (presence == NULL) { length++; wprintw(window->win, "%d participants: ", length); wattroff(window->win, COLOUR_ROOMINFO); wattron(window->win, COLOUR_ONLINE); wprintw(window->win, "%s", muc_get_room_nick(room)); wprintw(window->win, ", "); } else { wprintw(window->win, "%d %s: ", length, presence); wattroff(window->win, COLOUR_ROOMINFO); wattron(window->win, COLOUR_ONLINE); } while (roster != NULL) { PContact member = roster->data; const char const *nick = p_contact_barejid(member); const char const *show = p_contact_presence(member); win_presence_colour_on(window, show); wprintw(window->win, "%s", nick); win_presence_colour_off(window, show); if (roster->next != NULL) { wprintw(window->win, ", "); } roster = g_list_next(roster); } wprintw(window->win, "\n"); wattroff(window->win, COLOUR_ONLINE); } if (wins_is_current(window)) { wins_refresh_current(); } }
void ui_contact_offline(const char * const from, const char * const show, const char * const status) { Jid *jidp = jid_create(from); PContact contact = roster_get_contact(jidp->barejid); GString *display_str = g_string_new(""); // use nickname if exists if (p_contact_name(contact) != NULL) { g_string_append(display_str, p_contact_name(contact)); } else { g_string_append(display_str, jidp->barejid); } // add resource if not default provided by profanity if (strcmp(jidp->resourcepart, "__prof_default") != 0) { g_string_append(display_str, " ("); g_string_append(display_str, jidp->resourcepart); g_string_append(display_str, ")"); } ProfWin *console = wins_get_console(); _show_status_string(console, display_str->str, show, status, NULL, "--", "offline"); ProfWin *window = wins_get_by_recipient(jidp->barejid); if (window != NULL) { _show_status_string(window, display_str->str, show, status, NULL, "--", "offline"); } jid_destroy(jidp); g_string_free(display_str, TRUE); if (wins_is_current(console)) { wins_refresh_current(); } else if ((window != NULL) && (wins_is_current(window))) { wins_refresh_current(); } }
void ui_contact_online(const char * const barejid, const char * const resource, const char * const show, const char * const status, GDateTime *last_activity) { Jid *jid = jid_create_from_bare_and_resource(barejid, resource); PContact contact = roster_get_contact(barejid); GString *display_str = g_string_new(""); // use nickname if exists if (p_contact_name(contact) != NULL) { g_string_append(display_str, p_contact_name(contact)); } else { g_string_append(display_str, barejid); } // add resource if not default provided by profanity if (strcmp(jid->resourcepart, "__prof_default") != 0) { g_string_append(display_str, " ("); g_string_append(display_str, jid->resourcepart); g_string_append(display_str, ")"); } ProfWin *console = wins_get_console(); _show_status_string(console, display_str->str, show, status, last_activity, "++", "online"); ProfWin *window = wins_get_by_recipient(barejid); if (window != NULL) { _show_status_string(window, display_str->str, show, status, last_activity, "++", "online"); } jid_destroy(jid); g_string_free(display_str, TRUE); if (wins_is_current(console)) { wins_refresh_current(); } else if ((window != NULL) && (wins_is_current(window))) { wins_refresh_current(); } }
void ui_room_member_offline(const char * const room, const char * const nick) { ProfWin *window = wins_get_by_recipient(room); win_print_time(window, '!'); wattron(window->win, COLOUR_OFFLINE); wprintw(window->win, "<- %s has left the room.\n", nick); wattroff(window->win, COLOUR_OFFLINE); if (wins_is_current(window)) { wins_refresh_current(); } }
void chatwin_otr_untrust(ProfChatWin *chatwin) { assert(chatwin != NULL); chatwin->is_otr = TRUE; chatwin->otr_is_trusted = FALSE; ProfWin *window = (ProfWin*)chatwin; win_print(window, '!', 0, NULL, 0, THEME_OTR_UNTRUSTED, "", "OTR session untrusted."); if (wins_is_current(window)) { title_bar_switch(); } }
void ui_room_nick_change(const char * const room, const char * const nick) { ProfWin *window = wins_get_by_recipient(room); win_print_time(window, '!'); wattron(window->win, COLOUR_ME); wprintw(window->win, "** You are now known as %s\n", nick); wattroff(window->win, COLOUR_ME); if (wins_is_current(window)) { wins_refresh_current(); } }
void ui_room_member_presence(const char * const room, const char * const nick, const char * const show, const char * const status) { ProfWin *window = wins_get_by_recipient(room); if (window != NULL) { _show_status_string(window, nick, show, status, NULL, "++", "online"); } if (wins_is_current(window)) { wins_refresh_current(); } }
void ui_print_error_from_recipient(const char * const from, const char *err_msg) { if (from == NULL || err_msg == NULL) return; ProfWin *window = wins_get_by_recipient(from); if (window != NULL) { win_print_time(window, '-'); _win_show_error_msg(window->win, err_msg); if (wins_is_current(window)) { wins_refresh_current(); } } }
void ui_room_member_online(const char * const room, const char * const nick, const char * const show, const char * const status) { ProfWin *window = wins_get_by_recipient(room); win_print_time(window, '!'); wattron(window->win, COLOUR_ONLINE); wprintw(window->win, "-> %s has joined the room.\n", nick); wattroff(window->win, COLOUR_ONLINE); if (wins_is_current(window)) { wins_refresh_current(); } }
void mucwin_broadcast(ProfMucWin *mucwin, const char *const message) { assert(mucwin != NULL); ProfWin *window = (ProfWin*)mucwin; int num = wins_get_num(window); win_vprint(window, '!', 0, NULL, NO_EOL, THEME_ROOMINFO, "", "Room message: "); win_vprint(window, '!', 0, NULL, NO_DATE, 0, "", "%s", message); // currently in groupchat window if (wins_is_current(window)) { status_bar_active(num); // not currently on groupchat window } else { status_bar_new(num); } }
void ui_room_broadcast(const char * const room_jid, const char * const message) { ProfWin *window = wins_get_by_recipient(room_jid); int num = wins_get_num(window); win_print_time(window, '!'); wattron(window->win, COLOUR_ROOMINFO); wprintw(window->win, "Room message: "); wattroff(window->win, COLOUR_ROOMINFO); wprintw(window->win, "%s\n", message); // currently in groupchat window if (wins_is_current(window)) { status_bar_active(num); wins_refresh_current(); // not currenlty on groupchat window } else { status_bar_new(num); } }
void privwin_incoming_msg(ProfPrivateWin *privatewin, const char *const message, GDateTime *timestamp) { assert(privatewin != NULL); ProfWin *window = (ProfWin*) privatewin; int num = wins_get_num(window); char *display_from = get_nick_from_full_jid(privatewin->fulljid); // currently viewing chat window with sender if (wins_is_current(window)) { win_print_incoming_message(window, timestamp, display_from, message, PROF_MSG_PLAIN); title_bar_set_typing(FALSE); status_bar_active(num); // not currently viewing chat window with sender } else { privatewin->unread++; status_bar_new(num); cons_show_incoming_message(display_from, num); win_print_incoming_message(window, timestamp, display_from, message, PROF_MSG_PLAIN); if (prefs_get_boolean(PREF_FLASH)) { flash(); } } if (prefs_get_boolean(PREF_BEEP)) { beep(); } if (prefs_get_boolean(PREF_NOTIFY_MESSAGE)) { notify_message(window, display_from, message); } free(display_from); }
void ui_contact_typing(const char * const barejid) { ProfWin *window = wins_get_by_recipient(barejid); if (prefs_get_boolean(PREF_INTYPE)) { // no chat window for user if (window == NULL) { cons_show_typing(barejid); // have chat window but not currently in it } else if (!wins_is_current(window)) { cons_show_typing(barejid); wins_refresh_current(); // in chat window with user } else { title_bar_set_typing(TRUE); title_bar_draw(); int num = wins_get_num(window); status_bar_active(num); wins_refresh_current(); } } if (prefs_get_boolean(PREF_NOTIFY_TYPING)) { PContact contact = roster_get_contact(barejid); char const *display_usr = NULL; if (p_contact_name(contact) != NULL) { display_usr = p_contact_name(contact); } else { display_usr = barejid; } notify_typing(display_usr); } }
void ui_incoming_msg(const char * const from, const char * const message, GTimeVal *tv_stamp, gboolean priv) { gboolean win_created = FALSE; char *display_from = NULL; win_type_t win_type; if (priv) { win_type = WIN_PRIVATE; display_from = get_nick_from_full_jid(from); } else { win_type = WIN_CHAT; PContact contact = roster_get_contact(from); if (contact != NULL) { if (p_contact_name(contact) != NULL) { display_from = strdup(p_contact_name(contact)); } else { display_from = strdup(from); } } else { display_from = strdup(from); } } ProfWin *window = wins_get_by_recipient(from); if (window == NULL) { window = wins_new(from, win_type); win_created = TRUE; } int num = wins_get_num(window); // currently viewing chat window with sender if (wins_is_current(window)) { if (tv_stamp == NULL) { win_print_time(window, '-'); } else { GDateTime *time = g_date_time_new_from_timeval_utc(tv_stamp); gchar *date_fmt = g_date_time_format(time, "%H:%M:%S"); wattron(window->win, COLOUR_TIME); wprintw(window->win, "%s - ", date_fmt); wattroff(window->win, COLOUR_TIME); g_date_time_unref(time); g_free(date_fmt); } if (strncmp(message, "/me ", 4) == 0) { wattron(window->win, COLOUR_THEM); wprintw(window->win, "*%s ", display_from); waddstr(window->win, message + 4); wprintw(window->win, "\n"); wattroff(window->win, COLOUR_THEM); } else { _win_show_user(window->win, display_from, 1); _win_show_message(window->win, message); } title_bar_set_typing(FALSE); title_bar_draw(); status_bar_active(num); wins_refresh_current(); // not currently viewing chat window with sender } else { status_bar_new(num); cons_show_incoming_message(display_from, num); if (prefs_get_boolean(PREF_FLASH)) flash(); window->unread++; if (prefs_get_boolean(PREF_CHLOG) && prefs_get_boolean(PREF_HISTORY)) { _win_show_history(window->win, num, from); } if (tv_stamp == NULL) { win_print_time(window, '-'); } else { // show users status first, when receiving message via delayed delivery if (win_created) { PContact pcontact = roster_get_contact(from); if (pcontact != NULL) { win_show_contact(window, pcontact); } } GDateTime *time = g_date_time_new_from_timeval_utc(tv_stamp); gchar *date_fmt = g_date_time_format(time, "%H:%M:%S"); wattron(window->win, COLOUR_TIME); wprintw(window->win, "%s - ", date_fmt); wattroff(window->win, COLOUR_TIME); g_date_time_unref(time); g_free(date_fmt); } if (strncmp(message, "/me ", 4) == 0) { wattron(window->win, COLOUR_THEM); wprintw(window->win, "*%s ", display_from); waddstr(window->win, message + 4); wprintw(window->win, "\n"); wattroff(window->win, COLOUR_THEM); } else { _win_show_user(window->win, display_from, 1); _win_show_message(window->win, message); } } int ui_index = num; if (ui_index == 10) { ui_index = 0; } if (prefs_get_boolean(PREF_BEEP)) beep(); if (prefs_get_boolean(PREF_NOTIFY_MESSAGE)) notify_message(display_from, ui_index); free(display_from); }
void sv_ev_room_message(const char *const room_jid, const char *const nick, const char *const message) { if (prefs_get_boolean(PREF_GRLOG)) { Jid *jid = jid_create(jabber_get_fulljid()); groupchat_log_chat(jid->barejid, room_jid, nick, message); jid_destroy(jid); } ProfMucWin *mucwin = wins_get_muc(room_jid); if (!mucwin) { return; } char *new_message = plugins_pre_room_message_display(room_jid, nick, message); char *mynick = muc_nick(mucwin->roomjid); gboolean mention = FALSE; char *message_lower = g_utf8_strdown(new_message, -1); char *mynick_lower = g_utf8_strdown(mynick, -1); if (g_strrstr(message_lower, mynick_lower)) { mention = TRUE; } g_free(message_lower); g_free(mynick_lower); GList *triggers = prefs_message_get_triggers(new_message); mucwin_message(mucwin, nick, new_message, mention, triggers); ProfWin *window = (ProfWin*)mucwin; int num = wins_get_num(window); gboolean is_current = FALSE; // currently in groupchat window if (wins_is_current(window)) { is_current = TRUE; status_bar_active(num); if ((g_strcmp0(mynick, nick) != 0) && (prefs_get_boolean(PREF_BEEP))) { beep(); } // not currently on groupchat window } else { status_bar_new(num); if ((g_strcmp0(mynick, nick) != 0) && (prefs_get_boolean(PREF_FLASH))) { flash(); } cons_show_incoming_room_message(nick, mucwin->roomjid, num, mention, triggers, mucwin->unread); mucwin->unread++; if (mention) { mucwin->unread_mentions = TRUE; } if (triggers) { mucwin->unread_triggers = TRUE; } } if (prefs_do_room_notify(is_current, mucwin->roomjid, mynick, nick, new_message, mention, triggers != NULL)) { Jid *jidp = jid_create(mucwin->roomjid); notify_room_message(nick, jidp->localpart, num, new_message); jid_destroy(jidp); } if (triggers) { g_list_free_full(triggers, free); } rosterwin_roster(); plugins_post_room_message_display(room_jid, nick, new_message); free(new_message); }
void mucwin_message(ProfMucWin *mucwin, const char *const nick, const char *const message) { assert(mucwin != NULL); ProfWin *window = (ProfWin*)mucwin; int num = wins_get_num(window); char *my_nick = muc_nick(mucwin->roomjid); if (g_strcmp0(nick, my_nick) != 0) { if (g_strrstr(message, my_nick)) { win_print(window, '-', 0, NULL, NO_ME, THEME_ROOMMENTION, nick, message); } else { win_print(window, '-', 0, NULL, NO_ME, THEME_TEXT_THEM, nick, message); } } else { win_print(window, '-', 0, NULL, 0, THEME_TEXT_ME, nick, message); } // currently in groupchat window if (wins_is_current(window)) { status_bar_active(num); // not currently on groupchat window } else { status_bar_new(num); cons_show_incoming_message(nick, num); if (prefs_get_boolean(PREF_FLASH) && (strcmp(nick, my_nick) != 0)) { flash(); } mucwin->unread++; } int ui_index = num; if (ui_index == 10) { ui_index = 0; } // don't notify self messages if (strcmp(nick, my_nick) == 0) { return; } if (prefs_get_boolean(PREF_BEEP)) { beep(); } gboolean notify = FALSE; char *room_setting = prefs_get_string(PREF_NOTIFY_ROOM); if (g_strcmp0(room_setting, "on") == 0) { notify = TRUE; } if (g_strcmp0(room_setting, "mention") == 0) { char *message_lower = g_utf8_strdown(message, -1); char *nick_lower = g_utf8_strdown(nick, -1); if (g_strrstr(message_lower, nick_lower)) { notify = TRUE; } g_free(message_lower); g_free(nick_lower); } prefs_free_string(room_setting); if (notify) { gboolean is_current = wins_is_current(window); if ( !is_current || (is_current && prefs_get_boolean(PREF_NOTIFY_ROOM_CURRENT)) ) { Jid *jidp = jid_create(mucwin->roomjid); if (prefs_get_boolean(PREF_NOTIFY_ROOM_TEXT)) { notify_room_message(nick, jidp->localpart, ui_index, message); } else { notify_room_message(nick, jidp->localpart, ui_index, NULL); } jid_destroy(jidp); } } }
void mucwin_message(ProfMucWin *mucwin, const char *const nick, const char *const message) { assert(mucwin != NULL); ProfWin *window = (ProfWin*)mucwin; int num = wins_get_num(window); char *my_nick = muc_nick(mucwin->roomjid); if (g_strcmp0(nick, my_nick) != 0) { if (g_strrstr(message, my_nick)) { win_print(window, '-', 0, NULL, NO_ME, THEME_ROOMMENTION, nick, message); } else { win_print(window, '-', 0, NULL, NO_ME, THEME_TEXT_THEM, nick, message); } } else { win_print(window, '-', 0, NULL, 0, THEME_TEXT_ME, nick, message); } gboolean is_current = wins_is_current(window); gboolean notify = prefs_do_room_notify(is_current, mucwin->roomjid, my_nick, message); // currently in groupchat window if (wins_is_current(window)) { status_bar_active(num); // not currently on groupchat window } else { status_bar_new(num); cons_show_incoming_message(nick, num); if (prefs_get_boolean(PREF_FLASH) && (strcmp(nick, my_nick) != 0)) { flash(); } mucwin->unread++; if (notify) { mucwin->notify = TRUE; } } // don't notify self messages if (strcmp(nick, my_nick) == 0) { return; } if (prefs_get_boolean(PREF_BEEP)) { beep(); } if (!notify) { return; } Jid *jidp = jid_create(mucwin->roomjid); int ui_index = num; if (ui_index == 10) { ui_index = 0; } if (prefs_get_boolean(PREF_NOTIFY_ROOM_TEXT)) { notify_room_message(nick, jidp->localpart, ui_index, message); } else { notify_room_message(nick, jidp->localpart, ui_index, NULL); } jid_destroy(jidp); }
void chatwin_incoming_msg(ProfChatWin *chatwin, const char *const resource, const char *const message, GDateTime *timestamp, gboolean win_created, prof_enc_t enc_mode) { assert(chatwin != NULL); char *plugin_message = plugins_pre_chat_message_display(chatwin->barejid, message); ProfWin *window = (ProfWin*)chatwin; int num = wins_get_num(window); char *display_name = roster_get_msg_display_name(chatwin->barejid, resource); gboolean is_current = wins_is_current(window); gboolean notify = prefs_do_chat_notify(is_current); // currently viewing chat window with sender if (wins_is_current(window)) { win_print_incoming_message(window, timestamp, display_name, plugin_message, enc_mode); title_bar_set_typing(FALSE); status_bar_active(num); // not currently viewing chat window with sender } else { status_bar_new(num); cons_show_incoming_message(display_name, num, chatwin->unread); if (prefs_get_boolean(PREF_FLASH)) { flash(); } chatwin->unread++; if (prefs_get_boolean(PREF_CHLOG) && prefs_get_boolean(PREF_HISTORY)) { _chatwin_history(chatwin, chatwin->barejid); } // show users status first, when receiving message via delayed delivery if (timestamp && win_created) { PContact pcontact = roster_get_contact(chatwin->barejid); if (pcontact) { win_show_contact(window, pcontact); } } win_print_incoming_message(window, timestamp, display_name, plugin_message, enc_mode); } if (prefs_get_boolean(PREF_BEEP)) { beep(); } if (notify) { notify_message(display_name, num, plugin_message); } free(display_name); plugins_post_chat_message_display(chatwin->barejid, plugin_message); free(plugin_message); }
void sv_ev_room_message(const char *const room_jid, const char *const nick, const char *const message) { if (prefs_get_boolean(PREF_GRLOG)) { Jid *jid = jid_create(connection_get_fulljid()); groupchat_log_chat(jid->barejid, room_jid, nick, message); jid_destroy(jid); } ProfMucWin *mucwin = wins_get_muc(room_jid); if (!mucwin) { return; } char *new_message = plugins_pre_room_message_display(room_jid, nick, message); char *mynick = muc_nick(mucwin->roomjid); gboolean whole_word = prefs_get_boolean(PREF_NOTIFY_MENTION_WHOLE_WORD); gboolean case_sensitive = prefs_get_boolean(PREF_NOTIFY_MENTION_CASE_SENSITIVE); char *message_search = case_sensitive ? strdup(new_message) : g_utf8_strdown(new_message, -1); char *mynick_search = case_sensitive ? strdup(mynick) : g_utf8_strdown(mynick, -1); GSList *mentions = NULL; mentions = prof_occurrences(mynick_search, message_search, 0, whole_word, &mentions); gboolean mention = g_slist_length(mentions) > 0; g_free(message_search); g_free(mynick_search); GList *triggers = prefs_message_get_triggers(new_message); mucwin_message(mucwin, nick, new_message, mentions, triggers); g_slist_free(mentions); ProfWin *window = (ProfWin*)mucwin; int num = wins_get_num(window); gboolean is_current = FALSE; // currently in groupchat window if (wins_is_current(window)) { is_current = TRUE; status_bar_active(num); if ((g_strcmp0(mynick, nick) != 0) && (prefs_get_boolean(PREF_BEEP))) { beep(); } // not currently on groupchat window } else { status_bar_new(num); if ((g_strcmp0(mynick, nick) != 0) && (prefs_get_boolean(PREF_FLASH))) { flash(); } cons_show_incoming_room_message(nick, mucwin->roomjid, num, mention, triggers, mucwin->unread); mucwin->unread++; if (mention) { mucwin->unread_mentions = TRUE; } if (triggers) { mucwin->unread_triggers = TRUE; } } if (prefs_do_room_notify(is_current, mucwin->roomjid, mynick, nick, new_message, mention, triggers != NULL)) { Jid *jidp = jid_create(mucwin->roomjid); notify_room_message(nick, jidp->localpart, num, new_message); jid_destroy(jidp); } if (triggers) { g_list_free_full(triggers, free); } rosterwin_roster(); plugins_post_room_message_display(room_jid, nick, new_message); free(new_message); }
void ui_room_message(const char * const room_jid, const char * const nick, const char * const message) { ProfWin *window = wins_get_by_recipient(room_jid); int num = wins_get_num(window); win_print_time(window, '-'); if (strcmp(nick, muc_get_room_nick(room_jid)) != 0) { if (strncmp(message, "/me ", 4) == 0) { wattron(window->win, COLOUR_THEM); wprintw(window->win, "*%s ", nick); waddstr(window->win, message + 4); wprintw(window->win, "\n"); wattroff(window->win, COLOUR_THEM); } else { _win_show_user(window->win, nick, 1); _win_show_message(window->win, message); } } else { if (strncmp(message, "/me ", 4) == 0) { wattron(window->win, COLOUR_ME); wprintw(window->win, "*%s ", nick); waddstr(window->win, message + 4); wprintw(window->win, "\n"); wattroff(window->win, COLOUR_ME); } else { _win_show_user(window->win, nick, 0); _win_show_message(window->win, message); } } // currently in groupchat window if (wins_is_current(window)) { status_bar_active(num); wins_refresh_current(); // not currenlty on groupchat window } else { status_bar_new(num); cons_show_incoming_message(nick, num); if (wins_get_current_num() == 0) { wins_refresh_current(); } if (strcmp(nick, muc_get_room_nick(room_jid)) != 0) { if (prefs_get_boolean(PREF_FLASH)) { flash(); } } window->unread++; } int ui_index = num; if (ui_index == 10) { ui_index = 0; } if (strcmp(nick, muc_get_room_nick(room_jid)) != 0) { if (prefs_get_boolean(PREF_BEEP)) { beep(); } if (prefs_get_boolean(PREF_NOTIFY_MESSAGE)) { Jid *jidp = jid_create(room_jid); notify_room_message(nick, jidp->localpart, ui_index); jid_destroy(jidp); } } }