Beispiel #1
0
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();
    }
}
Beispiel #2
0
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();
        }
    }
}
Beispiel #3
0
void
ui_duck_result(const char * const result)
{
    ProfWin *window = wins_get_by_recipient("DuckDuckGo search");

    if (window != NULL) {
        win_print_time(window, '-');
        wattron(window->win, COLOUR_THEM);
        wprintw(window->win, "Result : ");
        wattroff(window->win, COLOUR_THEM);

        glong offset = 0;
        while (offset < g_utf8_strlen(result, -1)) {
            gchar *ptr = g_utf8_offset_to_pointer(result, offset);
            gunichar unichar = g_utf8_get_char(ptr);
            if (unichar == '\n') {
                wprintw(window->win, "\n");
                win_print_time(window, '-');
            } else {
                gchar *string = g_ucs4_to_utf8(&unichar, 1, NULL, NULL, NULL);
                if (string != NULL) {
                    wprintw(window->win, string);
                    g_free(string);
                }
            }

            offset++;
        }

        wprintw(window->win, "\n");
    }
}
Beispiel #4
0
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();
    }
}
Beispiel #5
0
void
ui_open_duck_win(void)
{
    ProfWin *window = wins_get_by_recipient("DuckDuckGo search");
    if (window != NULL) {
        int num = wins_get_num(window);
        ui_switch_win(num);
    }
}
Beispiel #6
0
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();
    }
}
Beispiel #7
0
void
ui_outgoing_msg(const char * const from, const char * const to,
    const char * const message)
{
    PContact contact = roster_get_contact(to);
    ProfWin *window = wins_get_by_recipient(to);
    int num = 0;

    // create new window
    if (window == NULL) {
        Jid *jid = jid_create(to);

        if (muc_room_is_active(jid)) {
            window = wins_new(to, WIN_PRIVATE);
        } else {
            window = wins_new(to, WIN_CHAT);
        }

        jid_destroy(jid);
        num = wins_get_num(window);

        if (prefs_get_boolean(PREF_CHLOG) && prefs_get_boolean(PREF_HISTORY)) {
            _win_show_history(window->win, num, to);
        }

        if (contact != NULL) {
            if (strcmp(p_contact_presence(contact), "offline") == 0) {
                const char const *show = p_contact_presence(contact);
                const char const *status = p_contact_status(contact);
                _show_status_string(window, to, show, status, NULL, "--", "offline");
            }
        }

    // use existing window
    } else {
        num = wins_get_num(window);
    }

    win_print_time(window, '-');
    if (strncmp(message, "/me ", 4) == 0) {
        wattron(window->win, COLOUR_ME);
        wprintw(window->win, "*%s ", from);
        wprintw(window->win, "%s", message + 4);
        wprintw(window->win, "\n");
        wattroff(window->win, COLOUR_ME);
    } else {
        _win_show_user(window->win, from, 0);
        _win_show_message(window->win, message);
    }
    ui_switch_win(num);
}
Beispiel #8
0
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();
    }
}
Beispiel #9
0
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();
    }
}
Beispiel #10
0
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();
    }
}
Beispiel #11
0
void
ui_room_join(Jid *jid)
{
    ProfWin *window = wins_get_by_recipient(jid->barejid);
    int num = 0;

    // create new window
    if (window == NULL) {
        window = wins_new(jid->barejid, WIN_MUC);
    }

    num = wins_get_num(window);
    ui_switch_win(num);
}
Beispiel #12
0
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();
        }
    }
}
Beispiel #13
0
void
ui_duck(const char * const query)
{
    ProfWin *window = wins_get_by_recipient("DuckDuckGo search");
    if (window != NULL) {
        win_print_time(window, '-');
        wprintw(window->win, "\n");
        win_print_time(window, '-');
        wattron(window->win, COLOUR_ME);
        wprintw(window->win, "Query  : ");
        wattroff(window->win, COLOUR_ME);
        wprintw(window->win, query);
        wprintw(window->win, "\n");
    }
}
Beispiel #14
0
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();
    }
}
Beispiel #15
0
void
ui_prune_wins(void)
{
    jabber_conn_status_t conn_status = jabber_get_connection_status();
    gboolean pruned = FALSE;

    GSList *recipients = wins_get_prune_recipients();
    if (recipients != NULL) {
        pruned = TRUE;
    }
    GSList *curr = recipients;
    while (curr != NULL) {
        char *recipient = curr->data;

        if (conn_status == JABBER_CONNECTED) {
            if (prefs_get_boolean(PREF_STATES)) {

                // send <gone/> chat state before closing
                if (chat_session_get_recipient_supports(recipient)) {
                    chat_session_set_gone(recipient);
                    message_send_gone(recipient);
                    chat_session_end(recipient);
                }
            }
        }

        ProfWin *window = wins_get_by_recipient(recipient);
        int num = wins_get_num(window);
        ui_close_win(num);

        curr = g_slist_next(curr);
    }

    if (recipients != NULL) {
        g_slist_free(recipients);
    }

    wins_tidy();
    if (pruned) {
        cons_show("Windows pruned.");
    } else {
        cons_show("No prune needed.");
    }
}
Beispiel #16
0
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();
    }
}
Beispiel #17
0
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();
    }
}
Beispiel #18
0
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);
    }
}
Beispiel #19
0
void
ui_new_chat_win(const char * const to)
{
    // if the contact is offline, show a message
    PContact contact = roster_get_contact(to);
    ProfWin *window = wins_get_by_recipient(to);
    int num = 0;

    // create new window
    if (window == NULL) {
        Jid *jid = jid_create(to);

        if (muc_room_is_active(jid)) {
            window = wins_new(to, WIN_PRIVATE);
        } else {
            window = wins_new(to, WIN_CHAT);
        }

        jid_destroy(jid);
        num = wins_get_num(window);

        if (prefs_get_boolean(PREF_CHLOG) && prefs_get_boolean(PREF_HISTORY)) {
            _win_show_history(window->win, num, to);
        }

        if (contact != NULL) {
            if (strcmp(p_contact_presence(contact), "offline") == 0) {
                const char const *show = p_contact_presence(contact);
                const char const *status = p_contact_status(contact);
                _show_status_string(window, to, show, status, NULL, "--", "offline");
            }
        }
    } else {
        num = wins_get_num(window);
    }

    ui_switch_win(num);
}
Beispiel #20
0
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);
    }
}
Beispiel #21
0
static void
_title_bar_draw(void)
{
    werase(win);

    // show title
    wmove(win, 0, 0);
    int i;
    for (i = 0; i < 45; i++)
        waddch(win, ' ');
    mvwprintw(win, 0, 0, " %s", current_title);


#ifdef HAVE_LIBOTR
    // show privacy
    if (current_recipient != NULL) {
        char *recipient_jid = roster_barejid_from_name(current_recipient);
        ProfWin *current = wins_get_by_recipient(recipient_jid);
        if (current != NULL) {
            if (current->type == WIN_CHAT) {
                if (!current->is_otr) {
                    if (prefs_get_boolean(PREF_OTR_WARN)) {
                        wprintw(win, " ");
                        wattron(win, COLOUR_TITLE_BRACKET);
                        wprintw(win, "[");
                        wattroff(win, COLOUR_TITLE_BRACKET);
                        wattron(win, COLOUR_TITLE_UNENCRYPTED);
                        wprintw(win, "unencrypted");
                        wattroff(win, COLOUR_TITLE_UNENCRYPTED);
                        wattron(win, COLOUR_TITLE_BRACKET);
                        wprintw(win, "]");
                        wattroff(win, COLOUR_TITLE_BRACKET);
                    }
                } else {
                    wprintw(win, " ");
                    wattron(win, COLOUR_TITLE_BRACKET);
                    wprintw(win, "[");
                    wattroff(win, COLOUR_TITLE_BRACKET);
                    wattron(win, COLOUR_TITLE_ENCRYPTED);
                    wprintw(win, "OTR");
                    wattroff(win, COLOUR_TITLE_ENCRYPTED);
                    wattron(win, COLOUR_TITLE_BRACKET);
                    wprintw(win, "]");
                    wattroff(win, COLOUR_TITLE_BRACKET);
                    if (current->is_trusted) {
                        wprintw(win, " ");
                        wattron(win, COLOUR_TITLE_BRACKET);
                        wprintw(win, "[");
                        wattroff(win, COLOUR_TITLE_BRACKET);
                        wattron(win, COLOUR_TITLE_TRUSTED);
                        wprintw(win, "trusted");
                        wattroff(win, COLOUR_TITLE_TRUSTED);
                        wattron(win, COLOUR_TITLE_BRACKET);
                        wprintw(win, "]");
                        wattroff(win, COLOUR_TITLE_BRACKET);
                    } else {
                        wprintw(win, " ");
                        wattron(win, COLOUR_TITLE_BRACKET);
                        wprintw(win, "[");
                        wattroff(win, COLOUR_TITLE_BRACKET);
                        wattron(win, COLOUR_TITLE_UNTRUSTED);
                        wprintw(win, "untrusted");
                        wattroff(win, COLOUR_TITLE_UNTRUSTED);
                        wattron(win, COLOUR_TITLE_BRACKET);
                        wprintw(win, "]");
                        wattroff(win, COLOUR_TITLE_BRACKET);
                    }
                }
            }
        }
    }
#endif

    // show contact typing
    if (typing) {
        wprintw(win, " (typing...)");
    }

    // show presence
    int cols = getmaxx(stdscr);

    wattron(win, COLOUR_TITLE_BRACKET);
    mvwaddch(win, 0, cols - 14, '[');
    wattroff(win, COLOUR_TITLE_BRACKET);

    switch (current_presence)
    {
        case CONTACT_ONLINE:
            mvwprintw(win, 0, cols - 13, " ...online ");
            break;
        case CONTACT_AWAY:
            mvwprintw(win, 0, cols - 13, " .....away ");
            break;
        case CONTACT_DND:
            mvwprintw(win, 0, cols - 13, " ......dnd ");
            break;
        case CONTACT_CHAT:
            mvwprintw(win, 0, cols - 13, " .....chat ");
            break;
        case CONTACT_XA:
            mvwprintw(win, 0, cols - 13, " .......xa ");
            break;
        case CONTACT_OFFLINE:
            mvwprintw(win, 0, cols - 13, " ..offline ");
            break;
    }

    wattron(win, COLOUR_TITLE_BRACKET);
    mvwaddch(win, 0, cols - 2, ']');
    wattroff(win, COLOUR_TITLE_BRACKET);

    wnoutrefresh(win);
    inp_put_back();
}
Beispiel #22
0
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);
        }
    }
}
Beispiel #23
0
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);
}