static void sig_presence_changed(XMPP_SERVER_REC *server, const char *full_jid, int show, const char *status) { XMPP_ROSTER_USER_REC *user; WINDOW_REC *window; const char *msg; char *name; g_return_if_fail(IS_XMPP_SERVER(server)); g_return_if_fail(full_jid != NULL); g_return_if_fail(0 <= show && show < XMPP_PRESENCE_SHOW_LEN); window = fe_xmpp_status_get_window(server); msg = fe_xmpp_presence_show[show]; user = rosters_find_user(server->roster, full_jid, NULL, NULL); name = user != NULL && user->name != NULL ? format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_NAME, user->name, full_jid) : format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_JID, full_jid); if (status != NULL) printformat_module_window(MODULE_NAME, window, MSGLEVEL_CRAP, XMPPTXT_PRESENCE_CHANGE_REASON, name, msg, status); else printformat_module_window(MODULE_NAME, window, MSGLEVEL_CRAP, XMPPTXT_PRESENCE_CHANGE, name, msg); g_free(name); }
static void show_begin_of_roster(XMPP_SERVER_REC *server) { char *show, *status, *priority, *text, *resources, *pgp_keyid; g_return_if_fail(IS_XMPP_SERVER(server)); show = (server->show == XMPP_PRESENCE_AVAILABLE) ? NULL : format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_RESOURCE_SHOW, xmpp_presence_show[server->show]); status = (server->away_reason == NULL || strcmp(server->away_reason, " ") == 0) ? NULL : format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_RESOURCE_STATUS, server->away_reason); priority = g_strdup_printf("%d", server->priority); pgp_keyid = !settings_get_str("xmpp_pgp") ? NULL : \ format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_PGP_KEYID, settings_get_str("xmpp_pgp")); text = format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_RESOURCE, show, server->resource, priority, status, pgp_keyid); g_free(show); g_free(status); g_free(priority); resources = get_resources(server, server->my_resources); printformat_module(MODULE_NAME, server, NULL, MSGLEVEL_CRAP, XMPPTXT_BEGIN_OF_ROSTER, server->jid, text, resources); g_free(text); g_free(resources); }
static void sig_version(XMPP_SERVER_REC *server, const char *jid, const char *client, const char *version, const char *os) { XMPP_ROSTER_USER_REC *user; char *name, *str; g_return_if_fail(jid != NULL); if (client == NULL && version == NULL && os == NULL) return; str = g_strconcat("is running ", client != NULL ? client : "", client != NULL && version != NULL ? " " : "", version != NULL ? version : "", (client != NULL || version != NULL) && os != NULL ? " - " : "", os != NULL ? "on " : "", os != NULL ? os : "", (void *)NULL); user = rosters_find_user(server->roster, jid, NULL, NULL); name = user != NULL && user->name != NULL ? format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_NAME, user->name, jid) : format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_JID, jid); printformat_module(MODULE_NAME, server, jid, MSGLEVEL_CRAP, XMPPTXT_MESSAGE_EVENT, name, str); g_free(name); g_free(str); }
static void show_user(XMPP_SERVER_REC *server, XMPP_ROSTER_USER_REC *user) { const char *first_show; char *name, *resources, *subscription; g_return_if_fail(IS_SERVER(server)); g_return_if_fail(user != NULL); if (user->resources == NULL) first_show = xmpp_presence_show[user->error ? XMPP_PRESENCE_ERROR : XMPP_PRESENCE_UNAVAILABLE]; else first_show = get_first_show(user->resources); name = user->name != NULL ? format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_NAME, user->name, user->jid) : format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_JID, user->jid); resources = get_resources(server, user->resources); subscription = user->subscription == XMPP_SUBSCRIPTION_BOTH ? NULL : format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_SUBSCRIPTION, xmpp_subscription[user->subscription]); printformat_module(MODULE_NAME, server, NULL, MSGLEVEL_CRAP, XMPPTXT_ROSTER_CONTACT, first_show, name, resources, subscription); g_free(name); g_free(resources); g_free(subscription); }
static void sig_presence_changed(XMPP_SERVER_REC *server, const char *full_jid, int show, const char *status) { XMPP_QUERY_REC *rec; XMPP_ROSTER_USER_REC *user; const char *msg; char *name; g_return_if_fail(server != NULL); g_return_if_fail(full_jid != NULL); g_return_if_fail(0 <= show && show < XMPP_PRESENCE_SHOW_LEN); if ((rec = xmpp_query_find(server, full_jid)) == NULL) return; msg = fe_xmpp_presence_show[show]; user = rosters_find_user(server->roster, full_jid, NULL, NULL); name = user != NULL && user->name != NULL ? format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_NAME, user->name, full_jid) : format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_JID, full_jid); if (status != NULL) printformat_module(MODULE_NAME, server, full_jid, MSGLEVEL_CRAP, XMPPTXT_PRESENCE_CHANGE_REASON, name, msg, status); else printformat_module(MODULE_NAME, server, full_jid, MSGLEVEL_CRAP, XMPPTXT_PRESENCE_CHANGE, name, msg); }
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); }
static void cmd_oper(const char *data, IRC_SERVER_REC *server) { char *nick, *password, *format; void *free_arg; g_return_if_fail(data != NULL); if (!IS_IRC_SERVER(server) || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); if (!cmd_get_params(data, &free_arg, 2, &nick, &password)) return; if (*password == '\0') { /* password not given, ask it. irc/core handles the /OPER when password is given */ OPER_PASS_REC *rec; rec = g_new(OPER_PASS_REC, 1); rec->server = server; rec->nick = g_strdup(*nick != '\0' ? nick : server->nick); format = format_get_text(MODULE_NAME, NULL, server, NULL, IRCTXT_ASK_OPER_PASS); keyboard_entry_redirect((SIGNAL_FUNC) cmd_oper_got_pass, format, ENTRY_REDIRECT_FLAG_HIDDEN, rec); g_free(format); signal_stop(); } cmd_params_free(free_arg); }
/* SYNTAX: SAVE [<file>] */ static void cmd_save(const char *data) { GHashTable *optlist; char *format, *fname; void *free_arg; if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS, "save", &optlist, &fname)) return; if (*fname == '\0') fname = mainconfig->fname; if (!irssi_config_is_changed(fname)) settings_save_fe(fname); else { /* config file modified outside irssi */ printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_CONFIG_MODIFIED, fname); format = format_get_text(MODULE_NAME, NULL, NULL, NULL, TXT_OVERWRITE_CONFIG); keyboard_entry_redirect((SIGNAL_FUNC) settings_save_confirm, format, 0, g_strdup(fname)); g_free(format); } cmd_params_free(free_arg); }
static char * get_resources(XMPP_SERVER_REC *server, GSList *list) { GSList *tmp; GString *resources; XMPP_ROSTER_RESOURCE_REC *resource; char *show, *status, *status_str, *priority, *text, *pgp_keyid; if (list == NULL) return NULL; resources = g_string_new(NULL); for (tmp = list; tmp != NULL; tmp = tmp->next) { resource = tmp->data; show = (resource->show == XMPP_PRESENCE_AVAILABLE) ? NULL : format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_RESOURCE_SHOW, xmpp_presence_show[resource->show]); status_str = g_strdup(resource->status); status = (resource->status == NULL) ? NULL : format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_RESOURCE_STATUS, status_str); g_free(status_str); priority = g_strdup_printf("%d", resource->priority); pgp_keyid = !resource->pgp_keyid ? NULL : \ format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_PGP_KEYID, resource->pgp_keyid); text = format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_RESOURCE, show, resource->name, priority, status, pgp_keyid); g_free(show); g_free(status); g_free(priority); g_string_append(resources, text); g_free(text); } text = resources->str; g_string_free(resources, FALSE); return text; }
static void sig_unsubscribed(XMPP_SERVER_REC *server, const char *jid) { XMPP_ROSTER_USER_REC *user; char *name; g_return_if_fail(IS_SERVER(server)); g_return_if_fail(jid != NULL); user = rosters_find_user(server->roster, jid, NULL, NULL); name = user != NULL && user->name != NULL ? format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_NAME, user->name, jid) : format_get_text(MODULE_NAME, NULL, server, NULL, XMPPTXT_FORMAT_JID, jid); if (settings_get_bool("xmpp_status_window")) printformat_module_window(MODULE_NAME, fe_xmpp_status_get_window(server), MSGLEVEL_CRAP, XMPPTXT_UNSUBSCRIBED, name); else printformat_module(MODULE_NAME, server, NULL, MSGLEVEL_CRAP, XMPPTXT_UNSUBSCRIBED, name); g_free(name); }
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 display_sorted_nicks(CHANNEL_REC *channel, GSList *nicklist) { WINDOW_REC *window; TEXT_DEST_REC dest; GString *str; GSList *tmp; char *format, *stripped, *prefix_format; char *linebuf, nickmode[2] = { 0, 0 }; int *columns, cols, rows, last_col_rows, col, row, max_width; int item_extra, linebuf_size, formatnum; window = window_find_closest(channel->server, channel->visible_name, MSGLEVEL_CLIENTCRAP); max_width = window->width; /* get the length of item extra stuff ("[ ] ") */ format = format_get_text(MODULE_NAME, NULL, channel->server, channel->visible_name, TXT_NAMES_NICK, " ", ""); stripped = strip_codes(format); item_extra = strlen(stripped); g_free(stripped); g_free(format); if (settings_get_int("names_max_width") > 0 && settings_get_int("names_max_width") < max_width) max_width = settings_get_int("names_max_width"); /* remove width of the timestamp from max_width */ format_create_dest(&dest, channel->server, channel->visible_name, MSGLEVEL_CLIENTCRAP, NULL); format = format_get_line_start(current_theme, &dest, time(NULL)); if (format != NULL) { stripped = strip_codes(format); max_width -= strlen(stripped); g_free(stripped); g_free(format); } /* remove width of the prefix from max_width */ prefix_format = format_get_text(MODULE_NAME, NULL, channel->server, channel->visible_name, TXT_NAMES_PREFIX, channel->visible_name); if (prefix_format != NULL) { stripped = strip_codes(prefix_format); max_width -= strlen(stripped); g_free(stripped); } if (max_width <= 0) { /* we should always have at least some space .. if we really don't, it won't show properly anyway. */ max_width = 10; } /* calculate columns */ cols = get_max_column_count(nicklist, get_nick_length, max_width, settings_get_int("names_max_columns"), item_extra, 3, &columns, &rows); nicklist = columns_sort_list(nicklist, rows); /* rows in last column */ last_col_rows = rows-(cols*rows-g_slist_length(nicklist)); if (last_col_rows == 0) last_col_rows = rows; str = g_string_new(prefix_format); linebuf_size = max_width+1; linebuf = g_malloc(linebuf_size); col = 0; row = 0; for (tmp = nicklist; tmp != NULL; tmp = tmp->next) { NICK_REC *rec = tmp->data; if (rec->other) nickmode[0] = rec->other; else if (rec->op) nickmode[0] = '@'; else if (rec->halfop) nickmode[0] = '%'; else if (rec->voice) nickmode[0] = '+'; else nickmode[0] = ' '; if (linebuf_size < columns[col]-item_extra+1) { linebuf_size = (columns[col]-item_extra+1)*2; linebuf = g_realloc(linebuf, linebuf_size); } memset(linebuf, ' ', columns[col]-item_extra); linebuf[columns[col]-item_extra] = '\0'; memcpy(linebuf, rec->nick, strlen(rec->nick)); formatnum = rec->op ? TXT_NAMES_NICK_OP : rec->halfop ? TXT_NAMES_NICK_HALFOP : rec->voice ? TXT_NAMES_NICK_VOICE : TXT_NAMES_NICK; format = format_get_text(MODULE_NAME, NULL, channel->server, channel->visible_name, formatnum, nickmode, linebuf); g_string_append(str, format); g_free(format); if (++col == cols) { printtext(channel->server, channel->visible_name, MSGLEVEL_CLIENTCRAP, "%s", str->str); g_string_truncate(str, 0); if (prefix_format != NULL) g_string_assign(str, prefix_format); col = 0; row++; if (row == last_col_rows) cols--; } } if (str->len > strlen(prefix_format)) { printtext(channel->server, channel->visible_name, MSGLEVEL_CLIENTCRAP, "%s", str->str); } g_slist_free(nicklist); g_string_free(str, TRUE); g_free_not_null(columns); g_free_not_null(prefix_format); g_free(linebuf); }