diff -r d10dda2777a9 -r b63ebf84c42b plugins/history.c --- a/plugins/history.c Sat Aug 19 00:24:14 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,209 +0,0 @@ -/* Puts last 4k of log in new conversations a la Everybuddy (and then - * stolen by Trillian "Pro") */ - -#include "internal.h" -#include "gtkgaim.h" - -#include "conversation.h" -#include "debug.h" -#include "log.h" -#include "notify.h" -#include "prefs.h" -#include "signals.h" -#include "util.h" -#include "version.h" - -#include "gtkconv.h" -#include "gtkimhtml.h" -#include "gtkplugin.h" - -#define HISTORY_PLUGIN_ID "gtk-history" - -#define HISTORY_SIZE (4 * 1024) - -static gboolean _scroll_imhtml_to_end(gpointer data) -{ - GtkIMHtml *imhtml = data; - gtk_imhtml_scroll_to_end(GTK_IMHTML(imhtml), FALSE); - g_object_unref(G_OBJECT(imhtml)); - return FALSE; -} - -static void historize(GaimConversation *c) -{ - GaimAccount *account = gaim_conversation_get_account(c); - const char *name = gaim_conversation_get_name(c); - GaimConversationType convtype; - GList *logs = NULL; - const char *alias = name; - guint flags; - char *history; - GaimGtkConversation *gtkconv; - GtkIMHtmlOptions options = GTK_IMHTML_NO_COLOURS; - char *header; - char *protocol; - - convtype = gaim_conversation_get_type(c); - gtkconv = GAIM_GTK_CONVERSATION(c); - if (convtype == GAIM_CONV_TYPE_IM && g_list_length(gtkconv->convs) < 2) - { - GSList *buddies; - GSList *cur; - - /* If we're not logging, don't show anything. - * Otherwise, we might show a very old log. */ - if (!gaim_prefs_get_bool("/core/logging/log_ims")) - return; - - /* Find buddies for this conversation. */ - buddies = gaim_find_buddies(account, name); - - /* If we found at least one buddy, save the first buddy's alias. */ - if (buddies != NULL) - alias = gaim_buddy_get_contact_alias((GaimBuddy *)buddies->data); - - for (cur = buddies; cur != NULL; cur = cur->next) - { - GaimBlistNode *node = cur->data; - if ((node != NULL) && ((node->prev != NULL) || (node->next != NULL))) - { - GaimBlistNode *node2; - - alias = gaim_buddy_get_contact_alias((GaimBuddy *)node); - - /* We've found a buddy that matches this conversation. It's part of a - * GaimContact with more than one GaimBuddy. Loop through the GaimBuddies - * in the contact and get all the logs. */ - for (node2 = node->parent->child ; node2 != NULL ; node2 = node2->next) - { - logs = g_list_concat( - gaim_log_get_logs(GAIM_LOG_IM, - gaim_buddy_get_name((GaimBuddy *)node2), - gaim_buddy_get_account((GaimBuddy *)node2)), - logs); - } - break; - } - } - g_slist_free(buddies); - - if (logs == NULL) - logs = gaim_log_get_logs(GAIM_LOG_IM, name, account); - else - logs = g_list_sort(logs, gaim_log_compare); - } - else if (convtype == GAIM_CONV_TYPE_CHAT) - { - /* If we're not logging, don't show anything. - * Otherwise, we might show a very old log. */ - if (!gaim_prefs_get_bool("/core/logging/log_chats")) - return; - - logs = gaim_log_get_logs(GAIM_LOG_CHAT, name, account); - } - - if (logs == NULL) - return; - - history = gaim_log_read((GaimLog*)logs->data, &flags); - gtkconv = GAIM_GTK_CONVERSATION(c); - if (flags & GAIM_LOG_READ_NO_NEWLINE) - options |= GTK_IMHTML_NO_NEWLINE; - - protocol = g_strdup(gtk_imhtml_get_protocol_name(GTK_IMHTML(gtkconv->imhtml))); - gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->imhtml), - gaim_account_get_protocol_name(((GaimLog*)logs->data)->account)); - - if (gtk_text_buffer_get_char_count(gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->imhtml)))) - gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), "
", options); - - header = g_strdup_printf(_("Conversation with %s on %s:
"), alias, - gaim_date_format_full(localtime(&((GaimLog *)logs->data)->time))); - gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), header, options); - g_free(header); - - g_strchomp(history); - gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), history, options); - g_free(history); - - gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), "
", options); - - gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->imhtml), protocol); - g_free(protocol); - - g_object_ref(G_OBJECT(gtkconv->imhtml)); - g_idle_add(_scroll_imhtml_to_end, gtkconv->imhtml); - - g_list_foreach(logs, (GFunc)gaim_log_free, NULL); - g_list_free(logs); -} - -static void -history_prefs_check(GaimPlugin *plugin) -{ - if (!gaim_prefs_get_bool("/core/logging/log_ims") && - !gaim_prefs_get_bool("/core/logging/log_chats")) - { - gaim_notify_warning(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).")); - } -} - -static void history_prefs_cb(const char *name, GaimPrefType type, - gconstpointer val, gpointer data) -{ - history_prefs_check((GaimPlugin *)data); -} - -static gboolean -plugin_load(GaimPlugin *plugin) -{ - gaim_signal_connect(gaim_conversations_get_handle(), - "conversation-created", - plugin, GAIM_CALLBACK(historize), NULL); - - gaim_prefs_connect_callback(plugin, "/core/logging/log_ims", - history_prefs_cb, plugin); - gaim_prefs_connect_callback(plugin, "/core/logging/log_chats", - history_prefs_cb, plugin); - - history_prefs_check(plugin); - - return TRUE; -} - -static GaimPluginInfo info = -{ - GAIM_PLUGIN_MAGIC, - GAIM_MAJOR_VERSION, - GAIM_MINOR_VERSION, - GAIM_PLUGIN_STANDARD, - GAIM_GTK_PLUGIN_TYPE, - 0, - NULL, - GAIM_PRIORITY_DEFAULT, - HISTORY_PLUGIN_ID, - N_("History"), - VERSION, - N_("Shows recently logged conversations in new conversations."), - N_("When a new conversation is opened this plugin will insert " - "the last conversation into the current conversation."), - "Sean Egan ", - GAIM_WEBSITE, - plugin_load, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL -}; - -static void -init_plugin(GaimPlugin *plugin) -{ -} - -GAIM_INIT_PLUGIN(history, init_plugin, info)