Files
profanity/src/ui/console.c
Michael Vetter 85520ecdc5 Remove unanimous MAM display
For some time users could choose to have the old way "unanimous" where
all the MUC history is just grey (or whatever was set). Now it is always
just displayed like regular new incoming MUC text.
2020-04-25 17:19:02 +02:00

2672 lines
85 KiB
C

/*
* console.c
* vim: expandtab:ts=4:sts=4:sw=4
*
* Copyright (C) 2012 - 2019 James Booth <boothj5@gmail.com>
* Copyright (C) 2019 - 2020 Michael Vetter <jubalh@iodoru.org>
*
* This file is part of Profanity.
*
* Profanity is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Profanity is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Profanity. If not, see <https://www.gnu.org/licenses/>.
*
* In addition, as a special exception, the copyright holders give permission to
* link the code of portions of this program with the OpenSSL library under
* certain conditions as described in each individual source file, and
* distribute linked combinations including the two.
*
* You must obey the GNU General Public License in all respects for all of the
* code used other than OpenSSL. If you modify file(s) with this exception, you
* may extend this exception to your version of the file(s), but you are not
* obligated to do so. If you do not wish to do so, delete this exception
* statement from your version. If you delete this exception statement from all
* source files in the program, then also delete it here.
*
*/
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#ifdef HAVE_NCURSESW_NCURSES_H
#include <ncursesw/ncurses.h>
#elif HAVE_NCURSES_H
#include <ncurses.h>
#endif
#include "common.h"
#include "log.h"
#include "config/preferences.h"
#include "config/theme.h"
#include "command/cmd_defs.h"
#include "ui/window_list.h"
#include "ui/ui.h"
#include "ui/window.h"
#include "ui/statusbar.h"
#include "xmpp/xmpp.h"
#include "xmpp/muc.h"
#include "xmpp/roster_list.h"
#ifdef HAVE_GIT_VERSION
#include "gitversion.h"
#endif
static void _cons_splash_logo(void);
void _show_roster_contacts(GSList *list, gboolean show_groups);
void
cons_debug(const char *const msg, ...)
{
ProfWin *console = wins_get_console();
if (strcmp(PACKAGE_STATUS, "development") == 0) {
va_list arg;
va_start(arg, msg);
GString *fmt_msg = g_string_new(NULL);
g_string_vprintf(fmt_msg, msg, arg);
win_println(console, THEME_DEFAULT, "-", "%s", fmt_msg->str);
g_string_free(fmt_msg, TRUE);
va_end(arg);
}
}
void
cons_show(const char *const msg, ...)
{
ProfWin *console = wins_get_console();
va_list arg;
va_start(arg, msg);
GString *fmt_msg = g_string_new(NULL);
g_string_vprintf(fmt_msg, msg, arg);
win_println(console, THEME_DEFAULT, "-", "%s", fmt_msg->str);
g_string_free(fmt_msg, TRUE);
va_end(arg);
}
void
cons_show_padded(int pad, const char *const msg, ...)
{
ProfWin *console = wins_get_console();
va_list arg;
va_start(arg, msg);
GString *fmt_msg = g_string_new(NULL);
g_string_vprintf(fmt_msg, msg, arg);
win_println_indent(console, pad, "%s", fmt_msg->str);
g_string_free(fmt_msg, TRUE);
va_end(arg);
}
void
cons_show_help(const char *const cmd, CommandHelp *help)
{
ProfWin *console = wins_get_console();
cons_show("");
win_println(console, THEME_HELP_HEADER, "-", "%s", &cmd[1]);
win_print(console, THEME_HELP_HEADER, "-", "");
int i;
for (i = 0; i < strlen(cmd) - 1 ; i++) {
win_append(console, THEME_HELP_HEADER, "-");
}
win_appendln(console, THEME_HELP_HEADER, "");
cons_show("");
win_println(console, THEME_HELP_HEADER, "-", "Synopsis");
ui_show_lines(console, help->synopsis);
cons_show("");
win_println(console, THEME_HELP_HEADER, "-", "Description");
win_println(console, THEME_DEFAULT, "-", "%s", help->desc);
int maxlen = 0;
for (i = 0; help->args[i][0] != NULL; i++) {
if (strlen(help->args[i][0]) > maxlen)
maxlen = strlen(help->args[i][0]);
}
if (i > 0) {
cons_show("");
win_println(console, THEME_HELP_HEADER, "-", "Arguments");
for (i = 0; help->args[i][0] != NULL; i++) {
win_println_indent(console, maxlen + 3, "%-*s: %s", maxlen + 1, help->args[i][0], help->args[i][1]);
}
}
if (g_strv_length((gchar**)help->examples) > 0) {
cons_show("");
win_println(console, THEME_HELP_HEADER, "-", "Examples");
ui_show_lines(console, help->examples);
}
}
void
cons_bad_cmd_usage(const char *const cmd)
{
GString *msg = g_string_new("");
g_string_printf(msg, "Invalid usage, see '/help %s' for details.", &cmd[1]);
cons_show("");
cons_show(msg->str);
g_string_free(msg, TRUE);
}
void
cons_show_error(const char *const msg, ...)
{
ProfWin *console = wins_get_console();
va_list arg;
va_start(arg, msg);
GString *fmt_msg = g_string_new(NULL);
g_string_vprintf(fmt_msg, msg, arg);
win_println(console, THEME_ERROR, "-", "%s", fmt_msg->str);
g_string_free(fmt_msg, TRUE);
va_end(arg);
cons_alert();
}
void
cons_show_tlscert_summary(TLSCertificate *cert)
{
if (!cert) {
return;
}
cons_show("Subject : %s", cert->subject_commonname);
cons_show("Issuer : %s", cert->issuer_commonname);
cons_show("Fingerprint : %s", cert->fingerprint);
}
void
cons_show_tlscert(TLSCertificate *cert)
{
if (!cert) {
return;
}
cons_show("Certificate:");
cons_show(" Subject:");
if (cert->subject_commonname) {
cons_show(" Common name : %s", cert->subject_commonname);
}
if (cert->subject_distinguishedname) {
cons_show(" Distinguished name : %s", cert->subject_distinguishedname);
}
if (cert->subject_organisation) {
cons_show(" Organisation : %s", cert->subject_organisation);
}
if (cert->subject_organisation_unit) {
cons_show(" Organisation unit : %s", cert->subject_organisation_unit);
}
if (cert->subject_email) {
cons_show(" Email : %s", cert->subject_email);
}
if (cert->subject_state) {
cons_show(" State : %s", cert->subject_state);
}
if (cert->subject_country) {
cons_show(" Country : %s", cert->subject_country);
}
if (cert->subject_serialnumber) {
cons_show(" Serial number : %s", cert->subject_serialnumber);
}
cons_show(" Issuer:");
if (cert->issuer_commonname) {
cons_show(" Common name : %s", cert->issuer_commonname);
}
if (cert->issuer_distinguishedname) {
cons_show(" Distinguished name : %s", cert->issuer_distinguishedname);
}
if (cert->issuer_organisation) {
cons_show(" Organisation : %s", cert->issuer_organisation);
}
if (cert->issuer_organisation_unit) {
cons_show(" Organisation unit : %s", cert->issuer_organisation_unit);
}
if (cert->issuer_email) {
cons_show(" Email : %s", cert->issuer_email);
}
if (cert->issuer_state) {
cons_show(" State : %s", cert->issuer_state);
}
if (cert->issuer_country) {
cons_show(" Country : %s", cert->issuer_country);
}
if (cert->issuer_serialnumber) {
cons_show(" Serial number : %s", cert->issuer_serialnumber);
}
cons_show(" Version : %d", cert->version);
if (cert->serialnumber) {
cons_show(" Serial number : %s", cert->serialnumber);
}
if (cert->key_alg) {
cons_show(" Key algorithm : %s", cert->key_alg);
}
if (cert->signature_alg) {
cons_show(" Signature algorithm : %s", cert->signature_alg);
}
cons_show(" Start : %s", cert->notbefore);
cons_show(" End : %s", cert->notafter);
cons_show(" Fingerprint : %s", cert->fingerprint);
}
void
cons_show_typing(const char *const barejid)
{
ProfWin *console = wins_get_console();
const char * display_usr = NULL;
PContact contact = roster_get_contact(barejid);
if (contact) {
if (p_contact_name(contact)) {
display_usr = p_contact_name(contact);
} else {
display_usr = barejid;
}
} else {
display_usr = barejid;
}
win_println(console, THEME_TYPING, "-", "!! %s is typing a message...", display_usr);
cons_alert();
}
char*
_room_triggers_to_string(GList *triggers)
{
GString *triggers_str = g_string_new("");
GList *curr = triggers;
while (curr) {
g_string_append_printf(triggers_str, "\"%s\"", (char*)curr->data);
curr = g_list_next(curr);
if (curr) {
g_string_append(triggers_str, ", ");
}
}
char *result = triggers_str->str;
g_string_free(triggers_str, FALSE);
return result;
}
void
cons_show_incoming_room_message(const char *const nick, const char *const room, const int win_index, gboolean mention,
GList *triggers, int unread)
{
ProfWin *const console = wins_get_console();
int ui_index = win_index;
if (ui_index == 10) {
ui_index = 0;
}
char *muc_show = prefs_get_string(PREF_CONSOLE_MUC);
if (g_strcmp0(muc_show, "all") == 0) {
if (mention) {
win_println(console, THEME_MENTION, "-", "<< room mention: %s in %s (win %d)", nick, room, ui_index);
} else if (triggers) {
char *triggers_str = _room_triggers_to_string(triggers);
win_println(console, THEME_TRIGGER, "-", "<< room trigger %s: %s in %s (win %d)", triggers_str, nick, room, ui_index);
free(triggers_str);
} else {
win_println(console, THEME_INCOMING, "-", "<< room message: %s in %s (win %d)", nick, room, ui_index);
}
cons_alert();
} else if (g_strcmp0(muc_show, "first") == 0) {
if (mention) {
win_println(console, THEME_MENTION, "-", "<< room mention: %s in %s (win %d)", nick, room, ui_index);
cons_alert();
} else if (triggers) {
char *triggers_str = _room_triggers_to_string(triggers);
win_println(console, THEME_TRIGGER, "-", "<< room trigger %s: %s in %s (win %d)", triggers_str, nick, room, ui_index);
free(triggers_str);
cons_alert();
} else if (unread == 0) {
win_println(console, THEME_INCOMING, "-", "<< room message: %s (win %d)", room, ui_index);
cons_alert();
}
}
prefs_free_string(muc_show);
}
void
cons_show_incoming_message(const char *const short_from, const int win_index, int unread)
{
ProfWin *console = wins_get_console();
int ui_index = win_index;
if (ui_index == 10) {
ui_index = 0;
}
char *chat_show = prefs_get_string(PREF_CONSOLE_CHAT);
if (g_strcmp0(chat_show, "all") == 0) {
win_println(console, THEME_INCOMING, "-", "<< chat message: %s (win %d)", short_from, ui_index);
cons_alert();
} else if ((g_strcmp0(chat_show, "first") == 0) && unread == 0) {
win_println(console, THEME_INCOMING, "-", "<< chat message: %s (win %d)", short_from, ui_index);
cons_alert();
}
prefs_free_string(chat_show);
}
void
cons_show_incoming_private_message(const char *const nick, const char *const room, const int win_index, int unread)
{
ProfWin *console = wins_get_console();
int ui_index = win_index;
if (ui_index == 10) {
ui_index = 0;
}
char *priv_show = prefs_get_string(PREF_CONSOLE_PRIVATE);
if (g_strcmp0(priv_show, "all") == 0) {
win_println(console, THEME_INCOMING, "-", "<< private message: %s in %s (win %d)", nick, room, ui_index);
cons_alert();
} else if ((g_strcmp0(priv_show, "first") == 0) && unread == 0) {
win_println(console, THEME_INCOMING, "-", "<< private message: %s in %s (win %d)", nick, room, ui_index);
cons_alert();
}
prefs_free_string(priv_show);
}
void
cons_about(void)
{
ProfWin *console = wins_get_console();
int rows, cols;
getmaxyx(stdscr, rows, cols);
if (prefs_get_boolean(PREF_SPLASH)) {
_cons_splash_logo();
} else {
if (strcmp(PACKAGE_STATUS, "development") == 0) {
#ifdef HAVE_GIT_VERSION
win_println(console, THEME_DEFAULT, "-", "Welcome to Profanity, version %sdev.%s.%s", PACKAGE_VERSION, PROF_GIT_BRANCH, PROF_GIT_REVISION);
#else
win_println(console, THEME_DEFAULT, "Welcome to Profanity, version %sdev", PACKAGE_VERSION);
#endif
} else {
win_println(console, THEME_DEFAULT, "-", "Welcome to Profanity, version %s", PACKAGE_VERSION);
}
}
win_println(console, THEME_DEFAULT, "-", "Copyright (C) 2012 - 2019 James Booth <boothj5web@gmail.com>.");
win_println(console, THEME_DEFAULT, "-", "Copyright (C) 2019 - 2020 Michael Vetter <jubalh@iodoru.org>.");
win_println(console, THEME_DEFAULT, "-", "License GPLv3+: GNU GPL version 3 or later <https://www.gnu.org/licenses/gpl.html>");
win_println(console, THEME_DEFAULT, "-", "");
win_println(console, THEME_DEFAULT, "-", "This is free software; you are free to change and redistribute it.");
win_println(console, THEME_DEFAULT, "-", "There is NO WARRANTY, to the extent permitted by law.");
win_println(console, THEME_DEFAULT, "-", "");
win_println(console, THEME_DEFAULT, "-", "Type '/help' to show complete help.");
win_println(console, THEME_DEFAULT, "-", "");
if (prefs_get_boolean(PREF_VERCHECK)) {
cons_check_version(FALSE);
}
pnoutrefresh(console->layout->win, 0, 0, 1, 0, rows-3, cols-1);
cons_alert();
}
void
cons_check_version(gboolean not_available_msg)
{
ProfWin *console = wins_get_console();
char *latest_release = release_get_latest();
if (latest_release) {
gboolean relase_valid = g_regex_match_simple("^\\d+\\.\\d+\\.\\d+$", latest_release, 0, 0);
if (relase_valid) {
if (release_is_new(latest_release)) {
win_println(console, THEME_DEFAULT, "-", "A new version of Profanity is available: %s", latest_release);
win_println(console, THEME_DEFAULT, "-", "Check <https://profanity-im.github.io> for details.");
win_println(console, THEME_DEFAULT, "-", "");
} else {
if (not_available_msg) {
win_println(console, THEME_DEFAULT, "-", "No new version available.");
win_println(console, THEME_DEFAULT, "-", "");
}
}
cons_alert();
}
free(latest_release);
}
}
void
cons_show_login_success(ProfAccount *account, gboolean secured)
{
ProfWin *console = wins_get_console();
const char *fulljid = connection_get_fulljid();
win_print(console, THEME_DEFAULT, "-", "%s logged in successfully, ", fulljid);
resource_presence_t presence = accounts_get_login_presence(account->name);
const char *presence_str = string_from_resource_presence(presence);
theme_item_t presence_colour = theme_main_presence_attrs(presence_str);
win_append(console, presence_colour, "%s", presence_str);
win_append(console, THEME_DEFAULT, " (priority %d)", accounts_get_priority_for_presence_type(account->name, presence));
win_appendln(console, THEME_DEFAULT, ".");
if (!secured) {
cons_show_error("TLS connection not established");
}
cons_alert();
}
void
cons_show_wins(gboolean unread)
{
ProfWin *console = wins_get_console();
cons_show("");
GSList *window_strings = wins_create_summary(unread);
if (unread && window_strings == NULL) {
cons_show("No windows with unread messages.");
return;
} else if (unread) {
cons_show("Unread:");
} else {
cons_show("Active windows:");
}
GSList *curr = window_strings;
while (curr) {
if (g_strstr_len(curr->data, strlen(curr->data), " unread") > 0) {
win_println(console, THEME_CMD_WINS_UNREAD, "-", "%s", curr->data);
} else {
win_println(console, THEME_DEFAULT, "-", "%s", curr->data);
}
curr = g_slist_next(curr);
}
g_slist_free_full(window_strings, free);
cons_alert();
}
void
cons_show_room_invites(GList *invites)
{
cons_show("");
if (invites == NULL) {
cons_show("No outstanding chat room invites.");
} else {
cons_show("Chat room invites, use /join or /decline commands:");
while (invites) {
cons_show(" %s", invites->data);
invites = g_list_next(invites);
}
}
cons_alert();
}
void
cons_show_info(PContact pcontact)
{
ProfWin *console = wins_get_console();
win_show_info(console, pcontact);
cons_alert();
}
void
cons_show_caps(const char *const fulljid, resource_presence_t presence)
{
ProfWin *console = wins_get_console();
cons_show("");
EntityCapabilities *caps = caps_lookup(fulljid);
if (caps) {
const char *resource_presence = string_from_resource_presence(presence);
theme_item_t presence_colour = theme_main_presence_attrs(resource_presence);
win_print(console, presence_colour, "-", "%s", fulljid);
win_appendln(console, THEME_DEFAULT, ":");
// show identity
if (caps->identity) {
DiscoIdentity *identity = caps->identity;
win_print(console, THEME_DEFAULT, "-", "Identity: ");
if (identity->name) {
win_append(console, THEME_DEFAULT, "%s", identity->name);
if (identity->category || identity->type) {
win_append(console, THEME_DEFAULT, " ");
}
}
if (identity->type) {
win_append(console, THEME_DEFAULT, "%s", identity->type);
if (identity->category) {
win_append(console, THEME_DEFAULT, " ");
}
}
if (identity->category) {
win_append(console, THEME_DEFAULT, "%s", identity->category);
}
win_newline(console);
}
if (caps->software_version) {
SoftwareVersion *software_version = caps->software_version;
if (software_version->software) {
win_print(console, THEME_DEFAULT, "-", "Software: %s", software_version->software);
}
if (software_version->software_version) {
win_append(console, THEME_DEFAULT, ", %s", software_version->software_version);
}
if (software_version->software || software_version->software_version) {
win_newline(console);
}
if (software_version->os) {
win_print(console, THEME_DEFAULT, "-", "OS: %s", software_version->os);
}
if (software_version->os_version) {
win_append(console, THEME_DEFAULT, ", %s", software_version->os_version);
}
if (software_version->os || software_version->os_version) {
win_newline(console);
}
}
if (caps->features) {
win_println(console, THEME_DEFAULT, "-", "Features:");
GSList *feature = caps->features;
while (feature) {
win_println(console, THEME_DEFAULT, "-", " %s", feature->data);
feature = g_slist_next(feature);
}
}
caps_destroy(caps);
} else {
cons_show("No capabilities found for %s", fulljid);
}
cons_alert();
}
void
cons_show_received_subs(void)
{
GList *received = presence_get_subscription_requests();
if (received == NULL) {
cons_show("No outstanding subscription requests.");
} else {
cons_show("Outstanding subscription requests from:",
g_list_length(received));
while (received) {
cons_show(" %s", received->data);
received = g_list_next(received);
}
g_list_free_full(received, g_free);
}
cons_alert();
}
void
cons_show_sent_subs(void)
{
if (roster_has_pending_subscriptions()) {
GSList *contacts = roster_get_contacts(ROSTER_ORD_NAME);
PContact contact = NULL;
cons_show("Awaiting subscription responses from:");
GSList *curr = contacts;
while (curr) {
contact = (PContact) curr->data;
if (p_contact_pending_out(contact)) {
cons_show(" %s", p_contact_barejid(contact));
}
curr = g_slist_next(curr);
}
g_slist_free(contacts);
} else {
cons_show("No pending requests sent.");
}
cons_alert();
}
void
cons_show_room_list(GSList *rooms, const char *const conference_node)
{
ProfWin *console = wins_get_console();
if (rooms && (g_slist_length(rooms) > 0)) {
cons_show("Chat rooms at %s:", conference_node);
while (rooms) {
DiscoItem *room = rooms->data;
win_print(console, THEME_DEFAULT, "-", " %s", room->jid);
if (room->name) {
win_append(console, THEME_DEFAULT, ", (%s)", room->name);
}
win_newline(console);
rooms = g_slist_next(rooms);
}
} else {
cons_show("No chat rooms at %s", conference_node);
}
cons_alert();
}
void
cons_show_bookmarks(const GList *list)
{
ProfWin *console = wins_get_console();
if (list == NULL) {
cons_show("");
cons_show("No bookmarks found.");
} else {
cons_show("");
cons_show("Bookmarks:");
while (list) {
Bookmark *item = list->data;
theme_item_t presence_colour = THEME_TEXT;
ProfWin *roomwin = (ProfWin*)wins_get_muc(item->barejid);
if (muc_active(item->barejid) && roomwin) {
presence_colour = THEME_ONLINE;
}
win_print(console, presence_colour, "-", " %s", item->barejid);
if (item->nick) {
win_append(console, presence_colour, "/%s", item->nick);
}
if (item->autojoin) {
win_append(console, presence_colour, " (autojoin)");
}
if (item->password) {
win_append(console, presence_colour, " (private)");
}
if (muc_active(item->barejid) && roomwin) {
int num = wins_get_num(roomwin);
win_append(console, presence_colour, " (win %d)", num);
}
win_newline(console);
list = g_list_next(list);
}
}
cons_show("");
if (prefs_get_boolean(PREF_BOOKMARK_INVITE)) {
cons_show("Automatic invite bookmarking (/bookmark invites): ON");
} else {
cons_show("Automatic invite bookmarking (/bookmark invites): OFF");
}
cons_alert();
}
void
cons_show_disco_info(const char *jid, GSList *identities, GSList *features)
{
if ((identities && (g_slist_length(identities) > 0)) ||
(features && (g_slist_length(features) > 0))) {
cons_show("");
cons_show("Service discovery info for %s", jid);
if (identities) {
cons_show(" Identities");
}
while (identities) {
DiscoIdentity *identity = identities->data; // anme trpe, cat
GString *identity_str = g_string_new(" ");
if (identity->name) {
identity_str = g_string_append(identity_str, identity->name);
identity_str = g_string_append(identity_str, " ");
}
if (identity->type) {
identity_str = g_string_append(identity_str, identity->type);
identity_str = g_string_append(identity_str, " ");
}
if (identity->category) {
identity_str = g_string_append(identity_str, identity->category);
}
cons_show(identity_str->str);
g_string_free(identity_str, TRUE);
identities = g_slist_next(identities);
}
if (features) {
cons_show(" Features:");
}
while (features) {
cons_show(" %s", features->data);
features = g_slist_next(features);
}
cons_alert();
}
}
void
cons_show_disco_items(GSList *items, const char *const jid)
{
ProfWin *console = wins_get_console();
if (items && (g_slist_length(items) > 0)) {
cons_show("");
cons_show("Service discovery items for %s:", jid);
while (items) {
DiscoItem *item = items->data;
win_print(console, THEME_DEFAULT, "-", " %s", item->jid);
if (item->name) {
win_append(console, THEME_DEFAULT, ", (%s)", item->name);
}
win_appendln(console, THEME_DEFAULT, "");
items = g_slist_next(items);
}
} else {
cons_show("");
cons_show("No service discovery items for %s", jid);
}
cons_alert();
}
void
cons_show_status(const char *const barejid)
{
ProfWin *console = wins_get_console();
PContact pcontact = roster_get_contact(barejid);
if (pcontact) {
win_show_contact(console, pcontact);
} else {
cons_show("No such contact \"%s\" in roster.", barejid);
}
cons_alert();
}
void
cons_show_room_invite(const char *const invitor, const char * const room, const char *const reason)
{
char *display_from = NULL;
PContact contact = roster_get_contact(invitor);
if (contact) {
if (p_contact_name(contact)) {
display_from = strdup(p_contact_name(contact));
} else {
display_from = strdup(invitor);
}
} else {
display_from = strdup(invitor);
}
cons_show("");
cons_show("Chat room invite received:");
cons_show(" From : %s", display_from);
cons_show(" Room : %s", room);
if (reason) {
cons_show(" Message: %s", reason);
}
cons_show("Use '/join %s' to accept the invitation", room);
cons_show("Use '/invite decline %s' to decline the invitation", room);
if (prefs_get_boolean(PREF_NOTIFY_INVITE)) {
notify_invite(display_from, room, reason);
}
free(display_from);
cons_alert();
}
void
cons_show_account_list(gchar **accounts)
{
ProfWin *console = wins_get_console();
int size = g_strv_length(accounts);
if (size > 0) {
cons_show("Accounts:");
int i = 0;
for (i = 0; i < size; i++) {
if ((connection_get_status() == JABBER_CONNECTED) &&
(g_strcmp0(session_get_account_name(), accounts[i]) == 0)) {
resource_presence_t presence = accounts_get_last_presence(accounts[i]);
theme_item_t presence_colour = theme_main_presence_attrs(string_from_resource_presence(presence));
win_println(console, presence_colour, "-", "%s", accounts[i]);
} else {
cons_show(accounts[i]);
}
}
cons_show("");
} else {
cons_show("No accounts created yet.");
cons_show("");
}
cons_alert();
}
void
cons_show_account(ProfAccount *account)
{
ProfWin *console = wins_get_console();
cons_show("");
cons_show("Account %s:", account->name);
if (account->enabled) {
cons_show ("enabled : TRUE");
} else {
cons_show ("enabled : FALSE");
}
cons_show ("jid : %s", account->jid);
if (account->eval_password) {
cons_show ("eval_password : %s", account->eval_password);
} else if (account->password) {
cons_show ("password : [redacted]");
}
if (account->resource) {
cons_show ("resource : %s", account->resource);
}
if (account->server) {
cons_show ("server : %s", account->server);
}
if (account->port != 0) {
cons_show ("port : %d", account->port);
}
if (account->muc_service) {
cons_show ("muc service : %s", account->muc_service);
}
if (account->muc_nick) {
cons_show ("muc nick : %s", account->muc_nick);
}
if (account->tls_policy) {
cons_show ("TLS policy : %s", account->tls_policy);
}
if (account->last_presence) {
cons_show ("Last presence : %s", account->last_presence);
}
if (account->login_presence) {
cons_show ("Login presence : %s", account->login_presence);
}
if (account->startscript) {
cons_show ("Start script : %s", account->startscript);
}
if (account->theme) {
cons_show ("Theme : %s", account->theme);
}
if (account->otr_policy) {
cons_show ("OTR policy : %s", account->otr_policy);
}
if (g_list_length(account->otr_manual) > 0) {
GString *manual = g_string_new("OTR manual : ");
GList *curr = account->otr_manual;
while (curr) {
g_string_append(manual, curr->data);
if (curr->next) {
g_string_append(manual, ", ");
}
curr = curr->next;
}
cons_show(manual->str);
g_string_free(manual, TRUE);
}
if (g_list_length(account->otr_opportunistic) > 0) {
GString *opportunistic = g_string_new("OTR opportunistic : ");
GList *curr = account->otr_opportunistic;
while (curr) {
g_string_append(opportunistic, curr->data);
if (curr->next) {
g_string_append(opportunistic, ", ");
}
curr = curr->next;
}
cons_show(opportunistic->str);
g_string_free(opportunistic, TRUE);
}
if (g_list_length(account->otr_always) > 0) {
GString *always = g_string_new("OTR always : ");
GList *curr = account->otr_always;
while (curr) {
g_string_append(always, curr->data);
if (curr->next) {
g_string_append(always, ", ");
}
curr = curr->next;
}
cons_show(always->str);
g_string_free(always, TRUE);
}
if (account->pgp_keyid) {
cons_show ("PGP Key ID : %s", account->pgp_keyid);
}
cons_show ("Priority : chat:%d, online:%d, away:%d, xa:%d, dnd:%d",
account->priority_chat, account->priority_online, account->priority_away,
account->priority_xa, account->priority_dnd);
if ((connection_get_status() == JABBER_CONNECTED) &&
(g_strcmp0(session_get_account_name(), account->name) == 0)) {
GList *resources = connection_get_available_resources();
GList *ordered_resources = NULL;
GList *curr = resources;
if (curr) {
win_println(console, THEME_DEFAULT, "-", "Resources:");
// sort in order of availability
while (curr) {
Resource *resource = curr->data;
ordered_resources = g_list_insert_sorted(ordered_resources,
resource, (GCompareFunc)resource_compare_availability);
curr = g_list_next(curr);
}
}
g_list_free(resources);
curr = ordered_resources;
while (curr) {
Resource *resource = curr->data;
const char *resource_presence = string_from_resource_presence(resource->presence);
theme_item_t presence_colour = theme_main_presence_attrs(resource_presence);
win_print(console, presence_colour, "-", " %s (%d), %s", resource->name, resource->priority, resource_presence);
if (resource->status) {
win_append(console, presence_colour, ", \"%s\"", resource->status);
}
win_appendln(console, THEME_DEFAULT, "");
Jid *jidp = jid_create_from_bare_and_resource(account->jid, resource->name);
EntityCapabilities *caps = caps_lookup(jidp->fulljid);
jid_destroy(jidp);
if (caps) {
// show identity
if (caps->identity) {
DiscoIdentity *identity = caps->identity;
win_print(console, THEME_DEFAULT, "-", " Identity: ");
if (identity->name) {
win_append(console, THEME_DEFAULT, "%s", identity->name);
if (identity->category || identity->type) {
win_append(console, THEME_DEFAULT, " ");
}
}
if (identity->type) {
win_append(console, THEME_DEFAULT, "%s", identity->type);
if (identity->category) {
win_append(console, THEME_DEFAULT, " ");
}
}
if (identity->category) {
win_append(console, THEME_DEFAULT, "%s", identity->category);
}
win_newline(console);
}
if (caps->software_version) {
SoftwareVersion *software_version = caps->software_version;
if (software_version->software) {
win_print(console, THEME_DEFAULT, "-", " Software: %s", software_version->software);
}
if (software_version->software_version) {
win_append(console, THEME_DEFAULT, ", %s", software_version->software_version);
}
if (software_version->software || software_version->software_version) {
win_newline(console);
}
if (software_version->os) {
win_print(console, THEME_DEFAULT, "-", " OS: %s", software_version->os);
}
if (software_version->os_version) {
win_append(console, THEME_DEFAULT, ", %s", software_version->os_version);
}
if (software_version->os || software_version->os_version) {
win_newline(console);
}
}
caps_destroy(caps);
}
curr = g_list_next(curr);
}
g_list_free(ordered_resources);
}
cons_alert();
}
void
cons_show_aliases(GList *aliases)
{
if (aliases == NULL) {
cons_show("No aliases configured.");
return;
}
GList *curr = aliases;
cons_show("Command aliases:");
while (curr) {
ProfAlias *alias = curr->data;
cons_show(" /%s -> %s", alias->name, alias->value);
curr = g_list_next(curr);
}
cons_show("");
}
void
cons_theme_setting(void)
{
char *theme = prefs_get_string(PREF_THEME);
if (theme == NULL) {
cons_show("Theme (/theme) : default");
} else {
cons_show("Theme (/theme) : %s", theme);
}
prefs_free_string(theme);
}
void
cons_privileges_setting(void)
{
if (prefs_get_boolean(PREF_MUC_PRIVILEGES))
cons_show("MUC privileges (/privileges) : ON");
else
cons_show("MUC privileges (/privileges) : OFF");
}
void
cons_beep_setting(void)
{
if (prefs_get_boolean(PREF_BEEP))
cons_show("Terminal beep (/beep) : ON");
else
cons_show("Terminal beep (/beep) : OFF");
}
void
cons_resource_setting(void)
{
if (prefs_get_boolean(PREF_RESOURCE_TITLE))
cons_show("Resource title (/resource) : ON");
else
cons_show("Resource title (/resource) : OFF");
if (prefs_get_boolean(PREF_RESOURCE_MESSAGE))
cons_show("Resource message (/resource) : ON");
else
cons_show("Resource message (/resource) : OFF");
}
void
cons_wrap_setting(void)
{
if (prefs_get_boolean(PREF_WRAP))
cons_show("Word wrap (/wrap) : ON");
else
cons_show("Word wrap (/wrap) : OFF");
}
void
cons_titlebar_setting(void)
{
cons_winpos_setting();
if (prefs_get_boolean(PREF_TLS_SHOW)) {
cons_show("TLS show (/titlebar) : ON");
} else {
cons_show("TLS show (/titlebar) : OFF");
}
if (prefs_get_boolean(PREF_ENC_WARN)) {
cons_show("Warn unencrypted (/titlebar) : ON");
} else {
cons_show("Warn unencrypted (/titlebar) : OFF");
}
if (prefs_get_boolean(PREF_RESOURCE_TITLE)) {
cons_show("Resource show (/titlebar) : ON");
} else {
cons_show("Resource show (/titlebar) : OFF");
}
if (prefs_get_boolean(PREF_PRESENCE)) {
cons_show("Titlebar presence (/titlebar) : ON");
} else {
cons_show("Titlebar presence (/titlebar) : OFF");
}
if (prefs_get_boolean(PREF_TITLEBAR_MUC_TITLE_NAME)) {
cons_show("Titlebar show MUC name (/titlebar) : ON");
} else {
cons_show("Titlebar show MUC name (/titlebar) : OFF");
}
if (prefs_get_boolean(PREF_TITLEBAR_MUC_TITLE_JID)) {
cons_show("Titlebar show MUC JID (/titlebar) : ON");
} else {
cons_show("Titlebar show MUC JID (/titlebar) : OFF");
}
}
void
cons_console_setting(void)
{
char *chatsetting = prefs_get_string(PREF_CONSOLE_CHAT);
cons_show("Console chat messages (/console) : %s", chatsetting);
prefs_free_string(chatsetting);
char *mucsetting = prefs_get_string(PREF_CONSOLE_MUC);
cons_show("Console MUC messages (/console) : %s", mucsetting);
prefs_free_string(mucsetting);
char *privsetting = prefs_get_string(PREF_CONSOLE_PRIVATE);
cons_show("Console private messages (/console) : %s", privsetting);
prefs_free_string(privsetting);
}
void
cons_presence_setting(void)
{
if (prefs_get_boolean(PREF_PRESENCE))
cons_show("Titlebar presence (/presence) : ON");
else
cons_show("Titlebar presence (/presence) : OFF");
char *console = prefs_get_string(PREF_STATUSES_CONSOLE);
char *chat = prefs_get_string(PREF_STATUSES_CHAT);
char *room = prefs_get_string(PREF_STATUSES_MUC);
cons_show("Console presence (/presence) : %s", console);
cons_show("Chat presence (/presence) : %s", chat);
cons_show("Room presence (/presence) : %s", room);
prefs_free_string(console);
prefs_free_string(chat);
prefs_free_string(room);
}
void
cons_flash_setting(void)
{
if (prefs_get_boolean(PREF_FLASH))
cons_show("Terminal flash (/flash) : ON");
else
cons_show("Terminal flash (/flash) : OFF");
}
void
cons_tray_setting(void)
{
if (prefs_get_boolean(PREF_TRAY))
cons_show("Tray icon (/tray) : ON");
else
cons_show("Tray icon (/tray) : OFF");
if (prefs_get_boolean(PREF_TRAY_READ))
cons_show("Tray icon read (/tray) : ON");
else
cons_show("Tray icon read (/tray) : OFF");
int seconds = prefs_get_tray_timer();
if (seconds == 1) {
cons_show("Tray timer (/tray) : 1 second");
} else {
cons_show("Tray timer (/tray) : %d seconds", seconds);
}
}
void
cons_splash_setting(void)
{
if (prefs_get_boolean(PREF_SPLASH))
cons_show("Splash screen (/splash) : ON");
else
cons_show("Splash screen (/splash) : OFF");
}
void
cons_occupants_setting(void)
{
if (prefs_get_boolean(PREF_OCCUPANTS))
cons_show("Occupants (/occupants) : show");
else
cons_show("Occupants (/occupants) : hide");
if (prefs_get_boolean(PREF_OCCUPANTS_JID))
cons_show("Occupant jids (/occupants) : show");
else
cons_show("Occupant jids (/occupants) : hide");
if (prefs_get_boolean(PREF_OCCUPANTS_WRAP))
cons_show("Occupants wrap (/occupants) : ON");
else
cons_show("Occupants wrap (/occupants) : OFF");
char occupants_ch = prefs_get_occupants_char();
if (occupants_ch)
cons_show("Occupants char (/occupants) : %c", occupants_ch);
else
cons_show("Occupants char (/occupants) : none");
gint occupant_indent = prefs_get_occupants_indent();
cons_show("Occupant indent (/occupants) : %d", occupant_indent);
int size = prefs_get_occupants_size();
cons_show("Occupants size (/occupants) : %d", size);
char header_ch = prefs_get_occupants_header_char();
if (header_ch)
cons_show("Occupants header char (/occupants) : %c", header_ch);
else
cons_show("Occupants header char (/occupants) : none");
}
void
cons_rooms_cache_setting(void)
{
if (prefs_get_boolean(PREF_ROOM_LIST_CACHE)) {
cons_show("Room list cache (/rooms cache) : ON");
} else {
cons_show("Room list cache (/rooms cache) : OFF");
}
}
void
cons_autoconnect_setting(void)
{
char *pref_connect_account = prefs_get_string(PREF_CONNECT_ACCOUNT);
if (pref_connect_account)
cons_show("Autoconnect (/autoconnect) : %s", pref_connect_account);
else
cons_show("Autoconnect (/autoconnect) : OFF");
prefs_free_string(pref_connect_account);
}
void
cons_time_setting(void)
{
char *pref_time_console = prefs_get_string(PREF_TIME_CONSOLE);
if (g_strcmp0(pref_time_console, "off") == 0)
cons_show("Time console (/time) : OFF");
else
cons_show("Time console (/time) : %s", pref_time_console);
prefs_free_string(pref_time_console);
char *pref_time_chat = prefs_get_string(PREF_TIME_CHAT);
if (g_strcmp0(pref_time_chat, "off") == 0)
cons_show("Time chat (/time) : OFF");
else
cons_show("Time chat (/time) : %s", pref_time_chat);
prefs_free_string(pref_time_chat);
char *pref_time_muc = prefs_get_string(PREF_TIME_MUC);
if (g_strcmp0(pref_time_muc, "off") == 0)
cons_show("Time MUC (/time) : OFF");
else
cons_show("Time MUC (/time) : %s", pref_time_muc);
prefs_free_string(pref_time_muc);
char *pref_time_conf = prefs_get_string(PREF_TIME_CONFIG);
if (g_strcmp0(pref_time_conf, "off") == 0)
cons_show("Time config (/time) : OFF");
else
cons_show("Time config (/time) : %s", pref_time_conf);
prefs_free_string(pref_time_conf);
char *pref_time_private = prefs_get_string(PREF_TIME_PRIVATE);
if (g_strcmp0(pref_time_private, "off") == 0)
cons_show("Time private (/time) : OFF");
else
cons_show("Time private (/time) : %s", pref_time_private);
prefs_free_string(pref_time_private);
char *pref_time_xml = prefs_get_string(PREF_TIME_XMLCONSOLE);
if (g_strcmp0(pref_time_xml, "off") == 0)
cons_show("Time XML Console (/time) : OFF");
else
cons_show("Time XML Console (/time) : %s", pref_time_xml);
prefs_free_string(pref_time_xml);
char *pref_time_statusbar = prefs_get_string(PREF_TIME_STATUSBAR);
if (g_strcmp0(pref_time_statusbar, "off") == 0)
cons_show("Time statusbar (/time) : OFF");
else
cons_show("Time statusbar (/time) : %s", pref_time_statusbar);
prefs_free_string(pref_time_statusbar);
char *pref_time_lastactivity = prefs_get_string(PREF_TIME_LASTACTIVITY);
cons_show("Time last activity (/time) : %s", pref_time_lastactivity);
prefs_free_string(pref_time_lastactivity);
}
void
cons_vercheck_setting(void)
{
if (prefs_get_boolean(PREF_VERCHECK))
cons_show("Version checking (/vercheck) : ON");
else
cons_show("Version checking (/vercheck) : OFF");
}
void
cons_wintitle_setting(void)
{
if (prefs_get_boolean(PREF_WINTITLE_SHOW)) {
cons_show("Window title show (/wintitle) : ON");
} else {
cons_show("Window title show (/wintitle) : OFF");
}
if (prefs_get_boolean(PREF_WINTITLE_GOODBYE)) {
cons_show("Window title goodbye (/wintitle) : ON");
} else {
cons_show("Window title goodbye (/wintitle) : OFF");
}
}
void
cons_roster_setting(void)
{
if (prefs_get_boolean(PREF_ROSTER))
cons_show("Roster (/roster) : show");
else
cons_show("Roster (/roster) : hide");
if (prefs_get_boolean(PREF_ROSTER_OFFLINE))
cons_show("Roster offline (/roster) : show");
else
cons_show("Roster offline (/roster) : hide");
char header_ch = prefs_get_roster_header_char();
if (header_ch)
cons_show("Roster header char (/roster) : %c", header_ch);
else
cons_show("Roster header char (/roster) : none");
char contact_ch = prefs_get_roster_contact_char();
if (contact_ch)
cons_show("Roster contact char (/roster) : %c", contact_ch);
else
cons_show("Roster contact char (/roster) : none");
char resource_ch = prefs_get_roster_resource_char();
if (resource_ch)
cons_show("Roster resource char (/roster) : %c", resource_ch);
else
cons_show("Roster resource char (/roster) : none");
char room_ch = prefs_get_roster_room_char();
if (room_ch)
cons_show("Roster room char (/roster) : %c", room_ch);
else
cons_show("Roster room char (/roster) : none");
char room_priv_ch = prefs_get_roster_room_private_char();
if (room_priv_ch)
cons_show("Roster room private char (/roster) : %c", room_priv_ch);
else
cons_show("Roster room private char (/roster) : none");
char private_ch = prefs_get_roster_private_char();
if (private_ch)
cons_show("Roster private char (/roster) : %c", private_ch);
else
cons_show("Roster private char (/roster) : none");
gint contact_indent = prefs_get_roster_contact_indent();
cons_show("Roster contact indent (/roster) : %d", contact_indent);
if (prefs_get_boolean(PREF_ROSTER_RESOURCE))
cons_show("Roster resource (/roster) : show");
else
cons_show("Roster resource (/roster) : hide");
gint resource_indent = prefs_get_roster_resource_indent();
cons_show("Roster resource indent (/roster) : %d", resource_indent);
if (prefs_get_boolean(PREF_ROSTER_RESOURCE_JOIN))
cons_show("Roster resource join (/roster) : on");
else
cons_show("Roster resource join (/roster) : off");
if (prefs_get_boolean(PREF_ROSTER_PRESENCE))
cons_show("Roster presence (/roster) : show");
else
cons_show("Roster presence (/roster) : hide");
gint presence_indent = prefs_get_roster_presence_indent();
cons_show("Roster presence indent (/roster) : %d", presence_indent);
if (prefs_get_boolean(PREF_ROSTER_STATUS))
cons_show("Roster status (/roster) : show");
else
cons_show("Roster status (/roster) : hide");
if (prefs_get_boolean(PREF_ROSTER_EMPTY))
cons_show("Roster empty (/roster) : show");
else
cons_show("Roster empty (/roster) : hide");
if (prefs_get_boolean(PREF_ROSTER_PRIORITY))
cons_show("Roster priority (/roster) : show");
else
cons_show("Roster priority (/roster) : hide");
if (prefs_get_boolean(PREF_ROSTER_CONTACTS))
cons_show("Roster contacts (/roster) : show");
else
cons_show("Roster contacts (/roster) : hide");
if (prefs_get_boolean(PREF_ROSTER_UNSUBSCRIBED))
cons_show("Roster unsubscribed (/roster) : show");
else
cons_show("Roster unsubscribed (/roster) : hide");
char *count = prefs_get_string(PREF_ROSTER_COUNT);
if (g_strcmp0(count, "off") == 0) {
cons_show("Roster count (/roster) : OFF");
} else {
cons_show("Roster count (/roster) : %s", count);
}
prefs_free_string(count);
if (prefs_get_boolean(PREF_ROSTER_COUNT_ZERO))
cons_show("Roster count zero (/roster) : ON");
else
cons_show("Roster count zero (/roster) : OFF");
char *by = prefs_get_string(PREF_ROSTER_BY);
cons_show("Roster by (/roster) : %s", by);
prefs_free_string(by);
char *order = prefs_get_string(PREF_ROSTER_ORDER);
cons_show("Roster order (/roster) : %s", order);
prefs_free_string(order);
char *unread = prefs_get_string(PREF_ROSTER_UNREAD);
if (g_strcmp0(unread, "before") == 0) {
cons_show("Roster unread (/roster) : before");
} else if (g_strcmp0(unread, "after") == 0) {
cons_show("Roster unread (/roster) : after");
} else {
cons_show("Roster unread (/roster) : OFF");
}
prefs_free_string(unread);
if (prefs_get_boolean(PREF_ROSTER_ROOMS))
cons_show("Roster rooms (/roster) : show");
else
cons_show("Roster rooms (/roster) : hide");
char *priv = prefs_get_string(PREF_ROSTER_PRIVATE);
if (g_strcmp0(priv, "room") == 0) {
cons_show("Roster private (/roster) : room");
} else if (g_strcmp0(priv, "group") == 0) {
cons_show("Roster private (/roster) : group");
} else {
cons_show("Roster private (/roster) : OFF");
}
prefs_free_string(priv);
char *rooms_pos = prefs_get_string(PREF_ROSTER_ROOMS_POS);
cons_show("Roster rooms position (/roster) : %s", rooms_pos);
prefs_free_string(rooms_pos);
char *rooms_by = prefs_get_string(PREF_ROSTER_ROOMS_BY);
cons_show("Roster rooms by (/roster) : %s", rooms_by);
prefs_free_string(rooms_by);
char *rooms_use = prefs_get_string(PREF_ROSTER_ROOMS_USE_AS_NAME);
cons_show("Roster rooms use (/roster) : %s", rooms_use);
prefs_free_string(rooms_use);
char *rooms_order = prefs_get_string(PREF_ROSTER_ROOMS_ORDER);
cons_show("Roster rooms order (/roster) : %s", rooms_order);
prefs_free_string(rooms_order);
char *roomsunread = prefs_get_string(PREF_ROSTER_ROOMS_UNREAD);
if (g_strcmp0(roomsunread, "before") == 0) {
cons_show("Roster rooms unread (/roster) : before");
} else if (g_strcmp0(roomsunread, "after") == 0) {
cons_show("Roster rooms unread (/roster) : after");
} else {
cons_show("Roster rooms unread (/roster) : OFF");
}
prefs_free_string(roomsunread);
int size = prefs_get_roster_size();
cons_show("Roster size (/roster) : %d", size);
if (prefs_get_boolean(PREF_ROSTER_WRAP))
cons_show("Roster wrap (/roster) : ON");
else
cons_show("Roster wrap (/roster) : OFF");
}
void
cons_show_ui_prefs(void)
{
cons_show("UI preferences:");
cons_show("");
cons_theme_setting();
cons_beep_setting();
cons_flash_setting();
cons_splash_setting();
cons_winpos_setting();
cons_wrap_setting();
cons_time_setting();
cons_resource_setting();
cons_vercheck_setting();
cons_console_setting();
cons_occupants_setting();
cons_roster_setting();
cons_privileges_setting();
cons_wintitle_setting();
cons_presence_setting();
cons_inpblock_setting();
cons_titlebar_setting();
cons_statusbar_setting();
cons_alert();
}
void
cons_notify_setting(void)
{
if (!is_notify_enabled()) {
cons_show("Notification support was not included in this build.");
return;
}
if (prefs_get_boolean(PREF_NOTIFY_CHAT))
cons_show("Chat message (/notify chat) : ON");
else
cons_show("Chat message (/notify chat) : OFF");
if (prefs_get_boolean(PREF_NOTIFY_CHAT_CURRENT))
cons_show("Chat current (/notify chat) : ON");
else
cons_show("Chat current (/notify chat) : OFF");
if (prefs_get_boolean(PREF_NOTIFY_CHAT_TEXT))
cons_show("Chat text (/notify chat) : ON");
else
cons_show("Chat text (/notify chat) : OFF");
if (prefs_get_boolean(PREF_NOTIFY_ROOM))
cons_show("Room message (/notify room) : ON");
else
cons_show("Room message (/notify room) : OFF");
if (prefs_get_boolean(PREF_NOTIFY_ROOM_MENTION))
cons_show("Room mention (/notify room) : ON");
else
cons_show("Room mention (/notify room) : OFF");
if (prefs_get_boolean(PREF_NOTIFY_MENTION_CASE_SENSITIVE))
cons_show("Room mention case (/notify room) : Case sensitive");
else
cons_show("Room mention case (/notify room) : Case insensitive");
if (prefs_get_boolean(PREF_NOTIFY_MENTION_WHOLE_WORD))
cons_show("Room mention word (/notify room) : Whole word only");
else
cons_show("Room mention word (/notify room) : Part of word");
if (prefs_get_boolean(PREF_NOTIFY_ROOM_TRIGGER))
cons_show("Room trigger (/notify room) : ON");
else
cons_show("Room trigger (/notify room) : OFF");
if (prefs_get_boolean(PREF_NOTIFY_ROOM_CURRENT))
cons_show("Room current (/notify room) : ON");
else
cons_show("Room current (/notify room) : OFF");
if (prefs_get_boolean(PREF_NOTIFY_ROOM_TEXT))
cons_show("Room text (/notify room) : ON");
else
cons_show("Room text (/notify room) : OFF");
if (prefs_get_boolean(PREF_NOTIFY_TYPING))
cons_show("Composing (/notify typing) : ON");
else
cons_show("Composing (/notify typing) : OFF");
if (prefs_get_boolean(PREF_NOTIFY_TYPING_CURRENT))
cons_show("Composing current (/notify typing) : ON");
else
cons_show("Composing current (/notify typing) : OFF");
if (prefs_get_boolean(PREF_NOTIFY_INVITE))
cons_show("Room invites (/notify invite) : ON");
else
cons_show("Room invites (/notify invite) : OFF");
if (prefs_get_boolean(PREF_NOTIFY_SUB))
cons_show("Subscription requests (/notify sub) : ON");
else
cons_show("Subscription requests (/notify sub) : OFF");
gint remind_period = prefs_get_notify_remind();
if (remind_period == 0) {
cons_show("Reminder period (/notify remind) : OFF");
} else if (remind_period == 1) {
cons_show("Reminder period (/notify remind) : 1 second");
} else {
cons_show("Reminder period (/notify remind) : %d seconds", remind_period);
}
}
void
cons_show_desktop_prefs(void)
{
cons_show("Desktop notification preferences:");
cons_show("");
cons_notify_setting();
cons_tray_setting();
cons_alert();
}
void
cons_states_setting(void)
{
if (prefs_get_boolean(PREF_STATES))
cons_show("Send chat states (/states) : ON");
else
cons_show("Send chat states (/states) : OFF");
}
void
cons_outtype_setting(void)
{
if (prefs_get_boolean(PREF_OUTTYPE))
cons_show("Send composing (/outtype) : ON");
else
cons_show("Send composing (/outtype) : OFF");
}
void
cons_intype_setting(void)
{
if (prefs_get_boolean(PREF_INTYPE))
cons_show("Show typing (/intype) : ON");
else
cons_show("Show typing (/intype) : OFF");
}
void
cons_gone_setting(void)
{
gint gone_time = prefs_get_gone();
if (gone_time == 0) {
cons_show("Leave conversation (/gone) : OFF");
} else if (gone_time == 1) {
cons_show("Leave conversation (/gone) : 1 minute");
} else {
cons_show("Leave conversation (/gone) : %d minutes", gone_time);
}
}
void
cons_history_setting(void)
{
if (prefs_get_boolean(PREF_HISTORY))
cons_show("Chat history (/history) : ON");
else
cons_show("Chat history (/history) : OFF");
}
void
cons_carbons_setting(void)
{
if (prefs_get_boolean(PREF_CARBONS))
cons_show("Message carbons (/carbons) : ON");
else
cons_show("Message carbons (/carbons) : OFF");
}
void
cons_receipts_setting(void)
{
if (prefs_get_boolean(PREF_RECEIPTS_REQUEST))
cons_show("Request receipts (/receipts) : ON");
else
cons_show("Request receipts (/receipts) : OFF");
if (prefs_get_boolean(PREF_RECEIPTS_SEND))
cons_show("Send receipts (/receipts) : ON");
else
cons_show("Send receipts (/receipts) : OFF");
}
void
cons_show_chat_prefs(void)
{
cons_show("Chat preferences:");
cons_show("");
cons_states_setting();
cons_outtype_setting();
cons_intype_setting();
cons_gone_setting();
cons_history_setting();
cons_carbons_setting();
cons_receipts_setting();
cons_alert();
}
void
cons_inpblock_setting(void)
{
cons_show("Input timeout (/inpblock) : %d milliseconds", prefs_get_inpblock());
if (prefs_get_boolean(PREF_INPBLOCK_DYNAMIC)) {
cons_show("Dynamic timeout (/inpblock) : ON");
} else {
cons_show("Dynamic timeout (/inpblock) : OFF");
}
}
void
cons_statusbar_setting(void)
{
if (prefs_get_boolean(PREF_STATUSBAR_SHOW_NAME)) {
cons_show("Show tab names (/statusbar) : ON");
} else {
cons_show("Show tab names (/statusbar) : OFF");
}
if (prefs_get_boolean(PREF_STATUSBAR_SHOW_NUMBER)) {
cons_show("Show tab numbers (/statusbar) : ON");
} else {
cons_show("Show tab numbers (/statusbar) : OFF");
}
cons_show("Max tabs (/statusbar) : %d", prefs_get_statusbartabs());
gint pref_len = prefs_get_statusbartablen();
if (pref_len == 0) {
cons_show("Max tab length (/statusbar) : OFF");
} else {
cons_show("Max tab length (/statusbar) : %d", pref_len);
}
char *pref_self = prefs_get_string(PREF_STATUSBAR_SELF);
if (g_strcmp0(pref_self, "off") == 0) {
cons_show("Self statusbar display (/statusbar) : OFF");
} else {
cons_show("Self statusbar display (/statusbar) : %s", pref_self);
}
prefs_free_string(pref_self);
char *pref_chat = prefs_get_string(PREF_STATUSBAR_CHAT);
cons_show("Chat tab display (/statusbar) : %s", pref_chat);
prefs_free_string(pref_chat);
char *pref_room = prefs_get_string(PREF_STATUSBAR_ROOM);
cons_show("Room tab display (/statusbar) : %s", pref_room);
prefs_free_string(pref_room);
}
void
cons_winpos_setting(void)
{
ProfWinPlacement *placement = prefs_get_win_placement();
cons_show("Title bar postion (/titlebar) : %d", placement->titlebar_pos);
cons_show("Main window postion (/mainwin) : %d", placement->mainwin_pos);
cons_show("Status bar postion (/statusbar) : %d", placement->statusbar_pos);
cons_show("Input window postion (/inputwin) : %d", placement->inputwin_pos);
prefs_free_win_placement(placement);
}
void
cons_log_setting(void)
{
cons_show("Log file location : %s", get_log_file_location());
cons_show("Max log size (/log maxsize) : %d bytes", prefs_get_max_log_size());
if (prefs_get_boolean(PREF_LOG_ROTATE))
cons_show("Log rotation (/log rotate) : ON");
else
cons_show("Log rotation (/log rotate) : OFF");
if (prefs_get_boolean(PREF_LOG_SHARED))
cons_show("Shared log (/log shared) : ON");
else
cons_show("Shared log (/log shared) : OFF");
}
void
cons_logging_setting(void)
{
if (prefs_get_boolean(PREF_CHLOG))
cons_show("Chat logging (/logging chat) : ON");
else
cons_show("Chat logging (/logging chat) : OFF");
if (prefs_get_boolean(PREF_GRLOG))
cons_show("Groupchat logging (/logging group) : ON");
else
cons_show("Groupchat logging (/logging group) : OFF");
}
void
cons_show_log_prefs(void)
{
cons_show("Logging preferences:");
cons_show("");
cons_log_setting();
cons_logging_setting();
cons_alert();
}
void
cons_autoaway_setting(void)
{
char *pref_autoaway_mode = prefs_get_string(PREF_AUTOAWAY_MODE);
if (strcmp(pref_autoaway_mode, "off") == 0) {
cons_show("Autoaway (/autoaway mode) : OFF");
} else {
cons_show("Autoaway (/autoaway mode) : %s", pref_autoaway_mode);
}
prefs_free_string(pref_autoaway_mode);
int away_time = prefs_get_autoaway_time();
if (away_time == 1) {
cons_show("Autoaway away minutes (/autoaway time) : 1 minute");
} else {
cons_show("Autoaway away minutes (/autoaway time) : %d minutes", away_time);
}
int xa_time = prefs_get_autoxa_time();
if (xa_time == 0) {
cons_show("Autoaway xa minutes (/autoaway time) : OFF");
} else if (xa_time == 1) {
cons_show("Autoaway xa minutes (/autoaway time) : 1 minute");
} else {
cons_show("Autoaway xa minutes (/autoaway time) : %d minutes", xa_time);
}
char *pref_autoaway_message = prefs_get_string(PREF_AUTOAWAY_MESSAGE);
if ((pref_autoaway_message == NULL) || (strcmp(pref_autoaway_message, "") == 0)) {
cons_show("Autoaway away message (/autoaway message) : OFF");
} else {
cons_show("Autoaway away message (/autoaway message) : \"%s\"", pref_autoaway_message);
}
prefs_free_string(pref_autoaway_message);
char *pref_autoxa_message = prefs_get_string(PREF_AUTOXA_MESSAGE);
if ((pref_autoxa_message == NULL) || (strcmp(pref_autoxa_message, "") == 0)) {
cons_show("Autoaway xa message (/autoaway message) : OFF");
} else {
cons_show("Autoaway xa message (/autoaway message) : \"%s\"", pref_autoxa_message);
}
prefs_free_string(pref_autoxa_message);
if (prefs_get_boolean(PREF_AUTOAWAY_CHECK)) {
cons_show("Autoaway check (/autoaway check) : ON");
} else {
cons_show("Autoaway check (/autoaway check) : OFF");
}
}
void
cons_show_presence_prefs(void)
{
cons_show("Presence preferences:");
cons_show("");
cons_autoaway_setting();
if (prefs_get_boolean(PREF_LASTACTIVITY)) {
cons_show("Send last activity (/lastactivity) : ON");
} else {
cons_show("Send last activity (/lastactivity) : OFF");
}
cons_alert();
}
void
cons_reconnect_setting(void)
{
gint reconnect_interval = prefs_get_reconnect();
if (reconnect_interval == 0) {
cons_show("Reconnect interval (/reconnect) : OFF");
} else if (reconnect_interval == 1) {
cons_show("Reconnect interval (/reconnect) : 1 second");
} else {
cons_show("Reconnect interval (/reconnect) : %d seconds", reconnect_interval);
}
}
void
cons_autoping_setting(void)
{
gint autoping_interval = prefs_get_autoping();
if (autoping_interval == 0) {
cons_show("Autoping interval (/autoping) : OFF");
} else if (autoping_interval == 1) {
cons_show("Autoping interval (/autoping) : 1 second");
} else {
cons_show("Autoping interval (/autoping) : %d seconds", autoping_interval);
}
gint autoping_timeout = prefs_get_autoping_timeout();
if (autoping_timeout == 0) {
cons_show("Autoping timeout (/autoping) : OFF");
} else if (autoping_timeout == 1) {
cons_show("Autoping timeout (/autoping) : 1 second");
} else {
cons_show("Autoping timeout (/autoping) : %d seconds", autoping_timeout);
}
}
void
cons_color_setting(void)
{
char *color_pref = prefs_get_string(PREF_COLOR_NICK);
if (!color_pref) {
cons_show("Consistent color generation for nicks (/color) : OFF");
return;
}
if (strcmp(color_pref, "true") == 0) {
cons_show("Consistent color generation for nicks (/color) : ON");
} else if (strcmp(color_pref, "redgreen") == 0) {
cons_show("Consistent color generation for nicks (/color) : REDGREEN");
} else if (strcmp(color_pref, "blue") == 0) {
cons_show("Consistent color generation for nicks (/color) : BLUE");
} else {
cons_show("Consistent color generation for nicks (/color) : OFF");
}
prefs_free_string(color_pref);
if (prefs_get_boolean(PREF_COLOR_NICK_OWN)) {
cons_show("Consistent color generation for own nick (/color own) : ON");
} else {
cons_show("Consistent color generation for own nick (/color own) : OFF");
}
if (prefs_get_boolean(PREF_ROSTER_COLOR_NICK)) {
cons_show("Consistent color generation in roster (/roster color) : ON");
} else {
cons_show("Consistent color generation in roster (/roster color) : OFF");
}
if (prefs_get_boolean(PREF_OCCUPANTS_COLOR_NICK)) {
cons_show("Consistent color generation for occupants (/occupants color) : ON");
} else {
cons_show("Consistent color generation for occupants (/occupants color) : OFF");
}
}
void
cons_os_setting(void)
{
if (prefs_get_boolean(PREF_REVEAL_OS)) {
cons_show("Reveal OS name when asked for software version (XEP-0092) (/os) : ON");
} else {
cons_show("Reveal OS name when asked for software version (XEP-0092) (/os) : OFF");
}
}
void
cons_correction_setting(void)
{
if (prefs_get_boolean(PREF_CORRECTION_ALLOW)) {
cons_show("Last Message Correction (XEP-0308) (/correction) : ON");
} else {
cons_show("Last Message Correction (XEP-0308) (/correction) : OFF");
}
char *cc = prefs_get_correction_char();
cons_show("LMC indication char (/correction char) : %c", cc);
free(cc);
}
void
cons_avatar_setting(void)
{
char *pref = prefs_get_string(PREF_AVATAR_CMD);
cons_show("Avatar command (/avatar cmd) : %s", pref);
prefs_free_string(pref);
}
void
cons_slashguard_setting(void)
{
if (prefs_get_boolean(PREF_SLASH_GUARD)) {
cons_show("Slashguard (/slashguard) : ON");
} else {
cons_show("Slashguard (/slashguard) : OFF");
}
}
void
cons_show_connection_prefs(void)
{
cons_show("Connection preferences:");
cons_show("");
cons_reconnect_setting();
cons_autoping_setting();
cons_autoconnect_setting();
cons_rooms_cache_setting();
cons_alert();
}
void
cons_show_otr_prefs(void)
{
cons_show("OTR preferences:");
cons_show("");
char *policy_value = prefs_get_string(PREF_OTR_POLICY);
cons_show("OTR policy (/otr policy) : %s", policy_value);
prefs_free_string(policy_value);
char *log_value = prefs_get_string(PREF_OTR_LOG);
if (strcmp(log_value, "on") == 0) {
cons_show("OTR logging (/otr log) : ON");
} else if (strcmp(log_value, "off") == 0) {
cons_show("OTR logging (/otr log) : OFF");
} else {
cons_show("OTR logging (/otr log) : Redacted");
}
prefs_free_string(log_value);
char *ch = prefs_get_otr_char();
cons_show("OTR char (/otr char) : %s", ch);
free(ch);
if (prefs_get_boolean(PREF_OTR_SENDFILE)) {
cons_show("Allow sending unencrypted files in an OTR session via /sendfile (/otr sendfile): ON");
} else {
cons_show("Allow sending unencrypted files in an OTR session via /sendfile (/otr sendfile): OFF");
}
cons_alert();
}
void
cons_show_pgp_prefs(void)
{
cons_show("PGP preferences:");
cons_show("");
char *log_value = prefs_get_string(PREF_PGP_LOG);
if (strcmp(log_value, "on") == 0) {
cons_show("PGP logging (/pgp log) : ON");
} else if (strcmp(log_value, "off") == 0) {
cons_show("PGP logging (/pgp log) : OFF");
} else {
cons_show("PGP logging (/pgp log) : Redacted");
}
prefs_free_string(log_value);
char *ch = prefs_get_pgp_char();
cons_show("PGP char (/pgp char) : %s", ch);
free(ch);
if (prefs_get_boolean(PREF_PGP_SENDFILE)) {
cons_show("Allow sending unencrypted files via /sendfile while otherwise using PGP (/pgp sendfile): ON");
} else {
cons_show("Allow sending unencrypted files via /sendfile while otherwise using PGP (/pgp sendfile): OFF");
}
cons_alert();
}
void
cons_show_omemo_prefs(void)
{
cons_show("OMEMO preferences:");
cons_show("");
char *policy_value = prefs_get_string(PREF_OMEMO_POLICY);
cons_show("OMEMO policy (/omemo policy) : %s", policy_value);
prefs_free_string(policy_value);
char *log_value = prefs_get_string(PREF_OMEMO_LOG);
if (strcmp(log_value, "on") == 0) {
cons_show("OMEMO logging (/omemo log) : ON");
} else if (strcmp(log_value, "off") == 0) {
cons_show("OMEMO logging (/omemo log) : OFF");
} else {
cons_show("OMEMO logging (/omemo log) : Redacted");
}
prefs_free_string(log_value);
char *ch = prefs_get_omemo_char();
cons_show("OMEMO char (/omemo char) : %s", ch);
free(ch);
if (prefs_get_boolean(PREF_OMEMO_SENDFILE)) {
cons_show("Allow sending unencrypted files in an OMEMO session via /sendfile (/omemo sendfile): ON");
} else {
cons_show("Allow sending unencrypted files in an OMEMO session via /sendfile (/omemo sendfile): OFF");
}
cons_alert();
}
void
cons_show_themes(GSList *themes)
{
cons_show("");
if (themes == NULL) {
cons_show("No available themes.");
} else {
cons_show("Available themes:");
while (themes) {
cons_show(themes->data);
themes = g_slist_next(themes);
}
}
cons_alert();
}
void
cons_show_scripts(GSList *scripts)
{
cons_show("");
if (scripts == NULL) {
cons_show("No scripts available.");
} else {
cons_show("Scripts:");
while (scripts) {
cons_show(scripts->data);
scripts = g_slist_next(scripts);
}
}
cons_alert();
}
void
cons_show_script(const char *const script, GSList *commands)
{
cons_show("");
if (commands == NULL) {
cons_show("Script not found: %s", script);
} else {
cons_show("%s:", script);
while (commands) {
cons_show(" %s", commands->data);
commands = g_slist_next(commands);
}
}
cons_alert();
}
void
cons_prefs(void)
{
cons_show("");
cons_show_ui_prefs();
cons_show("");
cons_show_desktop_prefs();
cons_show("");
cons_show_chat_prefs();
cons_show("");
cons_show_log_prefs();
cons_show("");
cons_show_presence_prefs();
cons_show("");
cons_show_connection_prefs();
cons_show("");
cons_show_otr_prefs();
cons_show("");
cons_show_pgp_prefs();
cons_show("");
cons_show_omemo_prefs();
cons_show("");
cons_alert();
}
void
cons_help(void)
{
int pad = strlen("/help commands connection") + 3;
cons_show("");
cons_show("Choose a help option:");
cons_show("");
cons_show_padded(pad, "/help commands : List all commands.");
cons_show_padded(pad, "/help commands chat : List chat commands.");
cons_show_padded(pad, "/help commands groupchat : List groupchat commands.");
cons_show_padded(pad, "/help commands roster : List commands for manipulating your roster.");
cons_show_padded(pad, "/help commands presence : List commands to change your presence.");
cons_show_padded(pad, "/help commands discovery : List service discovery commands.");
cons_show_padded(pad, "/help commands connection : List commands related to managing your connection.");
cons_show_padded(pad, "/help commands ui : List commands for manipulating the user interface.");
cons_show_padded(pad, "/help commands plugins : List plugin commands.");
cons_show_padded(pad, "/help [command] : Detailed help on a specific command.");
cons_show_padded(pad, "/help navigation : How to navigate around Profanity.");
cons_show("");
cons_alert();
}
void
cons_navigation_help(void)
{
ProfWin *console = wins_get_console();
cons_show("");
win_println(console, THEME_HELP_HEADER, "-", "Navigation");
cons_show("Alt-1..Alt-0, F1..F10 : Choose window.");
cons_show("Alt-LEFT, Alt-RIGHT : Previous/next chat window.");
cons_show("PAGEUP, PAGEDOWN : Page the main window.");
cons_show("Alt-PAGEUP, Alt-PAGEDOWN : Page occupants/roster panel.");
cons_show("");
cons_show("/win <n> : Focus window n, where n is the window number.");
cons_show("/win <name> : Focus window with name, where name is the recipient, room or window title.");
cons_show("");
cons_show("See '/help win' for more information.");
cons_alert();
}
void
cons_show_roster_group(const char *const group, GSList *list)
{
cons_show("");
if (list) {
cons_show("%s:", group);
} else {
cons_show("No group named %s exists.", group);
}
_show_roster_contacts(list, FALSE);
cons_alert();
}
void
cons_show_roster(GSList *list)
{
cons_show("");
cons_show("Roster: jid (nick) - subscription - groups");
_show_roster_contacts(list, TRUE);
cons_alert();
}
void
cons_show_contact_online(PContact contact, Resource *resource, GDateTime *last_activity)
{
const char *show = string_from_resource_presence(resource->presence);
char *display_str = p_contact_create_display_string(contact, resource->name);
ProfWin *console = wins_get_console();
win_show_status_string(console, display_str, show, resource->status, last_activity,
"++", "online");
free(display_str);
}
void
cons_show_contact_offline(PContact contact, char *resource, char *status)
{
char *display_str = p_contact_create_display_string(contact, resource);
ProfWin *console = wins_get_console();
win_show_status_string(console, display_str, "offline", status, NULL, "--",
"offline");
free(display_str);
}
void
cons_show_contacts(GSList *list)
{
ProfWin *console = wins_get_console();
GSList *curr = list;
while(curr) {
PContact contact = curr->data;
if ((strcmp(p_contact_subscription(contact), "to") == 0) ||
(strcmp(p_contact_subscription(contact), "both") == 0)) {
win_show_contact(console, contact);
}
curr = g_slist_next(curr);
}
cons_alert();
}
void
cons_alert(void)
{
ProfWin *current = wins_get_current();
if (current->type != WIN_CONSOLE) {
status_bar_new(1, WIN_CONSOLE, "console");
}
}
char*
cons_get_string(ProfConsoleWin *conswin)
{
assert(conswin != NULL);
return strdup("Console");
}
void
_cons_theme_bar_prop(theme_item_t theme, char *prop)
{
ProfWin *console = wins_get_console();
GString *propstr = g_string_new(" ");
g_string_append_printf(propstr, "%-24s", prop);
win_print(console, THEME_TEXT, "-", "%s", propstr->str);
g_string_free(propstr, TRUE);
GString *valstr = g_string_new(" ");
char *setting = theme_get_string(prop);
g_string_append_printf(valstr, "%s ", setting);
theme_free_string(setting);
win_append(console, theme, "%s", valstr->str);
win_appendln(console, THEME_TEXT, "");
g_string_free(valstr, TRUE);
}
void
_cons_theme_prop(theme_item_t theme, char *prop)
{
ProfWin *console = wins_get_console();
GString *propstr = g_string_new(" ");
g_string_append_printf(propstr, "%-24s", prop);
win_print(console, THEME_TEXT, "-", "%s", propstr->str);
g_string_free(propstr, TRUE);
GString *valstr = g_string_new("");
char *setting = theme_get_string(prop);
g_string_append_printf(valstr, "%s", setting);
theme_free_string(setting);
win_appendln(console, theme, "%s", valstr->str);
g_string_free(valstr, TRUE);
}
void
cons_theme_properties(void)
{
cons_show("Current colours:");
_cons_theme_bar_prop(THEME_TITLE_TEXT, "titlebar.text");
_cons_theme_bar_prop(THEME_TITLE_BRACKET, "titlebar.brackets");
_cons_theme_bar_prop(THEME_TITLE_UNENCRYPTED, "titlebar.unencrypted");
_cons_theme_bar_prop(THEME_TITLE_ENCRYPTED, "titlebar.encrypted");
_cons_theme_bar_prop(THEME_TITLE_UNTRUSTED, "titlebar.untrusted");
_cons_theme_bar_prop(THEME_TITLE_TRUSTED, "titlebar.trusted");
_cons_theme_bar_prop(THEME_TITLE_CHAT, "titlebar.chat");
_cons_theme_bar_prop(THEME_TITLE_ONLINE, "titlebar.online");
_cons_theme_bar_prop(THEME_TITLE_AWAY, "titlebar.away");
_cons_theme_bar_prop(THEME_TITLE_XA, "titlebar.xa");
_cons_theme_bar_prop(THEME_TITLE_DND, "titlebar.dnd");
_cons_theme_bar_prop(THEME_TITLE_OFFLINE, "titlebar.offline");
_cons_theme_bar_prop(THEME_STATUS_TEXT, "statusbar.text");
_cons_theme_bar_prop(THEME_STATUS_BRACKET, "statusbar.brackets");
_cons_theme_bar_prop(THEME_STATUS_ACTIVE, "statusbar.active");
_cons_theme_bar_prop(THEME_STATUS_CURRENT, "statusbar.current");
_cons_theme_bar_prop(THEME_STATUS_NEW, "statusbar.new");
_cons_theme_bar_prop(THEME_STATUS_TIME, "statusbar.time");
_cons_theme_prop(THEME_TIME, "main.time");
_cons_theme_prop(THEME_TEXT, "main.text");
_cons_theme_prop(THEME_SPLASH, "main.splash");
_cons_theme_prop(THEME_ERROR, "error");
_cons_theme_prop(THEME_OTR_STARTED_TRUSTED, "otr.started.trusted");
_cons_theme_prop(THEME_OTR_STARTED_UNTRUSTED, "otr.started.untrusted");
_cons_theme_prop(THEME_OTR_ENDED, "otr.ended");
_cons_theme_prop(THEME_OTR_TRUSTED, "otr.trusted");
_cons_theme_prop(THEME_OTR_UNTRUSTED, "otr.untrusted");
_cons_theme_prop(THEME_ME, "me");
_cons_theme_prop(THEME_TEXT_ME, "main.text.me");
_cons_theme_prop(THEME_THEM, "them");
_cons_theme_prop(THEME_TEXT_THEM, "main.text.them");
_cons_theme_prop(THEME_TEXT_HISTORY, "main.text.history");
_cons_theme_prop(THEME_CHAT, "chat");
_cons_theme_prop(THEME_ONLINE, "online");
_cons_theme_prop(THEME_AWAY, "away");
_cons_theme_prop(THEME_XA, "xa");
_cons_theme_prop(THEME_DND, "dnd");
_cons_theme_prop(THEME_OFFLINE, "offline");
_cons_theme_prop(THEME_SUBSCRIBED, "subscribed");
_cons_theme_prop(THEME_UNSUBSCRIBED, "unsubscribed");
_cons_theme_prop(THEME_INCOMING, "incoming");
_cons_theme_prop(THEME_MENTION, "mention");
_cons_theme_prop(THEME_TRIGGER, "trigger");
_cons_theme_prop(THEME_TYPING, "typing");
_cons_theme_prop(THEME_GONE, "gone");
_cons_theme_prop(THEME_ROOMINFO, "roominfo");
_cons_theme_prop(THEME_ROOMMENTION, "roommention");
_cons_theme_prop(THEME_ROOMMENTION_TERM, "roommention.term");
_cons_theme_prop(THEME_ROOMTRIGGER, "roomtrigger");
_cons_theme_prop(THEME_ROOMTRIGGER_TERM, "roomtrigger.term");
_cons_theme_prop(THEME_ROSTER_HEADER, "roster.header");
_cons_theme_prop(THEME_ROSTER_CHAT, "roster.chat");
_cons_theme_prop(THEME_ROSTER_ONLINE, "roster.online");
_cons_theme_prop(THEME_ROSTER_AWAY, "roster.away");
_cons_theme_prop(THEME_ROSTER_XA, "roster.xa");
_cons_theme_prop(THEME_ROSTER_DND, "roster.dnd");
_cons_theme_prop(THEME_ROSTER_OFFLINE, "roster.offline");
_cons_theme_prop(THEME_ROSTER_CHAT_ACTIVE, "roster.chat.active");
_cons_theme_prop(THEME_ROSTER_ONLINE_ACTIVE, "roster.online.active");
_cons_theme_prop(THEME_ROSTER_AWAY_ACTIVE, "roster.away.active");
_cons_theme_prop(THEME_ROSTER_XA_ACTIVE, "roster.xa.active");
_cons_theme_prop(THEME_ROSTER_DND_ACTIVE, "roster.dnd.active");
_cons_theme_prop(THEME_ROSTER_OFFLINE_ACTIVE, "roster.offline.active");
_cons_theme_prop(THEME_ROSTER_CHAT_UNREAD, "roster.chat.unread");
_cons_theme_prop(THEME_ROSTER_ONLINE_UNREAD, "roster.online.unread");
_cons_theme_prop(THEME_ROSTER_AWAY_UNREAD, "roster.away.unread");
_cons_theme_prop(THEME_ROSTER_XA_UNREAD, "roster.xa.unread");
_cons_theme_prop(THEME_ROSTER_DND_UNREAD, "roster.dnd.unread");
_cons_theme_prop(THEME_ROSTER_OFFLINE_UNREAD, "roster.offline.unread");
_cons_theme_prop(THEME_ROSTER_ROOM, "roster.room");
_cons_theme_prop(THEME_ROSTER_ROOM_UNREAD, "roster.room.unread");
_cons_theme_prop(THEME_ROSTER_ROOM_TRIGGER, "roster.room.trigger");
_cons_theme_prop(THEME_ROSTER_ROOM_MENTION, "roster.room.mention");
_cons_theme_prop(THEME_OCCUPANTS_HEADER, "occupants.header");
_cons_theme_prop(THEME_RECEIPT_SENT, "receipt.sent");
_cons_theme_prop(THEME_INPUT_TEXT, "input.text");
cons_show("");
}
void
cons_theme_colours(void)
{
/*
* { "default", -1 },
{ "white", COLOR_WHITE },
{ "green", COLOR_GREEN },
{ "red", COLOR_RED },
{ "yellow", COLOR_YELLOW },
{ "blue", COLOR_BLUE },
{ "cyan", COLOR_CYAN },
{ "black", COLOR_BLACK },
{ "magenta", COLOR_MAGENTA },
*/
ProfWin *console = wins_get_console();
cons_show("Available colours:");
win_print(console, THEME_WHITE, "-", " white ");
win_appendln(console, THEME_WHITE_BOLD, " bold_white");
win_print(console, THEME_GREEN, "-", " green ");
win_appendln(console, THEME_GREEN_BOLD, " bold_green");
win_print(console, THEME_RED, "-", " red ");
win_appendln(console, THEME_RED_BOLD, " bold_red");
win_print(console, THEME_YELLOW, "-", " yellow ");
win_appendln(console, THEME_YELLOW_BOLD, " bold_yellow");
win_print(console, THEME_BLUE, "-", " blue ");
win_appendln(console, THEME_BLUE_BOLD, " bold_blue");
win_print(console, THEME_CYAN, "-", " cyan ");
win_appendln(console, THEME_CYAN_BOLD, " bold_cyan");
win_print(console, THEME_MAGENTA, "-", " magenta ");
win_appendln(console, THEME_MAGENTA_BOLD, " bold_magenta");
win_print(console, THEME_BLACK, "-", " black ");
win_appendln(console, THEME_BLACK_BOLD, " bold_black");
if (COLORS >= 256) {
cons_show("Your terminal supports 256 colours.");
cons_show("But only basic colours are printed here.");
cons_show("To use them use their Xterm colour name.");
cons_show("See https://jonasjacek.github.io/colors/");
}
cons_show("");
}
static void
_cons_splash_logo(void)
{
ProfWin *console = wins_get_console();
win_println(console, THEME_DEFAULT, "-", "Welcome to");
win_println(console, THEME_SPLASH, "-", " ___ _ ");
win_println(console, THEME_SPLASH, "-", " / __) (_)_ ");
win_println(console, THEME_SPLASH, "-", " ____ ___ ___ | |__ ____ ____ _| |_ _ _ ");
win_println(console, THEME_SPLASH, "-", "| _ \\ / __) _ \\| __) _ | _ \\| | _) | | |");
win_println(console, THEME_SPLASH, "-", "| | ) | | | (_) | | | ( | | | | | | |_| |_| |");
win_println(console, THEME_SPLASH, "-", "| ||_/|_| \\___/|_| \\_||_|_| |_|_|\\___)__ |");
win_println(console, THEME_SPLASH, "-", "|_| (____/ ");
win_println(console, THEME_SPLASH, "-", "");
if (strcmp(PACKAGE_STATUS, "development") == 0) {
#ifdef HAVE_GIT_VERSION
win_println(console, THEME_DEFAULT, "-", "Version %sdev.%s.%s", PACKAGE_VERSION, PROF_GIT_BRANCH, PROF_GIT_REVISION);
#else
win_println(console, THEME_DEFAULT, "Version %sdev", PACKAGE_VERSION);
#endif
} else {
win_println(console, THEME_DEFAULT, "-", "Version %s", PACKAGE_VERSION);
}
}
void
_show_roster_contacts(GSList *list, gboolean show_groups)
{
ProfWin *console = wins_get_console();
GSList *curr = list;
while(curr) {
PContact contact = curr->data;
GString *title = g_string_new(" ");
title = g_string_append(title, p_contact_barejid(contact));
if (p_contact_name(contact)) {
title = g_string_append(title, " (");
title = g_string_append(title, p_contact_name(contact));
title = g_string_append(title, ")");
}
const char *presence = p_contact_presence(contact);
theme_item_t presence_colour = THEME_TEXT;
if (p_contact_subscribed(contact)) {
presence_colour = theme_main_presence_attrs(presence);
} else {
presence_colour = theme_main_presence_attrs("offline");
}
win_print(console, presence_colour, "-", "%s", title->str);
g_string_free(title, TRUE);
win_append(console, THEME_DEFAULT, " - ");
GString *sub = g_string_new("");
sub = g_string_append(sub, p_contact_subscription(contact));
if (p_contact_pending_out(contact)) {
sub = g_string_append(sub, ", request sent");
}
if (presence_sub_request_exists(p_contact_barejid(contact))) {
sub = g_string_append(sub, ", request received");
}
if (p_contact_subscribed(contact)) {
presence_colour = THEME_SUBSCRIBED;
} else {
presence_colour = THEME_UNSUBSCRIBED;
}
if (show_groups) {
win_append(console, presence_colour, "%s", sub->str);
} else {
win_appendln(console, presence_colour, "%s", sub->str);
}
g_string_free(sub, TRUE);
if (show_groups) {
GSList *groups = p_contact_groups(contact);
if (groups) {
GString *groups_str = g_string_new(" - ");
while (groups) {
g_string_append(groups_str, groups->data);
if (g_slist_next(groups)) {
g_string_append(groups_str, ", ");
}
groups = g_slist_next(groups);
}
win_appendln(console, THEME_DEFAULT, "%s", groups_str->str);
g_string_free(groups_str, TRUE);
} else {
win_appendln(console, THEME_DEFAULT, " ");
}
}
curr = g_slist_next(curr);
}
}