Wed, 13 May 2009 20:29:03 +0000
Support custom smileys in MUCs (when all participants support BoB and a maximum
of 10 participants are in the chat).
Always announce support for BoB, since disable custom smileys will still turn
off fetching them, and BoB can be used for other purposes further on.
| 15230 | 1 | /* |
| 2 | * Offline Message Emulation - Save messages sent to an offline user as pounce | |
| 3 | * Copyright (C) 2004 | |
| 4 | * | |
| 5 | * This program is free software; you can redistribute it and/or | |
| 6 | * modify it under the terms of the GNU General Public License as | |
| 7 | * published by the Free Software Foundation; either version 2 of the | |
| 8 | * License, or (at your option) any later version. | |
| 9 | * | |
| 10 | * This program is distributed in the hope that it will be useful, but | |
| 11 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 13 | * General Public License for more details. | |
| 14 | * | |
| 15 | * You should have received a copy of the GNU General Public License | |
| 16 | * along with this program; if not, write to the Free Software | |
|
19859
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
19832
diff
changeset
|
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
|
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
19832
diff
changeset
|
18 | * 02111-1301, USA. |
| 15230 | 19 | */ |
| 20 | #include "internal.h" | |
| 21 | ||
| 22 | #define PLUGIN_ID "core-plugin_pack-offlinemsg" | |
|
15418
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
23 | #define PLUGIN_NAME N_("Offline Message Emulation") |
|
25633
feee0c7e503f
Fix some more mis-identified plugins, like 3b3526a0...
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22268
diff
changeset
|
24 | #define PLUGIN_STATIC_NAME offlinemsg |
|
15418
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
25 | #define PLUGIN_SUMMARY N_("Save messages sent to an offline user as pounce.") |
|
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
26 | #define PLUGIN_DESCRIPTION N_("Save messages sent to an offline user as pounce.") |
| 15230 | 27 | #define PLUGIN_AUTHOR "Sadrul H Chowdhury <sadrul@users.sourceforge.net>" |
| 28 | ||
| 15884 | 29 | /* Purple headers */ |
| 15230 | 30 | #include <version.h> |
| 31 | ||
| 32 | #include <blist.h> | |
| 33 | #include <conversation.h> | |
| 34 | #include <core.h> | |
| 35 | #include <debug.h> | |
| 36 | #include <pounce.h> | |
| 37 | #include <request.h> | |
| 38 | ||
| 16481 | 39 | #define PREF_PREFIX "/plugins/core/" PLUGIN_ID |
| 15230 | 40 | #define PREF_ALWAYS PREF_PREFIX "/always" |
| 41 | ||
| 42 | typedef struct _OfflineMsg OfflineMsg; | |
| 43 | ||
| 44 | typedef enum | |
| 45 | { | |
| 46 | OFFLINE_MSG_NONE, | |
| 47 | OFFLINE_MSG_YES, | |
| 48 | OFFLINE_MSG_NO | |
| 49 | } OfflineMessageSetting; | |
| 50 | ||
| 51 | struct _OfflineMsg | |
| 52 | { | |
| 15884 | 53 | PurpleAccount *account; |
| 54 | PurpleConversation *conv; | |
| 15230 | 55 | char *who; |
| 56 | char *message; | |
| 57 | }; | |
| 58 | ||
| 59 | static void | |
| 60 | discard_data(OfflineMsg *offline) | |
| 61 | { | |
| 62 | g_free(offline->who); | |
| 63 | g_free(offline->message); | |
| 64 | g_free(offline); | |
| 65 | } | |
| 66 | ||
| 67 | static void | |
| 68 | cancel_poune(OfflineMsg *offline) | |
| 69 | { | |
| 15884 | 70 | purple_conversation_set_data(offline->conv, "plugin_pack:offlinemsg", |
| 15230 | 71 | GINT_TO_POINTER(OFFLINE_MSG_NO)); |
| 15884 | 72 | purple_conv_im_send_with_flags(PURPLE_CONV_IM(offline->conv), offline->message, 0); |
| 15230 | 73 | discard_data(offline); |
| 74 | } | |
| 75 | ||
| 76 | static void | |
| 77 | record_pounce(OfflineMsg *offline) | |
| 78 | { | |
| 15884 | 79 | PurplePounce *pounce; |
| 80 | PurplePounceEvent event; | |
| 81 | PurplePounceOption option; | |
| 82 | PurpleConversation *conv; | |
| 15230 | 83 | |
| 15884 | 84 | event = PURPLE_POUNCE_SIGNON; |
| 85 | option = PURPLE_POUNCE_OPTION_NONE; | |
| 15230 | 86 | |
| 15884 | 87 | pounce = purple_pounce_new(purple_core_get_ui(), offline->account, offline->who, |
| 15230 | 88 | event, option); |
| 89 | ||
| 15884 | 90 | purple_pounce_action_set_enabled(pounce, "send-message", TRUE); |
| 91 | purple_pounce_action_set_attribute(pounce, "send-message", "message", offline->message); | |
| 15230 | 92 | |
| 93 | conv = offline->conv; | |
| 15884 | 94 | if (!purple_conversation_get_data(conv, "plugin_pack:offlinemsg")) |
| 95 | purple_conversation_write(conv, NULL, _("The rest of the messages will be saved " | |
| 15230 | 96 | "as pounce. You can edit/delete the pounce from the `Buddy " |
| 97 | "Pounce' dialog."), | |
| 15884 | 98 | PURPLE_MESSAGE_SYSTEM, time(NULL)); |
| 99 | purple_conversation_set_data(conv, "plugin_pack:offlinemsg", | |
| 15230 | 100 | GINT_TO_POINTER(OFFLINE_MSG_YES)); |
| 101 | ||
| 15884 | 102 | purple_conv_im_write(PURPLE_CONV_IM(conv), offline->who, offline->message, |
| 103 | PURPLE_MESSAGE_SEND, time(NULL)); | |
| 15230 | 104 | |
| 105 | discard_data(offline); | |
| 106 | } | |
| 107 | ||
| 108 | static void | |
| 15884 | 109 | sending_msg_cb(PurpleAccount *account, const char *who, char **message, gpointer handle) |
| 15230 | 110 | { |
| 15884 | 111 | PurpleBuddy *buddy; |
| 15230 | 112 | OfflineMsg *offline; |
| 15884 | 113 | PurpleConversation *conv; |
| 15230 | 114 | OfflineMessageSetting setting; |
| 115 | ||
|
19825
9f31b80db6a9
Catch the event at the very end to make sure other plugins can play with it
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
16745
diff
changeset
|
116 | if (message == NULL || *message == NULL || |
|
9f31b80db6a9
Catch the event at the very end to make sure other plugins can play with it
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
16745
diff
changeset
|
117 | **message == '\0') |
|
9f31b80db6a9
Catch the event at the very end to make sure other plugins can play with it
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
16745
diff
changeset
|
118 | return; |
|
9f31b80db6a9
Catch the event at the very end to make sure other plugins can play with it
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
16745
diff
changeset
|
119 | |
| 15884 | 120 | buddy = purple_find_buddy(account, who); |
| 15230 | 121 | if (!buddy) |
| 122 | return; | |
| 123 | ||
| 15884 | 124 | if (purple_presence_is_online(purple_buddy_get_presence(buddy))) |
| 15230 | 125 | return; |
| 126 | ||
| 15884 | 127 | if (purple_account_supports_offline_message(account, buddy)) |
| 15230 | 128 | { |
|
19832
84b69b21672b
Patch from QuLogic. Fixes #2903 ('Missing newlines in debug messages.')
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
19825
diff
changeset
|
129 | purple_debug_info("offlinemsg", "Account \"%s\" supports offline messages.\n", |
| 15884 | 130 | purple_account_get_username(account)); |
| 15230 | 131 | return; |
| 132 | } | |
| 133 | ||
| 15884 | 134 | conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, |
| 15230 | 135 | who, account); |
| 136 | ||
| 137 | if (!conv) | |
| 138 | return; | |
| 139 | ||
| 15884 | 140 | setting = GPOINTER_TO_INT(purple_conversation_get_data(conv, "plugin_pack:offlinemsg")); |
| 15230 | 141 | if (setting == OFFLINE_MSG_NO) |
| 142 | return; | |
| 143 | ||
| 144 | offline = g_new0(OfflineMsg, 1); | |
| 145 | offline->conv = conv; | |
| 146 | offline->account = account; | |
| 147 | offline->who = g_strdup(who); | |
| 148 | offline->message = *message; | |
| 149 | *message = NULL; | |
| 150 | ||
| 15884 | 151 | if (purple_prefs_get_bool(PREF_ALWAYS) || setting == OFFLINE_MSG_YES) |
| 15230 | 152 | record_pounce(offline); |
| 153 | else if (setting == OFFLINE_MSG_NONE) | |
| 154 | { | |
| 155 | char *ask; | |
| 156 | ask = g_strdup_printf(_("\"%s\" is currently offline. Do you want to save the " | |
| 157 | "rest of the messages in a pounce and automatically send them " | |
| 158 | "when \"%s\" logs back in?"), who, who); | |
| 159 | ||
|
21175
c6d76b49c206
disapproval of revision '8ba833993a115415727bb1b70362e0bd1603c169'
Richard Laager <rlaager@pidgin.im>
parents:
21174
diff
changeset
|
160 | purple_request_action(handle, _("Offline Message"), ask, |
| 15230 | 161 | _("You can edit/delete the pounce from the `Buddy Pounces' dialog"), |
|
22268
a6f48dec4ca5
A few more "purple_request_action" default action corrections
Mark Doliner <markdoliner@pidgin.im>
parents:
21630
diff
changeset
|
162 | 0, |
|
16490
68c22924d66b
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evands@pidgin.im>
parents:
16481
diff
changeset
|
163 | offline->account, offline->who, offline->conv, |
|
21175
c6d76b49c206
disapproval of revision '8ba833993a115415727bb1b70362e0bd1603c169'
Richard Laager <rlaager@pidgin.im>
parents:
21174
diff
changeset
|
164 | offline, 2, |
| 15230 | 165 | _("Yes"), record_pounce, |
| 166 | _("No"), cancel_poune); | |
| 167 | g_free(ask); | |
| 168 | } | |
| 169 | } | |
| 170 | ||
| 171 | static gboolean | |
| 15884 | 172 | plugin_load(PurplePlugin *plugin) |
| 15230 | 173 | { |
|
19825
9f31b80db6a9
Catch the event at the very end to make sure other plugins can play with it
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
16745
diff
changeset
|
174 | purple_signal_connect_priority(purple_conversations_get_handle(), "sending-im-msg", |
|
9f31b80db6a9
Catch the event at the very end to make sure other plugins can play with it
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
16745
diff
changeset
|
175 | plugin, PURPLE_CALLBACK(sending_msg_cb), plugin, PURPLE_SIGNAL_PRIORITY_HIGHEST); |
| 15230 | 176 | return TRUE; |
| 177 | } | |
| 178 | ||
| 179 | static gboolean | |
| 15884 | 180 | plugin_unload(PurplePlugin *plugin) |
| 15230 | 181 | { |
| 182 | return TRUE; | |
| 183 | } | |
| 184 | ||
| 15884 | 185 | static PurplePluginPrefFrame * |
| 186 | get_plugin_pref_frame(PurplePlugin *plugin) | |
| 15230 | 187 | { |
| 15884 | 188 | PurplePluginPrefFrame *frame; |
| 189 | PurplePluginPref *pref; | |
| 15230 | 190 | |
| 15884 | 191 | frame = purple_plugin_pref_frame_new(); |
| 15230 | 192 | |
| 15884 | 193 | pref = purple_plugin_pref_new_with_label(_("Save offline messages in pounce")); |
| 194 | purple_plugin_pref_frame_add(frame, pref); | |
| 15230 | 195 | |
| 15884 | 196 | pref = purple_plugin_pref_new_with_name_and_label(PREF_ALWAYS, |
| 15230 | 197 | _("Do not ask. Always save in pounce.")); |
| 15884 | 198 | purple_plugin_pref_frame_add(frame, pref); |
| 15230 | 199 | |
| 200 | return frame; | |
| 201 | } | |
| 202 | ||
| 15884 | 203 | static PurplePluginUiInfo prefs_info = { |
| 15230 | 204 | get_plugin_pref_frame, |
| 205 | 0, | |
|
16745
df2c3d6b609a
And the rest of the plugins that are compiling for me by default...
Gary Kramlich <grim@reaperworld.com>
parents:
16490
diff
changeset
|
206 | NULL, |
|
df2c3d6b609a
And the rest of the plugins that are compiling for me by default...
Gary Kramlich <grim@reaperworld.com>
parents:
16490
diff
changeset
|
207 | |
|
df2c3d6b609a
And the rest of the plugins that are compiling for me by default...
Gary Kramlich <grim@reaperworld.com>
parents:
16490
diff
changeset
|
208 | /* padding */ |
|
df2c3d6b609a
And the rest of the plugins that are compiling for me by default...
Gary Kramlich <grim@reaperworld.com>
parents:
16490
diff
changeset
|
209 | NULL, |
|
df2c3d6b609a
And the rest of the plugins that are compiling for me by default...
Gary Kramlich <grim@reaperworld.com>
parents:
16490
diff
changeset
|
210 | NULL, |
|
df2c3d6b609a
And the rest of the plugins that are compiling for me by default...
Gary Kramlich <grim@reaperworld.com>
parents:
16490
diff
changeset
|
211 | NULL, |
| 15230 | 212 | NULL |
| 213 | }; | |
| 214 | ||
| 15884 | 215 | static PurplePluginInfo info = |
| 15230 | 216 | { |
| 15884 | 217 | PURPLE_PLUGIN_MAGIC, /* Magic */ |
| 218 | PURPLE_MAJOR_VERSION, /* Purple Major Version */ | |
| 219 | PURPLE_MINOR_VERSION, /* Purple Minor Version */ | |
| 220 | PURPLE_PLUGIN_STANDARD, /* plugin type */ | |
|
15418
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
221 | NULL, /* ui requirement */ |
|
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
222 | 0, /* flags */ |
|
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
223 | NULL, /* dependencies */ |
| 15884 | 224 | PURPLE_PRIORITY_DEFAULT, /* priority */ |
| 15230 | 225 | |
|
15418
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
226 | PLUGIN_ID, /* plugin id */ |
|
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
227 | PLUGIN_NAME, /* name */ |
|
20288
5ca925a094e2
applied changes from 03b709ec2a153e7e82719df0ba4635108bb1d3c6
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
19859
diff
changeset
|
228 | DISPLAY_VERSION, /* version */ |
|
15418
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
229 | PLUGIN_SUMMARY, /* summary */ |
|
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
230 | PLUGIN_DESCRIPTION, /* description */ |
| 15230 | 231 | PLUGIN_AUTHOR, /* author */ |
| 15884 | 232 | PURPLE_WEBSITE, /* website */ |
| 15230 | 233 | |
| 234 | plugin_load, /* load */ | |
| 235 | plugin_unload, /* unload */ | |
|
15418
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
236 | NULL, /* destroy */ |
| 15230 | 237 | |
|
15418
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
238 | NULL, /* ui_info */ |
|
bf287f742a5a
[gaim-migrate @ 18149]
Luke Schierer <lschiere@pidgin.im>
parents:
15230
diff
changeset
|
239 | NULL, /* extra_info */ |
| 15230 | 240 | &prefs_info, /* prefs_info */ |
|
16745
df2c3d6b609a
And the rest of the plugins that are compiling for me by default...
Gary Kramlich <grim@reaperworld.com>
parents:
16490
diff
changeset
|
241 | NULL, /* actions */ |
|
df2c3d6b609a
And the rest of the plugins that are compiling for me by default...
Gary Kramlich <grim@reaperworld.com>
parents:
16490
diff
changeset
|
242 | |
|
df2c3d6b609a
And the rest of the plugins that are compiling for me by default...
Gary Kramlich <grim@reaperworld.com>
parents:
16490
diff
changeset
|
243 | /* padding */ |
|
df2c3d6b609a
And the rest of the plugins that are compiling for me by default...
Gary Kramlich <grim@reaperworld.com>
parents:
16490
diff
changeset
|
244 | NULL, |
|
df2c3d6b609a
And the rest of the plugins that are compiling for me by default...
Gary Kramlich <grim@reaperworld.com>
parents:
16490
diff
changeset
|
245 | NULL, |
|
df2c3d6b609a
And the rest of the plugins that are compiling for me by default...
Gary Kramlich <grim@reaperworld.com>
parents:
16490
diff
changeset
|
246 | NULL, |
|
df2c3d6b609a
And the rest of the plugins that are compiling for me by default...
Gary Kramlich <grim@reaperworld.com>
parents:
16490
diff
changeset
|
247 | NULL |
| 15230 | 248 | }; |
| 249 | ||
| 250 | static void | |
| 15884 | 251 | init_plugin(PurplePlugin *plugin) |
| 15230 | 252 | { |
| 15884 | 253 | purple_prefs_add_none(PREF_PREFIX); |
| 254 | purple_prefs_add_bool(PREF_ALWAYS, FALSE); | |
| 15230 | 255 | } |
| 256 | ||
| 15884 | 257 | PURPLE_INIT_PLUGIN(PLUGIN_STATIC_NAME, init_plugin, info) |