static void _win_chat_print_incoming_message(ProfWin *window, GTimeVal *tv_stamp, const char * const from, const char * const message) { 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 ", from); waddstr(window->win, message + 4); wprintw(window->win, "\n"); wattroff(window->win, COLOUR_THEM); } else { wattron(window->win, COLOUR_THEM); wprintw(window->win, "%s: ", from); wattroff(window->win, COLOUR_THEM); waddstr(window->win, message); wprintw(window->win, "\n"); } }
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(); } }
/** * as_iso8601_to_datetime: * * Helper function to work around a bug in g_time_val_from_iso8601. * Can be dropped when the bug gets resolved upstream: * https://bugzilla.gnome.org/show_bug.cgi?id=760983 **/ GDateTime* as_iso8601_to_datetime (const gchar *iso_date) { GTimeVal tv; guint dmy[] = {0, 0, 0}; /* nothing set */ if (iso_date == NULL || iso_date[0] == '\0') return NULL; /* try to parse complete ISO8601 date */ if (g_strstr_len (iso_date, -1, " ") != NULL) { if (g_time_val_from_iso8601 (iso_date, &tv) && tv.tv_sec != 0) return g_date_time_new_from_timeval_utc (&tv); } /* g_time_val_from_iso8601() blows goats and won't * accept a valid ISO8601 formatted date without a * time value - try and parse this case */ if (sscanf (iso_date, "%u-%u-%u", &dmy[0], &dmy[1], &dmy[2]) != 3) return NULL; /* create valid object */ return g_date_time_new_utc (dmy[0], dmy[1], dmy[2], 0, 0, 0); }
/** * pk_iso8601_to_datetime: (skip) * @iso_date: The ISO8601 date to convert * * Return value: If valid then a new %GDateTime, else NULL * * Since: 0.8.11 **/ GDateTime * pk_iso8601_to_datetime (const gchar *iso_date) { gboolean ret = FALSE; guint retval; guint d = 0; guint m = 0; guint y = 0; GTimeVal time_val; GDateTime *date = NULL; if (iso_date == NULL || iso_date[0] == '\0') goto out; /* try to parse complete ISO8601 date */ if (g_strstr_len (iso_date, -1, " ") != NULL) ret = g_time_val_from_iso8601 (iso_date, &time_val); if (ret && time_val.tv_sec != 0) { g_debug ("Parsed %s %i", iso_date, ret); date = g_date_time_new_from_timeval_utc (&time_val); goto out; } /* g_time_val_from_iso8601() blows goats and won't * accept a valid ISO8601 formatted date without a * time value - try and parse this case */ retval = sscanf (iso_date, "%u-%u-%u", &y, &m, &d); if (retval != 3) goto out; /* create valid object */ date = g_date_time_new_utc (y, m, d, 0, 0, 0); out: return date; }
/** * mongo_bson_iter_get_value_date_time: * @iter: (in): A #MongoBsonIter. * * Fetches a #GDateTime for the current value pointed to by @iter. * * Returns: A new #GDateTime which should be freed with g_date_time_unref(). */ GDateTime * mongo_bson_iter_get_value_date_time (MongoBsonIter *iter) { GTimeVal tv; g_return_val_if_fail(iter != NULL, NULL); mongo_bson_iter_get_value_timeval(iter, &tv); return g_date_time_new_from_timeval_utc(&tv); }
/** * CacheUtilDatetimeFromString: * @value: String containing the date, in the "{yyyy}-{mm}-{dd}T{hh}:{mm}:{ss}Z" * format (ISO 8601). Dates are always UTC. * @result: (out): GDateTime respresenting the given @value. * * Returns: #TRUE if @result was modified or #FALSE if the date couldn't be * parsed. */ gboolean CacheUtilDatetimeFromString(const gchar *value, GDateTime **result) { GTimeVal tv = {0, 0}; g_assert(result); if (g_time_val_from_iso8601(value, &tv)) { *result = g_date_time_new_from_timeval_utc(&tv); return TRUE; } else { return FALSE; } }
void sv_ev_roster_received(void) { if (prefs_get_boolean(PREF_ROSTER)) { ui_show_roster(); } char *account_name = session_get_account_name(); #ifdef HAVE_LIBGPGME // check pgp key valid if specified ProfAccount *account = accounts_get_account(account_name); if (account && account->pgp_keyid) { char *err_str = NULL; if (!p_gpg_valid_key(account->pgp_keyid, &err_str)) { cons_show_error("Invalid PGP key ID specified: %s, %s", account->pgp_keyid, err_str); } free(err_str); } account_free(account); #endif // send initial presence resource_presence_t conn_presence = accounts_get_login_presence(account_name); char *last_activity_str = accounts_get_last_activity(account_name); if (last_activity_str) { GDateTime *nowdt = g_date_time_new_now_utc(); GTimeVal lasttv; gboolean res = g_time_val_from_iso8601(last_activity_str, &lasttv); if (res) { GDateTime *lastdt = g_date_time_new_from_timeval_utc(&lasttv); GTimeSpan diff_micros = g_date_time_difference(nowdt, lastdt); int diff_secs = (diff_micros / 1000) / 1000; if (prefs_get_boolean(PREF_LASTACTIVITY)) { cl_ev_presence_send(conn_presence, NULL, diff_secs); } else { cl_ev_presence_send(conn_presence, NULL, 0); } g_date_time_unref(lastdt); } else { cl_ev_presence_send(conn_presence, NULL, 0); } free(last_activity_str); g_date_time_unref(nowdt); } else { cl_ev_presence_send(conn_presence, NULL, 0); } const char *fulljid = connection_get_fulljid(); plugins_on_connect(account_name, fulljid); }
void chat_log_chat(const gchar * const login, gchar *other, const gchar * const msg, chat_log_direction_t direction, GTimeVal *tv_stamp) { struct dated_chat_log *dated_log = g_hash_table_lookup(logs, other); // no log for user if (dated_log == NULL) { dated_log = _create_log(other, login); g_hash_table_insert(logs, strdup(other), dated_log); // log exists but needs rolling } else if (_log_roll_needed(dated_log)) { dated_log = _create_log(other, login); g_hash_table_replace(logs, strdup(other), dated_log); } gchar *date_fmt = NULL; GDateTime *dt = NULL; if (tv_stamp == NULL) { dt = g_date_time_new_now_local(); } else { dt = g_date_time_new_from_timeval_utc(tv_stamp); } date_fmt = g_date_time_format(dt, "%H:%M:%S"); FILE *logp = fopen(dated_log->filename, "a"); g_chmod(dated_log->filename, S_IRUSR | S_IWUSR); if (logp != NULL) { if (direction == PROF_IN_LOG) { if (strncmp(msg, "/me ", 4) == 0) { fprintf(logp, "%s - *%s %s\n", date_fmt, other, msg + 4); } else { fprintf(logp, "%s - %s: %s\n", date_fmt, other, msg); } } else { if (strncmp(msg, "/me ", 4) == 0) { fprintf(logp, "%s - *me %s\n", date_fmt, msg + 4); } else { fprintf(logp, "%s - me: %s\n", date_fmt, msg); } } fflush(logp); int result = fclose(logp); if (result == EOF) { log_error("Error closing file %s, errno = %d", dated_log->filename, errno); } } g_free(date_fmt); g_date_time_unref(dt); }
static GDateTime* gnc_g_date_time_new_from_timeval_local (const GTimeVal* tv) { #ifndef G_OS_WIN32 return g_date_time_new_from_timeval_local (tv); #else GTimeZone *tz = gnc_g_time_zone_new_local (); GDateTime *gdt = g_date_time_new_from_timeval_utc (tv); if (!gdt) return gdt; return gnc_g_date_time_adjust_for_dst (gdt, tz); #endif }
static GDateTime * parse_date (const gchar *iso8601_string) { char *padded_date; GDateTime *date; GTimeVal tv; padded_date = g_strconcat (iso8601_string, "T00:00:00Z", NULL); g_time_val_from_iso8601 (padded_date, &tv); date = g_date_time_new_from_timeval_utc (&tv); g_free (padded_date); return date; }
void win_save_print(ProfWin *window, const char show_char, GTimeVal *tstamp, int flags, theme_item_t theme_item, const char * const from, const char * const message) { GDateTime *time; if (tstamp == NULL) { time = g_date_time_new_now_local(); } else { time = g_date_time_new_from_timeval_utc(tstamp); } buffer_push(window->buffer, show_char, time, flags, theme_item, from, message); _win_print(window, show_char, time, flags, theme_item, from, message); }
/** * grl_date_time_from_iso8601: * @date: a date expressed in iso8601 format * * Returns: a newly-allocated #GDateTime set to the time corresponding to * @date, or %NULL if @date could not be parsed properly. * * Since: 0.2.0 */ GDateTime * grl_date_time_from_iso8601 (const gchar *date) { GTimeVal t = { 0, }; gboolean ret; gchar *date_time; gint date_length; if (!date) { return NULL; } ret = g_time_val_from_iso8601 (date, &t); /* second condition works around * https://bugzilla.gnome.org/show_bug.cgi?id=650968 */ if (!ret || (t.tv_sec == 0 && t.tv_usec == 0)) { /* We might be in the case where there is a date alone. In that case, we * take the convention of setting it to noon GMT */ /* Date can could be YYYY, YYYY-MM, YYYY-MM-DD or YYYYMMDD */ date_length = strlen (date); switch (date_length) { case 4: date_time = g_strdup_printf ("%s-01-01T12:00:00Z", date); break; case 7: date_time = g_strdup_printf ("%s-01T12:00:00Z", date); break; default: date_time = g_strdup_printf ("%sT12:00:00Z", date); } ret = g_time_val_from_iso8601 (date_time, &t); g_free (date_time); } if (ret) return g_date_time_new_from_timeval_utc (&t); return NULL; }
void win_print_with_receipt(ProfWin *window, const char show_char, int pad_indent, GTimeVal *tstamp, int flags, theme_item_t theme_item, const char *const from, const char *const message, char *id) { GDateTime *time; if (tstamp == NULL) { time = g_date_time_new_now_local(); } else { time = g_date_time_new_from_timeval_utc(tstamp); } DeliveryReceipt *receipt = malloc(sizeof(struct delivery_receipt_t)); receipt->id = strdup(id); receipt->received = FALSE; buffer_push(window->layout->buffer, show_char, pad_indent, time, flags, theme_item, from, message, receipt); _win_print(window, show_char, pad_indent, time, flags, theme_item, from, message, receipt); // TODO: cross-reference.. this should be replaced by a real event-based system inp_nonblocking(TRUE); g_date_time_unref(time); }
TpDebugMessage * _tp_debug_message_new (gdouble timestamp, const gchar *domain, TpDebugLevel level, const gchar *message) { TpDebugMessage *self; GTimeVal tv; g_return_val_if_fail (domain != NULL, NULL); g_return_val_if_fail (message != NULL, NULL); self = g_object_new (TP_TYPE_DEBUG_MESSAGE, NULL); tv.tv_sec = (glong) timestamp; tv.tv_usec = ((timestamp - (int) timestamp) * 1e6); if (g_strrstr (domain, "/")) { gchar **parts = g_strsplit (domain, "/", 2); self->priv->domain = g_strdup (parts[0]); self->priv->category = g_strdup (parts[1]); g_strfreev (parts); } else { self->priv->domain = g_strdup (domain); self->priv->category = NULL; } self->priv->time = g_date_time_new_from_timeval_utc (&tv); self->priv->level = debug_level_to_log_level_flags (level); self->priv->message = g_strdup (message); g_strchomp (self->priv->message); return self; }
static gboolean news_format_rss_read_from_xml (NewsFormatRss *rss, XmlReader *reader, NewsFeed *feed, GError **error) { GHashTable *categories = NULL; GHashTable *persons = NULL; GHashTable *links = NULL; GomAdapter *adapter; gchar *str; ENTRY; g_return_val_if_fail(NEWS_IS_FORMAT_RSS(rss), FALSE); g_return_val_if_fail(XML_IS_READER(reader), FALSE); g_return_val_if_fail(NEWS_IS_FEED(feed), FALSE); adapter = news_format_get_adapter(NEWS_FORMAT(rss)); g_assert(adapter); skip: if (!xml_reader_read_to_next(reader) || !xml_reader_is_a(reader, "rss")) { if (xml_reader_is_a(reader, "xml-stylesheet") || xml_reader_is_a(reader, "#comment")) { goto skip; } RETURN_ERROR; } if (!xml_reader_is_a_local(reader, "rss")) { RETURN_ERROR; } if ((str = xml_reader_get_attribute(reader, "version"))) { if (!!g_strcmp0(str, "2.0")) { g_set_error(error, XML_READER_ERROR, XML_READER_ERROR_INVALID, _("RSS Version \"%s\" is not supported."), str); g_free(str); RETURN(FALSE); } g_free(str); } if (!xml_reader_read_start_element(reader, "channel")) { RETURN_ERROR; } persons = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref); categories = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref); links = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref); xml_reader_read(reader); for (xml_reader_read_to_next(reader); xml_reader_get_node_type(reader) != XML_READER_TYPE_END_ELEMENT; xml_reader_read_to_next(reader)) { if ((xml_reader_get_node_type(reader) != XML_READER_TYPE_ELEMENT) || rss->priv->error) { g_hash_table_destroy(categories); g_hash_table_destroy(persons); g_hash_table_destroy(links); RETURN_ERROR; } if (xml_reader_is_a_local(reader, "title")) { str = xml_reader_read_string(reader); g_object_set(feed, "title", str, NULL); g_free(str); } else if (xml_reader_is_a_local(reader, "link")) { GomCollection *collection; NewsLink *link_; g_object_get(feed, "links", &collection, NULL); if ((link_ = news_format_rss_read_link(rss, reader, links))) { gom_collection_add_resource(collection, GOM_RESOURCE(link_)); g_object_unref(link_); } g_object_unref(collection); } else if (xml_reader_is_a_local(reader, "description")) { str = xml_reader_read_string(reader); g_object_set(feed, "description", str, NULL); g_free(str); xml_reader_read_end_element(reader); } else if (xml_reader_is_a_local(reader, "language")) { str = xml_reader_read_string(reader); g_object_set(feed, "language", str, NULL); g_free(str); } else if (xml_reader_is_a_local(reader, "copyright")) { str = xml_reader_read_string(reader); g_object_set(feed, "copyright", str, NULL); g_free(str); } else if (xml_reader_is_a_local(reader, "managingEditor")) { GomCollection *collection; NewsPerson *person; g_object_get(feed, "authors", &collection, NULL); if ((person = news_format_rss_read_person(rss, reader, persons))) { gom_collection_add_resource(collection, GOM_RESOURCE(person)); g_object_unref(person); } g_object_unref(collection); } else if (xml_reader_is_a_local(reader, "pubDate") || xml_reader_is_a_local(reader, "lastBuildDate")) { GDateTime *dt; GTimeVal tv; if ((str = xml_reader_read_string(reader))) { if (g_time_val_from_iso8601(str, &tv)) { if ((dt = g_date_time_new_from_timeval_utc(&tv))) { g_object_set(feed, "last-updated-at", dt, NULL); g_date_time_unref(dt); } } g_free(str); } } else if (xml_reader_is_a_local(reader, "category")) { GomCollection *collection; NewsCategory *category; g_object_get(feed, "categories", &collection, NULL); if ((category = news_format_rss_read_category(rss, reader, categories))) { gom_collection_add_resource(collection, GOM_RESOURCE(category)); g_object_unref(category); } g_object_unref(collection); } else if (xml_reader_is_a_local(reader, "generator")) { str = xml_reader_read_string(reader); g_object_set(feed, "generator", str, NULL); g_free(str); } else if (xml_reader_is_a_local(reader, "item")) { GomCollection *collection; NewsItem *item; g_object_get(feed, "items", &collection, NULL); item = g_object_new(NEWS_TYPE_ITEM, "adapter", adapter, "is-new", TRUE, NULL); if (news_format_rss_read_item(rss, reader, item, persons, categories, links)) { gom_collection_add_resource(collection, GOM_RESOURCE(item)); } g_object_unref(item); g_object_unref(collection); } } g_hash_table_destroy(categories); g_hash_table_destroy(links); g_hash_table_destroy(persons); RETURN(TRUE); }
static int _roster_result_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata) { const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID); if (g_strcmp0(id, "roster") != 0) { return 1; } // handle initial roster response xmpp_stanza_t *query = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_QUERY); xmpp_stanza_t *item = xmpp_stanza_get_children(query); while (item) { const char *barejid = xmpp_stanza_get_attribute(item, STANZA_ATTR_JID); gchar *barejid_lower = g_utf8_strdown(barejid, -1); const char *name = xmpp_stanza_get_attribute(item, STANZA_ATTR_NAME); const char *sub = xmpp_stanza_get_attribute(item, STANZA_ATTR_SUBSCRIPTION); // do not set nickname to empty string, set to NULL instead if (name && (strlen(name) == 0)) name = NULL; gboolean pending_out = FALSE; const char *ask = xmpp_stanza_get_attribute(item, STANZA_ATTR_ASK); if (g_strcmp0(ask, "subscribe") == 0) { pending_out = TRUE; } GSList *groups = _get_groups_from_item(item); gboolean added = roster_add(barejid_lower, name, groups, sub, pending_out); if (!added) { log_warning("Attempt to add contact twice: %s", barejid_lower); } g_free(barejid_lower); item = xmpp_stanza_get_next(item); } sv_ev_roster_received(); char *account = jabber_get_account_name(); resource_presence_t conn_presence = accounts_get_login_presence(account); char *last_activity_str = accounts_get_last_activity(account); if (last_activity_str) { GDateTime *nowdt = g_date_time_new_now_utc(); GTimeVal lasttv; gboolean res = g_time_val_from_iso8601(last_activity_str, &lasttv); if (res) { GDateTime *lastdt = g_date_time_new_from_timeval_utc(&lasttv); GTimeSpan diff_micros = g_date_time_difference(nowdt, lastdt); int diff_secs = (diff_micros / 1000) / 1000; cl_ev_presence_send(conn_presence, NULL, diff_secs); g_date_time_unref(lastdt); } else { cl_ev_presence_send(conn_presence, NULL, 0); } free(last_activity_str); g_date_time_unref(nowdt); } else { cl_ev_presence_send(conn_presence, NULL, 0); } return 1; }
static gboolean news_format_rss_read_item (NewsFormatRss *rss, XmlReader *reader, NewsItem *item, GHashTable *persons, GHashTable *categories, GHashTable *links) { gchar *str; xml_reader_read(reader); for (; xml_reader_get_node_type(reader) != XML_READER_TYPE_END_ELEMENT; xml_reader_read_to_next(reader)) { if (rss->priv->error) { break; } if (xml_reader_is_a_local(reader, "author")) { GomCollection *collection; NewsPerson *person; g_object_get(item, "authors", &collection, NULL); if ((person = news_format_rss_read_person(rss, reader, persons))) { gom_collection_add_resource(collection, GOM_RESOURCE(person)); g_object_unref(person); } g_object_unref(collection); } else if (xml_reader_is_a_local(reader, "category")) { GomCollection *collection; NewsCategory *category; g_object_get(item, "categories", &collection, NULL); if ((category = news_format_rss_read_category(rss, reader, categories))) { gom_collection_add_resource(collection, GOM_RESOURCE(category)); g_object_unref(category); } g_object_unref(collection); } else if (xml_reader_is_a_local(reader, "link")) { GomCollection *collection; NewsLink *link_; g_object_get(item, "links", &collection, NULL); if ((link_ = news_format_rss_read_link(rss, reader, links))) { gom_collection_add_resource(collection, GOM_RESOURCE(link_)); g_object_unref(link_); } g_object_unref(collection); } else if (xml_reader_is_a_local(reader, "guid")) { str = xml_reader_read_string(reader); g_object_set(item, "item-id", str, NULL); g_free(str); } else if (xml_reader_is_a_local(reader, "description")) { str = xml_reader_read_inner_xml(reader); g_object_set(item, "summary", str, NULL); g_free(str); xml_reader_read_end_element(reader); } else if (xml_reader_is_a_local(reader, "title")) { str = xml_reader_read_string(reader); g_object_set(item, "title", str, NULL); g_free(str); } else if (xml_reader_is_a_local(reader, "pubDate")) { GDateTime *dt; GTimeVal tv; if ((str = xml_reader_read_string(reader))) { if (g_time_val_from_iso8601(str, &tv)) { if ((dt = g_date_time_new_from_timeval_utc(&tv))) { g_object_set(item, "last-updated-at", dt, NULL); g_date_time_unref(dt); } } g_free(str); } } else if (xml_reader_is_a_local(reader, "source")) { /* * TODO: */ } } xml_reader_read_end_element(reader); return TRUE; }
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); }