Sat, 29 May 2021 03:20:21 -0500
Convert the Finch plugins to use GPLUGIN_NATIVE_PLUGIN_DECLARE
Testing Done:
Compile only
Reviewed at https://reviews.imfreedom.org/r/681/
/** * Copyright (C) 2006 Sadrul Habib Chowdhury <sadrul@users.sourceforge.net> * * This program 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 2 of the License, or * (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ /* Ripped from gtk/plugins/history.c */ #include <glib/gi18n-lib.h> #include <purple.h> #include <finch.h> #define HISTORY_PLUGIN_ID "gnt-history" #define HISTORY_SIZE (4 * 1024) static void historize(PurpleConversation *c) { PurpleAccount *account = purple_conversation_get_account(c); const char *name = purple_conversation_get_name(c); GList *logs = NULL; const char *alias = name; PurpleLogReadFlags flags; GDateTime *dt; char *date; char *history; char *header; PurpleMessageFlags mflag; if (PURPLE_IS_IM_CONVERSATION(c)) { GSList *buddies; GSList *cur; FinchConv *fc = FINCH_CONV(c); if (fc->list && fc->list->next) /* We were already in the middle of a conversation. */ return; /* If we're not logging, don't show anything. * Otherwise, we might show a very old log. */ if (!purple_prefs_get_bool("/purple/logging/log_ims")) return; /* Find buddies for this conversation. */ buddies = purple_blist_find_buddies(account, name); /* If we found at least one buddy, save the first buddy's alias. */ if (buddies != NULL) alias = purple_buddy_get_contact_alias(PURPLE_BUDDY(buddies->data)); for (cur = buddies; cur != NULL; cur = cur->next) { PurpleBlistNode *node = cur->data; if ((node != NULL) && ((purple_blist_node_get_sibling_prev(node) != NULL) || (purple_blist_node_get_sibling_next(node) != NULL))) { PurpleBlistNode *node2; alias = purple_buddy_get_contact_alias(PURPLE_BUDDY(node)); /* We've found a buddy that matches this conversation. It's part of a * PurpleContact with more than one PurpleBuddy. Loop through the PurpleBuddies * in the contact and get all the logs. */ for (node2 = purple_blist_node_get_first_child(purple_blist_node_get_parent(node)); node2 != NULL ; node2 = purple_blist_node_get_sibling_next(node2)) { logs = g_list_concat( purple_log_get_logs(PURPLE_LOG_IM, purple_buddy_get_name(PURPLE_BUDDY(node2)), purple_buddy_get_account(PURPLE_BUDDY(node2))), logs); } break; } } g_slist_free(buddies); if (logs == NULL) logs = purple_log_get_logs(PURPLE_LOG_IM, name, account); else logs = g_list_sort(logs, purple_log_compare); } else if (PURPLE_IS_CHAT_CONVERSATION(c)) { /* If we're not logging, don't show anything. * Otherwise, we might show a very old log. */ if (!purple_prefs_get_bool("/purple/logging/log_chats")) return; logs = purple_log_get_logs(PURPLE_LOG_CHAT, name, account); } if (logs == NULL) return; mflag = PURPLE_MESSAGE_NO_LOG | PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_DELAYED; history = purple_log_read((PurpleLog*)logs->data, &flags); dt = g_date_time_to_local(((PurpleLog *)logs->data)->time); date = g_date_time_format(dt, "%c"); header = g_strdup_printf(_("<b>Conversation with %s on %s:</b><br>"), alias, date); purple_conversation_write_system_message(c, header, mflag); g_free(date); g_free(header); if (flags & PURPLE_LOG_READ_NO_NEWLINE) purple_str_strip_char(history, '\n'); purple_conversation_write_system_message(c, history, mflag); g_free(history); purple_conversation_write_system_message(c, "<hr>", mflag); g_list_free_full(logs, (GDestroyNotify)purple_log_free); } static void history_prefs_check(PurplePlugin *plugin) { if (!purple_prefs_get_bool("/purple/logging/log_ims") && !purple_prefs_get_bool("/purple/logging/log_chats")) { PurpleRequestFields *fields = purple_request_fields_new(); PurpleRequestFieldGroup *group; PurpleRequestField *field; struct { const char *pref; const char *label; } prefs[] = { {"/purple/logging/log_ims", N_("Log IMs")}, {"/purple/logging/log_chats", N_("Log chats")}, {NULL, NULL} }; int iter; GList *list = purple_log_logger_get_options(); const char *system = purple_prefs_get_string("/purple/logging/format"); group = purple_request_field_group_new(_("Logging")); field = purple_request_field_list_new("/purple/logging/format", _("Log format")); while (list) { const char *label = _(list->data); list = g_list_delete_link(list, list); purple_request_field_list_add_icon(field, label, NULL, list->data); if (purple_strequal(system, list->data)) purple_request_field_list_add_selected(field, label); list = g_list_delete_link(list, list); } purple_request_field_group_add_field(group, field); for (iter = 0; prefs[iter].pref; iter++) { field = purple_request_field_bool_new(prefs[iter].pref, _(prefs[iter].label), purple_prefs_get_bool(prefs[iter].pref)); purple_request_field_group_add_field(group, field); } purple_request_fields_add_group(fields, group); /* Translators: Please maintain the use of ⇦ or ⇨ to represent the menu hierarchy */ purple_request_fields(plugin, NULL, _("History Plugin Requires Logging"), _("Logging can be enabled from Tools ⇨ Preferences ⇨ Logging.\n\n" "Enabling logs for instant messages and/or chats will activate " "history for the same conversation type(s)."), fields, _("OK"), G_CALLBACK(finch_request_save_in_prefs), _("Cancel"), NULL, NULL, plugin); } } static void history_prefs_cb(const char *name, PurplePrefType type, gconstpointer val, gpointer data) { history_prefs_check((PurplePlugin *)data); } static GPluginPluginInfo * gnt_history_query(GError **error) { const gchar * const authors[] = { "Sean Egan <seanegan@gmail.com>", "Sadrul H Chowdhury <sadrul@users.sourceforge.net>", NULL }; return finch_plugin_info_new( "id", HISTORY_PLUGIN_ID, "name", N_("GntHistory"), "version", DISPLAY_VERSION, "category", N_("User interface"), "summary", N_("Shows recently logged conversations in new " "conversations."), "description", N_("When a new conversation is opened this plugin will " "insert the last conversation into the current " "conversation."), "authors", authors, "website", PURPLE_WEBSITE, "abi-version", PURPLE_ABI_VERSION, NULL ); } static gboolean gnt_history_load(GPluginPlugin *plugin, GError **error) { purple_signal_connect(purple_conversations_get_handle(), "conversation-created", plugin, PURPLE_CALLBACK(historize), NULL); purple_prefs_connect_callback(plugin, "/purple/logging/log_ims", history_prefs_cb, plugin); purple_prefs_connect_callback(plugin, "/purple/logging/log_chats", history_prefs_cb, plugin); history_prefs_check(plugin); return TRUE; } static gboolean gnt_history_unload(GPluginPlugin *plugin, GError **error) { return TRUE; } GPLUGIN_NATIVE_PLUGIN_DECLARE(gnt_history)