\n" +"This module turns on after your computer has been completely idle (no mouse or keyboard movement) for a period of time. It turns off the instant you move your mouse or press a key, so it has no effect on your PC's performance when you're using it. The research module also runs as a low priority, sandboxed Java process, so that other tasks your computer is doing will get done first, and so that it is completely secure.\n" +"
\n"
+"For more details, see the Research Module FAQ.\n"
+msgstr "TL;DT Research Module FAQ\n"
+
+#: src/gui/pref/pg_research.py:98
+#: src/gui/pref/prefstrings.py:25
+msgid "Research Module"
+msgstr "|23534|2(# |\\/|0|)|_||_3"
+
+#: src/gui/pref/pg_research.py:105
+msgid "Allow Digsby to use CPU time to conduct research after %2(research.idle_time_min)d minutes of idle time"
+msgstr "4|_|_0\\/\\/ |)165|3'/ 2 |_|53 (P|_| 71|\\/|3 2 (0|\\||)|_|(7 |23534|2(# 4|=73|2 %2(research.idle_time_min)d |\\/|1|\\||_|732 0|= 1|)|_3 71|\\/|3"
+
+#: src/gui/pref/pg_research.py:111
+msgid "Maximum CPU Usage:"
+msgstr "|\\/|4><1|\\/||_||\\/| (P|_| |_|5463:"
+
+#: src/gui/pref/pg_research.py:116
+#: src/gui/pref/pg_research.py:123
+msgid "{val}%"
+msgstr "{val}%"
+
+#: src/gui/pref/pg_research.py:118
+msgid "Maximum Bandwidth Usage:"
+msgstr "|\\/|4><1|\\/||_||\\/| |34|\\||)\\/\\/1|)7# |_|5463:"
+
+#: src/gui/pref/pg_status.py:19
+msgid "Status Options"
+msgstr "5747|_|2 0P710|\\|2"
+
+#: src/gui/pref/pg_status.py:21
+msgid "Promote Digsby in my IM status messages"
+msgstr "P|20|\\/|073 |)165|3'/ 1|\\| |\\/|'/ 1|\\/| 5747|_|2 |\\/|3554632"
+
+#: src/gui/pref/pg_status.py:24
+msgid "Help Digsby by linking album when sharing \"Listening to...\" as status"
+msgstr "|-|3|_P |)165|3'/ |3'/ |_1|\\||<1|\\|6 4|_|3|_||\\/| \\/\\/|-|3|\\| 5|-|4|21|\\|6 \"|_1573|\\|6 2\" 45 5747|_|5"
+
+#: src/gui/pref/pg_status.py:26
+msgid "Let others know that I am idle after %2(messaging.idle_after)d minutes of inactivity"
+msgstr "|_37 07#3|22 |<|\\|0\\/\\/ |)47 1 |3 1|)|_3 4|=73|2 %2(messaging.idle_after)d |\\/|1|\\||_|732 0|= 1|\\|4(71\\/17'/"
+
+#: src/gui/pref/pg_status.py:33
+msgid "Autorespond with status message"
+msgstr "4|_|70|235P0|\\||) \\/\\/17# 5747|_|2 |\\/|355463"
+
+#: src/gui/pref/pg_status.py:34
+msgid "Disable sounds"
+msgstr "|)154|3|_3 50|_||\\||)2"
+
+#: src/gui/pref/pg_status.py:35
+msgid "Disable pop-up notifications"
+msgstr "|)154B|_3 P0P-|_|P |\\|071|=1(4710|\\|2"
+
+#: src/gui/pref/pg_status.py:38
+msgid "When away..."
+msgstr "\\/\\/#3|\\| 4\\/\\/4'/..."
+
+#: src/gui/pref/pg_status.py:45
+msgid "&Hide new conversation windows"
+msgstr "&H1|)3 |\\|3\\/\\/ (0|\\|\\/3|254710|\\| \\/\\/1|\\||)0\\/\\/2"
+
+#: src/gui/pref/pg_status.py:46
+msgid "&Disable sounds"
+msgstr "&D154|3|_3 50|_||\\||)2"
+
+#: src/gui/pref/pg_status.py:47
+msgid "Disable &pop-up notifications"
+msgstr "|)154B|_3 &P0P-|_|P |\\|071|=1(4710|\\|2"
+
+#: src/gui/pref/pg_status.py:50
+msgid "When running full screen applications..."
+msgstr "\\/\\/#3|\\| |2|_||\\||\\|1|\\|' |=|_||_|_ 5(|233|\\| 4PP|_1(4710|\\|2..."
+
+#: src/gui/pref/pg_status.py:60
+#: src/gui/status.py:607
+msgid "New Status Message"
+msgstr "|\\|3\\/\\/ 5747|_|2 |\\/|355463"
+
+#: src/gui/pref/pg_status.py:60
+msgid "Status Messages"
+msgstr "5747|_|2 |\\/|3554632"
+
+#: src/gui/pref/pg_supportdigsby.py:12
+#: src/gui/supportdigsby/supportdialog.py:120
+msgid "Support Digsby"
+msgstr "5|_|PP0|27 |)165|3'/"
+
+#: src/gui/pref/pg_text_conversations.py:21
+msgid "automatically take focus"
+msgstr "4|_|70|\\/|461(4|_|_'/ 74|<3 |=0(|_|5"
+
+#: src/gui/pref/pg_text_conversations.py:22
+msgid "start minimized in taskbar"
+msgstr "574|27 |\\/|1|\\|1|\\/|123|) 1|\\| 745|<|34|2"
+
+#: src/gui/pref/pg_text_conversations.py:23
+msgid "start hidden (tray icon blinks)"
+msgstr "574|27 #1|)|)3|\\| (7|24'/ 1(0|\\| |3|_1|\\||<2)"
+
+#: src/gui/pref/pg_text_conversations.py:27
+msgid "bottom"
+msgstr "|30770|\\/|"
+
+#: src/gui/pref/pg_text_conversations.py:28
+msgid "top"
+msgstr "2"
+
+#: src/gui/pref/pg_text_conversations.py:29
+msgid "left"
+msgstr "|_3|=7"
+
+#: src/gui/pref/pg_text_conversations.py:30
+msgid "right"
+msgstr "|216#7"
+
+#: src/gui/pref/pg_text_conversations.py:46
+msgid "Group multiple conversations into one tabbed window"
+msgstr "6|20|_|P |\\/||_||_71P|_3 (0|\\|\\/3|254710|\\|2 1|\\|70 0|\\|3 74|3|33|) \\/\\/1|\\||)0\\/\\/"
+
+#: src/gui/pref/pg_text_conversations.py:52
+msgid "New conversation windows: "
+msgstr "|\\|3\\/\\/ (0|\\|\\/3|254710|\\| \\/\\/1|\\||)0\\/\\/2:"
+
+#: src/gui/pref/pg_text_conversations.py:54
+msgid "buddy icon"
+msgstr "|3|_||)|)'/ 1(0|\\|"
+
+#: src/gui/pref/pg_text_conversations.py:55
+msgid "service icon"
+msgstr "53|2\\/1(3 1(0|\\|"
+
+#: src/gui/pref/pg_text_conversations.py:56
+msgid "status icon"
+msgstr "5747|_|2 1(0|\\|"
+
+#: src/gui/pref/pg_text_conversations.py:57
+msgid "Identify conversations with the contact's: "
+msgstr "1|)3|\\|71|='/ (0|\\|\\/3|254710|\\|2 \\/\\/17# 73# (0|\\|7497'5: "
+
+#: src/gui/pref/pg_text_conversations.py:64
+msgid "Conversation Options"
+msgstr "(0|\\|\\/3|254710|\\| 0P710|\\|2"
+
+#: src/gui/pref/pg_text_conversations.py:66
+msgid "Don't show flash ads"
+msgstr "|)0|\\|'7 5#0\\/\\/ |=|_45# 4|)2"
+
+#: src/gui/pref/pg_text_conversations.py:70
+msgid ""
+"Help keep Digsby free by showing an\n"
+"advertisement in the IM window."
+msgstr "5|_|PP0|27 |)165|3'/ |)3\\/3|_0P|\\/|3|\\|7 |3'/ 5#0\\/\\/1|\\|' |\\| 4|) 1|\\| 73# 1|\\/| \\/\\/1|\\||)0\\/\\/"
+
+#: src/gui/pref/pg_text_conversations.py:71
+msgid "Support Digsby development with an ad"
+msgstr "5|_|PP0|27 |)165|3'/ |)3\\/3|_0P|\\/|3|\\|7 |3'/ 5#0\\/\\/1|\\|' |\\| 4|) 1|\\| 73# 1|\\/| \\/\\/1|\\||)0\\/\\/"
+
+#: src/gui/pref/pg_text_conversations.py:73
+msgid "Location of ad in IM window: "
+msgstr "|_0(4710|\\| 0|= 4|) 1|\\| 1|\\/| \\/\\/1|\\||)0\\/\\/: "
+
+#: src/gui/pref/pg_text_conversations.py:77
+msgid "Ad Options"
+msgstr "0P710|\\|2"
+
+#: src/gui/pref/pg_text_conversations.py:86
+msgid "Text Formatting"
+msgstr "73><7 |=0|2|\\/|4771|\\|'"
+
+#: src/gui/pref/pg_text_conversations.py:106
+msgid "Your messages will look like this."
+msgstr "'/0 |\\/|3554632 \\/\\/1|_|_ |_00|< 45 |)12."
+
+#: src/gui/pref/pg_text_conversations.py:157
+msgid "Show last %2(conversation_window.num_lines)d lines in IM window"
+msgstr "5#0\\/\\/ |_457 %2(conversation_window.num_lines)d |_1|\\|32 0|= #1570|2'/ 1|\\| (0|\\|\\/3|54710|\\| \\/\\/1|\\||)0\\/\\/"
+
+#: src/gui/pref/pg_text_conversations.py:160
+msgid "&Display timestamp:"
+msgstr "&D15P|_4'/ 71|\\/|3574|\\/|P: "
+
+#: src/gui/pref/pg_text_conversations.py:168
+msgid "Spell check:"
+msgstr "5P3|_|_(#3(|< 3|2|20|2"
+
+#: src/gui/pref/pg_text_conversations.py:187
+msgid "Log IM conversations to hard drive"
+msgstr "|_06 1|\\/| (0|\\|\\/3|254710|\\|2 2 #4|2|) |)|21\\/3"
+
+#: src/gui/pref/pg_text_conversations.py:219
+msgid "Show &emoticons:"
+msgstr "3|\\|4|3|_3 &E|\\/|071(0|\\|2: "
+
+#: src/gui/pref/pg_widgets.py:41
+msgid "Widget Preview"
+msgstr "\\/\\/1|)637 P|23\\/13\\/\\/"
+
+#: src/gui/pref/pg_widgets.py:49
+msgid "&Copy To Clipboard"
+msgstr "&(0P'/ 2 C|_1P|304|2d"
+
+#: src/gui/pref/pg_widgets.py:88
+msgid "New Widget"
+msgstr "|\\|3\\/\\/ \\/\\/1|)637"
+
+#: src/gui/pref/pg_widgets.py:88
+#: src/gui/pref/prefstrings.py:23
+msgid "Widgets"
+msgstr "\\/\\/1|)6372"
+
+#: src/gui/pref/pg_widgets.py:90
+msgid "Embed Tag"
+msgstr "3|\\/||33|) 746"
+
+#: src/gui/pref/prefcontrols.py:584
+msgid "Custom ({prefval})"
+msgstr "(|_|570|\\/| ({prefval})"
+
+#: src/gui/pref/prefcontrols.py:643
+msgid "Choose a folder"
+msgstr "(#0053 4 |=0|_|)3|2"
+
+#: src/gui/pref/prefcontrols.py:841
+msgid "{val}px"
+msgstr "{val}P><"
+
+#: src/gui/pref/prefsdialog.py:170
+msgid "Digsby Preferences"
+msgstr "|)165|3'/ P|23|=3|23|\\|(32"
+
+#: src/gui/pref/prefsdialog.py:263
+msgid "&Done"
+msgstr "&D0|\\|3"
+
+#: src/gui/pref/prefsdialog.py:289
+msgid "Search"
+msgstr "&534|2(#"
+
+#: src/gui/pref/prefstrings.py:14
+msgid "Accounts"
+msgstr "4((0|_||\\|75"
+
+#: src/gui/pref/prefstrings.py:15
+msgid "General & Profile"
+msgstr "63|\\|3|24|_ & P|20|=1|_3"
+
+#: src/gui/pref/prefstrings.py:16
+msgid "Skins"
+msgstr "5|<1|\\|2"
+
+#: src/gui/pref/prefstrings.py:18
+msgid "Conversations"
+msgstr "(0|\\|\\/3|254710|\\|2"
+
+#: src/gui/pref/prefstrings.py:21
+#: src/plugins/msim/myspacegui/privacy.py:88
+msgid "Privacy"
+msgstr "P|21\\/4('/"
+
+#: src/gui/pref/prefstrings.py:26
+#: src/gui/proxydialog.py:222
+msgid "Connection Settings"
+msgstr "(0|\\||\\|3(710|\\| 53771|\\|62"
+
+#: src/gui/pref/prefstrings.py:42
+msgid "Developer"
+msgstr "|)3\\/3|_0P3|2"
+
+#: src/gui/protocols/__init__.py:7
+msgid "Enter a new password for {username}:"
+msgstr "3|\\|73|2 @ |\\|3\\/\\/ P455\\/\\/0|2|) 4 {username}::"
+
+#: src/gui/protocols/__init__.py:8
+#: src/gui/protocols/jabbergui.py:139
+msgid "Change Password"
+msgstr "(#4|\\|63 P455\\/\\/0|2|)"
+
+#: src/gui/protocols/__init__.py:22
+msgid "Are you sure you want to delete contact {name}?"
+msgstr "12 J00 5|_||23 J00 \\/\\/4|\\|7 2 |)3|_373 c0|\\|74c7 {name}?"
+
+#: src/gui/protocols/__init__.py:23
+msgid "Delete Contact"
+msgstr "|)3|_373 (0|\\|74c7"
+
+#: src/gui/protocols/__init__.py:36
+msgid "WARNING!"
+msgstr "\\/\\/4|2|\\|1|\\|6!!12eleventy"
+
+#: src/gui/protocols/__init__.py:37
+msgid "All your contacts in this group will be deleted locally AND on the server."
+msgstr "4|_|_ |_| (0|\\|74(72 |\\| |015 6|20|_|P \\/\\/1|_|_ |3 |)3|_373|) |_0(4|_|_'/ |\\| 0|\\| 53|2\\/3|2."
+
+#: src/gui/protocols/__init__.py:38
+msgid "Are you sure you want to remove {groupname}?"
+msgstr "|_| 5|_||23 |_| \\/\\/4|\\|4 2 |23|\\/|0\\/3 {groupname}?"
+
+#: src/gui/protocols/__init__.py:42
+msgid "Delete Group"
+msgstr "|)3|_373 6|20|_|P"
+
+#: src/gui/protocols/__init__.py:47
+msgid "Add Group"
+msgstr "4|)|) 6|20|_|P"
+
+#: src/gui/protocols/__init__.py:47
+msgid "Please enter a group name:"
+msgstr "P|_3453 3|\\|73|2 @ 6|20|_|P |\\|4|\\/|3:"
+
+#: src/gui/protocols/__init__.py:60
+#, python-format
+msgid "Are you sure you want to block %s?"
+msgstr "12 J00 5|_||23 J00 \\/\\/4|\\|7 2 |3|_0(|< %s?"
+
+#: src/gui/protocols/__init__.py:61
+msgid "Block Buddy"
+msgstr "|3|_0(|< B|_||)|)Y"
+
+# %s
+#: src/gui/protocols/jabbergui.py:18
+#, python-format
+msgid "Enter a priority for %s:"
+msgstr "3|\\|73|2 @ P|210|217'/ 4 %s:"
+
+#: src/gui/protocols/jabbergui.py:19
+msgid "Set Jabber Priority"
+msgstr "537 J4|3|33|2 P|210|217'/"
+
+#: src/gui/protocols/jabbergui.py:105
+msgid "Incorrect Password"
+msgstr "1|\\|(0|2|23(7 P455\\/\\/0|2|)"
+
+#: src/gui/protocols/jabbergui.py:111
+msgid "Failed to delete account from the server."
+msgstr "|=41|_3|) 2 |)3|_373 4((0|_||\\|7 |=|20|\\/| 73# 53|2\\/3|2."
+
+#: src/gui/protocols/jabbergui.py:112
+msgid "Delete Account - Failed"
+msgstr "|)3|_373 4((0|_||\\|7 - |=41|_3|)"
+
+#: src/gui/protocols/jabbergui.py:150
+msgid "Old Password: "
+msgstr "0|_|) P455\\/\\/0|2|): "
+
+#: src/gui/protocols/jabbergui.py:152
+msgid "New Password: "
+msgstr "|\\|3\\/\\/ P455\\/\\/0|2|): "
+
+#: src/gui/protocols/jabbergui.py:154
+msgid "Confirm New Password: "
+msgstr "(0|\\||=1|2|\\/| |\\|3\\/\\/ P455\\/\\/0|2|): "
+
+#: src/gui/protocols/jabbergui.py:217
+msgid "Incorrect Old Password"
+msgstr "1|\\|(0|2|23(7 0|_|) P455\\/\\/0|2|)"
+
+#: src/gui/protocols/jabbergui.py:219
+msgid "Passwords do not match"
+msgstr "P455\\/\\/0|2|) |)0 |\\|07 |\\/|47(#"
+
+#: src/gui/protocols/jabbergui.py:219
+msgid "Paswords do not match"
+msgstr "P45\\/\\/0|2|)2 |)0 |\\|07 |\\/|47(#"
+
+#: src/gui/protocols/jabbergui.py:280
+msgid "&Enabled"
+msgstr "&3|\\|4|3|_3|)"
+
+#: src/gui/protocols/jabbergui.py:283
+msgid "&Scroll Lock"
+msgstr "&5(|20|_|_ |_0(|<"
+
+#: src/gui/protocols/jabbergui.py:290
+msgid "&Close"
+msgstr "&(|_053"
+
+#: src/gui/protocols/oscargui.py:10
+msgid "Enter a formatted screenname for {username}"
+msgstr "3|)17 |=0|2|\\/|4773|) 5(|233|\\||\\|4|\\/|3 |=0|2 {username}"
+
+#: src/gui/protocols/oscargui.py:11
+msgid "The new screenname must be the same as the old one, except for changes in capitalization and spacing."
+msgstr "73# |\\|3\\/\\/ 5(|233|\\||\\|4|\\/|3 |\\/||_|57 |3 73# 54|\\/|3 42 73# 0|_|) 0|\\|3, ><(3P7 4 (#4|\\|632 1|\\| (4P174|_124710|\\| |\\| 5P4(1|\\|6."
+
+#: src/gui/protocols/oscargui.py:14
+msgid "Edit Formatted Screenname"
+msgstr "3|)17 |=0|2|\\/|4773|) 5(|233|\\||\\|4|\\/|3"
+
+#: src/gui/protocols/oscargui.py:26
+msgid "Enter an email address:"
+msgstr "3|\\|73|2 |\\| 3|\\/|41|_ 4|)|)|2352:"
+
+#: src/gui/protocols/oscargui.py:27
+msgid "Edit Account Email: {username}"
+msgstr "3|)17 4((0|_||\\|7 3|\\/|41|_: {username}"
+
+#: src/gui/proxydialog.py:40
+msgid "&No proxy"
+msgstr "&N0 P|20><'/"
+
+#: src/gui/proxydialog.py:41
+msgid "Use &default system settings"
+msgstr "|_|53 &D3|=4|_||_7 5'/573|\\/| 53771|\\|62"
+
+#: src/gui/proxydialog.py:42
+msgid "&Specify proxy settings"
+msgstr "&5P3(1|=Y P|20><'/ 53771|\\|62"
+
+#: src/gui/proxydialog.py:59
+msgid "&Host:"
+msgstr "&H057:"
+
+#: src/gui/proxydialog.py:66
+msgid "P&ort:"
+msgstr "P&0|27:"
+
+#: src/gui/proxydialog.py:96
+msgid "&Username:"
+msgstr "&|_|53|2|\\|4|\\/|3:"
+
+#: src/gui/proxydialog.py:117
+msgid "Proxy Server"
+msgstr "P|20><'/ 53|2\\/3|2"
+
+#: src/gui/proxydialog.py:118
+msgid "Protocol"
+msgstr "P|2070(0|_"
+
+#: src/gui/proxydialog.py:121
+msgid "How to Connect"
+msgstr "#0\\/\\/ 2 (0|\\||\\|3(7"
+
+#: src/gui/proxydialog.py:123
+msgid "Authentication"
+msgstr "4|_|7#3|\\|71(4710|\\|"
+
+#: src/gui/proxydialog.py:232
+msgid "&OK"
+msgstr "&0|<"
+
+#: src/gui/searchgui.py:43
+msgid "Arrange Searches"
+msgstr "4|2|24|\\|63 534|2(#32"
+
+#: src/gui/searchgui.py:89
+msgid "Search {search_engine_name:s} for \"{search_string:s}\""
+msgstr "534|2(|-| {search_engine_name:s} 4 \"{search_string:s}\""
+
+#: src/gui/searchgui.py:132
+msgid "Web Search"
+msgstr "\\/\\/3|3 534|2(#"
+
+#: src/gui/social_status_dialog.py:103
+msgid "Set IM Status"
+msgstr "537 1|\\/| 5747|_|2"
+
+#: src/gui/social_status_dialog.py:380
+msgid "Choose Accounts:"
+msgstr "(#0053 4((0|_||\\|72:"
+
+#: src/gui/social_status_dialog.py:438
+msgid "Insert Link"
+msgstr "1|\\|53|27 |_1|\\||<"
+
+#: src/gui/social_status_dialog.py:451
+msgid "Website URL:"
+msgstr "\\/\\/3|35173 |_||2|_:"
+
+#: src/gui/social_status_dialog.py:461
+msgid "Insert &Link"
+msgstr "1|\\|53|27 &L1|\\||<"
+
+#: src/gui/social_status_dialog.py:507
+msgid "Share Image"
+msgstr "5#4|23 1|\\/|463"
+
+#: src/gui/social_status_dialog.py:582
+msgid "Uploading Image..."
+msgstr "|_|P|_04|)1|\\|' 1|\\/|463..."
+
+#: src/gui/social_status_dialog.py:777
+msgid "Errors Encountered:"
+msgstr "3|2|20|2 3|\\|(0|_||\\|73|23|):"
+
+#: src/gui/social_status_dialog.py:882
+#: src/plugins/msim/myspacegui/editstatus.py:6
+msgid "Your Status:"
+msgstr "'/0 5747|_|5:"
+
+#: src/gui/social_status_dialog.py:891
+msgid "&Update Status"
+msgstr "&|_|P|)473 5747|_|2"
+
+#: src/gui/social_status_dialog.py:1081
+#, python-format
+msgid "Network error (%r)"
+msgstr "|\\|37\\/\\/0|2|< 3|2|20|2 (%r)"
+
+#: src/gui/social_status_dialog.py:1083
+#, python-format
+msgid "Network error (%s)"
+msgstr "|\\|37\\/\\/0|2|< 3|2|20|2 (%s)"
+
+#: src/gui/social_status_dialog.py:1085
+msgid "Network error ({error!r} - {error!s})"
+msgstr "|\\|37\\/\\/0|2|< 3|2|20|2 "
+
+#: src/gui/social_status_dialog.py:1087
+#: src/gui/social_status_dialog.py:1090
+#, python-format
+msgid "%s"
+msgstr "%s"
+
+#: src/gui/social_status_dialog.py:1092
+#, python-format
+msgid "Unknown error (%s)"
+msgstr "|_||\\||<|\\|0\\/\\/|\\| 3|2|20|2 %s"
+
+#: src/gui/social_status_dialog.py:1094
+msgid "Unknown error"
+msgstr "|_||\\||<|\\|0\\/\\/|\\| 3|2|20|2"
+
+#: src/gui/spellchecktextctrlmixin.py:550
+msgid "Add to Dictionary"
+msgstr "4|)|) 2 |)1(710|\\|4|2'/"
+
+#. Translators: Separator when listing multiple accounts, ex: MSN/ICQ only
+#: src/gui/status.py:118
+msgid "/"
+msgstr "/"
+
+#: src/gui/status.py:119
+msgid "{status} ({account_types} Only)"
+msgstr "{status} ({account_types} 0|\\||_'/)"
+
+#: src/gui/status.py:374
+msgid "Message"
+msgstr "|\\/|355463"
+
+#: src/gui/status.py:496
+msgid "&Title:"
+msgstr "&717|_3:"
+
+#: src/gui/status.py:501
+msgid "&State:"
+msgstr "&57473:"
+
+#: src/gui/status.py:509
+msgid "&Status message:"
+msgstr "&5747|_|2 |\\/|355463:"
+
+#: src/gui/status.py:535
+msgid "&Use a different status for some accounts"
+msgstr "&|_|53 @ |)1|=|=3|23|\\|7 5747|_|2 4 50|\\/|3 4((0|_||\\|72"
+
+#: src/gui/status.py:539
+msgid "&Set"
+msgstr "&537"
+
+#: src/gui/status.py:548
+msgid "Save for &later"
+msgstr "54\\/3 |=0|2 |_473|2"
+
+#: src/gui/status.py:608
+msgid "New Status for {name}"
+msgstr "|\\|3\\/\\/ 5747|_|2 |=0|2 {name}"
+
+#: src/gui/status.py:633
+msgid "Edit Status Message"
+msgstr "3|)17 5747|_|2 |\\/|355463"
+
+#: src/gui/status.py:636
+msgid "Edit Status for {account}"
+msgstr "3|)17 5747|_|2 4 {account}"
+
+#: src/gui/status.py:793
+msgid "Are you sure you want to delete status message \"{title}\"?"
+msgstr "12 J00 5|_||23 J00 \\/\\/4|\\|7 2 |)3|_373 5747|_|2 |\\/|355463 \"{title}\"?"
+
+#: src/gui/status.py:794
+msgid "Delete Status Message"
+msgstr "|)3|_373 S747|_|2 |\\/|355463"
+
+#: src/gui/statuscombo.py:87
+#: src/gui/statuscombo.py:165
+#: src/gui/statuscombo.py:529
+#: src/plugins/twitter/twitter_gui.py:615
+msgid "Global Status"
+msgstr "6|_0|34|_ 5747|_|5"
+
+#: src/gui/statuscombo.py:105
+#: src/gui/statuscombo.py:540
+msgid "Promote Digsby!"
+msgstr "P|20|\\/|073 |)165|3'/!"
+
+#: src/gui/statuscombo.py:125
+#: src/gui/statuscombo.py:160
+#: src/gui/statuscombo.py:526
+msgid "Custom..."
+msgstr "(|_|570|\\/|..."
+
+#: src/gui/statuscombo.py:639
+msgid "Press 'Ctrl+F' to Search List"
+msgstr "P|2355 'Ctrl+F' 2 534|2(# |_157"
+
+#: src/gui/supportdigsby/supportdialog.py:96
+#: src/gui/supportdigsby/supportoptions.py:71
+msgid "Are you sure?"
+msgstr "12 j00 5|_||23?"
+
+#: src/gui/supportdigsby/supportdialog.py:97
+msgid "Are you sure you want do this?"
+msgstr "12 J00 5|_||23 J00 \\/\\/4|\\|7 |)0 |)12?"
+
+#: src/gui/supportdigsby/supportdialog.py:111
+msgid "Thank you for supporting Digsby."
+msgstr "7'/ 4 5|_|PP0|271|\\|' |)165|3'/."
+
+#: src/gui/supportdigsby/supportdialog.py:111
+msgid "Thank you!"
+msgstr "7'/!"
+
+#: src/gui/supportdigsby/supportoptions.py:22
+#: src/gui/supportdigsby/supportoptions.py:32
+msgid "Set"
+msgstr "537"
+
+#: src/gui/supportdigsby/supportoptions.py:23
+msgid "Make Google Powered Digsby Search your homepage"
+msgstr "|\\/|4|<3 6006|_3 P0\\/\\/3|23|) |)165|3'/ 534|2(# '/0 |)3|=4|_||_7 534|2(# #0|\\/|3P463"
+
+#: src/gui/supportdigsby/supportoptions.py:33
+msgid "Make Google Powered Digsby Search your default search engine"
+msgstr "|\\/|4|<3 6006|_3 P0\\/\\/3|23|) |)165|3'/ 534|2(# '/0 |)3|=4|_||_7 534|2(# 3|\\|61|\\|3"
+
+#: src/gui/supportdigsby/supportoptions.py:42
+#: src/gui/supportdigsby/supportoptions.py:47
+msgid "Invite"
+msgstr "1|\\|\\/173"
+
+#: src/gui/supportdigsby/supportoptions.py:43
+msgid "Invite your friends via Email"
+msgstr "1|\\|\\/173 '/0 |=|213|\\||)2 \\/14 3|\\/|41|_"
+
+#: src/gui/supportdigsby/supportoptions.py:48
+msgid "Invite your friends via Facebook"
+msgstr "1|\\|\\/173 '/0 |=|213|\\||)2 \\/14 |=4(3|300|<"
+
+#: src/gui/supportdigsby/supportoptions.py:52
+#: src/gui/supportdigsby/supportoptions.py:57
+msgid "Join Group"
+msgstr "J01|\\| 6|20|_|P"
+
+#: src/gui/supportdigsby/supportoptions.py:53
+msgid "Become a fan on Facebook"
+msgstr "|33(0|\\/|3 @ |=4|\\| 0|\\| |=4(3|300|<"
+
+#: src/gui/supportdigsby/supportoptions.py:58
+msgid "Become a fan on LinkedIn"
+msgstr "|33(0|\\/|3 @ |=4|\\| 0|\\| |_1|\\||<3|)1|\\|"
+
+#: src/gui/supportdigsby/supportoptions.py:62
+msgid "Follow"
+msgstr "|=0|_|_0\\/\\/"
+
+#: src/gui/supportdigsby/supportoptions.py:63
+msgid "Follow us on Twitter"
+msgstr "|=0|_|_0\\/\\/ |_|2 0|\\| 7\\/\\/1773|2"
+
+#: src/gui/supportdigsby/supportoptions.py:67
+msgid "Help Digsby conduct research"
+msgstr "#3|_P |)165|3'/ (0|\\||)|_|(7 |23534|2(#"
+
+#: src/gui/supportdigsby/supportoptions.py:70
+msgid "Helping us conduct research keeps Digsby free and ad-free. Are you sure you want to disable this option?"
+msgstr "#3|_P1|\\|' |_|2 (0|\\||)|_|(7 |23534|2(# |<33P2 D165|3'/ |=|233 |\\| 4|)-|=r33. 12 J00 5|_||23 J00 \\/\\/4|\\|7 2 |)154|3|_3 |)12 0P710|\\|?"
+
+#: src/gui/supportdigsby/supportoptions.py:83
+msgid "Disable"
+msgstr "|)154B|_3"
+
+#: src/gui/supportdigsby/supportoptions.py:85
+msgid "Enable"
+msgstr "3|\\|4|3|_3"
+
+#: src/gui/supportdigsby/supportoptions.py:94
+msgid "Subscribe"
+msgstr "5|_||35(|21|33"
+
+#: src/gui/supportdigsby/supportoptions.py:95
+msgid "Subscribe to our Blog"
+msgstr "5|_||35(|21|33 2 0|_|r |3|_06"
+
+#: src/gui/supportdigsby/supportoptions.py:99
+msgid "Create"
+msgstr "(|23473"
+
+#: src/gui/supportdigsby/supportoptions.py:100
+msgid "Create a Digsby widget for your blog or website"
+msgstr "(|23473 @ |)165|3'/ \\/\\/1|)637 4 J00 |3|_06 0|2 \\/\\/3|35173"
+
+#: src/gui/toast/toasthelp.py:25
+msgid "TIP: Popup Notifications"
+msgstr "71P: P0P|_|P |\\|071|=1(4710|\\|2"
+
+#: src/gui/toast/toasthelp.py:27
+msgid "You can right click popups to close them right away instead of waiting for them to fade out."
+msgstr "J00 (4|\\| |216#7 (|_1(|< P0P|_|P2 2 (|_053 7#3|\\/| |216#7 4\\/\\/4'/ 1|\\|5734|) 0|= \\/\\/4171|\\|' 4 7#3|\\/| 2 |=4|)3 0|_|7."
+
+#: src/gui/toolbox/toolbox.py:427
+msgid "Confirm"
+msgstr "(0|\\||=1|2|\\/|"
+
+#: src/gui/toolbox/toolbox.py:1225
+#: src/gui/toolbox/toolbox.py:1252
+msgid "Right To Left"
+msgstr "|216#7 2 |_3|=7"
+
+#: src/gui/toolbox/toolbox.py:1336
+msgid "Use Long URL"
+msgstr "|_|53 |_0|\\|6 |_||2|_"
+
+#: src/gui/toolbox/toolbox.py:1346
+msgid "Shorten URL"
+msgstr "5#0|273|\\| |_||2|_"
+
+#: src/gui/toolbox/toolbox.py:1437
+msgid "Undo"
+msgstr "|_||\\||)0"
+
+#: src/gui/toolbox/toolbox.py:1440
+msgid "Redo"
+msgstr "|23|)0"
+
+#: src/gui/toolbox/toolbox.py:1445
+#: src/gui/uberwidgets/formattedinput2/FormattedExpandoTextCtrl.py:104
+msgid "Cut"
+msgstr "(|_|7"
+
+#: src/gui/toolbox/toolbox.py:1455
+#: src/gui/uberwidgets/formattedinput2/FormattedExpandoTextCtrl.py:108
+msgid "Select All"
+msgstr "53|_3(7 4|_|_"
+
+#: src/gui/toolbox/toolbox.py:1461
+msgid "Select an image file"
+msgstr "53|_3(7 |\\| 1|\\/|463 |=1|_3"
+
+#: src/gui/trayicons.py:172
+msgid "Set &Global Status..."
+msgstr "537 &G|_0|34|_ 5747|_|2..."
+
+#: src/gui/trayicons.py:175
+msgid "Set IM &Status"
+msgstr "537 1|\\/| &S747|_|5"
+
+#: src/gui/trayicons.py:179
+#: src/gui/trayicons.py:185
+msgid "Show &Buddy List"
+msgstr "5#0\\/\\/ &B|_||)|)'/ |_157"
+
+#: src/gui/trayicons.py:185
+msgid "Hide &Buddy List"
+msgstr "#1|)3 &B|_||)|)'/ |_157"
+
+#: src/gui/trayicons.py:190
+msgid "Show Menu Bar"
+msgstr "5#0\\/\\/ |\\/|3|\\||_| |34|2"
+
+#: src/gui/trayicons.py:214
+msgid "Digsby"
+msgstr "D165|3'/"
+
+#: src/gui/trayicons.py:225
+msgid "{msgs} message"
+msgid_plural "{msgs} messages"
+msgstr[0] "{msgs} |\\/|355463"
+msgstr[1] "{msgs} |\\/|3554632"
+
+#: src/gui/trayicons.py:230
+msgid "{alias} ({service}) - {message}"
+msgstr "{alias} ({service}) - {message}"
+
+#: src/gui/trayicons.py:298
+msgid "Show All"
+msgstr "5#0\\/\\/ 4|_|_"
+
+#: src/gui/uberwidgets/formattedinput.py:423
+#: src/gui/uberwidgets/formattedinput2/formattingbar.py:103
+msgid "Hide Formatting Bar"
+msgstr "#1|)3 |=0|2|\\/|4771|\\|' B4|2"
+
+#: src/gui/uberwidgets/formattedinput.py:726
+#: src/gui/uberwidgets/formattedinput2/formattedinput.py:206
+msgid "Set Font..."
+msgstr "537 |=0|\\|7..."
+
+#: src/gui/uberwidgets/formattedinput.py:739
+#: src/gui/uberwidgets/formattedinput2/formattingbar.py:133
+msgid "Choose a foreground color"
+msgstr "(#0053 @ |=0|236|20|_||\\||) (0|_0|2"
+
+#: src/gui/vcard/vcardgui.py:19
+msgid "Unit"
+msgstr "|_||\\|17"
+
+#: src/gui/vcard/vcardgui.py:48
+msgid "Last Name"
+msgstr "|_457 |\\|4|\\/|3"
+
+#: src/gui/vcard/vcardgui.py:49
+msgid "First Name"
+msgstr "|=1|257 |\\|4|\\/|3"
+
+#: src/gui/vcard/vcardgui.py:50
+msgid "Middle Name"
+msgstr "|\\/|1|)|)|_3 |\\|4|\\/|3"
+
+#: src/gui/vcard/vcardgui.py:51
+msgid "Prefix"
+msgstr "P|23|=1><"
+
+#: src/gui/vcard/vcardgui.py:52
+msgid "Suffix"
+msgstr "S|_||=|=1><"
+
+#: src/gui/vcard/vcardgui.py:108
+msgid "Number"
+msgstr "|\\||_||\\/||33|2"
+
+#: src/gui/vcard/vcardgui.py:173
+msgid "Street"
+msgstr "57|2337"
+
+#: src/gui/vcard/vcardgui.py:176
+msgid "City"
+msgstr "(17'/"
+
+#: src/gui/vcard/vcardgui.py:177
+msgid "State"
+msgstr "57473"
+
+#: src/gui/vcard/vcardgui.py:178
+msgid "Postal Code"
+msgstr "P0574|_ (0|)3"
+
+#: src/gui/vcard/vcardgui.py:179
+msgid "Country"
+msgstr "(0|_||\\|7|2'/"
+
+#: src/gui/vcard/vcardgui.py:263
+msgid "vCard Editor for {username}"
+msgstr "\\/(4|2|) 3|)170|2 4 {username}"
+
+#: src/gui/vcard/vcardgui.py:263
+msgid "vCard Viewer"
+msgstr "\\/(4|2|) \\/13\\/\\/3|2"
+
+#: src/gui/vcard/vcardgui.py:274
+msgid "Retreive"
+msgstr "|237|231\\/3"
+
+#: src/gui/vcard/vcardgui.py:334
+msgid "General"
+msgstr "63|\\|3|24|_"
+
+#: src/gui/vcard/vcardgui.py:337
+msgid "Full Name"
+msgstr "|=|_||_|_ |\\|4|\\/|3"
+
+#: src/gui/vcard/vcardgui.py:338
+#: src/plugins/msim/res/content.tenjin:22
+msgid "Nickname"
+msgstr "|\\|1(|<|\\|4|\\/|3"
+
+#: src/gui/vcard/vcardgui.py:339
+#: src/oscar/OscarBuddies.py:292
+msgid "Birthday"
+msgstr "|31|27#|)4'/"
+
+#: src/gui/vcard/vcardgui.py:341
+msgid "Homepage"
+msgstr "#0|\\/|3P463"
+
+#: src/gui/vcard/vcardgui.py:358
+msgid "Work"
+msgstr "\\/\\/0|2|<"
+
+#: src/gui/vcard/vcardgui.py:363
+#: src/oscar/OscarBuddies.py:340
+msgid "Position"
+msgstr "P051710|\\|"
+
+#: src/gui/vcard/vcardgui.py:364
+msgid "Role"
+msgstr "|20|_3"
+
+#: src/gui/vcard/vcardgui.py:377
+#: src/plugins/msim/res/content.tenjin:26
+msgid "Location"
+msgstr "|_0(4710|\\|"
+
+#: src/gui/vcard/vcardgui.py:390
+msgid "About"
+msgstr "4|30|_|7"
+
+#: src/gui/video/webvideo.py:19
+msgid "{name} has invited you to an audio/video chat."
+msgstr "{name} 1|\\|\\/173|) |_| 2 |\\| 4|_||)10/\\/1|)30 (#47."
+
+#: src/gui/video/webvideo.py:20
+#: src/hub.py:122
+msgid "Would you like to join?"
+msgstr "J01|\\| 637?"
+
+#: src/gui/video/webvideo.py:24
+msgid "Audio/Video Chat Invitation"
+msgstr "4|_||)10/\\/1|)30 (#47 1|\\|\\/174710|\\|"
+
+#: src/gui/visuallisteditor.py:114
+msgid "(Unnamed Panel)"
+msgstr "(|_||\\||\\|4|\\/|3|) P4|\\|3|_)"
+
+#: src/gui/visuallisteditor.py:298
+msgid "Drag and drop to reorder"
+msgstr "|)|246 |\\| |)|20P 2 |230|2|)3|2"
+
+#: src/gui/visuallisteditor.py:308
+msgid "Done"
+msgstr "|)0|\\|3"
+
+#: src/gui/widgetlist.py:124
+msgid "Are you sure you want to delete widget \"{widgetname}\"?"
+msgstr "12 J00 5|_||23 J00 \\/\\/4|\\|7 2 |)3|_373 \\/\\/1|)637 \"{widgetname}\"?"
+
+#: src/gui/widgetlist.py:125
+msgid "Delete Widget"
+msgstr "|)3|_373 \\/\\/1|)637"
+
+#: src/hub.py:107
+msgid "{protocolname} DirectIM"
+msgstr "{protocolname} |)1|23(71|\\/|"
+
+#: src/hub.py:108
+msgid "{name} wants to directly connect with you. (Your IP address will be revealed.)"
+msgstr "{name} \\/\\/4|\\|75 |)1|23>< (0|\\||\\|3><"
+
+#: src/hub.py:127
+msgid "{name} has invited you to a group chat."
+msgstr "{name} \\/\\/4|\\|75 70 P4|27'/ |_|P."
+
+#: src/hub.py:130
+msgid "You have been invited to a group chat."
+msgstr "J00 #4\\/3 |333|\\| 1|\\|\\/173|) 2 @ 6|20|_|P (#47."
+
+#: src/hub.py:140
+msgid "Join"
+msgstr "J01|\\|"
+
+#: src/hub.py:141
+msgid "Ignore"
+msgstr "16|\\|0|23"
+
+#: src/hub.py:151
+msgid "{protocol_name:s} Invite"
+msgstr "{protocol_name:s} 1|\\|\\/173"
+
+#: src/hub.py:157
+msgid "Ignore Invite"
+msgstr "16|\\|0|23 1|\\|\\/173"
+
+#: src/hub.py:176
+msgid "Allow {buddy} to add you ({you}) as a buddy on {protocol}?"
+msgstr "4|_|_0\\/\\/ {buddy} 2 4|)|) J00 ({you}) 42 @ |3|_||)|)'/ 0|\\| {protocol}?"
+
+#: src/imaccount.py:515
+#: src/imaccount.py:522
+msgid "Connect"
+msgstr "(0|\\||\\|3(7"
+
+#: src/imaccount.py:523
+msgid "Disconnect"
+msgstr "|)15(0|\\||\\|3(7"
+
+#: src/jabber/JabberBuddy.py:176
+#: src/oscar/OscarBuddies.py:280
+msgid "Full Name:"
+msgstr "|=|_||_|_ |\\|4|\\/|3:"
+
+#: src/jabber/JabberBuddy.py:187
+msgid "Birthday:"
+msgstr "|31|27#|)4'/:"
+
+#: src/jabber/JabberBuddy.py:187
+#: src/plugins/digsby_service_editor/default_ui.py:143
+msgid "Email Address:"
+msgstr "3|\\/|41|_ 4||)|)|255:"
+
+#: src/jabber/JabberBuddy.py:187
+msgid "Phone:"
+msgstr "P|-|0|\\|3:"
+
+#: src/jabber/JabberBuddy.py:196
+msgid "Website"
+msgstr "\\/\\/3|35173"
+
+#: src/jabber/JabberBuddy.py:203
+#: src/oscar/OscarBuddies.py:314
+msgid "Additional Information:"
+msgstr "4|)|)1710|\\|4|_ 1|\\||=0|2|\\/|4710|\\|"
+
+#: src/jabber/JabberBuddy.py:210
+msgid "{street} {extra_adress} {locality} {region} {postal_code} {country}"
+msgstr "{street} {extra_adress} {locality} {region} {postal_code} {country}"
+
+#: src/jabber/JabberBuddy.py:256
+#: src/oscar/OscarBuddies.py:320
+msgid "Home Address:"
+msgstr "|-|0|\\/|3 4||)|)|255:"
+
+#: src/jabber/JabberChat.py:298
+msgid "You have been invited to {roomname}"
+msgstr "J00 #4\\/3 |333|\\| 1|\\|\\/173|) 2 {roomname}"
+
+#: src/jabber/JabberConversation.py:133
+msgid "{name} has left the conversation."
+msgstr "{name} |24|\\| 4\\/\\/4'/."
+
+#: src/jabber/JabberResource.py:15
+#: src/oscar/OscarBuddies.py:45
+msgid "Free for Chat"
+msgstr "|=|233 4 (#47"
+
+#: src/main.py:379
+msgid "Your digsby password has been changed. Please log back in with the new password."
+msgstr "'/0 |)165b'/ P455\\/\\/0|2|) #42 |333|\\| (#4|\\|63|). P|_3453 |_06 |34(|< 1|\\| \\/\\/17# 73# |\\|3\\/\\/ P455\\/\\/0|2|)."
+
+#: src/main.py:381
+msgid "Password Changed"
+msgstr "P455\\/\\/0|2|) (#4|\\|63|)"
+
+#: src/main.py:562
+msgid "Advanced Preferences"
+msgstr "4|)\\/4|\\|(3|) P|23|=3|23|\\|(32"
+
+#: src/main.py:562
+msgid "Please login first."
+msgstr "P|_3453 |_061|\\| |=1|257."
+
+#: src/main.py:816
+msgid "Global Shortcuts"
+msgstr "6|_0|34|_ 5#0|27(|_|72"
+
+#: src/main.py:820
+msgid "Debug Global Shortcuts"
+msgstr "|)3|3|_|6 6|_0|34|_ 5#0|27(|_|72"
+
+#: src/main.py:823
+msgid "Text Controls"
+msgstr "73><7 (0|\\|7|20|_2"
+
+#: src/main.py:1345
+msgid "There was an error submitting your crash report."
+msgstr "7#3|23 \\/\\/|_|2 |\\| 3|2|20|2 5|_||3|\\/|1771|\\|' '/0 (|245# |23P0|27."
+
+#: src/main.py:1358
+msgid "Crash report submitted successfully."
+msgstr "(|245# |23P0|27 5|_||3|\\/|1773|) 5|_|((355|=|_||_|_'/."
+
+#: src/main.py:1365
+msgid "Would you like to restart Digsby now?"
+msgstr "\\/\\/0|_||_|) J00 \\/\\/|_||3 2 |23574|27 |)165|3'/ |\\|0\\/\\/?"
+
+#: src/main.py:1367
+msgid "Crash Report"
+msgstr "(|245# |23P0|27"
+
+#: src/msn/MSNBuddy.py:26
+#: src/plugins/provider_windows_live/info.yaml:32
+msgid "Be Right Back"
+msgstr "|3 |216#7 |34(|<"
+
+#: src/msn/MSNBuddy.py:27
+#: src/plugins/provider_windows_live/info.yaml:34
+msgid "On the Phone"
+msgstr "0|\\| 73# P#0|\\|3"
+
+#: src/msn/MSNBuddy.py:28
+#: src/plugins/provider_windows_live/info.yaml:35
+msgid "Out to Lunch"
+msgstr "0|_|7 2 |_|_||\\|(#"
+
+#: src/msn/MSNBuddy.py:284
+#: src/oscar/OscarBuddies.py:242
+msgid "Mobile"
+msgstr "|\\/|0|31|_3"
+
+#: src/msn/MSNBuddy.py:488
+#: src/plugins/digsby_service_editor/default_ui.py:207
+msgid "Display Name:"
+msgstr "|)15P|_4Y |\\|4|\\/|3:"
+
+#: src/msn/MSNBuddy.py:559
+msgid "Administrators:"
+msgstr "4|)|\\/|1|\\|157|2470|22:"
+
+#: src/msn/MSNBuddy.py:561
+msgid "Assistant Administrators:"
+msgstr "45515574|\\|7 4|)|\\/|1|\\|157|2470|22:"
+
+#: src/msn/MSNBuddy.py:563
+msgid "Members:"
+msgstr "M3|\\/||33|22"
+
+#: src/msn/MSNBuddy.py:565
+msgid "Invited:"
+msgstr "1|\\|\\/173|):"
+
+#: src/msn/MSNBuddy.py:802
+msgid "{song:s} by {artist:s}"
+msgstr "{song:s}|3'/ {artist:s}"
+
+#: src/msn/MSNConversation.py:287
+msgid "There was a network error creating a chat session."
+msgstr "7#3|23 \\/\\/|_|2 @ |\\|37\\/\\/0|2|< 3|2|20|2 (|23471|\\|' @ (#47 535510|\\|."
+
+#: src/msn/MSNConversation.py:466
+msgid "Your messages could not be sent because too many conversation sessions have been requested."
+msgstr "'/0 |\\/|3554632 (0|_||_|) |\\|07 |3 53|\\|7 (02 700 |\\/|4|\\|'/ (0|\\|\\/3|254710|\\| 535510|\\|2 #4\\/3 |333|\\| |23Q|_|3573|)."
+
+#. Translators: ex: Frank nudged you!
+#: src/msn/MSNConversation.py:599
+#: src/msn/p21/MSNP21Conversation.py:260
+msgid "{name} {action}"
+msgstr "{name} {action}"
+
+#: src/msn/MSNConversation.py:603
+#: src/msn/p21/MSNP21Conversation.py:264
+msgid "{name} winked at you!"
+msgstr "{name} \\/\\/1|\\||<3|) 47 J00!"
+
+#: src/msn/MSNConversation.py:604
+#: src/msn/p21/MSNP21Conversation.py:265
+msgid "{name} nudged you!"
+msgstr "{name} |\\||_||)63|) |_|!"
+
+#: src/msn/msngui.py:15
+msgid "Group Invite"
+msgstr "6|20|_|P 1|\\|\\/173"
+
+#: src/msn/msngui.py:20
+#: src/plugins/digsby_updater/updater.py:487
+#: src/plugins/digsby_updater/updater.py:499
+msgid "Yes"
+msgstr "'/32"
+
+#: src/msn/msngui.py:21
+#: src/plugins/digsby_updater/updater.py:488
+#: src/plugins/digsby_updater/updater.py:500
+msgid "No"
+msgstr "|\\|0"
+
+#: src/msn/msngui.py:25
+msgid "{inviter_email} says: \"{invite_message}\""
+msgstr "{inviter_email} 54'/2: \"{invite_message}\""
+
+#: src/msn/msngui.py:28
+msgid ""
+"{inviter_email} has invited you to join the group {circle_name}.{invite_segment}\n"
+"Would you like to join?"
+msgstr ""
+"{inviter_email} #42 1|\\|\\/173|) J00 2 J01|\\| 73# 6|20|_|P {circle_name}.{invite_segment}\n"
+"\\/\\/0|_||_|) J00 \\/\\/|_||3 2 J01|\\|?"
+
+#: src/msn/msngui.py:36
+msgid "Please enter a name for your group chat:"
+msgstr "P|_3453 3|\\|73|2 4 |\\|4|\\/|3 6|20|_|P 4 J00 6|20|_|P (|-|47:"
+
+#: src/oscar/OscarBuddies.py:46
+#: src/plugins/provider_aol/info.yaml:142
+msgid "Occupied"
+msgstr "0((|_|P13|)"
+
+#: src/oscar/OscarBuddies.py:265
+#: src/oscar/OscarBuddies.py:356
+msgid "Profile URL:"
+msgstr "P|20|=1|_3 |_||2|_:"
+
+#: src/oscar/OscarBuddies.py:291
+#: src/plugins/msim/res/content.tenjin:25
+msgid "Gender"
+msgstr "63|\\||)3|2"
+
+#: src/oscar/OscarBuddies.py:295
+#: src/oscar/OscarBuddies.py:343
+msgid "{label}:"
+msgstr "{label}:"
+
+#: src/oscar/OscarBuddies.py:301
+msgid "Website:"
+msgstr "\\/\\/3|35173:"
+
+#: src/oscar/OscarBuddies.py:333
+msgid "Work Address:"
+msgstr "\\/\\/0|2|< 4||)|)|255:"
+
+#: src/oscar/OscarBuddies.py:340
+msgid "Company"
+msgstr "(0|\\/|P4|\\|'/"
+
+#: src/oscar/OscarBuddies.py:340
+msgid "Department"
+msgstr "|)3P4|27|\\/|3|\\|7"
+
+#: src/oscar/OscarBuddies.py:348
+msgid "Work Website:"
+msgstr "\\/\\/0|2|< \\/\\/3|35173:"
+
+#: src/oscar/snac/family_x07.py:165
+msgid "You should receive an email with confirmation instructions shortly."
+msgstr "J00 5#0|_||_|) |23(31\\/3 |\\| 3|\\/|41|_ \\/\\/17# (0|\\||=1|2|\\/|4710|\\| 1|\\|57|2|_|9710|\\|2 5#0|27|_'/."
+
+#: src/oscar/snac/family_x07.py:166
+msgid "Your account is already confirmed."
+msgstr "'/0 4((0|_||\\|7 |3 4|_|234|)'/ (0|\\||=1|2|\\/|3|)."
+
+#: src/oscar/snac/family_x07.py:167
+msgid "There was an unknown server error."
+msgstr "7#3|23 \\/\\/|_|2 |\\| |_||\\||<|\\|0\\/\\/|\\| 53|2\\/3|2 3|2|20|2."
+
+#: src/oscar/snac/family_x07.py:180
+msgid "Confirm Account: {username}"
+msgstr "(0|\\||=1|2|\\/| 4((0|_||\\|7: {username}"
+
+#: src/oscar/snac/family_x15.py:636
+msgid "Female"
+msgstr "|=3|\\/|4|_3"
+
+#: src/oscar/snac/family_x15.py:636
+msgid "Male"
+msgstr "|\\/|4|_3"
+
+#: src/plugins/component_gmail/gmail.py:123
+msgid "Mark as Read"
+msgstr "|\\/|4|2|< 42 |234|)"
+
+#: src/plugins/component_gmail/gmail.py:124
+msgid "Archive"
+msgstr "4|2(#1\\/3"
+
+#: src/plugins/component_gmail/info.yaml:2
+msgid "Gmail"
+msgstr "6|\\/|41|_"
+
+#: src/plugins/component_gmail/info.yaml:6
+msgid "Gmail Account"
+msgstr "3|\\/|41|_ 4((0|_||\\|72"
+
+#: src/plugins/component_gtalk/info.yaml:0
+msgid "Google Talk"
+msgstr "6006|_3 74|_|<"
+
+#: src/plugins/component_gtalk/info.yaml:59
+#: src/plugins/provider_google/info.yaml:0
+#: src/plugins/provider_google/info.yaml:10
+msgid "Google Account"
+msgstr "(#0053 4((0|_||\\|72:"
+
+#: src/plugins/component_yahooim/info.yaml:1
+msgid "Yahoo"
+msgstr "'/4#00"
+
+#: src/plugins/component_yahooim/info.yaml:3
+msgid "Yahoo Messenger"
+msgstr "'/4|-|00 |\\/|355463|2"
+
+#: src/plugins/component_yahooim/info.yaml:7
+#: src/plugins/component_ymail/info.yaml:7
+#: src/plugins/provider_yahoo/info.yaml:10
+msgid "Yahoo! ID"
+msgstr "'/4#00! 1|)"
+
+#: src/plugins/component_ymail/info.yaml:2
+msgid "Yahoo! Mail"
+msgstr "'/4#00 |\\/|41|_"
+
+#: src/plugins/component_ymail/info.yaml:3
+msgid "Yahoo Mail"
+msgstr "'/4#00 |\\/|41|_"
+
+#: src/plugins/digsby_about/aboutdialog.py:48
+msgid "About Digsby"
+msgstr "4|30|_|7 |)165|3'/"
+
+#: src/plugins/digsby_about/res/content.tenjin:14
+msgid "Checking for updates..."
+msgstr "(#3(|< 4 |_|P|)4732..."
+
+#: src/plugins/digsby_about/res/content.tenjin:20
+msgid "Digsby is up to date"
+msgstr "|)165|3'/ 15 |_|P 2 |)473"
+
+#: src/plugins/digsby_about/res/content.tenjin:26
+#: src/plugins/digsby_updater/updater.py:484
+#: src/plugins/digsby_updater/updater.py:496
+msgid "Update Available"
+msgstr "|_|P|)473 4\\/41|_4|3|_3"
+
+#: src/plugins/digsby_about/res/content.tenjin:31
+msgid "Copyright © 2010 dotSyntax, LLC."
+msgstr "(0p'/|216#7 © 2010 |)07S'/|\\|74><, |_|_(."
+
+#: src/plugins/digsby_about/res/content.tenjin:33
+msgid "All Rights Reserved."
+msgstr "4|_|_ |216#72 |2353|2\\/3|)."
+
+#: src/plugins/digsby_email/info.yaml:1
+#: src/plugins/digsby_email/info.yaml:26
+#: src/plugins/digsby_email/info.yaml:116
+#: src/plugins/myspace/MyspaceProtocol.py:40
+msgid "Mail"
+msgstr "|\\/|41|_"
+
+#: src/plugins/digsby_email/info.yaml:10
+msgid "POP Account"
+msgstr "P0P 4((0|_||\\|7"
+
+#: src/plugins/digsby_email/info.yaml:30
+msgid "POP"
+msgstr "P0P"
+
+#: src/plugins/digsby_email/info.yaml:68
+msgid "IMAP Account"
+msgstr "1|\\/|4P 4((0|_||\\|72"
+
+#: src/plugins/digsby_email/info.yaml:101
+msgid "IMAP"
+msgstr "1|\\/|4P"
+
+#: src/plugins/digsby_service_editor/default_ui.py:62
+msgid "{account_name:s} - {service_name:s} Settings"
+msgstr "{account_name:s} - {service_name:s} 53771|\\|62"
+
+#: src/plugins/digsby_service_editor/default_ui.py:167
+msgid "Forgot Password?"
+msgstr "|=0|2607 P455\\/\\/0|2|)?"
+
+#: src/plugins/digsby_service_editor/default_ui.py:247
+msgid "&{server_type} Server:"
+msgstr "&{server_type} 53|2\\/3|2:"
+
+#: src/plugins/digsby_service_editor/default_ui.py:248
+msgid "&This server requires SSL"
+msgstr "&|)12 53|2\\/3|2 |23Q|_|1|232 55|_"
+
+#: src/plugins/digsby_service_editor/default_ui.py:266
+msgid "This server requires SSL"
+msgstr "|)12 53|2\\/3|2 |23Q|_|1|232 55|_"
+
+#: src/plugins/digsby_service_editor/default_ui.py:326
+msgid "IM Server:"
+msgstr "1|\\/| 53|2\\/3|2:"
+
+#: src/plugins/digsby_service_editor/default_ui.py:348
+msgid "Always connect over HTTP"
+msgstr "4|_\\/\\/4'/2 (0|\\||\\|3(7 0\\/3|2 #77P"
+
+#: src/plugins/digsby_service_editor/default_ui.py:363
+msgid "Check for new mail every {minutes_input} minutes"
+msgstr "(#3(|< 4 |\\|3\\/\\/ |\\/|41|_ 3\\/3|2'/ {minutes_input} minutes"
+
+#: src/plugins/digsby_service_editor/default_ui.py:600
+msgid "Custom ({mailclient})"
+msgstr "(|_|570|\\/| ({mailclient})"
+
+#: src/plugins/digsby_status/status_tag_urls.py:56
+#: src/plugins/facebook/fbgui.py:10
+#: src/plugins/linkedin/ligui.py:8
+#: src/plugins/myspace/msgui.py:10
+#: src/plugins/researchdriver/researchtoast.py:36
+#: src/plugins/twitter/twgui.py:14
+msgid "Learn More"
+msgstr "|_34|2|\\| |\\/|0|23"
+
+#: src/plugins/digsby_status/status_tag_urls.py:67
+msgid "Yes, Spread the Word!"
+msgstr "'/32, 5P|234|) 73# \\/\\/0|2|)!"
+
+#: src/plugins/digsby_status/status_tag_urls.py:68
+#: src/plugins/facebook/fbgui.py:19
+#: src/plugins/linkedin/ligui.py:17
+#: src/plugins/msim/myspacegui/prompts.py:11
+#: src/plugins/myspace/msgui.py:19
+#: src/plugins/twitter/twgui.py:23
+msgid "No Thanks"
+msgstr "|\\|0 7#4|\\||<2"
+
+#: src/plugins/digsby_status/status_tag_urls.py:106
+msgid "Spread the Word!"
+msgstr "5P|234|) 73# \\/\\/0|2|)!"
+
+#: src/plugins/digsby_status/status_tag_urls.py:109
+msgid "We've made it easier to spread the word about Digsby by adding a link to your IM status. You can disable this option in Preferences > Status."
+msgstr "\\/\\/3'\\/3 |\\/|4|)3 17 34513|2 2 5P|234|) 73# \\/\\/0|2|) 4|30|_|7 |)165|3'/ |3'/ 4|)|)1|\\|' @ |_1|\\||< 2 '/0 1|\\/| 5747|_|2. J00 (4|\\| |)154|3|_3 |)12 0P710|\\| 1|\\| P|23|=3|23|\\|(32 > 5747|_|2."
+
+#: src/plugins/digsby_updater/UpdateProgress.py:55
+msgid "Digsby Update"
+msgstr "|)165|3'/ |_|P|)473"
+
+#: src/plugins/digsby_updater/UpdateProgress.py:63
+msgid "{state}: {completed} of {size} -- {time} remain"
+msgstr "{state}: {completed} 0|= {size} -- {time} |23|\\/|41|\\|"
+
+#: src/plugins/digsby_updater/UpdateProgress.py:145
+msgid "Slower"
+msgstr "5|_0\\/\\/3|2"
+
+#: src/plugins/digsby_updater/UpdateProgress.py:146
+msgid "Faster!"
+msgstr "|=4573|2!"
+
+#: src/plugins/digsby_updater/machelpers.py:18
+msgid "Error while updating Digsby. Please restart and try again, or grab the latest version from digsby.com. Digsby will now shut down."
+msgstr "3|2|20|2 \\/\\/#1|_3 |_|P|)471|\\|6 |)165|3'/. P|_3453 |23574|27 |\\| 7|2'/ 4641|\\|, 0|2 6|24|3 73# |_47357 \\/3|2510|\\| |=|20|\\/| |)165|3'/.(0|\\/|. |)165|3'/ \\/\\/1|_|_ |\\|0\\/\\/ 5#|_|7 |)0\\/\\/|\\|."
+
+#: src/plugins/digsby_updater/machelpers.py:25
+msgid "Updated successfully. Digsby now needs to restart."
+msgstr "|_|P|)473|) 5|_|((355|=|_||_|_'/. |)165|3'/ |\\|0\\/\\/ |\\|33|)2 2 |23574|27."
+
+#: src/plugins/digsby_updater/machelpers.py:31
+msgid "Unable to authenticate. Please restart and try again."
+msgstr "|_||\\|4|3|_3 2 4|_|7#3|\\|71(473. P|_3453 |23574|27 |\\| 7|2'/ 4641|\\|."
+
+#: src/plugins/digsby_updater/updater.py:202
+msgid "Check for {tag} updates"
+msgstr "(#3(|< 4 {tag} |_|P|)4732"
+
+#: src/plugins/digsby_updater/updater.py:204
+msgid "Check for Updates"
+msgstr "(#3(|< 4 |_|P|)4732"
+
+#: src/plugins/digsby_updater/updater.py:485
+#: src/plugins/digsby_updater/updater.py:497
+msgid ""
+"A Digsby update is available to download.\n"
+"Would you like to begin downloading it now?"
+msgstr "@ |)165|3'/ |_|P|)473 |3 4\\/41|_4|3|_3 2 |)0\\/\\/|\\||_04|).\\|\\|\\/\\/0|_||_|) J00 \\/\\/|_||3 2 |3361|\\| |)0\\/\\/|\\||_04|)1|\\|6 17 |\\|0\\/\\/?"
+
+#: src/plugins/digsby_updater/updater.py:573
+msgid "Update Failed"
+msgstr "|_|P|)473 |=41|_3|)"
+
+#: src/plugins/digsby_updater/updater.py:574
+msgid "Digsby was unable to complete the download. This update will be attempted again later."
+msgstr " \\/\\/|_|2 |_||\\|4B|_3 2 (0|\\/|P|_373 73# |)0\\/\\/|\\||_04|). |)12 |_|P|)473 \\/\\/1|_|_ |3 4773|\\/|P73|) 4641|\\| |_8|2."
+
+#: src/plugins/digsby_updater/updater.py:576
+msgid "Manual Update"
+msgstr "|\\/|4|\\||_|4|_ |_|P|)473"
+
+#: src/plugins/digsby_updater/updater.py:606
+msgid "Update Ready"
+msgstr "|_|P|)473 |234|)'/"
+
+#: src/plugins/digsby_updater/updater.py:607
+msgid "A new version of Digsby is ready to install. Restart Digsby to apply the update."
+msgstr "@ |\\|3\\/\\/ \\/3|2510|\\| 0|= |)165|3'/ |3 |234|)'/ 2 1|\\|574|_|_. |23574|27 |)165|3'/ 2 4PP|_'/ 73# |_|P|)473."
+
+#: src/plugins/digsby_updater/updater.py:609
+msgid "Restart Now"
+msgstr "|23574|27 |\\|40"
+
+#: src/plugins/digsby_updater/updater.py:610
+msgid "Restart Later"
+msgstr "|23574|27 |_8|2"
+
+#: src/plugins/facebook/actions.yaml:8
+msgid "Pro&file"
+msgstr "P|20|=1|_3"
+
+#: src/plugins/facebook/actions.yaml:12
+msgid "&Photos"
+msgstr "P#0702"
+
+#: src/plugins/facebook/actions.yaml:14
+msgid "&Messages"
+msgstr "|\\/|3554632"
+
+#: src/plugins/facebook/fbacct.py:310
+#: src/plugins/facebook/res/comment_link.py.xml:19
+#: src/plugins/facebook/res/comment_link.py.xml:20
+#: src/plugins/linkedin/LinkedInAccount.py:235
+#: src/plugins/linkedin/res/comment_link.tenjin:12
+#: src/plugins/linkedin/res/comment_link.tenjin:13
+#: src/plugins/myspace/MyspaceProtocol.py:417
+#: src/plugins/myspace/res/comment_link.tenjin:7
+#: src/plugins/myspace/res/comment_link.tenjin:9
+msgid "Comment"
+msgstr "(0|\\/||\\/|3|\\|7"
+
+#: src/plugins/facebook/fbacct.py:318
+#: src/plugins/facebook/res/like_link.py.xml:11
+#: src/plugins/linkedin/res/like_dislike_link.tenjin:20
+#: src/plugins/myspace/res/like_dislike_link.tenjin:17
+msgid "Like"
+msgstr "\\/\\/|_||3"
+
+#: src/plugins/facebook/fbacct.py:318
+#: src/plugins/facebook/res/like_link.py.xml:16
+msgid "Unlike"
+msgstr "|_||\\||_1|<3"
+
+#: src/plugins/facebook/fbacct.py:329
+#: src/plugins/myspace/MyspaceProtocol.py:425
+msgid "comment"
+msgstr "(0|\\/||\\/|3|\\|7"
+
+#: src/plugins/facebook/fbacct.py:349
+#: src/plugins/facebook/fbacct.py:353
+msgid "like"
+msgstr "\\/\\/|_||3"
+
+#: src/plugins/facebook/fbacct.py:366
+msgid "Facebook Error"
+msgstr "|=4(3|300|< 3|2|20|2"
+
+#: src/plugins/facebook/fbacct.py:367
+#: src/plugins/myspace/MyspaceProtocol.py:433
+msgid "Error posting {thing}"
+msgstr "3|2|20|2 P0571|\\|6 {thing}"
+
+#: src/plugins/facebook/fbacct.py:368
+msgid "Digsby does not have permission to publish to your stream."
+msgstr "|)165|3'/ |)032 |\\|07 #4\\/3 P3|2|\\/|15510|\\| 2 P|_||3|_15# 2 '/0 57|234|\\/|."
+
+#: src/plugins/facebook/fbacct.py:369
+#: src/plugins/myspace/MyspaceProtocol.py:435
+msgid "Grant Permissions"
+msgstr "6|24|\\|7 P3|2|\\/|15510|\\|2"
+
+#: src/plugins/facebook/fbacct.py:389
+msgid "Facebook Alerts"
+msgstr "|=4(3b00|< 4|_3|272"
+
+#: src/plugins/facebook/fbacct.py:396
+msgid "You have new messages."
+msgstr "J00 #4\\/3 |\\|3\\/\\/ |\\/|3554632."
+
+#: src/plugins/facebook/fbacct.py:399
+msgid "You have new pokes."
+msgstr "J00 #4\\/3 |\\|3\\/\\/ P0|<32."
+
+#: src/plugins/facebook/fbacct.py:402
+msgid "You have new shares."
+msgstr "J00 #4\\/3 |\\|3\\/\\/ 5#4|232."
+
+#: src/plugins/facebook/fbacct.py:405
+msgid "You have new friend requests."
+msgstr "J00 #4\\/3 |\\|3\\/\\/ |=|213|\\||) |23Q|_|3572."
+
+#: src/plugins/facebook/fbacct.py:408
+msgid "You have new group invites."
+msgstr "J00 #4\\/3 |\\|3\\/\\/ 6|20|_|P 1|\\|\\/1732."
+
+#: src/plugins/facebook/fbacct.py:411
+msgid "You have new event invites."
+msgstr "J00 #4\\/3 |\\|3\\/\\/ 3\\/3|\\|7 1|\\|\\/1732."
+
+#: src/plugins/facebook/fbacct.py:416
+msgid "You have new notifications."
+msgstr "J00 #4\\/3 |\\|3\\/\\/ 3\\/3|\\|7 1|\\|\\/1732."
+
+#: src/plugins/facebook/fbgui.py:18
+#: src/plugins/linkedin/ligui.py:16
+#: src/plugins/myspace/msgui.py:18
+#: src/plugins/twitter/twgui.py:22
+msgid "Post Achievements"
+msgstr "P057 4(#13\\/3|\\/|3|\\|72"
+
+#: src/plugins/facebook/fbgui.py:24
+msgid "Post achievements to my Wall"
+msgstr "P057 4(#13\\/3|\\/|3|\\|72 2 |\\/|'/ \\/\\/4|_|_"
+
+#: src/plugins/facebook/fbgui.py:40
+#: src/plugins/myspace/msgui.py:69
+msgid "Show Alerts:"
+msgstr "5#0\\/\\/ 4|_3|272:"
+
+#: src/plugins/facebook/fbgui.py:43
+msgid "Messages"
+msgstr "|\\/|3554632"
+
+#: src/plugins/facebook/fbgui.py:44
+msgid "Pokes"
+msgstr "P0|<32"
+
+#: src/plugins/facebook/fbgui.py:45
+msgid "Shares"
+msgstr "5#4|232"
+
+#: src/plugins/facebook/fbgui.py:46
+#: src/plugins/myspace/MyspaceProtocol.py:34
+#: src/plugins/myspace/msgui.py:79
+msgid "Friend Requests"
+msgstr "|=|213|\\||) |239|_|3572"
+
+#: src/plugins/facebook/fbgui.py:47
+msgid "Group Invitations"
+msgstr "6|20|_|P 1|\\|\\/174710|\\|2"
+
+#: src/plugins/facebook/fbgui.py:48
+#: src/plugins/myspace/MyspaceProtocol.py:33
+msgid "Event Invitations"
+msgstr "3\\/3|\\|7 1|\\|\\/174710|\\|2"
+
+#: src/plugins/facebook/info.yaml:0
+msgid "Facebook"
+msgstr "|=4(3|300|<"
+
+#: src/plugins/facebook/info.yaml:4
+msgid "News Feed"
+msgstr "|\\|3\\/\\/5 |=33|)"
+
+#: src/plugins/facebook/info.yaml:26
+#: src/plugins/myspace/info.yaml:47
+#: src/plugins/twitter/res/content.tenjin:25
+msgid "Show Alerts"
+msgstr "5#0\\/\\/ 4|_3|272:"
+
+#: src/plugins/facebook/notifications.yaml:1
+msgid "Facebook Alert"
+msgstr "|=4(3b00|< 4|_3|272"
+
+#: src/plugins/facebook/notifications.yaml:10
+#: src/plugins/facebook/notifications.yaml:11
+msgid "Facebook Notification"
+msgstr "|\\|071|=1(4710|\\|2"
+
+#: src/plugins/facebook/notifications.yaml:21
+msgid "Facebook Newsfeed"
+msgstr "|\\/|'/5P4(3 |\\|3\\/\\/5|=33|)"
+
+#: src/plugins/facebook/res/alerts.py.xml:2
+#: src/plugins/myspace/res/indicators.tenjin:2
+#: src/plugins/twitter/res/content.tenjin:8
+msgid "Alerts"
+msgstr "5#0\\/\\/ 4|_3|272:"
+
+#: src/plugins/facebook/res/alerts.py.xml:4
+msgid "No Alerts"
+msgstr "|\\|0 4|_3|272"
+
+#: src/plugins/facebook/res/alerts.py.xml:6
+#, python-format
+msgid "%d new message"
+msgid_plural "%d new messages"
+msgstr[0] "%d |\\|3\\/\\/ |\\/|355463."
+msgstr[1] "%d |\\|3\\/\\/ |\\/|3554632."
+
+#: src/plugins/facebook/res/alerts.py.xml:7
+#, python-format
+msgid "%d new friend request"
+msgid_plural "%d new friend requests"
+msgstr[0] "%d |\\|3\\/\\/ |=|213|\\||) |23Q|_|357"
+msgstr[1] "%d |\\|3\\/\\/ |=|213|\\||) |23Q|_|3572"
+
+#: src/plugins/facebook/res/alerts.py.xml:8
+#, python-format
+msgid "%d new poke"
+msgid_plural "%d new pokes"
+msgstr[0] "%d |\\|3\\/\\/ P0|<3"
+msgstr[1] "%d |\\|3\\/\\/ P0|<32"
+
+#: src/plugins/facebook/res/alerts.py.xml:9
+#, python-format
+msgid "%d new share"
+msgid_plural "%d new shares"
+msgstr[0] "%d |\\|3\\/\\/ 5#4|23."
+msgstr[1] "%d |\\|3\\/\\/ 5#4|232."
+
+#: src/plugins/facebook/res/alerts.py.xml:10
+#, python-format
+msgid "%d new group invite"
+msgid_plural "%d new group invites"
+msgstr[0] "%d |\\|3\\/\\/ 6|20|_|P 1|\\|\\/173."
+msgstr[1] "%d |\\|3\\/\\/ 6|20|_|P 1|\\|\\/1732."
+
+#: src/plugins/facebook/res/alerts.py.xml:11
+#, python-format
+msgid "%d new event invite"
+msgid_plural "%d new event invites"
+msgstr[0] "%d |\\|3\\/\\/ 3\\/3|\\|7 1|\\|\\/173."
+msgstr[1] "%d |\\|3\\/\\/ 3\\/3|\\|7 1|\\|\\/1732."
+
+#: src/plugins/facebook/res/alerts.py.xml:12
+#, python-format
+msgid "%d new notification"
+msgid_plural "%d new notifications"
+msgstr[0] "%d |\\|3\\/\\/ 3\\/3|\\|7 1|\\|\\/173."
+msgstr[1] "%d |\\|3\\/\\/ 3\\/3|\\|7 1|\\|\\/1732."
+
+#: src/plugins/facebook/res/birthdays.py.xml:9
+msgid "Upcoming Birthdays"
+msgstr "|_|P(0|\\/|1|\\|6 |31|27#|)4'/5"
+
+#: src/plugins/facebook/res/comment.py.xml:11
+#: src/plugins/facebook/res/comment.py.xml:13
+#: src/plugins/facebook/res/dislikes.py.xml:28
+#: src/plugins/facebook/res/dislikes.py.xml:30
+#: src/plugins/facebook/res/dislikes.py.xml:39
+#: src/plugins/facebook/res/dislikes.py.xml:41
+#: src/plugins/facebook/res/dislikes.py.xml:55
+#: src/plugins/facebook/res/dislikes.py.xml:57
+#: src/plugins/facebook/res/dislikes.py.xml:63
+#: src/plugins/facebook/res/dislikes.py.xml:65
+#: src/plugins/facebook/res/dislikes.py.xml:71
+#: src/plugins/facebook/res/dislikes.py.xml:73
+#: src/plugins/facebook/res/likes.py.xml:42
+#: src/plugins/facebook/res/likes.py.xml:46
+#: src/plugins/facebook/res/likes.py.xml:55
+#: src/plugins/facebook/res/likes.py.xml:62
+#: src/plugins/facebook/res/likes.py.xml:80
+#: src/plugins/facebook/res/likes.py.xml:85
+msgid "Facebook User"
+msgstr "|=4(3b00|< |_|53|2"
+
+#: src/plugins/facebook/res/comment_link.py.xml:2
+#: src/plugins/facebook/res/comment_post_link.py.xml:2
+#: src/plugins/facebook/res/comments.py.xml:2
+#: src/plugins/facebook/res/dislike_link.py.xml:2
+#: src/plugins/facebook/res/dislikes.py.xml:2
+msgid "Dislike! (via http://digsby.com/fb)"
+msgstr "|)15|_1|<3! (via http://digsby.com)"
+
+#: src/plugins/facebook/res/comment_post_link.py.xml:15
+#, python-format
+msgid "See all %d comments"
+msgstr "533 4|_|_ %d (0|\\/||\\/|3|\\|72"
+
+#: src/plugins/facebook/res/comment_post_link.py.xml:17
+msgid "See all comments"
+msgstr "533 4|_|_ (0|\\/||\\/|3|\\|72"
+
+#: src/plugins/facebook/res/content.tenjin:35
+msgid "Back to News Feed"
+msgstr "|34(|< 2 |\\|3\\/\\/5|=33|):"
+
+#: src/plugins/facebook/res/dislike_link.py.xml:18
+msgid "Dislike"
+msgstr "|)15|_1|<3"
+
+#: src/plugins/facebook/res/dislike_link.py.xml:23
+msgid "Undislike"
+msgstr "|_||\\||)15|_1|<3"
+
+#: src/plugins/facebook/res/dislike_link.py.xml:32
+msgid "Dislikes"
+msgstr "|)154B|_32"
+
+#: src/plugins/facebook/res/like_link.py.xml:25
+#: src/plugins/linkedin/res/like_dislike_link.tenjin:29
+#: src/plugins/myspace/res/like_dislike_link.tenjin:26
+msgid "Likes"
+msgstr "|_1|<35"
+
+#: src/plugins/facebook/res/likes.py.xml:14
+msgid "You liked this"
+msgstr "|_| |_1|<3|) |)15"
+
+#: src/plugins/facebook/res/likes.py.xml:16
+msgid "You and {startlink_other}one other{endlink_other} liked this"
+msgid_plural "You and {startlink_other}{num_others} others{endlink_other} liked this"
+msgstr[0] "|_| |\\| {startlink_other}1 07|-|3|2{endlink_other} |_1|<3|) |)15"
+msgstr[1] "|_| |\\| {startlink_other}{num_others} 07|-|3|22{endlink_other} |_1|<3|) |)15"
+
+#: src/plugins/facebook/res/likes.py.xml:40
+msgid "{startlink_name}{name}{endlink_name} liked this"
+msgstr "{startlink_name}{name}{endlink_name} |_1|<3|) |)15"
+
+#: src/plugins/facebook/res/likes.py.xml:51
+msgid "{startlink_name}{name}{endlink_name} and {startlink_other}one other{endlink_other} liked this"
+msgid_plural "{startlink_name}{name}{endlink_name} and {startlink_other}{num_others} others{endlink_other} liked this"
+msgstr[0] "{startlink_name}{name}{endlink_name} |\\| {startlink_other}1 07|-|3|2{endlink_other} liked this"
+msgstr[1] "{startlink_name}{name}{endlink_name} |\\| {startlink_other} 07|-|3|22{endlink_other} liked this"
+
+#: src/plugins/facebook/res/likes.py.xml:76
+msgid "{startlink_other}one user{endlink_other} liked this"
+msgid_plural "{startlink_other}{num_users} users{endlink_other} liked this"
+msgstr[0] "{startlink_other}1 |_|53|2{endlink_other} \\/\\/|_||33|) |)1s"
+msgstr[1] "{startlink_other}{num_users} |_|53|22{endlink_other} \\/\\/|_||33|) |)12"
+
+#: src/plugins/facebook/res/post.py.xml:63
+msgid "See Friendship"
+msgstr "533 |=|213|\\||)2"
+
+#: src/plugins/facebook/res/status.py.xml:7
+#: src/plugins/linkedin/res/content.tenjin:3
+msgid "You have no status message"
+msgstr "J00 #4\\/3 |\\|0 5747|_|5 |\\/|3554632."
+
+#: src/plugins/facebook/res/status.py.xml:9
+#: src/plugins/myspace/res/status.tenjin:18
+#: src/plugins/twitter/res/status.tenjin:14
+#: src/plugins/twitter/res/status.tenjin:21
+msgid "update"
+msgstr "|_|P|)4732"
+
+#: src/plugins/fbchat/info.yaml:5
+msgid "Facebook Chat"
+msgstr "|=4(3b00|< (|-|47"
+
+#: src/plugins/fbchat/xmppfb.py:116
+msgid "Send Message"
+msgstr "53|\\||) |\\/|355463"
+
+#: src/plugins/fbchat/xmppfb.py:117
+msgid "Send Poke"
+msgstr "53|\\||) P0|<3"
+
+#: src/plugins/fbchat/xmppfb.py:118
+msgid "View Photos"
+msgstr "\\/13\\/\\/ P#0702"
+
+#: src/plugins/fbchat/xmppfb.py:122
+#: src/yahoo/yahoobuddy.py:133
+msgid "View Profile"
+msgstr "\\/13\\/\\/ P|20|=1|_3"
+
+#: src/plugins/fbchat/xmppfb.py:123
+msgid "Write on Wall"
+msgstr "\\/\\/|2173 0|\\| \\/\\/4|_|_"
+
+#: src/plugins/fbchat/xmppfb.py:132
+#: src/yahoo/yahoobuddy.py:164
+#: src/yahoo/yahoobuddy.py:181
+msgid "Links:"
+msgstr "|_1|\\||<2:"
+
+#: src/plugins/feed_trends/feed_trends.py:702
+msgid "Trending News"
+msgstr "7|23|\\||)1|\\|' |\\|3\\/\\/2"
+
+#: src/plugins/feed_trends/feed_trends.py:973
+msgid "read more..."
+msgstr "|234|) |\\/|0|23..."
+
+#: src/plugins/feed_trends/feed_trends.py:1010
+msgid "Feed Trends Debug"
+msgstr "|=33|) 7|23|\\||)2 |)3|3|_|6"
+
+#: src/plugins/feed_trends/geo_trends.py:259
+msgid "Featured Content"
+msgstr "|=347|_||23|) (0|\\|73|\\|7"
+
+#: src/plugins/feed_trends/res/trend_details.tenjin:7
+msgid "get address"
+msgstr "637 4|)|)|2355"
+
+#: src/plugins/feed_trends/res/trend_details.tenjin:12
+msgid "phone number"
+msgstr "P#0|\\|3 |\\||_||\\/||33|2"
+
+#: src/plugins/feed_trends/res/trend_details.tenjin:25
+msgid "reviews"
+msgstr "|23\\/13\\/\\/2"
+
+#: src/plugins/linkedin/LinkedInAccount.py:66
+msgid "Checking now..."
+msgstr "(#3(|<1|\\|' |\\|0\\/\\/..."
+
+#: src/plugins/linkedin/LinkedInAccount.py:82
+#: src/plugins/twitter/twitter.py:214
+msgid "Home"
+msgstr "#0|\\/|3"
+
+#: src/plugins/linkedin/LinkedInAccount.py:83
+msgid "Inbox"
+msgstr "1|\\||30><"
+
+#: src/plugins/linkedin/LinkedInAccount.py:85
+#: src/plugins/twitter/twitter.py:215
+msgid "Profile"
+msgstr "P|20|=1|_3"
+
+#: src/plugins/linkedin/LinkedInAccount.py:176
+msgid "API request limit has been reached."
+msgstr "4P1 |23Q|_|357 |_1|\\/|17 #42 |333|\\| |234(#3|)."
+
+#: src/plugins/linkedin/LinkedInAccount.py:378
+#: src/plugins/myspace/MyspaceAccount.py:334
+msgid "Please set your computer clock to the correct time / timezone."
+msgstr "P|_3453 537 '/0 (0|\\/|P|_|73|2 (|_0(|< 2 73# (0|2|23(7 71|\\/|3 / 71|\\/|320|\\|3."
+
+#: src/plugins/linkedin/LinkedInObjects.py:138
+msgid "Like! (via http://digsby.com)"
+msgstr "\\/\\/|_||3! (via http://digsby.com)"
+
+#: src/plugins/linkedin/LinkedInObjects.py:139
+msgid "Dislike! (via http://digsby.com)"
+msgstr "|)15|_1|<3! (via http://digsby.com)"
+
+#: src/plugins/linkedin/LinkedInObjects.py:294
+#, python-format
+msgid "answered the question \"%s\""
+msgstr "4|\\|5\\/\\/3|23|) 73# Q|_|35710|\\| \"%s\""
+
+# LATERMARK: %s replacement, fragment, formatting
+#: src/plugins/linkedin/LinkedInObjects.py:356
+#: src/plugins/linkedin/LinkedInObjects.py:435
+#, python-format
+msgid "%s and "
+msgstr "%s 4|\\||) "
+
+#: src/plugins/linkedin/LinkedInObjects.py:360
+#, python-format
+msgid "is now connected to %s"
+msgstr "|3 |\\|0\\/\\/ (0|\\||\\|3(73|) 2 %s"
+
+#: src/plugins/linkedin/LinkedInObjects.py:371
+#: src/plugins/linkedin/res/ncon.tenjin:1
+msgid "is now a connection"
+msgstr "|3 |\\|0\\/\\/ @ (0|\\||\\|3(710|\\|"
+
+#: src/plugins/linkedin/LinkedInObjects.py:385
+msgid "joined LinkedIn"
+msgstr "J01|\\|3|) |_1|\\||<3|)1|\\|"
+
+#: src/plugins/linkedin/LinkedInObjects.py:412
+msgid "posted a job: {position_title:s} at {company_name:s}"
+msgstr "P0573|) 4 J0|3: {position_title:s} @ {company_name:s}"
+
+# MARK: Fragment, %s replacement
+#: src/plugins/linkedin/LinkedInObjects.py:439
+#, python-format
+msgid "is now a member of %s"
+msgstr "|3 |\\|0\\/\\/ @ |\\/|3|\\/||33|2 0|= %s"
+
+# MARK: Fragment
+#: src/plugins/linkedin/LinkedInObjects.py:459
+#: src/plugins/linkedin/res/picu.tenjin:1
+msgid "has a new profile photo"
+msgstr "#42 @ |\\|3\\/\\/ P|20|=1|_3 P#070"
+
+# MARK: Fragmnet, %s replacement
+#: src/plugins/linkedin/LinkedInObjects.py:498
+#, python-format
+msgid "has recommended %s"
+msgstr "#42 |23(0|\\/||\\/|3|\\||)3|) %s"
+
+# MARK: Fragment, %s replacemnet
+#: src/plugins/linkedin/LinkedInObjects.py:500
+#, python-format
+msgid "was recommended by %s"
+msgstr "\\/\\/|_|2 |23(0|\\/||\\/|3|\\||)3|) |3'/ %s"
+
+# MARK: Fragment
+#: src/plugins/linkedin/LinkedInObjects.py:512
+msgid "has an updated profile"
+msgstr "#42 |\\| |_|P|)473|) P|20|=1|_3"
+
+# MARK: Fragment, %s replacement
+#: src/plugins/linkedin/LinkedInObjects.py:536
+#, python-format
+msgid "asked a question: %s"
+msgstr "45|<3|) @ Q|_|35710|\\|: %s"
+
+#: src/plugins/linkedin/actions.yaml:8
+msgid "C&ontacts"
+msgstr "(0|\\|74(72"
+
+#: src/plugins/linkedin/info.yaml:0
+msgid "LinkedIn"
+msgstr "|_1|\\||<3|)1|\\|"
+
+#: src/plugins/linkedin/info.yaml:46
+msgid "LinkedIn Newsfeed"
+msgstr "|\\/|'/5P4(3 |\\|3\\/\\/5|=33|)"
+
+#: src/plugins/linkedin/ligui.py:28
+msgid "Post achievements to my LinkedIn Network"
+msgstr "P057 4(#13\\/3|\\/|3|\\|72 2 |\\/|'/ |_1|\\||<3|)1|\\| |\\|37\\/\\/0|2|<"
+
+# MARK: Fragment
+#: src/plugins/linkedin/res/ccem.tenjin:1
+msgid "joined"
+msgstr "J01|\\|3|)"
+
+# MARK: Fragment, %s replacement
+#: src/plugins/linkedin/res/conn.tenjin:1
+msgid "is now connected to"
+msgstr "|3 |\\|0\\/\\/ (0|\\||\\|3(73|) 2"
+
+#: src/plugins/linkedin/res/content.tenjin:11
+msgid "Network Updates"
+msgstr "(#3(|< 4 |_|P|)4732"
+
+#: src/plugins/linkedin/res/content.tenjin:14
+msgid "No news today."
+msgstr "|\\|0 |\\|3\\/\\/2 70|)4'/."
+
+# MARK: Fragment, Should exist?
+#: src/plugins/linkedin/res/dislikes.tenjin:15
+#: src/plugins/linkedin/res/dislikes.tenjin:33
+#: src/plugins/myspace/res/dislikes.tenjin:15
+#: src/plugins/myspace/res/dislikes.tenjin:30
+#: src/plugins/myspace/res/likes.tenjin:15
+#: src/plugins/myspace/res/likes.tenjin:29
+msgid "and"
+msgstr "|\\|"
+
+# MARK: Fragment
+#: src/plugins/linkedin/res/dislikes.tenjin:16
+#: src/plugins/linkedin/res/dislikes.tenjin:34
+#: src/plugins/myspace/res/dislikes.tenjin:17
+#: src/plugins/myspace/res/dislikes.tenjin:31
+#: src/plugins/myspace/res/likes.tenjin:16
+#: src/plugins/myspace/res/likes.tenjin:30
+msgid "other"
+msgid_plural "others"
+msgstr[0] "07#3|2"
+msgstr[1] "07#3|22"
+
+#: src/plugins/linkedin/res/dislikes.tenjin:18
+#: src/plugins/myspace/res/dislikes.tenjin:19
+#: src/plugins/myspace/res/dislikes.tenjin:33
+msgid "disliked this"
+msgstr "|)15|_1|<3|) |)15"
+
+# MARK: Fragment
+#: src/plugins/linkedin/res/jgrp.tenjin:1
+msgid "has joined"
+msgstr "#42 J01|\\|3|)"
+
+# MARK: Fragment, I don't know what this is
+#: src/plugins/linkedin/res/jobp.tenjin:1
+msgid "at"
+msgstr "@ "
+
+# Mark: Fragment, Multiple %s replacements
+#: src/plugins/linkedin/res/jobp.tenjin:1
+msgid "posted a job"
+msgstr "P0573|) @ J0|3"
+
+#: src/plugins/linkedin/res/like_dislike_link.tenjin:18
+#: src/plugins/myspace/res/like_dislike_link.tenjin:15
+msgid "Liked"
+msgstr "|_1|<3|)"
+
+#: src/plugins/msim/MSIMConversation.py:35
+msgid "{name} zapped you"
+msgstr "{name} 24PP3|) J00"
+
+#: src/plugins/msim/MSIMConversation.py:36
+msgid "You zapped {name}"
+msgstr "J00 P3\\/\\/3|) {name}"
+
+#: src/plugins/msim/MSIMConversation.py:37
+msgid "Zap"
+msgstr "P3\\/\\/"
+
+#: src/plugins/msim/MSIMConversation.py:41
+msgid "{name} whacked you"
+msgstr "{name} \\/\\/#4(|<3|) J00"
+
+#: src/plugins/msim/MSIMConversation.py:42
+msgid "You whacked {name}"
+msgstr "J00 \\/\\/#4(|<3|) {name}"
+
+#: src/plugins/msim/MSIMConversation.py:43
+msgid "Whack"
+msgstr "\\/\\/#4(|<"
+
+#: src/plugins/msim/MSIMConversation.py:47
+msgid "{name} torched you"
+msgstr "{name} 70|2(|-|3|) |_|"
+
+#: src/plugins/msim/MSIMConversation.py:48
+msgid "You torched {name}"
+msgstr "J00 70|2(#3|) {name}"
+
+#: src/plugins/msim/MSIMConversation.py:49
+msgid "Torch"
+msgstr "70|2(#"
+
+#: src/plugins/msim/MSIMConversation.py:53
+msgid "{name} smooched you"
+msgstr "{name} 5|\\/|00(|-|3|) |_|"
+
+#: src/plugins/msim/MSIMConversation.py:54
+msgid "You smooched {name}"
+msgstr "J00 5|\\/|00(#3|) {name}"
+
+#: src/plugins/msim/MSIMConversation.py:55
+msgid "Smooch"
+msgstr "5|\\/|00(#"
+
+#: src/plugins/msim/MSIMConversation.py:59
+msgid "{name} slapped you"
+msgstr "{name} 5|_4PP3|) |_|"
+
+#: src/plugins/msim/MSIMConversation.py:60
+msgid "You slapped {name}"
+msgstr "J00 5|_4PP3|) {name}"
+
+#: src/plugins/msim/MSIMConversation.py:61
+msgid "Slap"
+msgstr "5|_4P"
+
+#: src/plugins/msim/MSIMConversation.py:65
+msgid "{name} goosed you"
+msgstr "{name} 5|_|P|2153 |3|_|753(|<53|) |_|!"
+
+#: src/plugins/msim/MSIMConversation.py:66
+msgid "You goosed {name}"
+msgstr "J00 60053|) {name}"
+
+#: src/plugins/msim/MSIMConversation.py:67
+msgid "Goose"
+msgstr "60053"
+
+#: src/plugins/msim/MSIMConversation.py:71
+msgid "{name} high-fived you"
+msgstr "{name} |-|16|-| |=1\\/3|) |_|"
+
+#: src/plugins/msim/MSIMConversation.py:72
+msgid "You high-fived {name}"
+msgstr "J00 #16#-|=1\\/3|) {name}"
+
+#: src/plugins/msim/MSIMConversation.py:73
+msgid "High-Five"
+msgstr "#16#-|=1\\/3"
+
+#: src/plugins/msim/MSIMConversation.py:77
+msgid "{name} punk'd you"
+msgstr "{name} P|_||\\||<3|) |_|"
+
+#: src/plugins/msim/MSIMConversation.py:78
+msgid "You punk'd {name}"
+msgstr "J00 7|20|_|_3|) {name}"
+
+#: src/plugins/msim/MSIMConversation.py:79
+msgid "Punk"
+msgstr "P|_||\\||<"
+
+#: src/plugins/msim/MSIMConversation.py:83
+msgid "{name} raspberry'd you"
+msgstr "{name} |245P|33|2|2Y'|) |_|"
+
+#: src/plugins/msim/MSIMConversation.py:84
+msgid "You raspberry'd {name}"
+msgstr "J00 |245P|33|2|2'/'|) {name}"
+
+#: src/plugins/msim/MSIMConversation.py:85
+msgid "Raspberry"
+msgstr "|245P|33|2|2'/"
+
+#: src/plugins/msim/info.yaml:0
+msgid "MySpace IM"
+msgstr "|\\/|'/5P4(3 1|\\/|"
+
+#: src/plugins/msim/info.yaml:4
+msgid "MySpaceIM"
+msgstr "|\\/|'/5P4(31|\\/|"
+
+#: src/plugins/msim/myspacegui/editstatus.py:6
+msgid "MySpace Status"
+msgstr "|\\/|'/5P4(3 5747|_|5"
+
+#: src/plugins/msim/myspacegui/privacy.py:20
+msgid "Everyone"
+msgstr "3\\/3|2Y0|\\|3"
+
+#: src/plugins/msim/myspacegui/privacy.py:21
+msgid "Only people on my contact list"
+msgstr "0|\\||_'/ P30P|_3 0|\\| |\\/|'/ (0|\\|74(7 |_157"
+
+#: src/plugins/msim/myspacegui/privacy.py:22
+msgid "No one"
+msgstr "|\\|0"
+
+#: src/plugins/msim/myspacegui/privacy.py:63
+msgid "Only people on my contact list can see my status"
+msgstr "0|\\||_'/ P30P|_3 0|\\| |\\/|'/ (0|\\|74(7 |_157 (4|\\| 533 |\\/|'/ 5747|_|5"
+
+#: src/plugins/msim/myspacegui/privacy.py:67
+msgid "Only people on my contact list can send me messages"
+msgstr "0|\\||_'/ P30P|_3 0|\\| |\\/|'/ (0|\\|74(7 |_157 (4|\\| 53|\\||) |\\/|3 |\\/|3554632"
+
+#: src/plugins/msim/myspacegui/privacy.py:74
+msgid "When I'm offline, receive and store messages from:"
+msgstr "\\/\\/#3|\\| 1'|\\/| 0|=|=|_1|\\|3, |23c31\\/3 |\\| 570|23 |\\/|3554632 |=|20|\\/|:"
+
+#: src/plugins/msim/myspacegui/privacy.py:80
+msgid "Offline Messages"
+msgstr "0|=|=|_1|\\|3 |\\/|3554632"
+
+#: src/plugins/msim/myspacegui/prompts.py:8
+msgid "Would you like to automatically add your MySpace friends to your MySpace IM contact list?"
+msgstr "\\/\\/0|_||_|) J00 \\/\\/|_||3 2 4|_|70|\\/|471(4|_|_'/ 4|)|) '/0 |\\/|'/5P4(3 |=|213|\\||)2 2 '/0 |\\/|'/5P4(3 1|\\/| (0|\\|74(7 |_157?"
+
+#: src/plugins/msim/myspacegui/prompts.py:9
+msgid "Add Top Friends"
+msgstr "4|)|) 70P |=|213|\\||)2"
+
+#: src/plugins/msim/myspacegui/prompts.py:10
+msgid "Add All Friends"
+msgstr "4|)|) 4|_|_ |=|213|\\||)2"
+
+#: src/plugins/msim/myspacegui/prompts.py:13
+msgid "Add Friends"
+msgstr "4|)|) |=|213|\\||)2"
+
+#: src/plugins/msim/res/content.tenjin:20
+msgid "IM Name"
+msgstr "1|\\/| |\\|4|\\/|3"
+
+#: src/plugins/msim/res/content.tenjin:21
+msgid "Display Name"
+msgstr "|)15P|_4'/ |\\|4|\\/|3:"
+
+#: src/plugins/msim/res/content.tenjin:23
+msgid "Real Name"
+msgstr "|234|_ |\\|4|\\/|3"
+
+#: src/plugins/msim/res/content.tenjin:24
+msgid "Age"
+msgstr "463"
+
+#: src/plugins/msim/res/content.tenjin:27
+msgid "IM Headline"
+msgstr "1|\\/| #34|)|_1|\\|3"
+
+# MARK: Fragment
+#: src/plugins/myspace/MyspaceAccount.py:557
+msgid "added"
+msgstr "4|)|)3|)"
+
+# MARK: %s replacement
+#: src/plugins/myspace/MyspaceAccount.py:558
+#, python-format
+msgid "%s account"
+msgstr "%s 4((0|_||\\|7"
+
+# MARK: Fragment
+#: src/plugins/myspace/MyspaceAccount.py:559
+msgid "to"
+msgstr "2"
+
+#: src/plugins/myspace/MyspaceProtocol.py:29
+#: src/plugins/myspace/msgui.py:83
+msgid "Birthdays"
+msgstr "|31|27#|)4'/5"
+
+#: src/plugins/myspace/MyspaceProtocol.py:30
+#: src/plugins/myspace/msgui.py:73
+msgid "Blog Comments"
+msgstr "|3|_06 (0|\\/||\\/|3|\\|72"
+
+#: src/plugins/myspace/MyspaceProtocol.py:31
+#: src/plugins/myspace/msgui.py:74
+msgid "Blog Subscriptions"
+msgstr "|3|_06 5|_||35(|21P710|\\|2"
+
+#: src/plugins/myspace/MyspaceProtocol.py:32
+msgid "Comments"
+msgstr "(0|\\/||\\/|3|\\|72"
+
+#: src/plugins/myspace/MyspaceProtocol.py:35
+#: src/plugins/myspace/msgui.py:81
+msgid "Group Notifications"
+msgstr "6|20|_|P |\\|071|=1(4710|\\|2"
+
+#: src/plugins/myspace/MyspaceProtocol.py:36
+#: src/plugins/myspace/msgui.py:78
+msgid "Photo Tag Approvals"
+msgstr "P#070 746 4PP|20\\/4|_2"
+
+#: src/plugins/myspace/MyspaceProtocol.py:37
+#: src/plugins/myspace/msgui.py:75
+msgid "Picture Comments"
+msgstr "P1(7|_||23 C0|\\/||\\/|3|\\|72"
+
+#: src/plugins/myspace/MyspaceProtocol.py:38
+#: src/plugins/myspace/msgui.py:82
+msgid "Recently Added Friends"
+msgstr "|23(3|\\|7|_'/ 4|)|)3|) |=|213|\\||)2"
+
+#: src/plugins/myspace/MyspaceProtocol.py:39
+#: src/plugins/myspace/msgui.py:80
+msgid "Video Comments"
+msgstr "\\/1|)30 (0|\\/||\\/|3|\\|72"
+
+#: src/plugins/myspace/MyspaceProtocol.py:74
+msgid "Mail ({mailcount})"
+msgstr "|\\/|41|_ ({mailcount})"
+
+#: src/plugins/myspace/MyspaceProtocol.py:395
+#: src/plugins/myspace/notifications.yaml:9
+msgid "MySpace Newsfeed"
+msgstr "|\\/|'/5P4(3 |\\|3\\/\\/5|=33|)"
+
+#: src/plugins/myspace/MyspaceProtocol.py:432
+msgid "MySpace Error"
+msgstr "|\\/|'/5P4(3 3|2|20|2"
+
+#: src/plugins/myspace/MyspaceProtocol.py:434
+msgid "Digsby does not have permission to perform this action."
+msgstr "|)165|3'/ |)032 |\\|07 #4\\/3 P3|2|\\/|15510|\\| 2 P3|2|=0|2|\\/| |)12 4(710|\\|."
+
+#: src/plugins/myspace/MyspaceProtocol.py:566
+msgid "MySpace Alerts"
+msgstr "|\\/|'/5P4(3 4|_3|272"
+
+#: src/plugins/myspace/MyspaceProtocol.py:567
+#, python-format
+msgid "You have new %s"
+msgstr "J00 #4\\/3 |\\|3\\/\\/ %s"
+
+#: src/plugins/myspace/MyspaceProtocol.py:684
+msgid "Activity stream item not found. It may have been removed by its creator."
+msgstr "4(71\\/17'/ 57|234|\\/| 173|\\/| |\\|07 |=0|_||\\||). 17 |\\/|4Y #4\\/3 |333|\\| |23|\\/|0\\/3|) |3'/ 172 (|23470|2."
+
+#: src/plugins/myspace/actions.yaml:13
+msgid "&Post Bulletin"
+msgstr "&P057 |3|_||_|_371|\\|"
+
+#: src/plugins/myspace/info.yaml:63
+msgid "Show Newsfeed"
+msgstr "5#0\\/\\/ |\\|3\\/\\/5|=33|)"
+
+#: src/plugins/myspace/msgui.py:24
+msgid "Post achievements to my Activity Stream"
+msgstr "P057 4(#13\\/3|\\/|3|\\|72 2 |\\/|'/ 4(71\\/17'/ 57|234|\\/|"
+
+#: src/plugins/myspace/msgui.py:38
+msgid "Show Newsfeed:"
+msgstr "5#0\\/\\/ |\\|3\\/\\/5|=33|):"
+
+#: src/plugins/myspace/msgui.py:42
+msgid "Status Updates"
+msgstr "5747|_|2 |_|P|)4732"
+
+#: src/plugins/myspace/msgui.py:43
+msgid "Friend Updates"
+msgstr "|=|213|\\||) |_|P|)4732"
+
+#: src/plugins/myspace/msgui.py:44
+msgid "Blog/Forum Posts"
+msgstr "|3|_06/|=0|2|_||\\/| P0572"
+
+#: src/plugins/myspace/msgui.py:45
+msgid "Group Updates"
+msgstr "6|20|_|P |_|P|)4732"
+
+#: src/plugins/myspace/msgui.py:46
+msgid "Photos"
+msgstr "P#0702"
+
+#: src/plugins/myspace/msgui.py:47
+msgid "Music"
+msgstr "|\\/||_|51("
+
+#: src/plugins/myspace/msgui.py:48
+msgid "Videos"
+msgstr "\\/1|)302"
+
+#: src/plugins/myspace/msgui.py:50
+msgid "Applications"
+msgstr "4PP|_1(4710|\\|2"
+
+#: src/plugins/myspace/msgui.py:76
+msgid "Event Invites"
+msgstr "3\\/3|\\|7 1|\\|\\/1732"
+
+#: src/plugins/myspace/msgui.py:77
+msgid "Profile Comments"
+msgstr "P|20|=1|_3 (0|\\/||\\/|3|\\|72"
+
+#: src/plugins/myspace/notifications.yaml:1
+msgid "MySpace Alert"
+msgstr "|\\/|'/5P4(3 4|_3|272"
+
+#: src/plugins/myspace/objects.py:301
+msgid "Private user"
+msgstr "P|21\\/473 |_|53|2"
+
+#: src/plugins/myspace/objects.py:355
+msgid "Like! (via http://lnk.ms/C5dls)"
+msgstr "\\/\\/|_||3! (via http://lnk.ms/C5dls)"
+
+#: src/plugins/myspace/objects.py:356
+msgid "Dislike! (via http://lnk.ms/C5dls)"
+msgstr "|)15|_1|<3! (via http://lnk.ms/C5dls)"
+
+#: src/plugins/myspace/res/content.tenjin:15
+msgid "Activity Stream"
+msgstr "4(71\\/17'/ 57|234|\\/|"
+
+#: src/plugins/myspace/res/indicators.tenjin:6
+msgid "New Mail"
+msgstr "|\\|3\\/\\/ |\\/|41|_"
+
+#: src/plugins/myspace/res/indicators.tenjin:12
+msgid "New Birthdays"
+msgstr "|\\|3\\/\\/ |31|27#|)4'/5"
+
+#: src/plugins/myspace/res/indicators.tenjin:19
+msgid "New Blog Comments"
+msgstr "|\\|3\\/\\/ |3|_06 (0|\\/||\\/|3|\\|72"
+
+#: src/plugins/myspace/res/indicators.tenjin:26
+msgid "New Blog Subscriptions"
+msgstr "|\\|3\\/\\/ |3|_06 5|_||35(|21P710|\\|2"
+
+#: src/plugins/myspace/res/indicators.tenjin:33
+msgid "New Comments"
+msgstr "|\\|3\\/\\/ (0|\\/||\\/|3|\\|72"
+
+#: src/plugins/myspace/res/indicators.tenjin:40
+msgid "New Event Invitations"
+msgstr "|\\|3\\/\\/ 3\\/3|\\|7 1|\\|\\/174710|\\|2"
+
+#: src/plugins/myspace/res/indicators.tenjin:47
+msgid "New Friend Requests"
+msgstr "|\\|3\\/\\/ |=|213|\\||) |239|_|3572"
+
+#: src/plugins/myspace/res/indicators.tenjin:54
+msgid "New Group Notifications"
+msgstr "|\\|3\\/\\/ 6|20|_|P |\\|071|=1(4710|\\|2"
+
+#: src/plugins/myspace/res/indicators.tenjin:61
+msgid "New Photo Tag Approvals"
+msgstr "|\\|3\\/\\/ P#070 746 4PP|20\\/4|_2"
+
+#: src/plugins/myspace/res/indicators.tenjin:68
+msgid "New Picture Comments"
+msgstr "|\\|3\\/\\/ P1(7|_||23 (0|\\/||\\/|3|\\|72"
+
+#: src/plugins/myspace/res/indicators.tenjin:75
+msgid "New Recently Added Friends"
+msgstr "|\\|3\\/\\/ |23(3|\\|7|_'/ 4|)|)3|) |=|213|\\||)2"
+
+#: src/plugins/myspace/res/indicators.tenjin:82
+msgid "New Video Comments"
+msgstr "|\\|3\\/\\/ \\/1|)30 (0|\\/||\\/|3|\\|72"
+
+# MARK: Fragment
+#: src/plugins/myspace/res/likes.tenjin:18
+#: src/plugins/myspace/res/likes.tenjin:32
+msgid "liked this"
+msgstr "|_1|<3|) |)15"
+
+#: src/plugins/nowplaying/nowplaying.py:29
+msgid "Listening to music"
+msgstr "|_1573|\\|1|\\|' 2 |\\/||_|51("
+
+#: src/plugins/nowplaying/nowplaying.py:182
+msgid "Listening To..."
+msgstr "|_1573|\\|1|\\|' 2 |\\/||_|51("
+
+#: src/plugins/provider_aol/aol_sp.py:79
+msgid "Password should be 8 characters or less."
+msgstr "P455\\/\\/0|2|) 5#0|_||_|) |3 8 (#4|24(73|22 0|2 |_355."
+
+#: src/plugins/provider_aol/info.yaml:5
+msgid "AOL/AIM Account"
+msgstr "40|_/41|\\/| 4((0|_||\\|72"
+
+#: src/plugins/provider_aol/info.yaml:13
+#: src/plugins/provider_aol/info.yaml:56
+#: src/plugins/provider_aol/info.yaml:73
+msgid "Screen Name"
+msgstr "5(|233|\\| |\\|4|\\/|3"
+
+#: src/plugins/provider_aol/info.yaml:63
+msgid "AOL Mail"
+msgstr "40|_ |\\/|41|_"
+
+#: src/plugins/provider_aol/info.yaml:72
+msgid "AIM"
+msgstr "41|\\/|"
+
+#: src/plugins/provider_aol/info.yaml:99
+msgid "ICQ Account"
+msgstr "1(Q 4((0|_||\\|7"
+
+#: src/plugins/provider_aol/info.yaml:109
+msgid "UIN or Email"
+msgstr "|_|1|\\| 0|2 3|\\/|41|_"
+
+#: src/plugins/provider_aol/info.yaml:117
+#: src/plugins/provider_jabber/info.yaml:25
+msgid "Chat"
+msgstr "(#47"
+
+#: src/plugins/provider_aol/info.yaml:141
+msgid "Not Available"
+msgstr "|\\|07 4\\/41|_4|3|_3"
+
+#: src/plugins/provider_aol/info.yaml:143
+msgid "ICQ Number"
+msgstr "1(Q |\\||_||\\/||33|2"
+
+#: src/plugins/provider_facebook/info.yaml:0
+#: src/plugins/provider_facebook/info.yaml:10
+msgid "Facebook Account"
+msgstr "|=4(3|300|< 4((0|_||\\|7"
+
+#: src/plugins/provider_jabber/info.yaml:5
+msgid "Jabber Account"
+msgstr "J4|3|33|2 4((0|_||\\|72"
+
+#: src/plugins/provider_jabber/info.yaml:15
+#: src/plugins/provider_jabber/info.yaml:28
+msgid "Jabber ID"
+msgstr "J4|3|33|2 1||)"
+
+#: src/plugins/provider_jabber/jabber_gui.py:33
+msgid "Use TLS if Possible"
+msgstr "|_|53 7|_5 1|= P0551|3|_3"
+
+#: src/plugins/provider_jabber/jabber_gui.py:34
+msgid "Require TLS"
+msgstr "|23Q|_|1|23 7|_5"
+
+#: src/plugins/provider_jabber/jabber_gui.py:35
+msgid "Force SSL"
+msgstr "|=0|2(3 55|_"
+
+# MARK: Should be translated?
+#: src/plugins/provider_jabber/jabber_gui.py:36
+msgid "No Encryption"
+msgstr "|\\|0 3|\\|(|21P710|\\|"
+
+#: src/plugins/provider_jabber/jabber_gui.py:50
+msgid "Ignore SSL Warnings"
+msgstr "16|\\|0|23 55|_ \\/\\/4|2|\\|1|\\|62"
+
+#: src/plugins/provider_jabber/jabber_gui.py:54
+msgid "Allow Plaintext Login"
+msgstr "4|_|_0\\/\\/ P|_41|\\|73><7 |_061|\\|"
+
+#: src/plugins/provider_linkedin/info.yaml:0
+msgid "LinkedIn Account"
+msgstr "|_1|\\||<3|)1|\\| 4((0|_||\\|7"
+
+#: src/plugins/provider_myspace/info.yaml:0
+msgid "MySpace Account"
+msgstr "|\\/|'/5P4(3 4((0|_||\\|72..."
+
+#: src/plugins/provider_twitter/info.yaml:0
+msgid "Twitter Account"
+msgstr "7\\/\\/1773|2 4((0|_||\\|7"
+
+#: src/plugins/provider_twitter/info.yaml:10
+#: src/plugins/twitter/info.yaml:10
+msgid "Twitter ID"
+msgstr "7\\/\\/1773|2 1 |)"
+
+#: src/plugins/provider_windows_live/info.yaml:1
+msgid "Windows Live"
+msgstr "\\/\\/1|\\||)0\\/\\/2 |_1\\/3"
+
+#: src/plugins/provider_windows_live/info.yaml:10
+msgid "Windows Live Account"
+msgstr "\\/\\/1|\\||)0\\/\\/2 |_1\\/3 4((0|_||\\|7"
+
+#: src/plugins/provider_windows_live/info.yaml:33
+msgid "Busy"
+msgstr "|3|_|5'/"
+
+#: src/plugins/provider_windows_live/info.yaml:54
+msgid "Live Messenger"
+msgstr "|_1\\/3 |\\/|355463|2"
+
+#: src/plugins/provider_windows_live/info.yaml:77
+msgid "Hotmail"
+msgstr "|-|07|\\/|41|_"
+
+#: src/plugins/provider_windows_live/wl_sp.py:17
+msgid "Password should be 16 characters or less."
+msgstr "P455\\/\\/0|2|) 5#0|_||_|) |3 16 (#4|24(73|22 0|2 |_355."
+
+#: src/plugins/provider_windows_live/wl_sp.py:22
+msgid "You can't have your password as your display name."
+msgstr "J00 (4|\\|'7 #4\\/3 '/0 P455\\/\\/0|2|) 42 '/0 |)15P|_4'/ |\\|4|\\/|3."
+
+#: src/plugins/provider_yahoo/info.yaml:0
+msgid "Yahoo Account"
+msgstr "'/4#00 4((0|_||\\|7"
+
+#: src/plugins/researchdriver/researchtoast.py:30
+msgid "Help Digsby Stay Free"
+msgstr "#3|_P |)165|3'/ 574'/ |=|233"
+
+#: src/plugins/researchdriver/researchtoast.py:32
+msgid "You are helping Digsby stay free by allowing Digsby to use your PC's idle time."
+msgstr "J00 12 #3|_P1|\\|' |)165|3'/ 574'/ |=|233 |3'/ 4|_|_0\\/\\/1|\\|' |)165b'/ 2 |_|53 '/0 P('2 1|)|_3 71|\\/|3."
+
+#: src/plugins/twitter/info.yaml:0
+msgid "Twitter"
+msgstr "7\\/\\/1773|2"
+
+#: src/plugins/twitter/info.yaml:3
+msgid "Timeline"
+msgstr "71|\\/||_1|\\|3"
+
+#: src/plugins/twitter/notifications.yaml:1
+msgid "Twitter Update"
+msgstr "7\\/\\/1773|2 |_|P|)473"
+
+#: src/plugins/twitter/notifications.yaml:9
+msgid "Twitter Direct Message"
+msgstr "7\\/\\/1773|2 |)1|23(7 |\\/|355463"
+
+#: src/plugins/twitter/res/alerts.tenjin:6
+msgid "Search: "
+msgstr "534|2(#"
+
+# MARK: Partial
+#: src/plugins/twitter/res/alerts.tenjin:8
+msgid "Group: "
+msgstr "6|20|_|P:"
+
+#: src/plugins/twitter/res/alerts.tenjin:25
+msgid "No alerts"
+msgstr "|\\|0 4|_3|272:"
+
+#: src/plugins/twitter/res/content.tenjin:34
+msgid "Trending Topics"
+msgstr "7|23|\\||)1|\\|' 70P1(2:"
+
+#: src/plugins/twitter/res/status.tenjin:20
+msgid "What are you doing?"
+msgstr "\\/\\/07 12 J00 |)01|\\|'?"
+
+#: src/plugins/twitter/res/tweet.tenjin:80
+msgid "Share"
+msgstr "5#4|23"
+
+#: src/plugins/twitter/twgui.py:31
+msgid "Follow Digsby on Twitter"
+msgstr "|=0|_|_0\\/\\/ |)165|3'/ 0|\\| 7\\/\\/1773|2"
+
+#: src/plugins/twitter/twgui.py:37
+msgid "Post achievements to my feed"
+msgstr "P057 4(#13\\/3|\\/|3|\\|72 2 |\\/|'/ |=33|)"
+
+#: src/plugins/twitter/twitter.py:216
+msgid "Followers"
+msgstr "|=0|_|_0\\/\\/3|22"
+
+#: src/plugins/twitter/twitter.py:217
+msgid "Following"
+msgstr "|=0|_|_0\\/\\/1|\\|'"
+
+#: src/plugins/twitter/twitter.py:606
+#: src/plugins/twitter/twitter_gui.py:702
+msgid "Favorites"
+msgstr "|=4\\/0|21732"
+
+#: src/plugins/twitter/twitter.py:607
+#: src/plugins/twitter/twitter_gui.py:703
+msgid "History"
+msgstr "#1570|2'/"
+
+#: src/plugins/twitter/twitter.py:851
+msgid "Reply"
+msgstr "|23P|_'/"
+
+#: src/plugins/twitter/twitter.py:852
+msgid "Retweet"
+msgstr "|237\\/\\/337"
+
+#: src/plugins/twitter/twitter.py:853
+msgid "Direct"
+msgstr "|)1|23(7"
+
+#: src/plugins/twitter/twitter.py:1207
+msgid "Twitter Error"
+msgstr "7\\/\\/1773|2 3|2|23|2"
+
+#: src/plugins/twitter/twitter.py:1208
+msgid "Send Tweet Failed"
+msgstr "53|\\||) 7\\/\\/337 |=41|_3|)"
+
+#: src/plugins/twitter/twitter_account_gui.py:9
+msgid "Twitter allows for 150 requests per hour. Make sure to leave room for manual updates and other actions."
+msgstr "7\\/\\/1773|2 4|_|_0\\/\\/2 4 150 |23Q|_|3572 P3|2 #0|_||2. |\\/|4|<3 5|_||23 2 |_34\\/3 |200|\\/| 4 |\\/|4|\\||_|4|_ |_|P|)4732 |\\| 07#3|2 4(710|\\|2."
+
+#: src/plugins/twitter/twitter_account_gui.py:14
+msgid "Friends:"
+msgstr "|=|213|\\||)2:"
+
+#: src/plugins/twitter/twitter_account_gui.py:15
+msgid "Mentions:"
+msgstr "|\\/|3|\\|710|\\|2:"
+
+#: src/plugins/twitter/twitter_account_gui.py:16
+msgid "Directs:"
+msgstr "|)1|23(72:"
+
+#: src/plugins/twitter/twitter_account_gui.py:17
+msgid "Searches:"
+msgstr "534|2(#35:"
+
+#: src/plugins/twitter/twitter_account_gui.py:35
+msgid "{mins} minute"
+msgid_plural "{mins} minutes"
+msgstr[0] "{mins} |\\/|1|\\||_|7 |_||\\|17"
+msgstr[1] "{mins} |\\/|1|\\||_|7 |_||\\|175"
+
+#: src/plugins/twitter/twitter_account_gui.py:38
+msgid "Never"
+msgstr "|\\|3\\/3|2"
+
+#: src/plugins/twitter/twitter_account_gui.py:94
+msgid "Update Frequency:"
+msgstr "|_|P|)473 |=|23Q|_|3|\\|('/:"
+
+#: src/plugins/twitter/twitter_account_gui.py:111
+msgid "Auto-throttle when Twitter lowers the rate limit."
+msgstr "4|_|70-7#|2077|_3 \\/\\/#3|\\| 7\\/\\/1773|2 |_0\\/\\/3|22 73# |2473 |_1|\\/|17."
+
+#: src/plugins/twitter/twitter_account_gui.py:114
+msgid "Server"
+msgstr "53|2\\/3|2:"
+
+#: src/plugins/twitter/twitter_account_gui.py:185
+msgid "{total_updates} / hour"
+msgstr "{total_updates} / |-|0|_||2"
+
+#: src/plugins/twitter/twitter_gui.py:123
+msgid "&Search"
+msgstr "&534|2(#"
+
+#: src/plugins/twitter/twitter_gui.py:127
+msgid "Twitter Search"
+msgstr "7\\/\\/1773|2 534|2(#"
+
+#: src/plugins/twitter/twitter_gui.py:187
+msgid "Search For:"
+msgstr "534|2(# |=0|2:"
+
+#: src/plugins/twitter/twitter_gui.py:195
+msgid "Title:"
+msgstr "717|_3:"
+
+#: src/plugins/twitter/twitter_gui.py:201
+msgid "Trending Topics:"
+msgstr "7|23|\\||)1|\\|' 70P1(2:"
+
+#: src/plugins/twitter/twitter_gui.py:211
+msgid "Search &Options"
+msgstr "534|2(# &OP710|\\|2"
+
+#: src/plugins/twitter/twitter_gui.py:212
+msgid "Merge search results into Timeline view"
+msgstr "|\\/|3|263 534|2(# |235|_||_72 1|\\|70 71|\\/|3|_1|\\|3 \\/13\\/\\/"
+
+#: src/plugins/twitter/twitter_gui.py:214
+msgid "Popup notifications for new search results"
+msgstr "P0P|_|P |\\|071|=1(4710|\\|2 4 |\\|3\\/\\/ 534|2(# |235|_||_72"
+
+#: src/plugins/twitter/twitter_gui.py:355
+msgid "Twitter Group"
+msgstr "7\\/\\/1773|2 6|20|_|P"
+
+#: src/plugins/twitter/twitter_gui.py:408
+msgid "&Group Name"
+msgstr "&6|20|_|p |\\|4|\\/|3"
+
+#: src/plugins/twitter/twitter_gui.py:413
+msgid "Group &Members"
+msgstr "6|20|_|P &M3|\\/||33|22"
+
+#: src/plugins/twitter/twitter_gui.py:426
+msgid "Group &Options"
+msgstr "6|20|_|P &0P710|\\|2"
+
+#: src/plugins/twitter/twitter_gui.py:427
+msgid "&Filter this group's tweets out of the Timeline view"
+msgstr "&|=1|_73|2 |)12 6|20|_|P'2 7\\/\\/3372 0|_|7 0|= 73# 71|\\/|3|_1|\\|3 \\/13\\/\\/"
+
+#: src/plugins/twitter/twitter_gui.py:429
+msgid "Show &popup notifications for this group's tweets"
+msgstr "5#0\\/\\/ &P0P|_|P |\\|071|=1(4710|\\|2 4 |)12 6|20|_|P'5 7\\/\\/3372"
+
+#: src/plugins/twitter/twitter_gui.py:606
+msgid "&Hide Toolbar"
+msgstr "&H1|)3 700|_|34|2"
+
+#: src/plugins/twitter/twitter_gui.py:612
+msgid "Shorten &Links"
+msgstr "5#0|273|\\| &L1|\\||<2"
+
+#: src/plugins/twitter/twitter_gui.py:613
+msgid "Image"
+msgstr "1|\\/|463"
+
+#: src/plugins/twitter/twitter_gui.py:614
+msgid "Shrink"
+msgstr "5#|21|\\||<"
+
+#: src/plugins/twitter/twitter_gui.py:710
+msgid "New Group..."
+msgstr "|\\|3\\/\\/ 6|20|_|P"
+
+#: src/plugins/twitter/twitter_gui.py:711
+msgid "New Search..."
+msgstr "|\\|3\\/\\/ 534|2(#..."
+
+#: src/plugins/twitter/twitter_gui.py:712
+msgid "Edit and Rearrange..."
+msgstr "3|)17 |\\| R34|2|24|\\|63"
+
+#: src/plugins/twitter/twitter_gui.py:1006
+msgid "Shortening..."
+msgstr "5#0|273|\\|1|\\|'"
+
+#: src/plugins/twitter/twitter_gui.py:1102
+msgid "Are you sure you want to upload the image in your clipboard?"
+msgstr "12 J00 5|_||23 J00 \\/\\/4|\\|7 2 |_|P|_04|) 73# 1|\\/|463 1|\\| '/0 (|_1P|304|2|)?"
+
+#: src/plugins/twitter/twitter_gui.py:1103
+msgid "Image Upload"
+msgstr "1|\\/|463 |_|P|_04|)"
+
+#: src/plugins/twitter/twitter_gui.py:1385
+msgid "&Rearrange"
+msgstr "&R34|2|24|\\|63"
+
+#: src/plugins/twitter/twitter_gui.py:1387
+msgid "Edit and &Rearrange"
+msgstr "3|)17 |\\| &R34|2|24|\\|63"
+
+#: src/plugins/twitter/twitter_gui.py:1390
+msgid "&Mark As Read"
+msgstr "&M4|2|< 42 |234|)"
+
+#: src/plugins/twitter/twitter_gui.py:1393
+msgid "&Adds to Unread Count"
+msgstr "&4|)|)2 2 |_||\\||234|) (0|_||\\|7"
+
+#: src/plugins/twitter/twitter_gui.py:1511
+msgid "Text Size"
+msgstr "73><7 5123"
+
+#: src/plugins/twitter/twitter_gui.py:1601
+msgid "Shorten URLs\tCtrl+L"
+msgstr "5#0|273|\\| |_||2|_\tCtrl+L"
+
+#: src/plugins/twitter/twitter_gui.py:1602
+msgid "Share Picture\tCtrl+P"
+msgstr "5#4|23 P1(7|_||23\tCtrl+P"
+
+#: src/plugins/twitter/twitter_gui.py:1603
+msgid "TweetShrink\tCtrl+S"
+msgstr "7\\/\\/3375#|21|\\||<\tCtrl+S"
+
+#: src/plugins/twitter/twitter_gui.py:1605
+msgid "Set Global Status\tCtrl+G"
+msgstr "537 6|_0|34|_ 5747|_|2\tCtrl+G"
+
+#: src/plugins/twitter/twitter_gui.py:1607
+msgid "Auto Shorten Pasted URLs"
+msgstr "4|_|70 5#0|273|\\| P4573|) |_||2|_2"
+
+#: src/plugins/twitter/twitter_gui.py:1608
+msgid "Auto Upload Pasted Images"
+msgstr "4|_|70 |_|P|_04|) P4573|) 1|\\/|4632"
+
+#: src/plugins/twitter/twitter_gui.py:1609
+msgid "Auto Scroll When At Bottom"
+msgstr "4|_|70 5(|20|_|_ \\/\\/#3|\\| 47 |30770|\\/|"
+
+#: src/plugins/twitter/twitter_gui.py:1730
+msgid "Your tweet has spelling errors."
+msgstr "7\\/\\/337 5P3|_|_1|\\|' 3|2|20|22"
+
+#: src/plugins/twitter/twitter_gui.py:1731
+msgid "Are you sure you'd like to send it?"
+msgstr "12 J00 5|_||23 J00 \\/\\/4|\\|7 |)0 |)12?"
+
+#: src/plugins/twitter/twitter_gui.py:1735
+msgid "Tweet spelling errors"
+msgstr "7\\/\\/337 5P3|_|_1|\\|' 3|2|20|22"
+
+#: src/plugins/twitter/twitter_gui.py:1738
+msgid "Send Anyways"
+msgstr "53|\\||) 4|\\|'/\\/\\/4'/2"
+
+#: src/plugins/twitter/twitter_gui.py:1996
+msgid "Twitter Groups and Searches"
+msgstr "7\\/\\/1773|2 6|20|_|P5 |\\| 534|2(#32"
+
+#: src/plugins/twitter/twitter_gui.py:2020
+msgid "Refresh Now"
+msgstr "|23|=|235# |\\|0\\/\\/"
+
+#: src/plugins/twitter/twitter_gui.py:2021
+msgid "Mark All As Read"
+msgstr "|\\/|4|2|< 4|_|_ 42 |234|)"
+
+#: src/plugins/twitter/twitter_gui.py:2046
+msgid "Set Status"
+msgstr "537 5747|_|5"
+
+#: src/plugins/twitter/twitter_gui.py:2064
+#, python-format
+msgid "Twitter (%s)"
+msgstr "7\\/\\/1773|2 (%s)"
+
+#: src/plugins/twitter/twitter_gui.py:2290
+msgid "&Invite Followers"
+msgstr "&1|\\|\\/173 |=0|_|_0\\/\\/3|22"
+
+#: src/plugins/twitter/twitter_gui.py:2291
+msgid "&No Thanks"
+msgstr "&N0 7#4|\\||<2"
+
+#: src/plugins/twitter/twitter_notifications.py:76
+#, python-format
+msgid "Twitter - %(feed_label)s (%(username)s)"
+msgstr "7\\/\\/1773|2 - %(feed_label)s (%(username)s)"
+
+#: src/plugins/twitter/twitter_notifications.py:78
+#, python-format
+msgid "Twitter - Group: %(feed_label)s (%(username)s)"
+msgstr "7\\/\\/1773|2 - 6|20|_|P: %(feed_label)s (%(username)s)"
+
+#: src/plugins/twitter/twitter_util.py:83
+msgid "about a minute ago"
+msgstr "4|30|_|7 @ |\\/|1|\\||_|73 460"
+
+#: src/plugins/twitter/twitter_util.py:85
+msgid "about {minutes} minutes ago"
+msgstr "4|30|_|7 {minutes} |\\/|1|\\||_|732 460"
+
+#: src/plugins/twitter/twitter_util.py:87
+msgid "about an hour ago"
+msgstr "4|30|_|7 |\\| #0|_||2 460"
+
+#: src/plugins/twitter/twitter_util.py:89
+msgid "about {hours} hours ago"
+msgstr "4|30|_|7 {hours} #0|_||22 460"
+
+#: src/plugins/twitter/twitter_util.py:91
+msgid "about a day ago"
+msgstr "4|30|_|7 @ |)4'/ 460"
+
+#: src/plugins/twitter/twitter_util.py:93
+msgid "about {days} days ago"
+msgstr "4|30|_|7 {days} |)4'/2 460"
+
+#: src/util/diagnostic.py:584
+#: src/util/diagnostic.py:941
+msgid "Submit Bug Report"
+msgstr "5|_||3|\\/|17 |3|_|6 |23p0|27"
+
+#: src/util/diagnostic.py:587
+msgid "Bug report submitted successfully."
+msgstr "|3|_|6 |23P0|27 5|_||3|\\/|1773|) 5|_|((355|=|_||_|_'/."
+
+#: src/util/diagnostic.py:589
+msgid "Bug report submission failed."
+msgstr "|3|_|6 |23P0|27 5|_||3|\\/|15510|\\| |=41|_!"
+
+#: src/util/diagnostic.py:916
+msgid "Please wait while we process the diagnostic information."
+msgstr "P|_3453 \\/\\/417 \\/\\/#1|_3 \\/\\/3 P|20(352 73# |)146|\\|0571( 1|\\||=0|2|\\/|4710|\\|."
+
+#: src/util/diagnostic.py:917
+msgid "Thanks for your patience!"
+msgstr "7#4|\\||<2 4 '/0 P4713|\\|(3!"
+
+#: src/util/diagnostic.py:919
+msgid "Processing Diagnostic Info"
+msgstr "P|20(3551|\\|' |)146|\\|0571( 1|\\||=0"
+
+#: src/util/diagnostic.py:922
+msgid "There was a problem submitting your bug report."
+msgstr "7#3|23 \\/\\/|_|2 |\\| 3|2|20|2 5|_||3|\\/|1771|\\|' '/0 (|245# |23P0|27."
+
+#: src/util/diagnostic.py:923
+msgid "If the problem persists, please email bugs@digsby.com"
+msgstr "1|= 73# P|20|3|_3|\\/| P3|251572, P|_3453 3|\\/|41|_ bugs@digsby.com"
+
+#: src/util/diagnostic.py:930
+msgid "Bug report sent successfully."
+msgstr "|3|_|6 |23P0|27 53|\\|7 5|_|((355|=|_||_|_Y."
+
+#: src/util/httplib2/httplib2.py:343
+#, python-format
+msgid "Content purported to be compressed with %s but failed to decompress."
+msgstr "(0|\\|73|\\|7 P|_||2P0|273|) 2 |3 (0|\\/|P|23553|) \\/\\/17# %s |3|_|7 |=41|_3|) 2 |)3(0|\\/|P|2355."
+
+#: src/util/httplib2/httplib2.py:502
+msgid "The challenge doesn't contain a server nonce, or this one is empty."
+msgstr "73# (#4|_|_3|\\|63 |)03s|\\|'7 (0|\\|741|\\| @ 53|2\\/3|2 |\\|0|\\|(3, 0|2 |)12 0|\\|3 |3 3|\\/|P7'/."
+
+#: src/util/httplib2/httplib2.py:946
+msgid "Redirected but the response is missing a Location: header."
+msgstr "|23|)1|23(73|) |3|_|7 73# |235P0|\\|53 |3 |\\/|1551|\\|' @ |_0(4710|\\|: #34|)3|2."
+
+#: src/util/httplib2/httplib2.py:973
+msgid "Redirected more times than rediection_limit allows."
+msgstr "|23|)1|23(73|) |\\/|0|23 71|\\/|32 7#4|\\| |23|)13(710|\\|_|_1|\\/|17 4|_|_0\\/\\/2."
+
+#: src/util/perfmon.py:127
+msgid ""
+"A log of the problem has been sent to digsby.com.\n"
+"\n"
+"Thanks for helping!"
+msgstr ""
+"@ |_06 0|= 73# P|20|3|_3|\\/| #42 |333|\\| 53|\\|7 2 |)165|3'/.(0|\\/|.\n"
+"\n"
+"7#4|\\||<2 4 #3|_P1|\\|'!"
+
+#: src/util/perfmon.py:128
+msgid "Diagnostic Log"
+msgstr "|)146|\\|0571( |_06"
+
+#: src/util/perfmon.py:132
+msgid "There was an error when submitting the diagnostic log."
+msgstr "7#3|23 \\/\\/|_|2 |\\| 3|2|20|2 \\/\\/#3|\\| 5|_||3|\\/|1771|\\|' 73# |)146|\\|0571( |_06."
+
+#: src/util/perfmon.py:146
+msgid "Digsby appears to be running slowly."
+msgstr "|)165|3'/ |331|\\| 5|_0\\/\\/?"
+
+#: src/util/perfmon.py:147
+msgid "Do you want to capture diagnostic information and send it to digsby.com?"
+msgstr "(4P7|_||2 |)146|\\|0571(2 |\\| 53|\\||) 2 |)165|3'/?"
+
+#: src/util/perfmon.py:151
+msgid "Digsby CPU Usage"
+msgstr "|)165|3'/ (P|_| |_|5463"
+
+# MARK: Shuold be translated, not actually correct, may not exist in other languages
+#: src/util/primitives/strings.py:587
+msgid "aeiou"
+msgstr "aeiou"
+
+# MARK: Fragment, Should exist?
+#: src/util/primitives/strings.py:588
+msgid "an"
+msgstr "|\\|"
+
+# MARK: Fragment, I don't know what this is
+#: src/util/primitives/strings.py:590
+msgid "a"
+msgstr "@ "
+
+# MARK: Key replacement
+#: src/util/primitives/strings.py:592
+#, python-format
+msgid "%(article)s %(s)s"
+msgstr "%(article)s %(s)s"
+
+#: src/yahoo/YahooProtocol.py:1163
+msgid "May I add you to my contact list?"
+msgstr "|\\/|4'/ 1 4|)|) J00 2 |\\/|'/ (0|\\|74(7 |_157?"
+
+#: src/yahoo/YahooProtocol.py:1323
+msgid "There was an error modifying stealth settings for {name}."
+msgstr "7#3|23 \\/\\/|_|2 |\\| 3|2|20|2 |\\/|0|)1|='/1|\\|' 5734|_7# 53771|\\|62 4 {name}"
+
+#: src/yahoo/login.py:35
+msgid "Bad Password"
+msgstr "|34|) P455\\/\\/0|2|)"
+
+#: src/yahoo/login.py:36
+msgid "There is a security lock on your account. Log in to http://my.yahoo.com and try again."
+msgstr "7#3|23 |3 @ 53(|_||217'/ |_0(|< 0|\\| '/0 4((0|_||\\|7. |_06 1|\\| 2 http://my.yahoo.com |\\| 7|2'/ 4641|\\|."
+
+#: src/yahoo/login.py:37
+msgid "Account Not Set Up"
+msgstr "4((0|_||\\|7 |\\|07 537 |_|P"
+
+#: src/yahoo/login.py:38
+msgid "Bad Username"
+msgstr "|34|) |_|53|2|\\|4|\\/|3"
+
+#: src/yahoo/login.py:39
+msgid "Rate Limit"
+msgstr "|2473 |_1|\\/|17"
+
+#: src/yahoo/yahoobuddy.py:130
+msgid "No Updates"
+msgstr "|\\|0 |_|P|)4732"
+
+#: src/yahoo/yahoobuddy.py:134
+#: src/yahoo/yahoobuddy.py:137
+#: src/yahoo/yahoobuddy.py:151
+#: src/yahoo/yahoobuddy.py:173
+msgid "Yahoo! 360:"
+msgstr "'/4#00! 360:"
+
+#: src/yahoo/yahoobuddy.py:145
+#: src/yahoo/yahoobuddy.py:167
+#: src/yahoo/yahoobuddy.py:174
+#: src/yahoo/yahoobuddy.py:195
+#: src/yahoo/yahoobuddy.py:203
+msgid "Directory URL:"
+msgstr "|)1|23(70|2'/ |_||2|_:"
+
+#: src/yahoo/yahoobuddy.py:152
+msgid "Real Name:"
+msgstr "|234|_ |\\|4|\\/|3:"
+
+#: src/yahoo/yahoobuddy.py:153
+msgid "Nickname:"
+msgstr "|\\|1(|<|\\|4|\\/|3:"
+
+#: src/yahoo/yahoobuddy.py:155
+msgid "Age:"
+msgstr "463:"
+
+#: src/yahoo/yahoobuddy.py:156
+msgid "Sex:"
+msgstr "53><:"
+
+#: src/yahoo/yahoobuddy.py:157
+msgid "Marital Status:"
+msgstr "|\\/|4|2174|_ 5747|_|5:"
+
+#: src/yahoo/yahoobuddy.py:158
+msgid "Occupation:"
+msgstr "0((|_|P4710|\\|:"
+
+#: src/yahoo/yahoobuddy.py:159
+msgid "Email:"
+msgstr "3|\\/|41|_:"
+
+#: src/yahoo/yahoobuddy.py:160
+msgid "Home Page:"
+msgstr "#0|\\/|3P463:"
+
+#: src/yahoo/yahoobuddy.py:161
+#: src/yahoo/yahoobuddy.py:181
+msgid "Hobbies:"
+msgstr "|-|0|3|3132:"
+
+#: src/yahoo/yahoobuddy.py:162
+#: src/yahoo/yahoobuddy.py:181
+msgid "Latest News:"
+msgstr "|_47357 |\\|4\\/\\/32"
+
+#: src/yahoo/yahoobuddy.py:163
+#: src/yahoo/yahoobuddy.py:181
+msgid "Favorite Quote:"
+msgstr "|=4\\/0|2173 Q|_|073:"
+
+#: src/yahoo/yahoobuddy.py:165
+#: src/yahoo/yahoobuddy.py:195
+msgid "Member Since "
+msgstr "|\\/|3|\\/||33|2 51|\\|(3"
+
+#: src/yahoo/yahoobuddy.py:166
+#: src/yahoo/yahoobuddy.py:195
+msgid "Last Update: "
+msgstr "|_457 |_|P|)473:"
+
+#~ msgid "Invite Twitter Followers"
+#~ msgstr "1|\\|\\/173 7\\/\\/1773|2 |=0|_|_0\\/\\/3|22"
+
+# MARK: Fragment
+#~ msgid "minutes"
+#~ msgstr "|\\/|1|\\||_|732"
+# MARKED %s Fragment
+#~ msgid " for %s"
+#~ msgstr "4 %s"
+# MARKED: Fragment
+#~ msgid " on monitor "
+#~ msgstr "0|\\| |\\//|0|\\|170|2"
+# MARK: Fragment, Posible multilingual issue
+#~ msgid "from"
+#~ msgstr "|=|20|\\/|"
+#~ msgid "blog subscriptions"
+#~ msgstr "|3|_06 5|_||35(|21P710|\\|2"
+#, fuzzy
+#~ msgid "\"Available\"], []]"
+#~ msgstr "4\\/41|_4|3|_3"
+
+#~ msgid ""
+#~ "Please support Digsby by helping us spread the word!\n"
+#~ "Would you like to invite your address book contacts to Digsby?"
+#~ msgstr ""
+#~ "P|_3453 5|_|PP0|27 |)165|3'/ |3'/ #3|_P1|\\|' |_|2 5P|234|) 73# \\/\\/0|2|)!\n"
+#~ "\\/\\/0|_||_|) J00 \\/\\/|_||3 2 1|\\|\\/173 '/0 4|)|)|2355 |300|< (0|\\|74(72 2 |)165|3'/?"
+
+# MARK: Fragment, %s replacement
+#~ msgid "to %s"
+#~ msgstr "2 %s"
+#~ msgid "&Submit"
+#~ msgstr "&5|_||3|\\/|17"
+# MARK: %r replacement
+#~ msgid "Set to %r"
+#~ msgstr "537 2 %r"
+# MARK: %s replacement
+#~ msgid "&%s Server:"
+#~ msgstr "&%s 53|2\\/3|2:"
+#~ msgid "Check for new mail every"
+#~ msgstr "(#3(|< 4 |\\|3\\/\\/ |\\/|41|_ 3\\/3|2'/"
+#~ msgid "Send Invites"
+#~ msgstr "53|\\||) 1|\\|\\/1732"
+#~ msgid "Sent "
+#~ msgstr "53|\\|7 "
+# MARK: Formatting, Reproduction
+#~ msgid ""
+#~ "Please support Digsby by helping us spread the word. Would\n"
+#~ "you like to send a direct message to your Twitter followers\n"
+#~ "inviting them to Digsby?"
+#~ msgstr ""
+#~ "P|_3453 5|_|PP0|27 |)165|3'/ |3'/ #3|_P1|\\|' |_|2 5P|234|) 73# \\/\\/0|2|)! \\/\\/0|_||_|)\n"
+#~ "J00 \\/\\/|_||3 2 53|\\||) @ |)1|23(7 |\\/|355463 2 '/0 7\\/\\/1773|2 |=0|_|_0\\/\\/3r2\n"
+#~ "1|\\|\\/171|\\|' 7#3|\\/| 2 |)165|3'/?"
+# MARK: Fragment
+#~ msgid "winked at you!"
+#~ msgstr "\\/\\/1|\\||<3|) 47 J00!"
+# MARK: Fragment
+#~ msgid "Enable &pop-up notifications in the "
+#~ msgstr "3|\\|4|3|_3 &P0P-|_|P |\\|071|=1(4710|\\|2 1|\\| 73# "
+# MARK: Should not be translated...
+#~ msgid "test"
+#~ msgstr "7357"
+#, fuzzy
+#~ msgid "'Available'],"
+#~ msgstr "4\\/41|_4|3|_3"
+
+#~ msgid "Editing Alerts for {name}"
+#~ msgstr "3|)17 4|_3|272 4 {name}"
+
+#, fuzzy
+#~ msgid "'Away']]"
+#~ msgstr "4\\/\\/4'/"
diff --git a/digsby/devplugins/l33t_language/info.yaml b/digsby/devplugins/l33t_language/info.yaml
new file mode 100644
index 0000000..4a91a67
--- /dev/null
+++ b/digsby/devplugins/l33t_language/info.yaml
@@ -0,0 +1,8 @@
+---
+name: !python/unicode l33t
+language: !python/unicode lt
+catalog_format: po
+domain: !python/unicode digsby
+shortname: !python/unicode digsby-i18n-digsby-lt
+pot_version: !python/unicode 29983
+type: lang
diff --git a/digsby/devplugins/skype/SkyLib.py b/digsby/devplugins/skype/SkyLib.py
new file mode 100644
index 0000000..808bc4a
--- /dev/null
+++ b/digsby/devplugins/skype/SkyLib.py
@@ -0,0 +1,3452 @@
+#__LICENSE_GOES_HERE__
+
+# -*- coding: utf-8 -*-
+# module skylib
+from skypekit import *
+
+class ContactGroup(Object):
+ event_handlers = {}
+ propid2label = {}
+ def _Init(self, object_id, transport):
+ Object._Init(self, object_id, transport)
+ def __str__(self):
+ return "ContactGroup %s" % (self.object_id, )
+ module_id = 10
+ def OnPropertyChange(self, property_name): pass
+ TYPE= {
+ 1 :'ALL_KNOWN_CONTACTS',
+ 2 :'ALL_BUDDIES',
+ 3 :'SKYPE_BUDDIES',
+ 4 :'SKYPEOUT_BUDDIES',
+ 5 :'ONLINE_BUDDIES',
+ 6 :'UNKNOWN_OR_PENDINGAUTH_BUDDIES',
+ 7 :'RECENTLY_CONTACTED_CONTACTS',
+ 8 :'CONTACTS_WAITING_MY_AUTHORIZATION',
+ 9 :'CONTACTS_AUTHORIZED_BY_ME',
+ 10:'CONTACTS_BLOCKED_BY_ME',
+ 11:'UNGROUPED_BUDDIES',
+ 12:'CUSTOM_GROUP',
+ 13:'PROPOSED_SHARED_GROUP',
+ 14:'SHARED_GROUP',
+ 15:'EXTERNAL_CONTACTS',
+ 'ALL_KNOWN_CONTACTS' : 1,
+ 'ALL_BUDDIES' : 2,
+ 'SKYPE_BUDDIES' : 3,
+ 'SKYPEOUT_BUDDIES' : 4,
+ 'ONLINE_BUDDIES' : 5,
+ 'UNKNOWN_OR_PENDINGAUTH_BUDDIES' : 6,
+ 'RECENTLY_CONTACTED_CONTACTS' : 7,
+ 'CONTACTS_WAITING_MY_AUTHORIZATION' : 8,
+ 'CONTACTS_AUTHORIZED_BY_ME' : 9,
+ 'CONTACTS_BLOCKED_BY_ME' :10,
+ 'UNGROUPED_BUDDIES' :11,
+ 'CUSTOM_GROUP' :12,
+ 'PROPOSED_SHARED_GROUP' :13,
+ 'SHARED_GROUP' :14,
+ 'EXTERNAL_CONTACTS' :15
+ }
+
+ def _Gettype(self):
+ return ContactGroup.TYPE[self._Property("ZG\233\001]\012",155, True)]
+ type = property(_Gettype)
+ propid2label[155] = "type"
+ def _Getcustom_group_id(self):
+ return self._Property("ZG\232\001]\012",154, True)
+ custom_group_id = property(_Getcustom_group_id)
+ propid2label[154] = "custom_group_id"
+ def _Getgiven_displayname(self):
+ return self._Property("ZG\227\001]\012",151, True)
+ given_displayname = property(_Getgiven_displayname)
+ propid2label[151] = "given_displayname"
+ def _Getnrofcontacts(self):
+ return self._Property("ZG\230\001]\012",152, True)
+ nrofcontacts = property(_Getnrofcontacts)
+ propid2label[152] = "nrofcontacts"
+ def _Getnrofcontacts_online(self):
+ return self._Property("ZG\231\001]\012",153, True)
+ nrofcontacts_online = property(_Getnrofcontacts_online)
+ propid2label[153] = "nrofcontacts_online"
+
+ def GiveDisplayName(
+ self,
+ name
+ ):
+ request = XCallRequest("ZR\012\001",10,1)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,name)
+ response = self.transport.Xcall(request)
+ def Delete(self):
+ request = XCallRequest("ZR\012\002",10,2)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def GetConversations(self):
+ request = XCallRequest("ZR\012\003",10,3)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = [module_id2classes[18](oid,self.transport) for oid in response.get(1,[])]
+ return result
+ def CanAddConversation(
+ self,
+ conversation
+ ):
+ request = XCallRequest("ZR\012\004",10,4)
+ request.AddParm('O',0,self)
+ request.AddParm('O',1,conversation)
+ response = self.transport.Xcall(request)
+ def AddConversation(
+ self,
+ conversation
+ ):
+ request = XCallRequest("ZR\012\005",10,5)
+ request.AddParm('O',0,self)
+ request.AddParm('O',1,conversation)
+ response = self.transport.Xcall(request)
+ def CanRemoveConversation(self):
+ request = XCallRequest("ZR\012\006",10,6)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def RemoveConversation(
+ self,
+ conversation
+ ):
+ request = XCallRequest("ZR\012\007",10,7)
+ request.AddParm('O',0,self)
+ request.AddParm('O',1,conversation)
+ response = self.transport.Xcall(request)
+ def OnChangeConversation(
+ self,
+ conversation
+ ): pass
+ event_handlers[1] = "OnChangeConversationDispatch"
+ def OnChangeConversationDispatch(self, parms):
+ cleanparms = module_id2classes[18](parms.get(1),self.transport)
+ self.OnChangeConversation(cleanparms)
+ def GetContacts(self):
+ request = XCallRequest("ZR\012\010",10,8)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = [module_id2classes[2](oid,self.transport) for oid in response.get(1,[])]
+ return result
+ def CanAddContact(
+ self,
+ contact
+ ):
+ request = XCallRequest("ZR\012\011",10,9)
+ request.AddParm('O',0,self)
+ request.AddParm('O',1,contact)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def AddContact(
+ self,
+ contact
+ ):
+ request = XCallRequest("ZR\012\012",10,10)
+ request.AddParm('O',0,self)
+ request.AddParm('O',1,contact)
+ response = self.transport.Xcall(request)
+ def CanRemoveContact(self):
+ request = XCallRequest("ZR\012\013",10,11)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def RemoveContact(
+ self,
+ contact
+ ):
+ request = XCallRequest("ZR\012\014",10,12)
+ request.AddParm('O',0,self)
+ request.AddParm('O',1,contact)
+ response = self.transport.Xcall(request)
+ def OnChange(
+ self,
+ contact
+ ): pass
+ event_handlers[2] = "OnChangeDispatch"
+ def OnChangeDispatch(self, parms):
+ cleanparms = module_id2classes[2](parms.get(1),self.transport)
+ self.OnChange(cleanparms)
+module_id2classes[10] = ContactGroup
+
+class Contact(Object):
+ event_handlers = {}
+ propid2label = {}
+ def _Init(self, object_id, transport):
+ Object._Init(self, object_id, transport)
+ def __str__(self):
+ return "Contact %s" % (self.object_id, )
+ module_id = 2
+ def OnPropertyChange(self, property_name): pass
+ TYPE= {0:'UNRECOGNIZED', 'UNRECOGNIZED':0, 1:'SKYPE', 'SKYPE':1, 2:'PSTN', 'PSTN':2, 3:'EMERGENCY_PSTN', 'EMERGENCY_PSTN':3, 4:'FREE_PSTN', 'FREE_PSTN':4, 5:'UNDISCLOSED_PSTN', 'UNDISCLOSED_PSTN':5, 6:'EXTERNAL', 'EXTERNAL':6}
+ AUTHLEVEL= {0:'NONE', 'NONE':0, 1:'AUTHORIZED_BY_ME', 'AUTHORIZED_BY_ME':1, 2:'BLOCKED_BY_ME', 'BLOCKED_BY_ME':2}
+ AVAILABILITY= {
+ 0 :'UNKNOWN',
+ 8 :'PENDINGAUTH',
+ 9 :'BLOCKED',
+ 11:'BLOCKED_SKYPEOUT',
+ 10:'SKYPEOUT',
+ 1 :'OFFLINE',
+ 12:'OFFLINE_BUT_VM_ABLE',
+ 13:'OFFLINE_BUT_CF_ABLE',
+ 2 :'ONLINE',
+ 3 :'AWAY',
+ 4 :'NOT_AVAILABLE',
+ 5 :'DO_NOT_DISTURB',
+ 7 :'SKYPE_ME',
+ 6 :'INVISIBLE',
+ 14:'CONNECTING',
+ 15:'ONLINE_FROM_MOBILE',
+ 16:'AWAY_FROM_MOBILE',
+ 17:'NOT_AVAILABLE_FROM_MOBILE',
+ 18:'DO_NOT_DISTURB_FROM_MOBILE',
+ 20:'SKYPE_ME_FROM_MOBILE',
+ 'UNKNOWN' : 0,
+ 'PENDINGAUTH' : 8,
+ 'BLOCKED' : 9,
+ 'BLOCKED_SKYPEOUT' :11,
+ 'SKYPEOUT' :10,
+ 'OFFLINE' : 1,
+ 'OFFLINE_BUT_VM_ABLE' :12,
+ 'OFFLINE_BUT_CF_ABLE' :13,
+ 'ONLINE' : 2,
+ 'AWAY' : 3,
+ 'NOT_AVAILABLE' : 4,
+ 'DO_NOT_DISTURB' : 5,
+ 'SKYPE_ME' : 7,
+ 'INVISIBLE' : 6,
+ 'CONNECTING' :14,
+ 'ONLINE_FROM_MOBILE' :15,
+ 'AWAY_FROM_MOBILE' :16,
+ 'NOT_AVAILABLE_FROM_MOBILE' :17,
+ 'DO_NOT_DISTURB_FROM_MOBILE' :18,
+ 'SKYPE_ME_FROM_MOBILE' :20
+ }
+ CAPABILITY= {
+ 0 :'CAPABILITY_VOICEMAIL',
+ 1 :'CAPABILITY_SKYPEOUT',
+ 2 :'CAPABILITY_SKYPEIN',
+ 3 :'CAPABILITY_CAN_BE_SENT_VM',
+ 4 :'CAPABILITY_CALL_FORWARD',
+ 5 :'CAPABILITY_VIDEO',
+ 6 :'CAPABILITY_TEXT',
+ 7 :'CAPABILITY_SERVICE_PROVIDER',
+ 8 :'CAPABILITY_LARGE_CONFERENCE',
+ 9 :'CAPABILITY_COMMERCIAL_CONTACT',
+ 10:'CAPABILITY_PSTN_TRANSFER',
+ 11:'CAPABILITY_TEXT_EVER',
+ 12:'CAPABILITY_VOICE_EVER',
+ 13:'CAPABILITY_MOBILE_DEVICE',
+ 14:'CAPABILITY_PUBLIC_CONTACT',
+ 'CAPABILITY_VOICEMAIL' : 0,
+ 'CAPABILITY_SKYPEOUT' : 1,
+ 'CAPABILITY_SKYPEIN' : 2,
+ 'CAPABILITY_CAN_BE_SENT_VM' : 3,
+ 'CAPABILITY_CALL_FORWARD' : 4,
+ 'CAPABILITY_VIDEO' : 5,
+ 'CAPABILITY_TEXT' : 6,
+ 'CAPABILITY_SERVICE_PROVIDER' : 7,
+ 'CAPABILITY_LARGE_CONFERENCE' : 8,
+ 'CAPABILITY_COMMERCIAL_CONTACT' : 9,
+ 'CAPABILITY_PSTN_TRANSFER' :10,
+ 'CAPABILITY_TEXT_EVER' :11,
+ 'CAPABILITY_VOICE_EVER' :12,
+ 'CAPABILITY_MOBILE_DEVICE' :13,
+ 'CAPABILITY_PUBLIC_CONTACT' :14
+ }
+ CAPABILITYSTATUS= {0:'NO_CAPABILITY', 'NO_CAPABILITY':0, 1:'CAPABILITY_MIXED', 'CAPABILITY_MIXED':1, 2:'CAPABILITY_EXISTS', 'CAPABILITY_EXISTS':2}
+
+ def _Gettype(self):
+ return Contact.TYPE[self._Property("ZG\312\001]\002",202, True)]
+ type = property(_Gettype)
+ propid2label[202] = "type"
+ def _Getskypename(self):
+ return self._Property("ZG\004]\002",4, True)
+ skypename = property(_Getskypename)
+ propid2label[4] = "skypename"
+ def _Getpstnnumber(self):
+ return self._Property("ZG\006]\002",6, True)
+ pstnnumber = property(_Getpstnnumber)
+ propid2label[6] = "pstnnumber"
+ def _Getfullname(self):
+ return self._Property("ZG\005]\002",5, True)
+ fullname = property(_Getfullname)
+ propid2label[5] = "fullname"
+ def _Getbirthday(self):
+ return self._Property("ZG\007]\002",7, True)
+ birthday = property(_Getbirthday)
+ propid2label[7] = "birthday"
+ def _Getgender(self):
+ return self._Property("ZG\010]\002",8, True)
+ gender = property(_Getgender)
+ propid2label[8] = "gender"
+ def _Getlanguages(self):
+ return self._Property("ZG\011]\002",9, True)
+ languages = property(_Getlanguages)
+ propid2label[9] = "languages"
+ def _Getcountry(self):
+ return self._Property("ZG\012]\002",10, True)
+ country = property(_Getcountry)
+ propid2label[10] = "country"
+ def _Getprovince(self):
+ return self._Property("ZG\013]\002",11, True)
+ province = property(_Getprovince)
+ propid2label[11] = "province"
+ def _Getcity(self):
+ return self._Property("ZG\014]\002",12, True)
+ city = property(_Getcity)
+ propid2label[12] = "city"
+ def _Getphone_home(self):
+ return self._Property("ZG\015]\002",13, True)
+ phone_home = property(_Getphone_home)
+ propid2label[13] = "phone_home"
+ def _Getphone_office(self):
+ return self._Property("ZG\016]\002",14, True)
+ phone_office = property(_Getphone_office)
+ propid2label[14] = "phone_office"
+ def _Getphone_mobile(self):
+ return self._Property("ZG\017]\002",15, True)
+ phone_mobile = property(_Getphone_mobile)
+ propid2label[15] = "phone_mobile"
+ def _Getemails(self):
+ return self._Property("ZG\020]\002",16, True)
+ emails = property(_Getemails)
+ propid2label[16] = "emails"
+ def _Gethomepage(self):
+ return self._Property("ZG\021]\002",17, True)
+ homepage = property(_Gethomepage)
+ propid2label[17] = "homepage"
+ def _Getabout(self):
+ return self._Property("ZG\022]\002",18, True)
+ about = property(_Getabout)
+ propid2label[18] = "about"
+ def _Getavatar_image(self):
+ return self._Property("ZG%]\002",37, True)
+ avatar_image = property(_Getavatar_image)
+ propid2label[37] = "avatar_image"
+ def _Getmood_text(self):
+ return self._Property("ZG\032]\002",26, True)
+ mood_text = property(_Getmood_text)
+ propid2label[26] = "mood_text"
+ def _Getrich_mood_text(self):
+ return self._Property("ZG\315\001]\002",205, True)
+ rich_mood_text = property(_Getrich_mood_text)
+ propid2label[205] = "rich_mood_text"
+ def _Gettimezone(self):
+ return self._Property("ZG\033]\002",27, True)
+ timezone = property(_Gettimezone)
+ propid2label[27] = "timezone"
+ def _Getcapabilities(self):
+ return self._Property("ZG$]\002",36, True)
+ capabilities = property(_Getcapabilities)
+ propid2label[36] = "capabilities"
+ def _Getprofile_timestamp(self):
+ return self._Property("ZG\023]\002",19, True)
+ profile_timestamp = property(_Getprofile_timestamp)
+ propid2label[19] = "profile_timestamp"
+ def _Getnrof_authed_buddies(self):
+ return self._Property("ZG\034]\002",28, True)
+ nrof_authed_buddies = property(_Getnrof_authed_buddies)
+ propid2label[28] = "nrof_authed_buddies"
+ def _Getipcountry(self):
+ return self._Property("ZG\035]\002",29, True)
+ ipcountry = property(_Getipcountry)
+ propid2label[29] = "ipcountry"
+ def _Getavatar_timestamp(self):
+ return self._Property("ZG\266\001]\002",182, True)
+ avatar_timestamp = property(_Getavatar_timestamp)
+ propid2label[182] = "avatar_timestamp"
+ def _Getmood_timestamp(self):
+ return self._Property("ZG\267\001]\002",183, True)
+ mood_timestamp = property(_Getmood_timestamp)
+ propid2label[183] = "mood_timestamp"
+ def _Getreceived_authrequest(self):
+ return self._Property("ZG\024]\002",20, True)
+ received_authrequest = property(_Getreceived_authrequest)
+ propid2label[20] = "received_authrequest"
+ def _Getauthreq_timestamp(self):
+ return self._Property("ZG\031]\002",25, True)
+ authreq_timestamp = property(_Getauthreq_timestamp)
+ propid2label[25] = "authreq_timestamp"
+ def _Getlastonline_timestamp(self):
+ return self._Property("ZG#]\002",35, True)
+ lastonline_timestamp = property(_Getlastonline_timestamp)
+ propid2label[35] = "lastonline_timestamp"
+ def _Getavailability(self):
+ return Contact.AVAILABILITY[self._Property("ZG\042]\002",34, True)]
+ availability = property(_Getavailability)
+ propid2label[34] = "availability"
+ def _Getdisplayname(self):
+ return self._Property("ZG\025]\002",21, True)
+ displayname = property(_Getdisplayname)
+ propid2label[21] = "displayname"
+ def _Getrefreshing(self):
+ return self._Property("ZG\026]\002",22, True)
+ refreshing = property(_Getrefreshing)
+ propid2label[22] = "refreshing"
+ def _Getgiven_authlevel(self):
+ return Contact.AUTHLEVEL[self._Property("ZG\027]\002",23, True)]
+ given_authlevel = property(_Getgiven_authlevel)
+ propid2label[23] = "given_authlevel"
+ def _Getgiven_displayname(self):
+ return self._Property("ZG!]\002",33, True)
+ given_displayname = property(_Getgiven_displayname)
+ propid2label[33] = "given_displayname"
+ def _Getassigned_comment(self):
+ return self._Property("ZG\264\001]\002",180, True)
+ assigned_comment = property(_Getassigned_comment)
+ propid2label[180] = "assigned_comment"
+ def _Getlastused_timestamp(self):
+ return self._Property("ZG']\002",39, True)
+ lastused_timestamp = property(_Getlastused_timestamp)
+ propid2label[39] = "lastused_timestamp"
+ def _Getauthrequest_count(self):
+ return self._Property("ZG)]\002",41, True)
+ authrequest_count = property(_Getauthrequest_count)
+ propid2label[41] = "authrequest_count"
+ def _Getassigned_phone1(self):
+ return self._Property("ZG\270\001]\002",184, True)
+ assigned_phone1 = property(_Getassigned_phone1)
+ propid2label[184] = "assigned_phone1"
+ def _Getassigned_phone1_label(self):
+ return self._Property("ZG\271\001]\002",185, True)
+ assigned_phone1_label = property(_Getassigned_phone1_label)
+ propid2label[185] = "assigned_phone1_label"
+ def _Getassigned_phone2(self):
+ return self._Property("ZG\272\001]\002",186, True)
+ assigned_phone2 = property(_Getassigned_phone2)
+ propid2label[186] = "assigned_phone2"
+ def _Getassigned_phone2_label(self):
+ return self._Property("ZG\273\001]\002",187, True)
+ assigned_phone2_label = property(_Getassigned_phone2_label)
+ propid2label[187] = "assigned_phone2_label"
+ def _Getassigned_phone3(self):
+ return self._Property("ZG\274\001]\002",188, True)
+ assigned_phone3 = property(_Getassigned_phone3)
+ propid2label[188] = "assigned_phone3"
+ def _Getassigned_phone3_label(self):
+ return self._Property("ZG\275\001]\002",189, True)
+ assigned_phone3_label = property(_Getassigned_phone3_label)
+ propid2label[189] = "assigned_phone3_label"
+
+ def GetType(self):
+ request = XCallRequest("ZR\002\001",2,1)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = Contact.TYPE[response.get(1)]
+ return result
+ def GetIdentity(self):
+ request = XCallRequest("ZR\002\002",2,2)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = response.get(1,'')
+ return result
+ def GetAvatar(self):
+ request = XCallRequest("ZR\002\004",2,4)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = (response.get(1,False)),
+ result += (response.get(2,'')),
+ return result
+ def IsMemberOf(
+ self,
+ group
+ ):
+ request = XCallRequest("ZR\002\006",2,6)
+ request.AddParm('O',0,self)
+ request.AddParm('O',1,group)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def IsMemberOfHardwiredGroup(
+ self,
+ groupType
+ ):
+ request = XCallRequest("ZR\002\007",2,7)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,ContactGroup.TYPE[groupType])
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def SetBlocked(
+ self,
+ blocked,
+ abuse
+ ):
+ request = XCallRequest("ZR\002\315\002",2,333)
+ request.AddParm('O',0,self)
+ request.AddParm('b',1,blocked)
+ request.AddParm('b',2,abuse)
+ response = self.transport.Xcall(request)
+ def IgnoreAuthRequest(self):
+ request = XCallRequest("ZR\002\025",2,21)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def GiveDisplayName(
+ self,
+ name
+ ):
+ request = XCallRequest("ZR\002\012",2,10)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,name)
+ response = self.transport.Xcall(request)
+ def SetBuddyStatus(
+ self,
+ isMyBuddy,
+ syncAuth
+ ):
+ request = XCallRequest("ZR\002\014",2,12)
+ request.AddParm('O',0,self)
+ request.AddParm('b',1,isMyBuddy)
+ request.AddParm('b',2,syncAuth)
+ response = self.transport.Xcall(request)
+ def SendAuthRequest(
+ self,
+ message
+ ):
+ request = XCallRequest("ZR\002\015",2,13)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,message)
+ response = self.transport.Xcall(request)
+ def HasAuthorizedMe(self):
+ request = XCallRequest("ZR\002\016",2,14)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def SetPhoneNumber(
+ self,
+ num,
+ label,
+ number
+ ):
+ request = XCallRequest("ZR\002\017",2,15)
+ request.AddParm('O',0,self)
+ request.AddParm('u',1,num)
+ request.AddParm('S',2,label)
+ request.AddParm('S',3,number)
+ response = self.transport.Xcall(request)
+ def OpenConversation(self):
+ request = XCallRequest("ZR\002\021",2,17)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[18](response.get(1),self.transport)
+ return result
+ def HasCapability(
+ self,
+ capability,
+ queryServer
+ ):
+ request = XCallRequest("ZR\002\022",2,18)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,Contact.CAPABILITY[capability])
+ request.AddParm('b',2,queryServer)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def GetCapabilityStatus(
+ self,
+ capability,
+ queryServer
+ ):
+ request = XCallRequest("ZR\002\023",2,19)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,Contact.CAPABILITY[capability])
+ request.AddParm('b',2,queryServer)
+ response = self.transport.Xcall(request)
+ result = Contact.CAPABILITYSTATUS[response.get(1)]
+ return result
+ def RefreshProfile(self):
+ request = XCallRequest("ZR\002\024",2,20)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def mget_profile(self):
+ self.multiget("ZG\004,\006,\005,\032,\020,\015,\016,\017,\007,\010,\011,\012,\013,\014,\021,\022,\033]\002")
+module_id2classes[2] = Contact
+
+class ContactSearch(Object):
+ event_handlers = {}
+ propid2label = {}
+ def _Init(self, object_id, transport):
+ Object._Init(self, object_id, transport)
+ def __str__(self):
+ return "ContactSearch %s" % (self.object_id, )
+ module_id = 1
+ def OnPropertyChange(self, property_name): pass
+ STATUS= {1:'CONSTRUCTION', 'CONSTRUCTION':1, 2:'PENDING', 'PENDING':2, 3:'EXTENDABLE', 'EXTENDABLE':3, 4:'FINISHED', 'FINISHED':4, 5:'FAILED', 'FAILED':5}
+ CONDITION= {
+ 0:'EQ',
+ 1:'GT',
+ 2:'GE',
+ 3:'LT',
+ 4:'LE',
+ 5:'PREFIX_EQ',
+ 6:'PREFIX_GE',
+ 7:'PREFIX_LE',
+ 8:'CONTAINS_WORDS',
+ 9:'CONTAINS_WORD_PREFIXES',
+ 'EQ' :0,
+ 'GT' :1,
+ 'GE' :2,
+ 'LT' :3,
+ 'LE' :4,
+ 'PREFIX_EQ' :5,
+ 'PREFIX_GE' :6,
+ 'PREFIX_LE' :7,
+ 'CONTAINS_WORDS' :8,
+ 'CONTAINS_WORD_PREFIXES' :9
+ }
+
+ def _Getcontact_search_status(self):
+ return ContactSearch.STATUS[self._Property("ZG\310\001]\001",200, True)]
+ contact_search_status = property(_Getcontact_search_status)
+ propid2label[200] = "contact_search_status"
+
+ def AddMinAgeTerm(
+ self,
+ min_age_in_years,
+ add_to_subs
+ ):
+ request = XCallRequest("ZR\001\001",1,1)
+ request.AddParm('O',0,self)
+ request.AddParm('u',1,min_age_in_years)
+ request.AddParm('b',2,add_to_subs)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def AddMaxAgeTerm(
+ self,
+ max_age_in_years,
+ add_to_subs
+ ):
+ request = XCallRequest("ZR\001\002",1,2)
+ request.AddParm('O',0,self)
+ request.AddParm('u',1,max_age_in_years)
+ request.AddParm('b',2,add_to_subs)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def AddEmailTerm(
+ self,
+ email,
+ add_to_subs
+ ):
+ request = XCallRequest("ZR\001\003",1,3)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,email)
+ request.AddParm('b',2,add_to_subs)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def AddLanguageTerm(
+ self,
+ language,
+ add_to_subs
+ ):
+ request = XCallRequest("ZR\001\004",1,4)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,language)
+ request.AddParm('b',2,add_to_subs)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def AddStrTerm(
+ self,
+ prop,
+ cond,
+ value,
+ add_to_subs
+ ):
+ request = XCallRequest("ZR\001\005",1,5)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,self._propkey(prop,1))
+ request.AddParm('e',2,ContactSearch.CONDITION[cond])
+ request.AddParm('S',3,value)
+ request.AddParm('b',4,add_to_subs)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def AddIntTerm(
+ self,
+ prop,
+ cond,
+ value,
+ add_to_subs
+ ):
+ request = XCallRequest("ZR\001\006",1,6)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,self._propkey(prop,1))
+ request.AddParm('e',2,ContactSearch.CONDITION[cond])
+ request.AddParm('u',3,value)
+ request.AddParm('b',4,add_to_subs)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def AddOr(self):
+ request = XCallRequest("ZR\001\007",1,7)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def IsValid(self):
+ request = XCallRequest("ZR\001\010",1,8)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def Submit(self):
+ request = XCallRequest("ZR\001\011",1,9)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def Extend(self):
+ request = XCallRequest("ZR\001\012",1,10)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def Release(self):
+ request = XCallRequest("ZR\001\014",1,12)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def GetResults(
+ self,
+ from_,
+ count
+ ):
+ request = XCallRequest("ZR\001\013",1,11)
+ request.AddParm('O',0,self)
+ request.AddParm('u',1,from_)
+ request.AddParm('u',2,count)
+ response = self.transport.Xcall(request)
+ result = [module_id2classes[2](oid,self.transport) for oid in response.get(1,[])]
+ return result
+ def OnNewResult(
+ self,
+ contact,
+ rankValue
+ ): pass
+ event_handlers[1] = "OnNewResultDispatch"
+ def OnNewResultDispatch(self, parms):
+ cleanparms = (module_id2classes[2](parms.get(1),self.transport)),
+ cleanparms += (parms.get(2,0)),
+ self.OnNewResult(*cleanparms)
+module_id2classes[1] = ContactSearch
+
+class Participant(Object):
+ event_handlers = {}
+ propid2label = {}
+ def _Init(self, object_id, transport):
+ Object._Init(self, object_id, transport)
+ def __str__(self):
+ return "Participant %s" % (self.object_id, )
+ module_id = 19
+ def OnPropertyChange(self, property_name): pass
+ RANK= {1:'CREATOR', 'CREATOR':1, 2:'ADMIN', 'ADMIN':2, 3:'SPEAKER', 'SPEAKER':3, 4:'WRITER', 'WRITER':4, 5:'SPECTATOR', 'SPECTATOR':5, 6:'APPLICANT', 'APPLICANT':6, 7:'RETIRED', 'RETIRED':7, 8:'OUTLAW', 'OUTLAW':8}
+ TEXT_STATUS= {0:'TEXT_UNKNOWN', 'TEXT_UNKNOWN':0, 1:'TEXT_NA', 'TEXT_NA':1, 2:'READING', 'READING':2, 3:'WRITING', 'WRITING':3, 4:'WRITING_AS_ANGRY', 'WRITING_AS_ANGRY':4, 5:'WRITING_AS_CAT', 'WRITING_AS_CAT':5}
+ VOICE_STATUS= {
+ 0:'VOICE_UNKNOWN',
+ 1:'VOICE_NA',
+ 2:'VOICE_AVAILABLE',
+ 3:'VOICE_CONNECTING',
+ 4:'RINGING',
+ 5:'EARLY_MEDIA',
+ 6:'LISTENING',
+ 7:'SPEAKING',
+ 8:'VOICE_ON_HOLD',
+ 9:'VOICE_STOPPED',
+ 'VOICE_UNKNOWN' :0,
+ 'VOICE_NA' :1,
+ 'VOICE_AVAILABLE' :2,
+ 'VOICE_CONNECTING' :3,
+ 'RINGING' :4,
+ 'EARLY_MEDIA' :5,
+ 'LISTENING' :6,
+ 'SPEAKING' :7,
+ 'VOICE_ON_HOLD' :8,
+ 'VOICE_STOPPED' :9
+ }
+ VIDEO_STATUS= {0:'VIDEO_UNKNOWN', 'VIDEO_UNKNOWN':0, 1:'VIDEO_NA', 'VIDEO_NA':1, 2:'VIDEO_AVAILABLE', 'VIDEO_AVAILABLE':2, 3:'VIDEO_CONNECTING', 'VIDEO_CONNECTING':3, 4:'STREAMING', 'STREAMING':4, 5:'VIDEO_ON_HOLD', 'VIDEO_ON_HOLD':5}
+ DTMF= {
+ 0 :'DTMF_0',
+ 1 :'DTMF_1',
+ 2 :'DTMF_2',
+ 3 :'DTMF_3',
+ 4 :'DTMF_4',
+ 5 :'DTMF_5',
+ 6 :'DTMF_6',
+ 7 :'DTMF_7',
+ 8 :'DTMF_8',
+ 9 :'DTMF_9',
+ 10:'DTMF_STAR',
+ 11:'DTMF_POUND',
+ 'DTMF_0' : 0,
+ 'DTMF_1' : 1,
+ 'DTMF_2' : 2,
+ 'DTMF_3' : 3,
+ 'DTMF_4' : 4,
+ 'DTMF_5' : 5,
+ 'DTMF_6' : 6,
+ 'DTMF_7' : 7,
+ 'DTMF_8' : 8,
+ 'DTMF_9' : 9,
+ 'DTMF_STAR' :10,
+ 'DTMF_POUND' :11
+ }
+
+ def _Getconvo_id(self): #@IndentOk
+ return module_id2classes[18](self._Property("ZG\242\007]\023",930, True),self.transport)
+ convo_id = property(_Getconvo_id)
+ propid2label[930] = "convo_id"
+ def _Getidentity(self):
+ return self._Property("ZG\243\007]\023",931, True)
+ identity = property(_Getidentity)
+ propid2label[931] = "identity"
+ def _Getrank(self):
+ return Participant.RANK[self._Property("ZG\244\007]\023",932, True)]
+ rank = property(_Getrank)
+ propid2label[932] = "rank"
+ def _Getrequested_rank(self):
+ return Participant.RANK[self._Property("ZG\245\007]\023",933, True)]
+ requested_rank = property(_Getrequested_rank)
+ propid2label[933] = "requested_rank"
+ def _Gettext_status(self):
+ return Participant.TEXT_STATUS[self._Property("ZG\246\007]\023",934, True)]
+ text_status = property(_Gettext_status)
+ propid2label[934] = "text_status"
+ def _Getvoice_status(self):
+ return Participant.VOICE_STATUS[self._Property("ZG\247\007]\023",935, True)]
+ voice_status = property(_Getvoice_status)
+ propid2label[935] = "voice_status"
+ def _Getvideo_status(self):
+ return Participant.VIDEO_STATUS[self._Property("ZG\250\007]\023",936, True)]
+ video_status = property(_Getvideo_status)
+ propid2label[936] = "video_status"
+ def _Getlive_identity(self):
+ return self._Property("ZG\257\007]\023",943, False)
+ live_identity = property(_Getlive_identity)
+ propid2label[943] = "live_identity"
+ def _Getlive_price_for_me(self):
+ return self._Property("ZG\252\007]\023",938, True)
+ live_price_for_me = property(_Getlive_price_for_me)
+ propid2label[938] = "live_price_for_me"
+ def _Getlive_fwd_identities(self):
+ return self._Property("ZG\264\007]\023",948, True)
+ live_fwd_identities = property(_Getlive_fwd_identities)
+ propid2label[948] = "live_fwd_identities"
+ def _Getlive_start_timestamp(self):
+ return self._Property("ZG\253\007]\023",939, True)
+ live_start_timestamp = property(_Getlive_start_timestamp)
+ propid2label[939] = "live_start_timestamp"
+ def _Getsound_level(self):
+ return self._Property("ZG\255\007]\023",941, True)
+ sound_level = property(_Getsound_level)
+ propid2label[941] = "sound_level"
+ def _Getdebuginfo(self):
+ return self._Property("ZG\256\007]\023",942, False)
+ debuginfo = property(_Getdebuginfo)
+ propid2label[942] = "debuginfo"
+ def _Getlast_voice_error(self):
+ return self._Property("ZG\263\007]\023",947, True)
+ last_voice_error = property(_Getlast_voice_error)
+ propid2label[947] = "last_voice_error"
+ def _Getquality_problems(self):
+ return self._Property("ZG\265\007]\023",949, True)
+ quality_problems = property(_Getquality_problems)
+ propid2label[949] = "quality_problems"
+ def _Getlive_type(self):
+ return SkyLib.IDENTITYTYPE[self._Property("ZG\266\007]\023",950, True)]
+ live_type = property(_Getlive_type)
+ propid2label[950] = "live_type"
+ def _Getlive_country(self):
+ return self._Property("ZG\267\007]\023",951, False)
+ live_country = property(_Getlive_country)
+ propid2label[951] = "live_country"
+ def _Gettransferred_by(self):
+ return self._Property("ZG\270\007]\023",952, True)
+ transferred_by = property(_Gettransferred_by)
+ propid2label[952] = "transferred_by"
+ def _Gettransferred_to(self):
+ return self._Property("ZG\271\007]\023",953, True)
+ transferred_to = property(_Gettransferred_to)
+ propid2label[953] = "transferred_to"
+ def _Getadder(self):
+ return self._Property("ZG\272\007]\023",954, True)
+ adder = property(_Getadder)
+ propid2label[954] = "adder"
+
+ def CanSetRankTo(
+ self,
+ rank
+ ):
+ request = XCallRequest("ZR\023\001",19,1)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,Participant.RANK[rank])
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def SetRankTo(
+ self,
+ rank
+ ):
+ request = XCallRequest("ZR\023\002",19,2)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,Participant.RANK[rank])
+ response = self.transport.Xcall(request)
+ def Ring(
+ self,
+ identityToUse,
+ videoCall,
+ nrofRedials,
+ redialPeriod,
+ autoStartVM,
+ origin
+ ):
+ request = XCallRequest("ZR\023\003",19,3)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,identityToUse)
+ request.AddParm('b',2,videoCall)
+ request.AddParm('u',3,nrofRedials)
+ request.AddParm('u',4,redialPeriod)
+ request.AddParm('b',5,autoStartVM)
+ request.AddParm('S',6,origin)
+ response = self.transport.Xcall(request)
+ def GetVideo(self):
+ request = XCallRequest("ZR\023\004",19,4)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[11](response.get(1),self.transport)
+ return result
+ def Hangup(self):
+ request = XCallRequest("ZR\023\005",19,5)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def Retire(self):
+ request = XCallRequest("ZR\023\006",19,6)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def OnIncomingDTMF(
+ self,
+ dtmf
+ ): pass
+ event_handlers[1] = "OnIncomingDTMFDispatch"
+ def OnIncomingDTMFDispatch(self, parms):
+ cleanparms = Participant.DTMF[parms.get(1)]
+ self.OnIncomingDTMF(cleanparms)
+module_id2classes[19] = Participant
+
+class Conversation(Object):
+ event_handlers = {}
+ propid2label = {}
+ def _Init(self, object_id, transport):
+ Object._Init(self, object_id, transport)
+ def __str__(self):
+ return "Conversation %s" % (self.object_id, )
+ module_id = 18
+ def OnPropertyChange(self, property_name): pass
+ TYPE= {1:'DIALOG', 'DIALOG':1, 2:'CONFERENCE', 'CONFERENCE':2, 3:'TERMINATED_CONFERENCE', 'TERMINATED_CONFERENCE':3, 4:'LEGACY_VOICE_CONFERENCE', 'LEGACY_VOICE_CONFERENCE':4, 5:'LEGACY_SHAREDGROUP', 'LEGACY_SHAREDGROUP':5}
+ MY_STATUS= {
+ 1 :'CONNECTING',
+ 2 :'RETRY_CONNECTING',
+ 3 :'DOWNLOADING_MESSAGES',
+ 4 :'QUEUED_TO_ENTER',
+ 5 :'APPLICANT',
+ 6 :'APPLICATION_DENIED',
+ 7 :'INVALID_ACCESS_TOKEN',
+ 8 :'CONSUMER',
+ 9 :'RETIRED_FORCEFULLY',
+ 10:'RETIRED_VOLUNTARILY',
+ 'CONNECTING' : 1,
+ 'RETRY_CONNECTING' : 2,
+ 'DOWNLOADING_MESSAGES' : 3,
+ 'QUEUED_TO_ENTER' : 4,
+ 'APPLICANT' : 5,
+ 'APPLICATION_DENIED' : 6,
+ 'INVALID_ACCESS_TOKEN' : 7,
+ 'CONSUMER' : 8,
+ 'RETIRED_FORCEFULLY' : 9,
+ 'RETIRED_VOLUNTARILY' :10
+ }
+ LOCAL_LIVESTATUS= {
+ 0 :'NONE',
+ 1 :'STARTING',
+ 2 :'RINGING_FOR_ME',
+ 3 :'IM_LIVE',
+ 5 :'ON_HOLD_LOCALLY',
+ 6 :'ON_HOLD_REMOTELY',
+ 7 :'OTHERS_ARE_LIVE',
+ 11:'OTHERS_ARE_LIVE_FULL',
+ 8 :'PLAYING_VOICE_MESSAGE',
+ 9 :'RECORDING_VOICE_MESSAGE',
+ 10:'RECENTLY_LIVE',
+ 12:'TRANSFERRING',
+ 'NONE' : 0,
+ 'STARTING' : 1,
+ 'RINGING_FOR_ME' : 2,
+ 'IM_LIVE' : 3,
+ 'ON_HOLD_LOCALLY' : 5,
+ 'ON_HOLD_REMOTELY' : 6,
+ 'OTHERS_ARE_LIVE' : 7,
+ 'OTHERS_ARE_LIVE_FULL' :11,
+ 'PLAYING_VOICE_MESSAGE' : 8,
+ 'RECORDING_VOICE_MESSAGE' : 9,
+ 'RECENTLY_LIVE' :10,
+ 'TRANSFERRING' :12
+ }
+ ALLOWED_ACTIVITY= {1:'SET_META', 'SET_META':1, 2:'ADD_CONSUMERS', 'ADD_CONSUMERS':2, 4:'SPEAK', 'SPEAK':4, 8:'SPEAK_AND_WRITE', 'SPEAK_AND_WRITE':8}
+ PARTICIPANTFILTER= {0:'ALL', 'ALL':0, 1:'CONSUMERS', 'CONSUMERS':1, 2:'APPLICANTS', 'APPLICANTS':2, 3:'CONSUMERS_AND_APPLICANTS', 'CONSUMERS_AND_APPLICANTS':3, 4:'MYSELF', 'MYSELF':4, 5:'OTHER_CONSUMERS', 'OTHER_CONSUMERS':5}
+ LIST_TYPE= {0:'ALL_CONVERSATIONS', 'ALL_CONVERSATIONS':0, 1:'INBOX_CONVERSATIONS', 'INBOX_CONVERSATIONS':1, 2:'BOOKMARKED_CONVERSATIONS', 'BOOKMARKED_CONVERSATIONS':2, 3:'LIVE_CONVERSATIONS', 'LIVE_CONVERSATIONS':3}
+
+ def _Getidentity(self):
+ return self._Property("ZG\314\007]\022",972, True)
+ identity = property(_Getidentity)
+ propid2label[972] = "identity"
+ def _Gettype(self):
+ return Conversation.TYPE[self._Property("ZG\206\007]\022",902, True)]
+ type = property(_Gettype)
+ propid2label[902] = "type"
+ def _Getlive_host(self):
+ return self._Property("ZG\226\007]\022",918, True)
+ live_host = property(_Getlive_host)
+ propid2label[918] = "live_host"
+ def _Getlive_start_timestamp(self):
+ return self._Property("ZG\316\007]\022",974, True)
+ live_start_timestamp = property(_Getlive_start_timestamp)
+ propid2label[974] = "live_start_timestamp"
+ def _Getlive_is_muted(self):
+ return self._Property("ZG\344\007]\022",996, True)
+ live_is_muted = property(_Getlive_is_muted)
+ propid2label[996] = "live_is_muted"
+ def _Getalert_string(self):
+ return self._Property("ZG\230\007]\022",920, True)
+ alert_string = property(_Getalert_string)
+ propid2label[920] = "alert_string"
+ def _Getis_bookmarked(self):
+ return self._Property("ZG\231\007]\022",921, True)
+ is_bookmarked = property(_Getis_bookmarked)
+ propid2label[921] = "is_bookmarked"
+ def _Getgiven_displayname(self):
+ return self._Property("ZG\235\007]\022",925, True)
+ given_displayname = property(_Getgiven_displayname)
+ propid2label[925] = "given_displayname"
+ def _Getdisplayname(self):
+ return self._Property("ZG\234\007]\022",924, True)
+ displayname = property(_Getdisplayname)
+ propid2label[924] = "displayname"
+ def _Getlocal_livestatus(self):
+ return Conversation.LOCAL_LIVESTATUS[self._Property("ZG\237\007]\022",927, True)]
+ local_livestatus = property(_Getlocal_livestatus)
+ propid2label[927] = "local_livestatus"
+ def _Getinbox_timestamp(self):
+ return self._Property("ZG\240\007]\022",928, True)
+ inbox_timestamp = property(_Getinbox_timestamp)
+ propid2label[928] = "inbox_timestamp"
+ def _Getinbox_message_id(self):
+ return module_id2classes[9](self._Property("ZG\315\007]\022",973, True),self.transport)
+ inbox_message_id = property(_Getinbox_message_id)
+ propid2label[973] = "inbox_message_id"
+ def _Getunconsumed_suppressed_messages(self):
+ return self._Property("ZG\317\007]\022",975, True)
+ unconsumed_suppressed_messages = property(_Getunconsumed_suppressed_messages)
+ propid2label[975] = "unconsumed_suppressed_messages"
+ def _Getunconsumed_normal_messages(self):
+ return self._Property("ZG\320\007]\022",976, True)
+ unconsumed_normal_messages = property(_Getunconsumed_normal_messages)
+ propid2label[976] = "unconsumed_normal_messages"
+ def _Getunconsumed_elevated_messages(self):
+ return self._Property("ZG\321\007]\022",977, True)
+ unconsumed_elevated_messages = property(_Getunconsumed_elevated_messages)
+ propid2label[977] = "unconsumed_elevated_messages"
+ def _Getunconsumed_messages_voice(self):
+ return self._Property("ZG\312\007]\022",970, True)
+ unconsumed_messages_voice = property(_Getunconsumed_messages_voice)
+ propid2label[970] = "unconsumed_messages_voice"
+ def _Getactive_vm_id(self):
+ return module_id2classes[7](self._Property("ZG\313\007]\022",971, True),self.transport)
+ active_vm_id = property(_Getactive_vm_id)
+ propid2label[971] = "active_vm_id"
+ def _Getconsumption_horizon(self):
+ return self._Property("ZG\323\007]\022",979, True)
+ consumption_horizon = property(_Getconsumption_horizon)
+ propid2label[979] = "consumption_horizon"
+ def _Getlast_activity_timestamp(self):
+ return self._Property("ZG\325\007]\022",981, True)
+ last_activity_timestamp = property(_Getlast_activity_timestamp)
+ propid2label[981] = "last_activity_timestamp"
+ def _Getspawned_from_convo_id(self):
+ return module_id2classes[18](self._Property("ZG\223\007]\022",915, True),self.transport)
+ spawned_from_convo_id = property(_Getspawned_from_convo_id)
+ propid2label[915] = "spawned_from_convo_id"
+ def _Getcreator(self):
+ return self._Property("ZG\207\007]\022",903, True)
+ creator = property(_Getcreator)
+ propid2label[903] = "creator"
+ def _Getcreation_timestamp(self):
+ return self._Property("ZG\210\007]\022",904, True)
+ creation_timestamp = property(_Getcreation_timestamp)
+ propid2label[904] = "creation_timestamp"
+ def _Getmy_status(self):
+ return Conversation.MY_STATUS[self._Property("ZG\227\007]\022",919, True)]
+ my_status = property(_Getmy_status)
+ propid2label[919] = "my_status"
+ def _Getopt_joining_enabled(self):
+ return self._Property("ZG\232\007]\022",922, True)
+ opt_joining_enabled = property(_Getopt_joining_enabled)
+ propid2label[922] = "opt_joining_enabled"
+ def _Getopt_entry_level_rank(self):
+ return Participant.RANK[self._Property("ZG\212\007]\022",906, True)]
+ opt_entry_level_rank = property(_Getopt_entry_level_rank)
+ propid2label[906] = "opt_entry_level_rank"
+ def _Getopt_disclose_history(self):
+ return self._Property("ZG\213\007]\022",907, True)
+ opt_disclose_history = property(_Getopt_disclose_history)
+ propid2label[907] = "opt_disclose_history"
+ def _Getopt_admin_only_activities(self):
+ return self._Property("ZG\215\007]\022",909, True)
+ opt_admin_only_activities = property(_Getopt_admin_only_activities)
+ propid2label[909] = "opt_admin_only_activities"
+ def _Getpasswordhint(self):
+ return self._Property("ZG\324\007]\022",980, True)
+ passwordhint = property(_Getpasswordhint)
+ propid2label[980] = "passwordhint"
+ def _Getmeta_name(self):
+ return self._Property("ZG\216\007]\022",910, True)
+ meta_name = property(_Getmeta_name)
+ propid2label[910] = "meta_name"
+ def _Getmeta_topic(self):
+ return self._Property("ZG\217\007]\022",911, True)
+ meta_topic = property(_Getmeta_topic)
+ propid2label[911] = "meta_topic"
+ def _Getmeta_guidelines(self):
+ return self._Property("ZG\221\007]\022",913, True)
+ meta_guidelines = property(_Getmeta_guidelines)
+ propid2label[913] = "meta_guidelines"
+ def _Getmeta_picture(self):
+ return self._Property("ZG\222\007]\022",914, True)
+ meta_picture = property(_Getmeta_picture)
+ propid2label[914] = "meta_picture"
+
+ SETUPKEY_ENABLE_BIRTHDAY_NOTIFICATION="Lib/Conversation/EnableBirthday"
+ SETUPKEY_INBOX_UPDATE_TIMEOUT="Lib/Conversation/InboxUpdateTimeout"
+ SETUPKEY_RECENTLY_LIVE_TIMEOUT="Lib/Conversation/RecentlyLiveTimeout"
+ SETUPKEY_DISABLE_CHAT="*Lib/Chat/DisableChat"
+ SETUPKEY_DISABLE_CHAT_HISTORY="Lib/Message/DisableHistory"
+ SETUPKEY_CHAT_HISTORY_DAYS="Lib/Chat/HistoryDays"
+ SETUPKEY_DISABLE_CHAT_ACTIVITY_INDICATION="Lib/Chat/DisableActivityIndication"
+ SETUPKEY_CALL_NOANSWER_TIMEOUT="Lib/Call/NoAnswerTimeout"
+ SETUPKEY_CALL_SEND_TO_VM="Lib/Call/SendToVM"
+ SETUPKEY_CALL_APPLY_CF="Lib/Call/ApplyCF"
+ SETUPKEY_CALL_EMERGENCY_COUNTRY="Lib/Call/EmergencyCountry"
+ def SetOption(
+ self,
+ propKey,
+ value
+ ):
+ request = XCallRequest("ZR\022\001",18,1)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,self._propkey(propKey,1))
+ request.AddParm('u',2,value)
+ response = self.transport.Xcall(request)
+ def SetTopic(
+ self,
+ topic,
+ isXML
+ ):
+ request = XCallRequest("ZR\022\002",18,2)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,topic)
+ request.AddParm('b',2,isXML)
+ response = self.transport.Xcall(request)
+ def SetGuidelines(
+ self,
+ guidelines,
+ isXML
+ ):
+ request = XCallRequest("ZR\022\003",18,3)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,guidelines)
+ request.AddParm('b',2,isXML)
+ response = self.transport.Xcall(request)
+ def SetPicture(
+ self,
+ jpeg
+ ):
+ request = XCallRequest("ZR\022\004",18,4)
+ request.AddParm('O',0,self)
+ request.AddParm('B',1,jpeg)
+ response = self.transport.Xcall(request)
+ def SpawnConference(
+ self,
+ identitiesToAdd
+ ):
+ request = XCallRequest("ZR\022\006",18,6)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,identitiesToAdd)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[18](response.get(1),self.transport)
+ return result
+ def AddConsumers(
+ self,
+ identities
+ ):
+ request = XCallRequest("ZR\022\007",18,7)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,identities)
+ response = self.transport.Xcall(request)
+ def Assimilate(
+ self,
+ otherConversation
+ ):
+ request = XCallRequest("ZR\022\011",18,9)
+ request.AddParm('O',0,self)
+ request.AddParm('O',1,otherConversation)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[18](response.get(1),self.transport)
+ return result
+ def JoinLiveSession(
+ self,
+ accessToken
+ ):
+ request = XCallRequest("ZR\022\012",18,10)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,accessToken)
+ response = self.transport.Xcall(request)
+ def MuteMyMicrophone(self):
+ request = XCallRequest("ZR\022\013",18,11)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def UnmuteMyMicrophone(self):
+ request = XCallRequest("ZR\022\014",18,12)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def HoldMyLiveSession(self):
+ request = XCallRequest("ZR\022\015",18,13)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def ResumeMyLiveSession(self):
+ request = XCallRequest("ZR\022\016",18,14)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def LeaveLiveSession(
+ self,
+ postVoiceAutoresponse
+ ):
+ request = XCallRequest("ZR\022\017",18,15)
+ request.AddParm('O',0,self)
+ request.AddParm('b',1,postVoiceAutoresponse)
+ response = self.transport.Xcall(request)
+ def StartVoiceMessage(self):
+ request = XCallRequest("ZR\022-",18,45)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def TransferLiveSession(
+ self,
+ identities,
+ transferTopic
+ ):
+ request = XCallRequest("ZR\022(",18,40)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,identities)
+ request.AddParm('S',2,transferTopic)
+ response = self.transport.Xcall(request)
+ def CanTransferLiveSession(
+ self,
+ identity
+ ):
+ request = XCallRequest("ZR\022.",18,46)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,identity)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def SendDTMF(
+ self,
+ dtmf,
+ lengthInMS
+ ):
+ request = XCallRequest("ZR\022\020",18,16)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,Participant.DTMF[dtmf])
+ request.AddParm('u',2,lengthInMS)
+ response = self.transport.Xcall(request)
+ def StopSendDTMF(self):
+ request = XCallRequest("ZR\022\060",18,48)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def SetMyTextStatusTo(
+ self,
+ status
+ ):
+ request = XCallRequest("ZR\022\022",18,18)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,Participant.TEXT_STATUS[status])
+ response = self.transport.Xcall(request)
+ def PostText(
+ self,
+ text,
+ isXML
+ ):
+ request = XCallRequest("ZR\022\023",18,19)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,text)
+ request.AddParm('b',2,isXML)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[9](response.get(1),self.transport)
+ return result
+ def PostContacts(
+ self,
+ contacts
+ ):
+ request = XCallRequest("ZR\022\024",18,20)
+ request.AddParm('O',0,self)
+ request.AddParm('O',1,contacts)
+ response = self.transport.Xcall(request)
+ def PostFiles(
+ self,
+ paths,
+ body
+ ):
+ request = XCallRequest("ZR\022\025",18,21)
+ request.AddParm('O',0,self)
+ request.AddParm('f',1,paths)
+ request.AddParm('S',2,body)
+ response = self.transport.Xcall(request)
+ result = (SkyLib.TRANSFER_SENDFILE_ERROR[response.get(1)]),
+ result += (response.get(2,'')),
+ return result
+ def PostVoiceMessage(
+ self,
+ voicemail,
+ body
+ ):
+ request = XCallRequest("ZR\022\026",18,22)
+ request.AddParm('O',0,self)
+ request.AddParm('O',1,voicemail)
+ request.AddParm('S',2,body)
+ response = self.transport.Xcall(request)
+ def PostSMS(
+ self,
+ sms,
+ body
+ ):
+ request = XCallRequest("ZR\022\027",18,23)
+ request.AddParm('O',0,self)
+ request.AddParm('O',1,sms)
+ request.AddParm('S',2,body)
+ response = self.transport.Xcall(request)
+ def GetJoinBlob(self):
+ request = XCallRequest("ZR\022\030",18,24)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = response.get(1,'')
+ return result
+ def Join(self):
+ request = XCallRequest("ZR\022\031",18,25)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def EnterPassword(
+ self,
+ password
+ ):
+ request = XCallRequest("ZR\022\032",18,26)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,password)
+ response = self.transport.Xcall(request)
+ def SetPassword(
+ self,
+ password,
+ hint
+ ):
+ request = XCallRequest("ZR\022\033",18,27)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,password)
+ request.AddParm('S',2,hint)
+ response = self.transport.Xcall(request)
+ def RetireFrom(self):
+ request = XCallRequest("ZR\022\034",18,28)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def Delete(self):
+ request = XCallRequest("ZR\022/",18,47)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def RenameTo(
+ self,
+ name
+ ):
+ request = XCallRequest("ZR\022\035",18,29)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,name)
+ response = self.transport.Xcall(request)
+ def SetBookmark(
+ self,
+ bookmark
+ ):
+ request = XCallRequest("ZR\022\036",18,30)
+ request.AddParm('O',0,self)
+ request.AddParm('b',1,bookmark)
+ response = self.transport.Xcall(request)
+ def SetAlertString(
+ self,
+ alertString
+ ):
+ request = XCallRequest("ZR\022\037",18,31)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,alertString)
+ response = self.transport.Xcall(request)
+ def RemoveFromInbox(self):
+ request = XCallRequest("ZR\022 ",18,32)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def AddToInbox(self):
+ request = XCallRequest("ZR\022!",18,33)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def SetConsumedHorizon(
+ self,
+ timestamp,
+ also_unconsume
+ ):
+ request = XCallRequest("ZR\022\042",18,34)
+ request.AddParm('O',0,self)
+ request.AddParm('u',1,timestamp)
+ request.AddParm('b',2,also_unconsume)
+ response = self.transport.Xcall(request)
+ def MarkUnread(self):
+ request = XCallRequest("ZR\022#",18,35)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def IsMemberOf(
+ self,
+ group
+ ):
+ request = XCallRequest("ZR\022%",18,37)
+ request.AddParm('O',0,self)
+ request.AddParm('O',1,group)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def GetParticipants(
+ self,
+ filter
+ ):
+ request = XCallRequest("ZR\022&",18,38)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,Conversation.PARTICIPANTFILTER[filter])
+ response = self.transport.Xcall(request)
+ result = [module_id2classes[19](oid,self.transport) for oid in response.get(1,[])]
+ return result
+ def GetLastMessages(
+ self,
+ requireTimestamp
+ ):
+ request = XCallRequest("ZR\022'",18,39)
+ request.AddParm('O',0,self)
+ request.AddParm('u',1,requireTimestamp)
+ response = self.transport.Xcall(request)
+ result = ([module_id2classes[9](oid,self.transport) for oid in response.get(1,[])]),
+ result += ([module_id2classes[9](oid,self.transport) for oid in response.get(2,[])]),
+ return result
+ def FindMessage(
+ self,
+ text,
+ fromTimestampUp
+ ):
+ request = XCallRequest("ZR\022)",18,41)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,text)
+ request.AddParm('u',2,fromTimestampUp)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[9](response.get(1),self.transport)
+ return result
+ def OnParticipantListChange(self): pass
+ def OnParticipantListChangeDispatch(self, parms): self.OnParticipantListChange()
+ event_handlers[1] = "OnParticipantListChangeDispatch"
+ def OnMessage(
+ self,
+ message
+ ): pass
+ event_handlers[2] = "OnMessageDispatch"
+ def OnMessageDispatch(self, parms):
+ cleanparms = module_id2classes[9](parms.get(1),self.transport)
+ self.OnMessage(cleanparms)
+ def OnSpawnConference(
+ self,
+ spawned
+ ): pass
+ event_handlers[3] = "OnSpawnConferenceDispatch"
+ def OnSpawnConferenceDispatch(self, parms):
+ cleanparms = module_id2classes[18](parms.get(1),self.transport)
+ self.OnSpawnConference(cleanparms)
+module_id2classes[18] = Conversation
+
+class Message(Object):
+ event_handlers = {}
+ propid2label = {}
+ def _Init(self, object_id, transport):
+ Object._Init(self, object_id, transport)
+ def __str__(self):
+ return "Message %s" % (self.object_id, )
+ module_id = 9
+ def OnPropertyChange(self, property_name): pass
+ TYPE= {
+ 2 :'SET_METADATA',
+ 4 :'SPAWNED_CONFERENCE',
+ 10 :'ADDED_CONSUMERS',
+ 11 :'ADDED_APPLICANTS',
+ 12 :'RETIRED_OTHERS',
+ 13 :'RETIRED',
+ 21 :'SET_RANK',
+ 30 :'STARTED_LIVESESSION',
+ 39 :'ENDED_LIVESESSION',
+ 50 :'REQUESTED_AUTH',
+ 51 :'GRANTED_AUTH',
+ 53 :'BLOCKED',
+ 61 :'POSTED_TEXT',
+ 60 :'POSTED_EMOTE',
+ 63 :'POSTED_CONTACTS',
+ 64 :'POSTED_SMS',
+ 65 :'POSTED_ALERT',
+ 67 :'POSTED_VOICE_MESSAGE',
+ 68 :'POSTED_FILES',
+ 69 :'POSTED_INVOICE',
+ 110:'HAS_BIRTHDAY',
+ 'SET_METADATA' : 2,
+ 'SPAWNED_CONFERENCE' : 4,
+ 'ADDED_CONSUMERS' : 10,
+ 'ADDED_APPLICANTS' : 11,
+ 'RETIRED_OTHERS' : 12,
+ 'RETIRED' : 13,
+ 'SET_RANK' : 21,
+ 'STARTED_LIVESESSION' : 30,
+ 'ENDED_LIVESESSION' : 39,
+ 'REQUESTED_AUTH' : 50,
+ 'GRANTED_AUTH' : 51,
+ 'BLOCKED' : 53,
+ 'POSTED_TEXT' : 61,
+ 'POSTED_EMOTE' : 60,
+ 'POSTED_CONTACTS' : 63,
+ 'POSTED_SMS' : 64,
+ 'POSTED_ALERT' : 65,
+ 'POSTED_VOICE_MESSAGE' : 67,
+ 'POSTED_FILES' : 68,
+ 'POSTED_INVOICE' : 69,
+ 'HAS_BIRTHDAY' :110
+ }
+ SENDING_STATUS= {1:'SENDING', 'SENDING':1, 2:'SENT', 'SENT':2, 3:'FAILED_TO_SEND', 'FAILED_TO_SEND':3}
+ CONSUMPTION_STATUS= {0:'CONSUMED', 'CONSUMED':0, 1:'UNCONSUMED_SUPPRESSED', 'UNCONSUMED_SUPPRESSED':1, 2:'UNCONSUMED_NORMAL', 'UNCONSUMED_NORMAL':2, 3:'UNCONSUMED_ELEVATED', 'UNCONSUMED_ELEVATED':3}
+ SET_METADATA_KEY= {3640:'SET_META_NAME', 'SET_META_NAME':3640, 3644:'SET_META_TOPIC', 'SET_META_TOPIC':3644, 3652:'SET_META_GUIDELINES', 'SET_META_GUIDELINES':3652, 3658:'SET_META_PICTURE', 'SET_META_PICTURE':3658}
+ SET_OPTION_KEY= {3689:'SET_OPTION_JOINING_ENABLED', 'SET_OPTION_JOINING_ENABLED':3689, 3625:'SET_OPTION_ENTRY_LEVEL_RANK', 'SET_OPTION_ENTRY_LEVEL_RANK':3625, 3629:'SET_OPTION_DISCLOSE_HISTORY', 'SET_OPTION_DISCLOSE_HISTORY':3629, 3633:'SET_OPTION_HISTORY_LIMIT_IN_DAYS', 'SET_OPTION_HISTORY_LIMIT_IN_DAYS':3633, 3637:'SET_OPTION_ADMIN_ONLY_ACTIVITIES', 'SET_OPTION_ADMIN_ONLY_ACTIVITIES':3637}
+ LEAVEREASON= {2:'USER_INCAPABLE', 'USER_INCAPABLE':2, 3:'ADDER_MUST_BE_FRIEND', 'ADDER_MUST_BE_FRIEND':3, 4:'ADDER_MUST_BE_AUTHORIZED', 'ADDER_MUST_BE_AUTHORIZED':4, 5:'DECLINE_ADD', 'DECLINE_ADD':5, 6:'UNSUBSCRIBE', 'UNSUBSCRIBE':6}
+
+ def _Getconvo_id(self):
+ return module_id2classes[18](self._Property("ZG\300\007]\011",960, True),self.transport)
+ convo_id = property(_Getconvo_id)
+ propid2label[960] = "convo_id"
+ def _Getconvo_guid(self):
+ return self._Property("ZGx]\011",120, True)
+ convo_guid = property(_Getconvo_guid)
+ propid2label[120] = "convo_guid"
+ def _Getauthor(self):
+ return self._Property("ZGz]\011",122, True)
+ author = property(_Getauthor)
+ propid2label[122] = "author"
+ def _Getauthor_displayname(self):
+ return self._Property("ZG{]\011",123, True)
+ author_displayname = property(_Getauthor_displayname)
+ propid2label[123] = "author_displayname"
+ def _Getguid(self):
+ return self._Property("ZG\230\006]\011",792, True)
+ guid = property(_Getguid)
+ propid2label[792] = "guid"
+ def _Getoriginally_meant_for(self):
+ return self._Property("ZG\226\006]\011",790, True)
+ originally_meant_for = property(_Getoriginally_meant_for)
+ propid2label[790] = "originally_meant_for"
+ def _Gettimestamp(self):
+ return self._Property("ZGy]\011",121, True)
+ timestamp = property(_Gettimestamp)
+ propid2label[121] = "timestamp"
+ def _Gettype(self):
+ return Message.TYPE[self._Property("ZG\301\007]\011",961, True)]
+ type = property(_Gettype)
+ propid2label[961] = "type"
+ def _Getsending_status(self):
+ return Message.SENDING_STATUS[self._Property("ZG\302\007]\011",962, True)]
+ sending_status = property(_Getsending_status)
+ propid2label[962] = "sending_status"
+ def _Getconsumption_status(self):
+ return Message.CONSUMPTION_STATUS[self._Property("ZG\310\007]\011",968, True)]
+ consumption_status = property(_Getconsumption_status)
+ propid2label[968] = "consumption_status"
+ def _Getedited_by(self):
+ return self._Property("ZG\336\001]\011",222, True)
+ edited_by = property(_Getedited_by)
+ propid2label[222] = "edited_by"
+ def _Getedit_timestamp(self):
+ return self._Property("ZG\337\001]\011",223, True)
+ edit_timestamp = property(_Getedit_timestamp)
+ propid2label[223] = "edit_timestamp"
+ def _Getparam_key(self):
+ return self._Property("ZG\303\007]\011",963, True)
+ param_key = property(_Getparam_key)
+ propid2label[963] = "param_key"
+ def _Getparam_value(self):
+ return self._Property("ZG\304\007]\011",964, True)
+ param_value = property(_Getparam_value)
+ propid2label[964] = "param_value"
+ def _Getbody_xml(self):
+ return self._Property("ZG\177]\011",127, True)
+ body_xml = property(_Getbody_xml)
+ propid2label[127] = "body_xml"
+ def _Getidentities(self):
+ return self._Property("ZG}]\011",125, True)
+ identities = property(_Getidentities)
+ propid2label[125] = "identities"
+ def _Getreason(self):
+ return self._Property("ZG\306\007]\011",966, True)
+ reason = property(_Getreason)
+ propid2label[966] = "reason"
+ def _Getleavereason(self):
+ return Message.LEAVEREASON[self._Property("ZG~]\011",126, True)]
+ leavereason = property(_Getleavereason)
+ propid2label[126] = "leavereason"
+ def _Getparticipant_count(self):
+ return self._Property("ZG\326\007]\011",982, True)
+ participant_count = property(_Getparticipant_count)
+ propid2label[982] = "participant_count"
+
+ def CanEdit(self):
+ request = XCallRequest("ZR\011\001",9,1)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def Edit(
+ self,
+ newText,
+ isXML
+ ):
+ request = XCallRequest("ZR\011\002",9,2)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,newText)
+ request.AddParm('b',2,isXML)
+ response = self.transport.Xcall(request)
+ def GetContacts(self):
+ request = XCallRequest("ZR\011\003",9,3)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = [module_id2classes[2](oid,self.transport) for oid in response.get(1,[])]
+ return result
+ def GetTransfers(self):
+ request = XCallRequest("ZR\011\004",9,4)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = [module_id2classes[6](oid,self.transport) for oid in response.get(1,[])]
+ return result
+ def GetVoiceMessage(self):
+ request = XCallRequest("ZR\011\005",9,5)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[7](response.get(1),self.transport)
+ return result
+ def GetSMS(self):
+ request = XCallRequest("ZR\011\006",9,6)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[12](response.get(1),self.transport)
+ return result
+ def DeleteLocally(self):
+ request = XCallRequest("ZR\011\010",9,8)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+module_id2classes[9] = Message
+
+class Video(Object):
+ event_handlers = {}
+ propid2label = {}
+ def _Init(self, object_id, transport):
+ Object._Init(self, object_id, transport)
+ def __str__(self):
+ return "Video %s" % (self.object_id, )
+ module_id = 11
+ def OnPropertyChange(self, property_name): pass
+ STATUS= {
+ 0 :'NOT_AVAILABLE',
+ 1 :'AVAILABLE',
+ 2 :'STARTING',
+ 3 :'REJECTED',
+ 4 :'RUNNING',
+ 5 :'STOPPING',
+ 6 :'PAUSED',
+ 7 :'NOT_STARTED',
+ 8 :'HINT_IS_VIDEOCALL_RECEIVED',
+ 9 :'UNKNOWN',
+ 10:'RENDERING',
+ 'NOT_AVAILABLE' : 0,
+ 'AVAILABLE' : 1,
+ 'STARTING' : 2,
+ 'REJECTED' : 3,
+ 'RUNNING' : 4,
+ 'STOPPING' : 5,
+ 'PAUSED' : 6,
+ 'NOT_STARTED' : 7,
+ 'HINT_IS_VIDEOCALL_RECEIVED' : 8,
+ 'UNKNOWN' : 9,
+ 'RENDERING' :10
+ }
+ MEDIATYPE= {1:'MEDIA_SCREENSHARING', 'MEDIA_SCREENSHARING':1, 0:'MEDIA_VIDEO', 'MEDIA_VIDEO':0}
+ VIDEO_DEVICE_CAPABILITY= {0:'VIDEOCAP_HQ_CAPABLE', 'VIDEOCAP_HQ_CAPABLE':0, 1:'VIDEOCAP_HQ_CERTIFIED', 'VIDEOCAP_HQ_CERTIFIED':1, 2:'VIDEOCAP_REQ_DRIVERUPDATE', 'VIDEOCAP_REQ_DRIVERUPDATE':2, 3:'VIDEOCAP_USB_HIGHSPEED', 'VIDEOCAP_USB_HIGHSPEED':3}
+
+ def _Getstatus(self):
+ return Video.STATUS[self._Property("ZG\202\001]\013",130, True)]
+ status = property(_Getstatus)
+ propid2label[130] = "status"
+ def _Geterror(self):
+ return self._Property("ZG\203\001]\013",131, True)
+ error = property(_Geterror)
+ propid2label[131] = "error"
+ def _Getdebuginfo(self):
+ return self._Property("ZG\204\001]\013",132, True)
+ debuginfo = property(_Getdebuginfo)
+ propid2label[132] = "debuginfo"
+ def _Getdimensions(self):
+ return self._Property("ZG\205\001]\013",133, True)
+ dimensions = property(_Getdimensions)
+ propid2label[133] = "dimensions"
+ def _Getmedia_type(self):
+ return Video.MEDIATYPE[self._Property("ZG\206\001]\013",134, True)]
+ media_type = property(_Getmedia_type)
+ propid2label[134] = "media_type"
+ def _Getconvo_id(self):
+ return self._Property("ZG\320\010]\013",1104, True)
+ convo_id = property(_Getconvo_id)
+ propid2label[1104] = "convo_id"
+ def _Getdevice_path(self):
+ return self._Property("ZG\321\010]\013",1105, True)
+ device_path = property(_Getdevice_path)
+ propid2label[1105] = "device_path"
+
+ SETUPKEY_VIDEO_DEVICE="Lib/Video/Device"
+ SETUPKEY_VIDEO_DEVICE_PATH="Lib/Video/DevicePath"
+ SETUPKEY_VIDEO_AUTOSEND="Lib/Video/AutoSend"
+ SETUPKEY_VIDEO_DISABLE="*Lib/Video/Disable"
+ SETUPKEY_VIDEO_RECVPOLICY="Lib/Video/RecvPolicy"
+ SETUPKEY_VIDEO_ADVERTPOLICY="Lib/Video/AdvertPolicy"
+ def SetScreen(
+ self,
+ windowh
+ ):
+ request = XCallRequest("ZR\013\001",11,1)
+ request.AddParm('O',0,self)
+ request.AddParm('u',1,windowh)
+ response = self.transport.Xcall(request)
+ def Start(self):
+ request = XCallRequest("ZR\013\002",11,2)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def Stop(self):
+ request = XCallRequest("ZR\013\003",11,3)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def SubmitCaptureRequest(self):
+ request = XCallRequest("ZR\013\013",11,11)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = (response.get(1,False)),
+ result += (response.get(2,0)),
+ return result
+ def OnCaptureRequestCompleted(
+ self,
+ requestId,
+ isSuccessful,
+ image,
+ width,
+ height
+ ): pass
+ event_handlers[2] = "OnCaptureRequestCompletedDispatch"
+ def OnCaptureRequestCompletedDispatch(self, parms):
+ cleanparms = (parms.get(1,0)),
+ cleanparms += (parms.get(2,False)),
+ cleanparms += (parms.get(3,'')),
+ cleanparms += (parms.get(4,0)),
+ cleanparms += (parms.get(5,0)),
+ self.OnCaptureRequestCompleted(*cleanparms)
+ def SetScreenCaptureRectangle(
+ self,
+ x0,
+ y0,
+ width,
+ height,
+ monitorNumber,
+ windowHandle
+ ):
+ request = XCallRequest("ZR\013\005",11,5)
+ request.AddParm('O',0,self)
+ request.AddParm('i',1,x0)
+ request.AddParm('i',2,y0)
+ request.AddParm('u',3,width)
+ request.AddParm('u',4,height)
+ request.AddParm('i',5,monitorNumber)
+ request.AddParm('u',6,windowHandle)
+ response = self.transport.Xcall(request)
+ def SetRenderRectangle(
+ self,
+ x0,
+ y0,
+ width,
+ height
+ ):
+ request = XCallRequest("ZR\013\006",11,6)
+ request.AddParm('O',0,self)
+ request.AddParm('i',1,x0)
+ request.AddParm('i',2,y0)
+ request.AddParm('u',3,width)
+ request.AddParm('u',4,height)
+ response = self.transport.Xcall(request)
+ def SelectVideoSource(
+ self,
+ mediaType,
+ webcamName,
+ devicePath,
+ updateSetup
+ ):
+ request = XCallRequest("ZR\013\007",11,7)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,Video.MEDIATYPE[mediaType])
+ request.AddParm('S',2,webcamName)
+ request.AddParm('S',3,devicePath)
+ request.AddParm('b',4,updateSetup)
+ response = self.transport.Xcall(request)
+ def GetCurrentVideoDevice(self):
+ request = XCallRequest("ZR\013\012",11,10)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = (Video.MEDIATYPE[response.get(1)]),
+ result += (response.get(2,'')),
+ result += (response.get(3,'')),
+ return result
+ def OnLastFrameCapture(
+ self,
+ image,
+ width,
+ height
+ ): pass
+ event_handlers[1] = "OnLastFrameCaptureDispatch"
+ def OnLastFrameCaptureDispatch(self, parms):
+ cleanparms = (parms.get(1,'')),
+ cleanparms += (parms.get(2,0)),
+ cleanparms += (parms.get(3,0)),
+ self.OnLastFrameCapture(*cleanparms)
+module_id2classes[11] = Video
+
+class Voicemail(Object):
+ event_handlers = {}
+ propid2label = {}
+ def _Init(self, object_id, transport):
+ Object._Init(self, object_id, transport)
+ def __str__(self):
+ return "Voicemail %s" % (self.object_id, )
+ module_id = 7
+ def OnPropertyChange(self, property_name): pass
+ TYPE= {1:'INCOMING', 'INCOMING':1, 4:'DEFAULT_GREETING', 'DEFAULT_GREETING':4, 2:'CUSTOM_GREETING', 'CUSTOM_GREETING':2, 3:'OUTGOING', 'OUTGOING':3}
+ STATUS= {
+ 1 :'NOTDOWNLOADED',
+ 2 :'DOWNLOADING',
+ 3 :'UNPLAYED',
+ 4 :'BUFFERING',
+ 5 :'PLAYING',
+ 6 :'PLAYED',
+ 7 :'BLANK',
+ 8 :'RECORDING',
+ 9 :'RECORDED',
+ 10:'UPLOADING',
+ 11:'UPLOADED',
+ 12:'DELETING',
+ 13:'FAILED',
+ 14:'DELETING_FAILED',
+ 15:'CHECKING',
+ 16:'CANCELLED',
+ 'NOTDOWNLOADED' : 1,
+ 'DOWNLOADING' : 2,
+ 'UNPLAYED' : 3,
+ 'BUFFERING' : 4,
+ 'PLAYING' : 5,
+ 'PLAYED' : 6,
+ 'BLANK' : 7,
+ 'RECORDING' : 8,
+ 'RECORDED' : 9,
+ 'UPLOADING' :10,
+ 'UPLOADED' :11,
+ 'DELETING' :12,
+ 'FAILED' :13,
+ 'DELETING_FAILED' :14,
+ 'CHECKING' :15,
+ 'CANCELLED' :16
+ }
+ FAILUREREASON= {
+ 1 :'MISC_ERROR',
+ 2 :'CONNECT_ERROR',
+ 3 :'NO_VOICEMAIL_CAPABILITY',
+ 4 :'NO_SUCH_VOICEMAIL',
+ 5 :'FILE_READ_ERROR',
+ 6 :'FILE_WRITE_ERROR',
+ 7 :'RECORDING_ERROR',
+ 8 :'PLAYBACK_ERROR',
+ 9 :'NO_PERMISSION',
+ 10:'RECEIVER_DISABLED_VOICEMAIL',
+ 11:'SENDER_NOT_AUTHORIZED',
+ 12:'SENDER_BLOCKED',
+ 'MISC_ERROR' : 1,
+ 'CONNECT_ERROR' : 2,
+ 'NO_VOICEMAIL_CAPABILITY' : 3,
+ 'NO_SUCH_VOICEMAIL' : 4,
+ 'FILE_READ_ERROR' : 5,
+ 'FILE_WRITE_ERROR' : 6,
+ 'RECORDING_ERROR' : 7,
+ 'PLAYBACK_ERROR' : 8,
+ 'NO_PERMISSION' : 9,
+ 'RECEIVER_DISABLED_VOICEMAIL' :10,
+ 'SENDER_NOT_AUTHORIZED' :11,
+ 'SENDER_BLOCKED' :12
+ }
+
+ def _Gettype(self):
+ return Voicemail.TYPE[self._Property("ZGd]\007",100, True)]
+ type = property(_Gettype)
+ propid2label[100] = "type"
+ def _Getpartner_handle(self):
+ return self._Property("ZGe]\007",101, True)
+ partner_handle = property(_Getpartner_handle)
+ propid2label[101] = "partner_handle"
+ def _Getpartner_dispname(self):
+ return self._Property("ZGf]\007",102, True)
+ partner_dispname = property(_Getpartner_dispname)
+ propid2label[102] = "partner_dispname"
+ def _Getstatus(self):
+ return Voicemail.STATUS[self._Property("ZGg]\007",103, True)]
+ status = property(_Getstatus)
+ propid2label[103] = "status"
+ def _Getfailurereason(self):
+ return Voicemail.FAILUREREASON[self._Property("ZGh]\007",104, True)]
+ failurereason = property(_Getfailurereason)
+ propid2label[104] = "failurereason"
+ def _Getsubject(self):
+ return self._Property("ZGi]\007",105, True)
+ subject = property(_Getsubject)
+ propid2label[105] = "subject"
+ def _Gettimestamp(self):
+ return self._Property("ZGj]\007",106, True)
+ timestamp = property(_Gettimestamp)
+ propid2label[106] = "timestamp"
+ def _Getduration(self):
+ return self._Property("ZGk]\007",107, True)
+ duration = property(_Getduration)
+ propid2label[107] = "duration"
+ def _Getallowed_duration(self):
+ return self._Property("ZGl]\007",108, True)
+ allowed_duration = property(_Getallowed_duration)
+ propid2label[108] = "allowed_duration"
+ def _Getplayback_progress(self):
+ return self._Property("ZGm]\007",109, True)
+ playback_progress = property(_Getplayback_progress)
+ propid2label[109] = "playback_progress"
+ def _Getconvo_id(self):
+ return module_id2classes[18](self._Property("ZG\276\006]\007",830, True),self.transport)
+ convo_id = property(_Getconvo_id)
+ propid2label[830] = "convo_id"
+ def _Getchatmsg_guid(self):
+ return self._Property("ZG\277\006]\007",831, True)
+ chatmsg_guid = property(_Getchatmsg_guid)
+ propid2label[831] = "chatmsg_guid"
+
+ def StartRecording(self):
+ request = XCallRequest("ZR\007\003",7,3)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def StopRecording(self):
+ request = XCallRequest("ZR\007\004",7,4)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def StartPlayback(self):
+ request = XCallRequest("ZR\007\005",7,5)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def StopPlayback(self):
+ request = XCallRequest("ZR\007\006",7,6)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def Delete(self):
+ request = XCallRequest("ZR\007\007",7,7)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def Cancel(self):
+ request = XCallRequest("ZR\007\010",7,8)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def CheckPermission(self):
+ request = XCallRequest("ZR\007\015",7,13)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+module_id2classes[7] = Voicemail
+
+class Sms(Object):
+ event_handlers = {}
+ propid2label = {}
+ def _Init(self, object_id, transport):
+ Object._Init(self, object_id, transport)
+ def __str__(self):
+ return "Sms %s" % (self.object_id, )
+ module_id = 12
+ def OnPropertyChange(self, property_name): pass
+ TYPE= {1:'INCOMING', 'INCOMING':1, 2:'OUTGOING', 'OUTGOING':2, 3:'CONFIRMATION_CODE_REQUEST', 'CONFIRMATION_CODE_REQUEST':3, 4:'CONFIRMATION_CODE_SUBMIT', 'CONFIRMATION_CODE_SUBMIT':4}
+ STATUS= {1:'RECEIVED', 'RECEIVED':1, 2:'READ', 'READ':2, 3:'COMPOSING', 'COMPOSING':3, 4:'SENDING_TO_SERVER', 'SENDING_TO_SERVER':4, 5:'SENT_TO_SERVER', 'SENT_TO_SERVER':5, 6:'DELIVERED', 'DELIVERED':6, 7:'SOME_TARGETS_FAILED', 'SOME_TARGETS_FAILED':7, 8:'FAILED', 'FAILED':8}
+ FAILUREREASON= {
+ 1:'MISC_ERROR',
+ 2:'SERVER_CONNECT_FAILED',
+ 3:'NO_SMS_CAPABILITY',
+ 4:'INSUFFICIENT_FUNDS',
+ 5:'INVALID_CONFIRMATION_CODE',
+ 6:'USER_BLOCKED',
+ 7:'IP_BLOCKED',
+ 8:'NODE_BLOCKED',
+ 9:'NO_SENDERID_CAPABILITY',
+ 'MISC_ERROR' :1,
+ 'SERVER_CONNECT_FAILED' :2,
+ 'NO_SMS_CAPABILITY' :3,
+ 'INSUFFICIENT_FUNDS' :4,
+ 'INVALID_CONFIRMATION_CODE' :5,
+ 'USER_BLOCKED' :6,
+ 'IP_BLOCKED' :7,
+ 'NODE_BLOCKED' :8,
+ 'NO_SENDERID_CAPABILITY' :9
+ }
+ TARGETSTATUS= {1:'TARGET_ANALYZING', 'TARGET_ANALYZING':1, 2:'TARGET_UNDEFINED', 'TARGET_UNDEFINED':2, 3:'TARGET_ACCEPTABLE', 'TARGET_ACCEPTABLE':3, 4:'TARGET_NOT_ROUTABLE', 'TARGET_NOT_ROUTABLE':4, 5:'TARGET_DELIVERY_PENDING', 'TARGET_DELIVERY_PENDING':5, 6:'TARGET_DELIVERY_SUCCESSFUL', 'TARGET_DELIVERY_SUCCESSFUL':6, 7:'TARGET_DELIVERY_FAILED', 'TARGET_DELIVERY_FAILED':7}
+ SETBODYRESULT= {0:'BODY_INVALID', 'BODY_INVALID':0, 1:'BODY_TRUNCATED', 'BODY_TRUNCATED':1, 2:'BODY_OK', 'BODY_OK':2, 3:'BODY_LASTCHAR_IGNORED', 'BODY_LASTCHAR_IGNORED':3}
+
+ def _Gettype(self):
+ return Sms.TYPE[self._Property("ZG\276\001]\014",190, True)]
+ type = property(_Gettype)
+ propid2label[190] = "type"
+ def _Getstatus(self):
+ return Sms.STATUS[self._Property("ZG\277\001]\014",191, True)]
+ status = property(_Getstatus)
+ propid2label[191] = "status"
+ def _Getfailurereason(self):
+ return Sms.FAILUREREASON[self._Property("ZG\300\001]\014",192, True)]
+ failurereason = property(_Getfailurereason)
+ propid2label[192] = "failurereason"
+ def _Getis_failed_unseen(self):
+ return self._Property("ZG0]\014",48, True)
+ is_failed_unseen = property(_Getis_failed_unseen)
+ propid2label[48] = "is_failed_unseen"
+ def _Gettimestamp(self):
+ return self._Property("ZG\306\001]\014",198, True)
+ timestamp = property(_Gettimestamp)
+ propid2label[198] = "timestamp"
+ def _Getprice(self):
+ return self._Property("ZG\301\001]\014",193, True)
+ price = property(_Getprice)
+ propid2label[193] = "price"
+ def _Getprice_precision(self):
+ return self._Property("ZG1]\014",49, True)
+ price_precision = property(_Getprice_precision)
+ propid2label[49] = "price_precision"
+ def _Getprice_currency(self):
+ return self._Property("ZG\302\001]\014",194, True)
+ price_currency = property(_Getprice_currency)
+ propid2label[194] = "price_currency"
+ def _Getreply_to_number(self):
+ return self._Property("ZG\307\001]\014",199, True)
+ reply_to_number = property(_Getreply_to_number)
+ propid2label[199] = "reply_to_number"
+ def _Gettarget_numbers(self):
+ return self._Property("ZG\303\001]\014",195, True)
+ target_numbers = property(_Gettarget_numbers)
+ propid2label[195] = "target_numbers"
+ def _Gettarget_statuses(self):
+ return self._Property("ZG\304\001]\014",196, True)
+ target_statuses = property(_Gettarget_statuses)
+ propid2label[196] = "target_statuses"
+ def _Getbody(self):
+ return self._Property("ZG\305\001]\014",197, True)
+ body = property(_Getbody)
+ propid2label[197] = "body"
+ def _Getchatmsg_id(self):
+ return module_id2classes[9](self._Property("ZG\310\006]\014",840, True),self.transport)
+ chatmsg_id = property(_Getchatmsg_id)
+ propid2label[840] = "chatmsg_id"
+
+ def GetTargetStatus(
+ self,
+ target
+ ):
+ request = XCallRequest("ZR\014\004",12,4)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,target)
+ response = self.transport.Xcall(request)
+ result = Sms.TARGETSTATUS[response.get(1)]
+ return result
+ def GetTargetPrice(
+ self,
+ target
+ ):
+ request = XCallRequest("ZR\014\015",12,13)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,target)
+ response = self.transport.Xcall(request)
+ result = response.get(1,0)
+ return result
+ def SetReplyTo(
+ self,
+ number
+ ):
+ request = XCallRequest("ZR\014\005",12,5)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,number)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def SetTargets(
+ self,
+ numbers
+ ):
+ request = XCallRequest("ZR\014\006",12,6)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,numbers)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def SetBody(
+ self,
+ text
+ ):
+ request = XCallRequest("ZR\014\007",12,7)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,text)
+ response = self.transport.Xcall(request)
+ result = (Sms.SETBODYRESULT[response.get(1)]),
+ result += (response.get(2,[])),
+ result += (response.get(3,0)),
+ return result
+ def GetBodyChunks(self):
+ request = XCallRequest("ZR\014\010",12,8)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = (response.get(1,[])),
+ result += (response.get(2,0)),
+ return result
+ def SetOrigin(
+ self,
+ origin
+ ):
+ request = XCallRequest("ZR\014\016",12,14)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,origin)
+ response = self.transport.Xcall(request)
+module_id2classes[12] = Sms
+
+class Transfer(Object):
+ event_handlers = {}
+ propid2label = {}
+ def _Init(self, object_id, transport):
+ Object._Init(self, object_id, transport)
+ def __str__(self):
+ return "Transfer %s" % (self.object_id, )
+ module_id = 6
+ def OnPropertyChange(self, property_name): pass
+ TYPE= {1:'INCOMING', 'INCOMING':1, 2:'OUTGOING', 'OUTGOING':2}
+ STATUS= {
+ 0 :'NEW',
+ 1 :'CONNECTING',
+ 2 :'WAITING_FOR_ACCEPT',
+ 3 :'TRANSFERRING',
+ 4 :'TRANSFERRING_OVER_RELAY',
+ 5 :'PAUSED',
+ 6 :'REMOTELY_PAUSED',
+ 7 :'CANCELLED',
+ 8 :'COMPLETED',
+ 9 :'FAILED',
+ 10:'PLACEHOLDER',
+ 11:'OFFER_FROM_OTHER_INSTANCE',
+ 12:'CANCELLED_BY_REMOTE',
+ 'NEW' : 0,
+ 'CONNECTING' : 1,
+ 'WAITING_FOR_ACCEPT' : 2,
+ 'TRANSFERRING' : 3,
+ 'TRANSFERRING_OVER_RELAY' : 4,
+ 'PAUSED' : 5,
+ 'REMOTELY_PAUSED' : 6,
+ 'CANCELLED' : 7,
+ 'COMPLETED' : 8,
+ 'FAILED' : 9,
+ 'PLACEHOLDER' :10,
+ 'OFFER_FROM_OTHER_INSTANCE' :11,
+ 'CANCELLED_BY_REMOTE' :12
+ }
+ FAILUREREASON= {
+ 1 :'SENDER_NOT_AUTHORISED',
+ 2 :'REMOTELY_CANCELLED',
+ 3 :'FAILED_READ',
+ 4 :'FAILED_REMOTE_READ',
+ 5 :'FAILED_WRITE',
+ 6 :'FAILED_REMOTE_WRITE',
+ 7 :'REMOTE_DOES_NOT_SUPPORT_FT',
+ 8 :'REMOTE_OFFLINE_FOR_TOO_LONG',
+ 9 :'TOO_MANY_PARALLEL',
+ 10:'PLACEHOLDER_TIMEOUT',
+ 'SENDER_NOT_AUTHORISED' : 1,
+ 'REMOTELY_CANCELLED' : 2,
+ 'FAILED_READ' : 3,
+ 'FAILED_REMOTE_READ' : 4,
+ 'FAILED_WRITE' : 5,
+ 'FAILED_REMOTE_WRITE' : 6,
+ 'REMOTE_DOES_NOT_SUPPORT_FT' : 7,
+ 'REMOTE_OFFLINE_FOR_TOO_LONG' : 8,
+ 'TOO_MANY_PARALLEL' : 9,
+ 'PLACEHOLDER_TIMEOUT' :10
+ }
+
+ def _Gettype(self):
+ return Transfer.TYPE[self._Property("ZGP]\006",80, True)]
+ type = property(_Gettype)
+ propid2label[80] = "type"
+ def _Getpartner_handle(self):
+ return self._Property("ZGQ]\006",81, True)
+ partner_handle = property(_Getpartner_handle)
+ propid2label[81] = "partner_handle"
+ def _Getpartner_dispname(self):
+ return self._Property("ZGR]\006",82, True)
+ partner_dispname = property(_Getpartner_dispname)
+ propid2label[82] = "partner_dispname"
+ def _Getstatus(self):
+ return Transfer.STATUS[self._Property("ZGS]\006",83, True)]
+ status = property(_Getstatus)
+ propid2label[83] = "status"
+ def _Getfailurereason(self):
+ return Transfer.FAILUREREASON[self._Property("ZGT]\006",84, True)]
+ failurereason = property(_Getfailurereason)
+ propid2label[84] = "failurereason"
+ def _Getstarttime(self):
+ return self._Property("ZGU]\006",85, True)
+ starttime = property(_Getstarttime)
+ propid2label[85] = "starttime"
+ def _Getfinishtime(self):
+ return self._Property("ZGV]\006",86, True)
+ finishtime = property(_Getfinishtime)
+ propid2label[86] = "finishtime"
+ def _Getfilepath(self):
+ return self._Property("ZGW]\006",87, True)
+ filepath = property(_Getfilepath)
+ propid2label[87] = "filepath"
+ def _Getfilename(self):
+ return self._Property("ZGX]\006",88, True)
+ filename = property(_Getfilename)
+ propid2label[88] = "filename"
+ def _Getfilesize(self):
+ return self._Property("ZGY]\006",89, True)
+ filesize = property(_Getfilesize)
+ propid2label[89] = "filesize"
+ def _Getbytestransferred(self):
+ return self._Property("ZGZ]\006",90, True)
+ bytestransferred = property(_Getbytestransferred)
+ propid2label[90] = "bytestransferred"
+ def _Getbytespersecond(self):
+ return self._Property("ZG[]\006",91, True)
+ bytespersecond = property(_Getbytespersecond)
+ propid2label[91] = "bytespersecond"
+ def _Getchatmsg_guid(self):
+ return self._Property("ZG\134]\006",92, True)
+ chatmsg_guid = property(_Getchatmsg_guid)
+ propid2label[92] = "chatmsg_guid"
+ def _Getchatmsg_index(self):
+ return self._Property("ZG]]\006",93, True)
+ chatmsg_index = property(_Getchatmsg_index)
+ propid2label[93] = "chatmsg_index"
+ def _Getconvo_id(self):
+ return module_id2classes[18](self._Property("ZGb]\006",98, True),self.transport)
+ convo_id = property(_Getconvo_id)
+ propid2label[98] = "convo_id"
+
+ def Accept(
+ self,
+ filenameWithPath
+ ):
+ request = XCallRequest("ZR\006\003",6,3)
+ request.AddParm('O',0,self)
+ request.AddParm('f',1,filenameWithPath)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def Pause(self):
+ request = XCallRequest("ZR\006\004",6,4)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def Resume(self):
+ request = XCallRequest("ZR\006\005",6,5)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def Cancel(self):
+ request = XCallRequest("ZR\006\006",6,6)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+module_id2classes[6] = Transfer
+
+class Account(Object):
+ event_handlers = {}
+ propid2label = {}
+ def _Init(self, object_id, transport):
+ Object._Init(self, object_id, transport)
+ def __str__(self):
+ return "Account %s" % (self.object_id, )
+ module_id = 5
+ def OnPropertyChange(self, property_name): pass
+ STATUS= {1:'LOGGED_OUT', 'LOGGED_OUT':1, 2:'LOGGED_OUT_AND_PWD_SAVED', 'LOGGED_OUT_AND_PWD_SAVED':2, 3:'CONNECTING_TO_P2P', 'CONNECTING_TO_P2P':3, 4:'CONNECTING_TO_SERVER', 'CONNECTING_TO_SERVER':4, 5:'LOGGING_IN', 'LOGGING_IN':5, 6:'INITIALIZING', 'INITIALIZING':6, 7:'LOGGED_IN', 'LOGGED_IN':7, 8:'LOGGING_OUT', 'LOGGING_OUT':8}
+ CBLSYNCSTATUS= {0:'CBL_INITIALIZING', 'CBL_INITIALIZING':0, 1:'CBL_INITIAL_SYNC_PENDING', 'CBL_INITIAL_SYNC_PENDING':1, 2:'CBL_SYNC_PENDING', 'CBL_SYNC_PENDING':2, 3:'CBL_SYNC_IN_PROGRESS', 'CBL_SYNC_IN_PROGRESS':3, 4:'CBL_IN_SYNC', 'CBL_IN_SYNC':4, 5:'CBL_SYNC_FAILED', 'CBL_SYNC_FAILED':5, 6:'CBL_REMOTE_SYNC_PENDING', 'CBL_REMOTE_SYNC_PENDING':6}
+ LOGOUTREASON= {
+ 1 :'LOGOUT_CALLED',
+ 2 :'HTTPS_PROXY_AUTH_FAILED',
+ 3 :'SOCKS_PROXY_AUTH_FAILED',
+ 4 :'P2P_CONNECT_FAILED',
+ 5 :'SERVER_CONNECT_FAILED',
+ 6 :'SERVER_OVERLOADED',
+ 7 :'DB_IN_USE',
+ 8 :'INVALID_SKYPENAME',
+ 9 :'INVALID_EMAIL',
+ 10:'UNACCEPTABLE_PASSWORD',
+ 11:'SKYPENAME_TAKEN',
+ 12:'REJECTED_AS_UNDERAGE',
+ 13:'NO_SUCH_IDENTITY',
+ 14:'INCORRECT_PASSWORD',
+ 15:'TOO_MANY_LOGIN_ATTEMPTS',
+ 16:'PASSWORD_HAS_CHANGED',
+ 17:'PERIODIC_UIC_UPDATE_FAILED',
+ 18:'DB_DISK_FULL',
+ 19:'DB_IO_ERROR',
+ 20:'DB_CORRUPT',
+ 21:'DB_FAILURE',
+ 22:'INVALID_APP_ID',
+ 23:'APP_ID_BLACKLISTED',
+ 24:'UNSUPPORTED_VERSION',
+ 'LOGOUT_CALLED' : 1,
+ 'HTTPS_PROXY_AUTH_FAILED' : 2,
+ 'SOCKS_PROXY_AUTH_FAILED' : 3,
+ 'P2P_CONNECT_FAILED' : 4,
+ 'SERVER_CONNECT_FAILED' : 5,
+ 'SERVER_OVERLOADED' : 6,
+ 'DB_IN_USE' : 7,
+ 'INVALID_SKYPENAME' : 8,
+ 'INVALID_EMAIL' : 9,
+ 'UNACCEPTABLE_PASSWORD' :10,
+ 'SKYPENAME_TAKEN' :11,
+ 'REJECTED_AS_UNDERAGE' :12,
+ 'NO_SUCH_IDENTITY' :13,
+ 'INCORRECT_PASSWORD' :14,
+ 'TOO_MANY_LOGIN_ATTEMPTS' :15,
+ 'PASSWORD_HAS_CHANGED' :16,
+ 'PERIODIC_UIC_UPDATE_FAILED' :17,
+ 'DB_DISK_FULL' :18,
+ 'DB_IO_ERROR' :19,
+ 'DB_CORRUPT' :20,
+ 'DB_FAILURE' :21,
+ 'INVALID_APP_ID' :22,
+ 'APP_ID_BLACKLISTED' :23,
+ 'UNSUPPORTED_VERSION' :24
+ }
+ PWDCHANGESTATUS= {0:'PWD_OK', 'PWD_OK':0, 1:'PWD_CHANGING', 'PWD_CHANGING':1, 2:'PWD_INVALID_OLD_PASSWORD', 'PWD_INVALID_OLD_PASSWORD':2, 3:'PWD_SERVER_CONNECT_FAILED', 'PWD_SERVER_CONNECT_FAILED':3, 4:'PWD_OK_BUT_CHANGE_SUGGESTED', 'PWD_OK_BUT_CHANGE_SUGGESTED':4, 5:'PWD_MUST_DIFFER_FROM_OLD', 'PWD_MUST_DIFFER_FROM_OLD':5, 6:'PWD_INVALID_NEW_PWD', 'PWD_INVALID_NEW_PWD':6, 7:'PWD_MUST_LOG_IN_TO_CHANGE', 'PWD_MUST_LOG_IN_TO_CHANGE':7}
+ COMMITSTATUS= {1:'COMMITTED', 'COMMITTED':1, 2:'COMMITTING_TO_SERVER', 'COMMITTING_TO_SERVER':2, 3:'COMMIT_FAILED', 'COMMIT_FAILED':3}
+ CHATPOLICY= {0:'EVERYONE_CAN_ADD', 'EVERYONE_CAN_ADD':0, 2:'BUDDIES_OR_AUTHORIZED_CAN_ADD', 'BUDDIES_OR_AUTHORIZED_CAN_ADD':2}
+ SKYPECALLPOLICY= {0:'EVERYONE_CAN_CALL', 'EVERYONE_CAN_CALL':0, 2:'BUDDIES_OR_AUTHORIZED_CAN_CALL', 'BUDDIES_OR_AUTHORIZED_CAN_CALL':2}
+ PSTNCALLPOLICY= {0:'ALL_NUMBERS_CAN_CALL', 'ALL_NUMBERS_CAN_CALL':0, 1:'DISCLOSED_NUMBERS_CAN_CALL', 'DISCLOSED_NUMBERS_CAN_CALL':1, 2:'BUDDY_NUMBERS_CAN_CALL', 'BUDDY_NUMBERS_CAN_CALL':2}
+ AVATARPOLICY= {0:'BUDDIES_OR_AUTHORIZED_CAN_SEE', 'BUDDIES_OR_AUTHORIZED_CAN_SEE':0, 2:'EVERYONE_CAN_SEE', 'EVERYONE_CAN_SEE':2}
+ BUDDYCOUNTPOLICY= {0:'DISCLOSE_TO_AUTHORIZED', 'DISCLOSE_TO_AUTHORIZED':0, 1:'DISCLOSE_TO_NOONE', 'DISCLOSE_TO_NOONE':1}
+ TIMEZONEPOLICY= {0:'TZ_AUTOMATIC', 'TZ_AUTOMATIC':0, 1:'TZ_MANUAL', 'TZ_MANUAL':1, 2:'TZ_UNDISCLOSED', 'TZ_UNDISCLOSED':2}
+ WEBPRESENCEPOLICY= {0:'WEBPRESENCE_DISABLED', 'WEBPRESENCE_DISABLED':0, 1:'WEBPRESENCE_ENABLED', 'WEBPRESENCE_ENABLED':1}
+ PHONENUMBERSPOLICY= {0:'PHONENUMBERS_VISIBLE_FOR_BUDDIES', 'PHONENUMBERS_VISIBLE_FOR_BUDDIES':0, 1:'PHONENUMBERS_VISIBLE_FOR_EVERYONE', 'PHONENUMBERS_VISIBLE_FOR_EVERYONE':1}
+ VOICEMAILPOLICY= {0:'VOICEMAIL_ENABLED', 'VOICEMAIL_ENABLED':0, 1:'VOICEMAIL_DISABLED', 'VOICEMAIL_DISABLED':1}
+ AUTHREQUESTPOLICY= {0:'AUTHREQUEST_ENABLED', 'AUTHREQUEST_ENABLED':0, 5:'CHAT_PARTICIPANTS_CAN_AUTHREQ', 'CHAT_PARTICIPANTS_CAN_AUTHREQ':5, 9:'AUTHREQUEST_DISABLED', 'AUTHREQUEST_DISABLED':9}
+ CAPABILITYSTATUS= {0:'NO_CAPABILITY', 'NO_CAPABILITY':0, 1:'CAPABILITY_EXISTS', 'CAPABILITY_EXISTS':1, 2:'FIRST_EXPIRY_WARNING', 'FIRST_EXPIRY_WARNING':2, 3:'SECOND_EXPIRY_WARNING', 'SECOND_EXPIRY_WARNING':3, 4:'FINAL_EXPIRY_WARNING', 'FINAL_EXPIRY_WARNING':4}
+
+ def _Getstatus(self):
+ return Account.STATUS[self._Property("ZGF]\005",70, True)]
+ status = property(_Getstatus)
+ propid2label[70] = "status"
+ def _Getpwdchangestatus(self):
+ return Account.PWDCHANGESTATUS[self._Property("ZGG]\005",71, True)]
+ pwdchangestatus = property(_Getpwdchangestatus)
+ propid2label[71] = "pwdchangestatus"
+ def _Getlogoutreason(self):
+ return Account.LOGOUTREASON[self._Property("ZGI]\005",73, True)]
+ logoutreason = property(_Getlogoutreason)
+ propid2label[73] = "logoutreason"
+ def _Getcommitstatus(self):
+ return Account.COMMITSTATUS[self._Property("ZGN]\005",78, True)]
+ commitstatus = property(_Getcommitstatus)
+ propid2label[78] = "commitstatus"
+ def _Getsuggested_skypename(self):
+ return self._Property("ZGH]\005",72, True)
+ suggested_skypename = property(_Getsuggested_skypename)
+ propid2label[72] = "suggested_skypename"
+ def _Getskypeout_balance_currency(self):
+ return self._Property("ZGJ]\005",74, True)
+ skypeout_balance_currency = property(_Getskypeout_balance_currency)
+ propid2label[74] = "skypeout_balance_currency"
+ def _Getskypeout_balance(self):
+ return self._Property("ZGK]\005",75, True)
+ skypeout_balance = property(_Getskypeout_balance)
+ propid2label[75] = "skypeout_balance"
+ def _Getskypeout_precision(self):
+ return self._Property("ZG\244\006]\005",804, True)
+ skypeout_precision = property(_Getskypeout_precision)
+ propid2label[804] = "skypeout_precision"
+ def _Getskypein_numbers(self):
+ return self._Property("ZGL]\005",76, True)
+ skypein_numbers = property(_Getskypein_numbers)
+ propid2label[76] = "skypein_numbers"
+ def _Getcblsyncstatus(self):
+ return Account.CBLSYNCSTATUS[self._Property("ZGO]\005",79, True)]
+ cblsyncstatus = property(_Getcblsyncstatus)
+ propid2label[79] = "cblsyncstatus"
+ def _Getoffline_callforward(self):
+ return self._Property("ZGM]\005",77, True)
+ offline_callforward = property(_Getoffline_callforward)
+ propid2label[77] = "offline_callforward"
+ def _Getchat_policy(self):
+ return Account.CHATPOLICY[self._Property("ZG\240\001]\005",160, True)]
+ chat_policy = property(_Getchat_policy)
+ propid2label[160] = "chat_policy"
+ def _Getskype_call_policy(self):
+ return Account.SKYPECALLPOLICY[self._Property("ZG\241\001]\005",161, True)]
+ skype_call_policy = property(_Getskype_call_policy)
+ propid2label[161] = "skype_call_policy"
+ def _Getpstn_call_policy(self):
+ return Account.PSTNCALLPOLICY[self._Property("ZG\242\001]\005",162, True)]
+ pstn_call_policy = property(_Getpstn_call_policy)
+ propid2label[162] = "pstn_call_policy"
+ def _Getavatar_policy(self):
+ return Account.AVATARPOLICY[self._Property("ZG\243\001]\005",163, True)]
+ avatar_policy = property(_Getavatar_policy)
+ propid2label[163] = "avatar_policy"
+ def _Getbuddycount_policy(self):
+ return Account.BUDDYCOUNTPOLICY[self._Property("ZG\244\001]\005",164, True)]
+ buddycount_policy = property(_Getbuddycount_policy)
+ propid2label[164] = "buddycount_policy"
+ def _Gettimezone_policy(self):
+ return Account.TIMEZONEPOLICY[self._Property("ZG\245\001]\005",165, True)]
+ timezone_policy = property(_Gettimezone_policy)
+ propid2label[165] = "timezone_policy"
+ def _Getwebpresence_policy(self):
+ return Account.WEBPRESENCEPOLICY[self._Property("ZG\246\001]\005",166, True)]
+ webpresence_policy = property(_Getwebpresence_policy)
+ propid2label[166] = "webpresence_policy"
+ def _Getphonenumbers_policy(self):
+ return Account.PHONENUMBERSPOLICY[self._Property("ZG\250\001]\005",168, True)]
+ phonenumbers_policy = property(_Getphonenumbers_policy)
+ propid2label[168] = "phonenumbers_policy"
+ def _Getvoicemail_policy(self):
+ return Account.VOICEMAILPOLICY[self._Property("ZG\251\001]\005",169, True)]
+ voicemail_policy = property(_Getvoicemail_policy)
+ propid2label[169] = "voicemail_policy"
+ def _Getauthrequest_policy(self):
+ return Account.AUTHREQUESTPOLICY[self._Property("ZG\260\001]\005",176, True)]
+ authrequest_policy = property(_Getauthrequest_policy)
+ propid2label[176] = "authrequest_policy"
+ def _Getpartner_optedout(self):
+ return self._Property("ZG\205\006]\005",773, True)
+ partner_optedout = property(_Getpartner_optedout)
+ propid2label[773] = "partner_optedout"
+ def _Getservice_provider_info(self):
+ return self._Property("ZG\240\006]\005",800, True)
+ service_provider_info = property(_Getservice_provider_info)
+ propid2label[800] = "service_provider_info"
+ def _Getregistration_timestamp(self):
+ return self._Property("ZG\241\006]\005",801, True)
+ registration_timestamp = property(_Getregistration_timestamp)
+ propid2label[801] = "registration_timestamp"
+ def _Getnr_of_other_instances(self):
+ return self._Property("ZG\242\006]\005",802, True)
+ nr_of_other_instances = property(_Getnr_of_other_instances)
+ propid2label[802] = "nr_of_other_instances"
+ def _Getskypename(self):
+ return self._Property("ZG\004]\005",4, True)
+ skypename = property(_Getskypename)
+ propid2label[4] = "skypename"
+ def _Getfullname(self):
+ return self._Property("ZG\005]\005",5, True)
+ fullname = property(_Getfullname)
+ propid2label[5] = "fullname"
+ def _Getbirthday(self):
+ return self._Property("ZG\007]\005",7, True)
+ birthday = property(_Getbirthday)
+ propid2label[7] = "birthday"
+ def _Getgender(self):
+ return self._Property("ZG\010]\005",8, True)
+ gender = property(_Getgender)
+ propid2label[8] = "gender"
+ def _Getlanguages(self):
+ return self._Property("ZG\011]\005",9, True)
+ languages = property(_Getlanguages)
+ propid2label[9] = "languages"
+ def _Getcountry(self):
+ return self._Property("ZG\012]\005",10, True)
+ country = property(_Getcountry)
+ propid2label[10] = "country"
+ def _Getprovince(self):
+ return self._Property("ZG\013]\005",11, True)
+ province = property(_Getprovince)
+ propid2label[11] = "province"
+ def _Getcity(self):
+ return self._Property("ZG\014]\005",12, True)
+ city = property(_Getcity)
+ propid2label[12] = "city"
+ def _Getphone_home(self):
+ return self._Property("ZG\015]\005",13, True)
+ phone_home = property(_Getphone_home)
+ propid2label[13] = "phone_home"
+ def _Getphone_office(self):
+ return self._Property("ZG\016]\005",14, True)
+ phone_office = property(_Getphone_office)
+ propid2label[14] = "phone_office"
+ def _Getphone_mobile(self):
+ return self._Property("ZG\017]\005",15, True)
+ phone_mobile = property(_Getphone_mobile)
+ propid2label[15] = "phone_mobile"
+ def _Getemails(self):
+ return self._Property("ZG\020]\005",16, True)
+ emails = property(_Getemails)
+ propid2label[16] = "emails"
+ def _Gethomepage(self):
+ return self._Property("ZG\021]\005",17, True)
+ homepage = property(_Gethomepage)
+ propid2label[17] = "homepage"
+ def _Getabout(self):
+ return self._Property("ZG\022]\005",18, True)
+ about = property(_Getabout)
+ propid2label[18] = "about"
+ def _Getprofile_timestamp(self):
+ return self._Property("ZG\023]\005",19, True)
+ profile_timestamp = property(_Getprofile_timestamp)
+ propid2label[19] = "profile_timestamp"
+ def _Getmood_text(self):
+ return self._Property("ZG\032]\005",26, True)
+ mood_text = property(_Getmood_text)
+ propid2label[26] = "mood_text"
+ def _Gettimezone(self):
+ return self._Property("ZG\033]\005",27, True)
+ timezone = property(_Gettimezone)
+ propid2label[27] = "timezone"
+ def _Getnrof_authed_buddies(self):
+ return self._Property("ZG\034]\005",28, True)
+ nrof_authed_buddies = property(_Getnrof_authed_buddies)
+ propid2label[28] = "nrof_authed_buddies"
+ def _Getavailability(self):
+ return Contact.AVAILABILITY[self._Property("ZG\042]\005",34, True)]
+ availability = property(_Getavailability)
+ propid2label[34] = "availability"
+ def _Getavatar_image(self):
+ return self._Property("ZG%]\005",37, True)
+ avatar_image = property(_Getavatar_image)
+ propid2label[37] = "avatar_image"
+ def _Getavatar_timestamp(self):
+ return self._Property("ZG\266\001]\005",182, True)
+ avatar_timestamp = property(_Getavatar_timestamp)
+ propid2label[182] = "avatar_timestamp"
+ def _Getmood_timestamp(self):
+ return self._Property("ZG\267\001]\005",183, True)
+ mood_timestamp = property(_Getmood_timestamp)
+ propid2label[183] = "mood_timestamp"
+ def _Getrich_mood_text(self):
+ return self._Property("ZG\315\001]\005",205, True)
+ rich_mood_text = property(_Getrich_mood_text)
+ propid2label[205] = "rich_mood_text"
+
+ def GetStatusWithProgress(self):
+ request = XCallRequest("ZR\005\001",5,1)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = (Account.STATUS[response.get(1)]),
+ result += (response.get(2,0)),
+ return result
+ def Login(
+ self,
+ setAvailabilityTo
+ ):
+ request = XCallRequest("ZR\005\005",5,5)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,Contact.AVAILABILITY[setAvailabilityTo])
+ response = self.transport.Xcall(request)
+ def LoginWithPassword(
+ self,
+ password,
+ savePwd,
+ saveDataLocally
+ ):
+ request = XCallRequest("ZR\005\006",5,6)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,password)
+ request.AddParm('b',2,savePwd)
+ request.AddParm('b',3,saveDataLocally)
+ response = self.transport.Xcall(request)
+ def Register(
+ self,
+ password,
+ savePwd,
+ saveDataLocally,
+ email,
+ allowSpam
+ ):
+ request = XCallRequest("ZR\005\007",5,7)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,password)
+ request.AddParm('b',2,savePwd)
+ request.AddParm('b',3,saveDataLocally)
+ request.AddParm('S',4,email)
+ request.AddParm('b',5,allowSpam)
+ response = self.transport.Xcall(request)
+ def Logout(
+ self,
+ clearSavedPwd
+ ):
+ request = XCallRequest("ZR\005\010",5,8)
+ request.AddParm('O',0,self)
+ request.AddParm('b',1,clearSavedPwd)
+ response = self.transport.Xcall(request)
+ def ChangePassword(
+ self,
+ oldPassword,
+ newPassword,
+ savePwd
+ ):
+ request = XCallRequest("ZR\005\013",5,11)
+ request.AddParm('O',0,self)
+ request.AddParm('S',1,oldPassword)
+ request.AddParm('S',2,newPassword)
+ request.AddParm('b',3,savePwd)
+ response = self.transport.Xcall(request)
+ def SetPasswordSaved(
+ self,
+ savePwd
+ ):
+ request = XCallRequest("ZR\005\031",5,25)
+ request.AddParm('O',0,self)
+ request.AddParm('b',1,savePwd)
+ response = self.transport.Xcall(request)
+ def SetServersideIntProperty(
+ self,
+ propKey,
+ value
+ ):
+ request = XCallRequest("ZR\005\014",5,12)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,self._propkey(propKey,1))
+ request.AddParm('u',2,value)
+ response = self.transport.Xcall(request)
+ def SetServersideStrProperty(
+ self,
+ propKey,
+ value
+ ):
+ request = XCallRequest("ZR\005\015",5,13)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,self._propkey(propKey,0))
+ request.AddParm('S',2,value)
+ response = self.transport.Xcall(request)
+ def CancelServerCommit(self):
+ request = XCallRequest("ZR\005\017",5,15)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def SetIntProperty(
+ self,
+ propKey,
+ value
+ ):
+ request = XCallRequest("ZR\005\020",5,16)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,self._propkey(propKey,1))
+ request.AddParm('u',2,value)
+ response = self.transport.Xcall(request)
+ def SetStrProperty(
+ self,
+ propKey,
+ value
+ ):
+ request = XCallRequest("ZR\005\021",5,17)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,self._propkey(propKey,0))
+ request.AddParm('S',2,value)
+ response = self.transport.Xcall(request)
+ def SetBinProperty(
+ self,
+ propKey,
+ value
+ ):
+ request = XCallRequest("ZR\005\022",5,18)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,self._propkey(propKey,2))
+ request.AddParm('B',2,value)
+ response = self.transport.Xcall(request)
+ def SetAvailability(
+ self,
+ availability
+ ):
+ request = XCallRequest("ZR\005\023",5,19)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,Contact.AVAILABILITY[availability])
+ response = self.transport.Xcall(request)
+ def SetStandby(
+ self,
+ standby
+ ):
+ request = XCallRequest("ZR\005\220\001",5,144)
+ request.AddParm('O',0,self)
+ request.AddParm('b',1,standby)
+ response = self.transport.Xcall(request)
+ def GetCapabilityStatus(
+ self,
+ capability
+ ):
+ request = XCallRequest("ZR\005\025",5,21)
+ request.AddParm('O',0,self)
+ request.AddParm('e',1,Contact.CAPABILITY[capability])
+ response = self.transport.Xcall(request)
+ result = (Account.CAPABILITYSTATUS[response.get(1)]),
+ result += (response.get(2,0)),
+ return result
+ def GetSkypenameHash(self):
+ request = XCallRequest("ZR\005\026",5,22)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ result = response.get(1,'')
+ return result
+ def Delete(self):
+ request = XCallRequest("ZR\005\030",5,24)
+ request.AddParm('O',0,self)
+ response = self.transport.Xcall(request)
+ def mget_profile(self):
+ self.multiget("ZG\004,\005,\032,\020,\015,\016,\017,\007,\010,\011,\012,\013,\014,\021,\022,\033]\005")
+module_id2classes[5] = Account
+class SkyLib(object):
+ module_id = 0
+ event_handlers = {}
+ def __init__(self, transport):
+ self.object_id = 0
+ self.transport = transport
+ transport.setRoot(self)
+ ''' Stop background operations (background threads). Might take some time.
+ '''
+ def Stop(self):
+ self.transport.Stop()
+
+ def _propkey(self, propname, t):
+ for p,l in Contact.propid2label.items():
+ if l == propname: return p*4+t
+ for p,l in Account.propid2label.items():
+ if l == propname: return p*4+t
+ raise Error('Unknown ' + propname)
+ def GetHardwiredContactGroup(
+ self,
+ type
+ ):
+ request = XCallRequest("ZR\000\001",0,1)
+ request.AddParm('e',1,ContactGroup.TYPE[type])
+ response = self.transport.Xcall(request)
+ result = module_id2classes[10](response.get(1),self.transport)
+ return result
+ def GetCustomContactGroups(self):
+ request = XCallRequest("ZR\000\002",0,2)
+ response = self.transport.Xcall(request)
+ result = [module_id2classes[10](oid,self.transport) for oid in response.get(1,[])]
+ return result
+ def CreateCustomContactGroup(self):
+ request = XCallRequest("ZR\000\003",0,3)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[10](response.get(1),self.transport)
+ return result
+ def OnNewCustomContactGroup(
+ self,
+ group
+ ): pass
+ event_handlers[1] = "OnNewCustomContactGroupDispatch"
+ def OnNewCustomContactGroupDispatch(self, parms):
+ cleanparms = module_id2classes[10](parms.get(1),self.transport)
+ self.OnNewCustomContactGroup(cleanparms)
+ def mget_info_from_Contacts(self, objects):
+ self.transport.multiget("ZG\042,\025]\002",objects)
+ def GetContactType(
+ self,
+ identity
+ ):
+ request = XCallRequest("ZR\000\005",0,5)
+ request.AddParm('S',1,identity)
+ response = self.transport.Xcall(request)
+ result = Contact.TYPE[response.get(1)]
+ return result
+ def GetContact(
+ self,
+ identity
+ ):
+ request = XCallRequest("ZR\000\006",0,6)
+ request.AddParm('S',1,identity)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[2](response.get(2),self.transport)
+ return result
+ def FindContactByPstnNumber(
+ self,
+ number
+ ):
+ request = XCallRequest("ZR\000\010",0,8)
+ request.AddParm('S',1,number)
+ response = self.transport.Xcall(request)
+ result = (response.get(1,False)),
+ result += (module_id2classes[2](response.get(2),self.transport)),
+ result += (response.get(3,0)),
+ return result
+ IDENTITYTYPE= {
+ 0:'UNRECOGNIZED',
+ 1:'SKYPE',
+ 2:'SKYPE_MYSELF',
+ 3:'SKYPE_UNDISCLOSED',
+ 4:'PSTN',
+ 5:'PSTN_EMERGENCY',
+ 6:'PSTN_FREE',
+ 7:'PSTN_UNDISCLOSED',
+ 8:'CONFERENCE',
+ 9:'EXTERNAL',
+ 'UNRECOGNIZED' :0,
+ 'SKYPE' :1,
+ 'SKYPE_MYSELF' :2,
+ 'SKYPE_UNDISCLOSED' :3,
+ 'PSTN' :4,
+ 'PSTN_EMERGENCY' :5,
+ 'PSTN_FREE' :6,
+ 'PSTN_UNDISCLOSED' :7,
+ 'CONFERENCE' :8,
+ 'EXTERNAL' :9
+ }
+ def GetIdentityType(
+ self,
+ identity
+ ):
+ request = XCallRequest("ZR\000\023",0,19)
+ request.AddParm('S',1,identity)
+ response = self.transport.Xcall(request)
+ result = SkyLib.IDENTITYTYPE[response.get(1)]
+ return result
+ NORMALIZERESULT= {0:'IDENTITY_OK', 'IDENTITY_OK':0, 1:'IDENTITY_EMPTY', 'IDENTITY_EMPTY':1, 2:'IDENTITY_TOO_LONG', 'IDENTITY_TOO_LONG':2, 3:'IDENTITY_CONTAINS_INVALID_CHAR', 'IDENTITY_CONTAINS_INVALID_CHAR':3, 4:'PSTN_NUMBER_TOO_SHORT', 'PSTN_NUMBER_TOO_SHORT':4, 5:'PSTN_NUMBER_HAS_INVALID_PREFIX', 'PSTN_NUMBER_HAS_INVALID_PREFIX':5, 6:'SKYPENAME_STARTS_WITH_NONALPHA', 'SKYPENAME_STARTS_WITH_NONALPHA':6, 7:'SKYPENAME_SHORTER_THAN_6_CHARS', 'SKYPENAME_SHORTER_THAN_6_CHARS':7}
+ def NormalizeIdentity(
+ self,
+ original,
+ isNewSkypeName
+ ):
+ request = XCallRequest("ZR\000\011",0,9)
+ request.AddParm('S',1,original)
+ request.AddParm('b',2,isNewSkypeName)
+ response = self.transport.Xcall(request)
+ result = (SkyLib.NORMALIZERESULT[response.get(1)]),
+ result += (response.get(2,'')),
+ return result
+ def NormalizePSTNWithCountry(
+ self,
+ original,
+ countryPrefix
+ ):
+ request = XCallRequest("ZR\000\315\001",0,205)
+ request.AddParm('S',1,original)
+ request.AddParm('u',2,countryPrefix)
+ response = self.transport.Xcall(request)
+ result = (SkyLib.NORMALIZERESULT[response.get(1)]),
+ result += (response.get(2,'')),
+ return result
+ def OnContactOnlineAppearance(
+ self,
+ contact
+ ): pass
+ event_handlers[2] = "OnContactOnlineAppearanceDispatch"
+ def OnContactOnlineAppearanceDispatch(self, parms):
+ cleanparms = module_id2classes[2](parms.get(1),self.transport)
+ self.OnContactOnlineAppearance(cleanparms)
+ def OnContactGoneOffline(
+ self,
+ contact
+ ): pass
+ event_handlers[3] = "OnContactGoneOfflineDispatch"
+ def OnContactGoneOfflineDispatch(self, parms):
+ cleanparms = module_id2classes[2](parms.get(1),self.transport)
+ self.OnContactGoneOffline(cleanparms)
+ def GetOptimalAgeRanges(self):
+ request = XCallRequest("ZR\000M",0,77)
+ response = self.transport.Xcall(request)
+ result = response.get(1,[])
+ return result
+ def CreateContactSearch(self):
+ request = XCallRequest("ZR\000\012",0,10)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[1](response.get(1),self.transport)
+ return result
+ def CreateBasicContactSearch(
+ self,
+ text
+ ):
+ request = XCallRequest("ZR\000\013",0,11)
+ request.AddParm('S',1,text)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[1](response.get(1),self.transport)
+ return result
+ def CreateIdentitySearch(
+ self,
+ identity
+ ):
+ request = XCallRequest("ZR\000\014",0,12)
+ request.AddParm('S',1,identity)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[1](response.get(1),self.transport)
+ return result
+ TRANSFER_SENDFILE_ERROR= {0:'TRANSFER_OPEN_SUCCESS', 'TRANSFER_OPEN_SUCCESS':0, 1:'TRANSFER_BAD_FILENAME', 'TRANSFER_BAD_FILENAME':1, 2:'TRANSFER_OPEN_FAILED', 'TRANSFER_OPEN_FAILED':2, 3:'TRANSFER_TOO_MANY_PARALLEL', 'TRANSFER_TOO_MANY_PARALLEL':3}
+ def mget_info_from_Participants(self, objects):
+ self.transport.multiget("ZG\247\007,\246\007,\250\007,\244\007,\266\007,\252\007]\023",objects)
+ def mget_info_from_Conversations(self, objects):
+ self.transport.multiget("ZG\234\007,\320\007,\240\007]\022",objects)
+ def CreateConference(self):
+ request = XCallRequest("ZR\000\015",0,13)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[18](response.get(1),self.transport)
+ return result
+ def GetConversationByIdentity(
+ self,
+ convoIdentity
+ ):
+ request = XCallRequest("ZR\000\017",0,15)
+ request.AddParm('S',1,convoIdentity)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[18](response.get(1),self.transport)
+ return result
+ def GetConversationByParticipants(
+ self,
+ participantIdentities,
+ createIfNonExisting,
+ ignoreBookmarkedOrNamed
+ ):
+ request = XCallRequest("ZR\000\020",0,16)
+ request.AddParm('S',1,participantIdentities)
+ request.AddParm('b',2,createIfNonExisting)
+ request.AddParm('b',3,ignoreBookmarkedOrNamed)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[18](response.get(1),self.transport)
+ return result
+ def GetConversationByBlob(
+ self,
+ joinBlob,
+ alsoJoin
+ ):
+ request = XCallRequest("ZR\000\021",0,17)
+ request.AddParm('S',1,joinBlob)
+ request.AddParm('b',2,alsoJoin)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[18](response.get(1),self.transport)
+ return result
+ def GetConversationList(
+ self,
+ type
+ ):
+ request = XCallRequest("ZR\000\022",0,18)
+ request.AddParm('e',1,Conversation.LIST_TYPE[type])
+ response = self.transport.Xcall(request)
+ result = [module_id2classes[18](oid,self.transport) for oid in response.get(1,[])]
+ return result
+ def OnConversationListChange(
+ self,
+ conversation,
+ type,
+ added
+ ): pass
+ event_handlers[4] = "OnConversationListChangeDispatch"
+ def OnConversationListChangeDispatch(self, parms):
+ cleanparms = (module_id2classes[18](parms.get(1),self.transport)),
+ cleanparms += (Conversation.LIST_TYPE[parms.get(2)]),
+ cleanparms += (parms.get(3,False)),
+ self.OnConversationListChange(*cleanparms)
+ def mget_info_from_Messages(self, objects):
+ self.transport.multiget("ZG\300\007,{,\301\007,\177,y]\011",objects)
+ def GetMessageByGuid(
+ self,
+ guid
+ ):
+ request = XCallRequest("ZR\000\025",0,21)
+ request.AddParm('B',1,guid)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[9](response.get(1),self.transport)
+ return result
+ def OnMessage(
+ self,
+ message,
+ changesInboxTimestamp,
+ supersedesHistoryMessage,
+ conversation
+ ): pass
+ event_handlers[5] = "OnMessageDispatch"
+ def OnMessageDispatch(self, parms):
+ cleanparms = (module_id2classes[9](parms.get(1),self.transport)),
+ cleanparms += (parms.get(2,False)),
+ cleanparms += (module_id2classes[9](parms.get(3),self.transport)),
+ cleanparms += (module_id2classes[18](parms.get(4),self.transport)),
+ self.OnMessage(*cleanparms)
+ cleanparms[3].OnMessage(cleanparms[0])
+ def GetAvailableVideoDevices(self):
+ request = XCallRequest("ZR\000P",0,80)
+ response = self.transport.Xcall(request)
+ result = (response.get(1,[])),
+ result += (response.get(2,[])),
+ result += (response.get(3,0)),
+ return result
+ def HasVideoDeviceCapability(
+ self,
+ deviceName,
+ devicePath,
+ cap
+ ):
+ request = XCallRequest("ZR\000!",0,33)
+ request.AddParm('S',1,deviceName)
+ request.AddParm('S',2,devicePath)
+ request.AddParm('e',3,Video.VIDEO_DEVICE_CAPABILITY[cap])
+ response = self.transport.Xcall(request)
+ def DisplayVideoDeviceTuningDialog(
+ self,
+ deviceName,
+ devicePath
+ ):
+ request = XCallRequest("ZR\000\042",0,34)
+ request.AddParm('S',1,deviceName)
+ request.AddParm('S',2,devicePath)
+ response = self.transport.Xcall(request)
+ def GetLocalVideo(
+ self,
+ type,
+ deviceName,
+ devicePath
+ ):
+ request = XCallRequest("ZR\000\203\001",0,131)
+ request.AddParm('e',1,Video.MEDIATYPE[type])
+ request.AddParm('S',2,deviceName)
+ request.AddParm('S',3,devicePath)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[11](response.get(1),self.transport)
+ return result
+ def GetPreviewVideo(
+ self,
+ type,
+ deviceName,
+ devicePath
+ ):
+ request = XCallRequest("ZR\000#",0,35)
+ request.AddParm('e',1,Video.MEDIATYPE[type])
+ request.AddParm('S',2,deviceName)
+ request.AddParm('S',3,devicePath)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[11](response.get(1),self.transport)
+ return result
+ def VideoCommand(
+ self,
+ command
+ ):
+ request = XCallRequest("ZR\000;",0,59)
+ request.AddParm('S',1,command)
+ response = self.transport.Xcall(request)
+ result = response.get(1,'')
+ return result
+ def OnAvailableVideoDeviceListChange(self): pass
+ def OnAvailableVideoDeviceListChangeDispatch(self, parms): self.OnAvailableVideoDeviceListChange()
+ event_handlers[7] = "OnAvailableVideoDeviceListChangeDispatch"
+ def GetGreeting(
+ self,
+ skypeName
+ ):
+ request = XCallRequest("ZR\000-",0,45)
+ request.AddParm('S',1,skypeName)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[7](response.get(1),self.transport)
+ return result
+ PREPARESOUNDRESULT= {0:'PREPARESOUND_SUCCESS', 'PREPARESOUND_SUCCESS':0, 1:'PREPARESOUND_MISC_ERROR', 'PREPARESOUND_MISC_ERROR':1, 2:'PREPARESOUND_FILE_NOT_FOUND', 'PREPARESOUND_FILE_NOT_FOUND':2, 3:'PREPARESOUND_FILE_TOO_BIG', 'PREPARESOUND_FILE_TOO_BIG':3, 4:'PREPARESOUND_FILE_READ_ERROR', 'PREPARESOUND_FILE_READ_ERROR':4, 5:'PREPARESOUND_UNSUPPORTED_FILE_FORMAT', 'PREPARESOUND_UNSUPPORTED_FILE_FORMAT':5, 6:'PREPARESOUND_PLAYBACK_NOT_SUPPORTED', 'PREPARESOUND_PLAYBACK_NOT_SUPPORTED':6}
+ AUDIODEVICE_CAPABILIES= {
+ 1 :'HAS_VIDEO_CAPTURE',
+ 2 :'HAS_USB_INTERFACE',
+ 4 :'POSSIBLY_HEADSET',
+ 8 :'HAS_AUDIO_CAPTURE',
+ 16 :'HAS_AUDIO_RENDERING',
+ 32 :'HAS_LOWBANDWIDTH_CAPTURE',
+ 64 :'IS_WEBCAM',
+ 128 :'IS_HEADSET',
+ 256 :'POSSIBLY_WEBCAM',
+ 2048:'HAS_VIDEO_RENDERING',
+ 4096:'HAS_BLUETOOTH_INTERFACE',
+ 'HAS_VIDEO_CAPTURE' : 1,
+ 'HAS_USB_INTERFACE' : 2,
+ 'POSSIBLY_HEADSET' : 4,
+ 'HAS_AUDIO_CAPTURE' : 8,
+ 'HAS_AUDIO_RENDERING' : 16,
+ 'HAS_LOWBANDWIDTH_CAPTURE' : 32,
+ 'IS_WEBCAM' : 64,
+ 'IS_HEADSET' : 128,
+ 'POSSIBLY_WEBCAM' : 256,
+ 'HAS_VIDEO_RENDERING' :2048,
+ 'HAS_BLUETOOTH_INTERFACE' :4096
+ }
+ def PlayStart(
+ self,
+ soundid,
+ sound,
+ loop,
+ useCallOutDevice
+ ):
+ request = XCallRequest("ZR\000\060",0,48)
+ request.AddParm('u',1,soundid)
+ request.AddParm('B',2,sound)
+ request.AddParm('b',3,loop)
+ request.AddParm('b',4,useCallOutDevice)
+ response = self.transport.Xcall(request)
+ def PlayStartFromFile(
+ self,
+ soundid,
+ datafile,
+ loop,
+ useCallOutDevice
+ ):
+ request = XCallRequest("ZR\000\324\001",0,212)
+ request.AddParm('u',1,soundid)
+ request.AddParm('f',2,datafile)
+ request.AddParm('b',3,loop)
+ request.AddParm('b',4,useCallOutDevice)
+ response = self.transport.Xcall(request)
+ result = SkyLib.PREPARESOUNDRESULT[response.get(1)]
+ return result
+ def PlayStop(
+ self,
+ soundid
+ ):
+ request = XCallRequest("ZR\000\061",0,49)
+ request.AddParm('u',1,soundid)
+ response = self.transport.Xcall(request)
+ def StartRecordingTest(
+ self,
+ recordAndPlaybackData
+ ):
+ request = XCallRequest("ZR\000\062",0,50)
+ request.AddParm('b',1,recordAndPlaybackData)
+ response = self.transport.Xcall(request)
+ def StopRecordingTest(self):
+ request = XCallRequest("ZR\000\063",0,51)
+ response = self.transport.Xcall(request)
+ def GetAvailableOutputDevices(self):
+ request = XCallRequest("ZR\000\065",0,53)
+ response = self.transport.Xcall(request)
+ result = (response.get(1,[])),
+ result += (response.get(2,[])),
+ result += (response.get(3,[])),
+ return result
+ def GetAvailableRecordingDevices(self):
+ request = XCallRequest("ZR\000\066",0,54)
+ response = self.transport.Xcall(request)
+ result = (response.get(1,[])),
+ result += (response.get(2,[])),
+ result += (response.get(3,[])),
+ return result
+ def SelectSoundDevices(
+ self,
+ callInDevice,
+ callOutDevice,
+ waveOutDevice
+ ):
+ request = XCallRequest("ZR\000\067",0,55)
+ request.AddParm('S',1,callInDevice)
+ request.AddParm('S',2,callOutDevice)
+ request.AddParm('S',3,waveOutDevice)
+ response = self.transport.Xcall(request)
+ def GetAudioDeviceCapabilities(
+ self,
+ deviceHandle
+ ):
+ request = XCallRequest("ZR\000\070",0,56)
+ request.AddParm('S',1,deviceHandle)
+ response = self.transport.Xcall(request)
+ result = (response.get(1,'')),
+ result += (response.get(2,0)),
+ return result
+ def GetNrgLevels(self):
+ request = XCallRequest("ZR\000\071",0,57)
+ response = self.transport.Xcall(request)
+ result = (response.get(1,0)),
+ result += (response.get(2,0)),
+ return result
+ def VoiceCommand(
+ self,
+ command
+ ):
+ request = XCallRequest("ZR\000:",0,58)
+ request.AddParm('S',1,command)
+ response = self.transport.Xcall(request)
+ result = response.get(1,'')
+ return result
+ def GetSpeakerVolume(self):
+ request = XCallRequest("ZR\000<",0,60)
+ response = self.transport.Xcall(request)
+ result = response.get(1,0)
+ return result
+ def SetSpeakerVolume(
+ self,
+ volume
+ ):
+ request = XCallRequest("ZR\000=",0,61)
+ request.AddParm('u',1,volume)
+ response = self.transport.Xcall(request)
+ def GetMicVolume(self):
+ request = XCallRequest("ZR\000>",0,62)
+ response = self.transport.Xcall(request)
+ result = response.get(1,0)
+ return result
+ def SetMicVolume(
+ self,
+ volume
+ ):
+ request = XCallRequest("ZR\000?",0,63)
+ request.AddParm('u',1,volume)
+ response = self.transport.Xcall(request)
+ def IsSpeakerMuted(self):
+ request = XCallRequest("ZR\000@",0,64)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def IsMicrophoneMuted(self):
+ request = XCallRequest("ZR\000\101",0,65)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def MuteSpeakers(
+ self,
+ mute
+ ):
+ request = XCallRequest("ZR\000\102",0,66)
+ request.AddParm('b',1,mute)
+ response = self.transport.Xcall(request)
+ def MuteMicrophone(
+ self,
+ mute
+ ):
+ request = XCallRequest("ZR\000\103",0,67)
+ request.AddParm('b',1,mute)
+ response = self.transport.Xcall(request)
+ def OnAvailableDeviceListChange(self): pass
+ def OnAvailableDeviceListChangeDispatch(self, parms): self.OnAvailableDeviceListChange()
+ event_handlers[10] = "OnAvailableDeviceListChangeDispatch"
+ def OnNrgLevelsChange(self): pass
+ def OnNrgLevelsChangeDispatch(self, parms): self.OnNrgLevelsChange()
+ event_handlers[11] = "OnNrgLevelsChangeDispatch"
+ def CreateOutgoingSms(self):
+ request = XCallRequest("ZR\000\106",0,70)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[12](response.get(1),self.transport)
+ return result
+ def GetValidatedSmsNumbers(self):
+ request = XCallRequest("ZR\000H",0,72)
+ response = self.transport.Xcall(request)
+ result = response.get(1,[])
+ return result
+ SETUPKEY_FT_AUTOACCEPT="Lib/FileTransfer/AutoAccept"
+ SETUPKEY_FT_SAVEPATH="Lib/FileTransfer/SavePath"
+ SETUPKEY_FT_INCOMING_LIMIT="Lib/FileTransfer/IncomingLimit"
+ SETUPKEY_IDLE_TIME_FOR_AWAY="Lib/Account/IdleTimeForAway"
+ SETUPKEY_IDLE_TIME_FOR_NA="Lib/Account/IdleTimeForNA"
+ def GetAccount(
+ self,
+ identity
+ ):
+ request = XCallRequest("ZR\000s",0,115)
+ request.AddParm('S',1,identity)
+ response = self.transport.Xcall(request)
+ result = module_id2classes[5](response.get(1),self.transport)
+ return result
+ def GetExistingAccounts(self):
+ request = XCallRequest("ZR\000q",0,113)
+ response = self.transport.Xcall(request)
+ result = response.get(1,[])
+ return result
+ def GetDefaultAccountName(self):
+ request = XCallRequest("ZR\000r",0,114)
+ response = self.transport.Xcall(request)
+ result = response.get(1,'')
+ return result
+ def GetSuggestedSkypename(
+ self,
+ fullname
+ ):
+ request = XCallRequest("ZR\000t",0,116)
+ request.AddParm('S',1,fullname)
+ response = self.transport.Xcall(request)
+ result = response.get(1,'')
+ return result
+ VALIDATERESULT= {
+ 0 :'NOT_VALIDATED',
+ 1 :'VALIDATED_OK',
+ 2 :'TOO_SHORT',
+ 3 :'TOO_LONG',
+ 4 :'CONTAINS_INVALID_CHAR',
+ 5 :'CONTAINS_SPACE',
+ 6 :'SAME_AS_USERNAME',
+ 7 :'INVALID_FORMAT',
+ 8 :'CONTAINS_INVALID_WORD',
+ 9 :'TOO_SIMPLE',
+ 10:'STARTS_WITH_INVALID_CHAR',
+ 'NOT_VALIDATED' : 0,
+ 'VALIDATED_OK' : 1,
+ 'TOO_SHORT' : 2,
+ 'TOO_LONG' : 3,
+ 'CONTAINS_INVALID_CHAR' : 4,
+ 'CONTAINS_SPACE' : 5,
+ 'SAME_AS_USERNAME' : 6,
+ 'INVALID_FORMAT' : 7,
+ 'CONTAINS_INVALID_WORD' : 8,
+ 'TOO_SIMPLE' : 9,
+ 'STARTS_WITH_INVALID_CHAR' :10
+ }
+ def ValidateAvatar(
+ self,
+ value
+ ):
+ request = XCallRequest("ZR\000w",0,119)
+ request.AddParm('B',1,value)
+ response = self.transport.Xcall(request)
+ result = (SkyLib.VALIDATERESULT[response.get(1)]),
+ result += (response.get(2,0)),
+ return result
+ def ValidateProfileString(
+ self,
+ propKey,
+ strValue,
+ forRegistration
+ ):
+ request = XCallRequest("ZR\000f",0,102)
+ request.AddParm('e',1,self._propkey(propKey,0))
+ request.AddParm('S',2,strValue)
+ request.AddParm('b',3,forRegistration)
+ response = self.transport.Xcall(request)
+ result = (SkyLib.VALIDATERESULT[response.get(1)]),
+ result += (response.get(2,0)),
+ return result
+ def ValidatePassword(
+ self,
+ username,
+ password
+ ):
+ request = XCallRequest("ZR\000G",0,71)
+ request.AddParm('S',1,username)
+ request.AddParm('S',2,password)
+ response = self.transport.Xcall(request)
+ result = SkyLib.VALIDATERESULT[response.get(1)]
+ return result
+ def SetApplicationToken(
+ self,
+ applicationToken
+ ):
+ request = XCallRequest("ZR\000\201\001",0,129)
+ request.AddParm('S',1,applicationToken)
+ response = self.transport.Xcall(request)
+ def GetStr(
+ self,
+ key
+ ):
+ request = XCallRequest("ZR\000x",0,120)
+ request.AddParm('S',1,key)
+ response = self.transport.Xcall(request)
+ result = response.get(1,'')
+ return result
+ def GetInt(
+ self,
+ key
+ ):
+ request = XCallRequest("ZR\000y",0,121)
+ request.AddParm('S',1,key)
+ response = self.transport.Xcall(request)
+ result = response.get(1,0)
+ return result
+ def GetBin(
+ self,
+ key
+ ):
+ request = XCallRequest("ZR\000z",0,122)
+ request.AddParm('S',1,key)
+ response = self.transport.Xcall(request)
+ result = response.get(1,'')
+ return result
+ def SetStr(
+ self,
+ key,
+ value
+ ):
+ request = XCallRequest("ZR\000{",0,123)
+ request.AddParm('S',1,key)
+ request.AddParm('S',2,value)
+ response = self.transport.Xcall(request)
+ def SetInt(
+ self,
+ key,
+ value
+ ):
+ request = XCallRequest("ZR\000|",0,124)
+ request.AddParm('S',1,key)
+ request.AddParm('i',2,value)
+ response = self.transport.Xcall(request)
+ def SetBin(
+ self,
+ key,
+ value
+ ):
+ request = XCallRequest("ZR\000}",0,125)
+ request.AddParm('S',1,key)
+ request.AddParm('B',2,value)
+ response = self.transport.Xcall(request)
+ def IsDefined(
+ self,
+ key
+ ):
+ request = XCallRequest("ZR\000~",0,126)
+ request.AddParm('S',1,key)
+ response = self.transport.Xcall(request)
+ result = response.get(1,False)
+ return result
+ def Delete(
+ self,
+ key
+ ):
+ request = XCallRequest("ZR\000\177",0,127)
+ request.AddParm('S',1,key)
+ response = self.transport.Xcall(request)
+ def GetSubKeys(
+ self,
+ key
+ ):
+ request = XCallRequest("ZR\000\200\001",0,128)
+ request.AddParm('S',1,key)
+ response = self.transport.Xcall(request)
+ result = response.get(1,[])
+ return result
+ def GetISOLanguageInfo(self):
+ request = XCallRequest("ZR\000\317\001",0,207)
+ response = self.transport.Xcall(request)
+ result = (response.get(1,[])),
+ result += (response.get(2,[])),
+ return result
+ def GetISOCountryInfo(self):
+ request = XCallRequest("ZR\000\320\001",0,208)
+ response = self.transport.Xcall(request)
+ result = (response.get(1,[])),
+ result += (response.get(2,[])),
+ result += (response.get(3,[])),
+ result += (response.get(4,[])),
+ return result
+ def GetISOCountryCodebyPhoneNo(
+ self,
+ number
+ ):
+ request = XCallRequest("ZR\000\323\001",0,211)
+ request.AddParm('S',1,number)
+ response = self.transport.Xcall(request)
+ result = response.get(1,'')
+ return result
+
+def GetSkyLib(has_event_thread = True, host = '127.0.0.1', port = 8963, logging_level = logging.NOTSET, logging_file = LOG_FILENAME,logtransport=False):
+ return SkyLib(SkypeKit(has_event_thread, host, port, logging_level, logging_file, "SKYPEKIT[19.943 19.942 19.951]",logtransport))
diff --git a/digsby/devplugins/skype/__init__.py b/digsby/devplugins/skype/__init__.py
new file mode 100644
index 0000000..a8fad7d
--- /dev/null
+++ b/digsby/devplugins/skype/__init__.py
@@ -0,0 +1,2 @@
+#__LICENSE_GOES_HERE__
+
diff --git a/digsby/devplugins/skype/info.yaml b/digsby/devplugins/skype/info.yaml
new file mode 100644
index 0000000..3f4ede2
--- /dev/null
+++ b/digsby/devplugins/skype/info.yaml
@@ -0,0 +1,17 @@
+name: "Skype IM"
+name_truncated: "skyp"
+popularity: 0
+path: skype.skylibprotocol.SkyLibProtocol
+username_desc: "Skype Identity"
+form: im
+type: im
+whitelist_opts: ['has_added_friends']
+
+skin:
+ serviceicons:
+ skype: "res/skype.png"
+
+defaults:
+ autologin: no
+
+hostport: no
diff --git a/digsby/devplugins/skype/res/skype.png b/digsby/devplugins/skype/res/skype.png
new file mode 100644
index 0000000..f8aac44
Binary files /dev/null and b/digsby/devplugins/skype/res/skype.png differ
diff --git a/digsby/devplugins/skype/res/svn-U4ZhBV b/digsby/devplugins/skype/res/svn-U4ZhBV
new file mode 100644
index 0000000..fd49ad2
Binary files /dev/null and b/digsby/devplugins/skype/res/svn-U4ZhBV differ
diff --git a/digsby/devplugins/skype/res/windows-x86-skypekit.exe b/digsby/devplugins/skype/res/windows-x86-skypekit.exe
new file mode 100644
index 0000000..fe02c74
Binary files /dev/null and b/digsby/devplugins/skype/res/windows-x86-skypekit.exe differ
diff --git a/digsby/devplugins/skype/skylibchat.py b/digsby/devplugins/skype/skylibchat.py
new file mode 100644
index 0000000..8691161
--- /dev/null
+++ b/digsby/devplugins/skype/skylibchat.py
@@ -0,0 +1,66 @@
+#__LICENSE_GOES_HERE__
+
+'''
+http://developer.skype.com/skypekit/development-guide/conversation-class-overview
+'''
+
+
+import common
+import skylibprotocol
+from util.callbacks import callsback
+from util.primitives.fmtstr import fmtstr
+
+class SkyLibConversation(common.Conversation):
+ ischat = False
+
+ def __init__(self, protocol, buddy):
+ buddies = [buddy]
+ if not buddies or not all(isinstance(buddy, skylibprotocol.SkypeBuddy)
+ for buddy in buddies):
+ raise TypeError
+ super(SkyLibConversation, self).__init__(protocol)
+ self.c = buddy.skycontact.OpenConversation()
+ self.c.OnMessage = self.OnMessage
+ self.buddy_to = buddy
+
+ def OnMessage(self, message):
+ self.message = message
+ if message.type == 'POSTED_TEXT':
+ if message.author != self.protocol.self_buddy.name:
+ self.buddy_says(self.protocol.get_buddy(message.author),
+ message.body_xml,
+ content_type='text/xml')
+
+ @property
+ def name(self):
+ return self.buddy.name
+
+ @property
+ def self_buddy(self):
+ return self.protocol.self_buddy
+
+ @property
+ def buddy(self):
+ return self.buddy_to
+
+ @callsback
+ def _send_message(self, message, auto = False, callback=None, **opts):
+ assert isinstance(message, fmtstr)
+ self.c.PostText(message.format_as('xhtml'), True)
+
+ def send_typing_status(self, status):
+ return
+
+ def buddy_join(self, buddy):
+ if buddy not in self.room_list:
+ self.room_list.append(buddy)
+ self.typing_status[buddy] = None
+
+ @property
+ def id(self):
+ return self.buddy_to
+
+ def exit(self):
+ self.c.RemoveFromInbox()
+ self.protocol.conversations.pop(self.id, None)
+ super(SkyLibConversation, self).exit()
diff --git a/digsby/devplugins/skype/skylibdriver.py b/digsby/devplugins/skype/skylibdriver.py
new file mode 100644
index 0000000..2217c6e
--- /dev/null
+++ b/digsby/devplugins/skype/skylibdriver.py
@@ -0,0 +1,21 @@
+#__LICENSE_GOES_HERE__
+
+import gui.native
+import path
+import subprocess
+
+__all__ = ['start']
+
+PROCNAME = u'windows-x86-skypekit.exe'
+
+#HAX: replace with real process management, ports, etc.
+def start(protocol = None):
+ if PROCNAME not in gui.native.process.process_list():
+ # don't show a console window for the skype process.
+ startupinfo = subprocess.STARTUPINFO()
+ startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
+ startupinfo.wShowWindow = subprocess.SW_HIDE
+
+ subprocess.Popen(path.path(__file__).dirname() /
+ 'res' / PROCNAME, startupinfo=startupinfo)
+ return 8963
diff --git a/digsby/devplugins/skype/skylibprotocol.py b/digsby/devplugins/skype/skylibprotocol.py
new file mode 100644
index 0000000..141f624
--- /dev/null
+++ b/digsby/devplugins/skype/skylibprotocol.py
@@ -0,0 +1,256 @@
+#__LICENSE_GOES_HERE__
+
+import common
+import logging
+from skypekit import SkypeKit
+import SkyLib
+from contacts import Group, Contact
+from util.observe import observable_dict
+from common.Protocol import OfflineReason
+from common.Buddy import Buddy
+from .skylibchat import SkyLibConversation
+
+APP_TOKEN = ''.join('''
+AAAgBobH4q2OPAaCX6vWseC82MmHZ1Cpayj61rbYlh0uenHxFByJ/lLu9HSN5nT3TjS91/2RQMAS
+lCmZUCM5zINkR3nQ1240JpB0yNfYfzxXm8EyE9p9gWAGU7spUMvuROxoQR0042VUR4dCRW/kYr3y
+eYiYOXW0poxxwg+esEbX8W1tqing25kfjUVsij6+T+dxtV8t/B1yGpTiT1okj9FoBvZgnwDoEGEy
+wG5xeJTGLuFtHGALqa7gwvj9rulf7TuM1Q==
+'''.split())
+
+def GetSkypeKit(port):
+ kit = SkypeKit(has_event_thread = True, host = '127.0.0.1',
+ port = port, logging_level = logging.NOTSET, logtransport = False)
+ kit.logger = logging.getLogger('SkypeKitLogger')
+ kit.logger.setLevel(logging.INFO)
+ return kit
+
+libs = {}
+
+def GetSkyLib(port):
+ global libs
+ if port in libs:
+ return libs[port]
+ lib = SkyLib.SkyLib(GetSkypeKit(port))
+ lib.SetApplicationToken(APP_TOKEN)
+ libs[port] = lib
+ return lib
+
+class SkyLibOfflineReasons(OfflineReason):
+ pass
+
+DIGSBY_REASON_MAP = {
+ 'LOGOUT_CALLED' : 'NONE',
+ 'HTTPS_PROXY_AUTH_FAILED' : 'CONN_FAIL',
+ 'SOCKS_PROXY_AUTH_FAILED' : 'CONN_FAIL',
+ 'P2P_CONNECT_FAILED' : 'CONN_FAIL',
+ 'SERVER_CONNECT_FAILED' : 'CONN_FAIL',
+ 'SERVER_OVERLOADED' : 'CONN_LOST',
+ 'DB_IN_USE' : 'CONN_FAIL',
+ 'INVALID_SKYPENAME' : 'BAD_PASSWORD',
+ 'INVALID_EMAIL' : 'BAD_PASSWORD',
+ 'UNACCEPTABLE_PASSWORD' : 'BAD_PASSWORD',
+ 'SKYPENAME_TAKEN' : 'BAD_PASSWORD',
+ 'REJECTED_AS_UNDERAGE' : 'BAD_PASSWORD',
+ 'NO_SUCH_IDENTITY' : 'BAD_PASSWORD',
+ 'INCORRECT_PASSWORD' : 'BAD_PASSWORD',
+ 'TOO_MANY_LOGIN_ATTEMPTS' : 'RATE_LIMIT',
+ 'PASSWORD_HAS_CHANGED' : 'BAD_PASSWORD',
+ 'PERIODIC_UIC_UPDATE_FAILED' : 'CONN_LOST',
+ 'DB_DISK_FULL' : 'CONN_FAIL',
+ 'DB_IO_ERROR' : 'CONN_FAIL',
+ 'DB_CORRUPT' : 'CONN_FAIL',
+ 'DB_FAILURE' : 'CONN_FAIL',
+ 'INVALID_APP_ID' : 'CONN_FAIL',
+ 'APP_ID_BLACKLISTED' : 'CONN_FAIL',
+ 'UNSUPPORTED_VERSION' : 'CONN_FAIL',
+ }
+
+for key in SkyLib.Account.LOGOUTREASON:
+ if isinstance(key, bytes):
+ setattr(SkyLibOfflineReasons, key, key)
+ for k,v in DIGSBY_REASON_MAP.items():
+ setattr(SkyLibOfflineReasons, k, getattr(OfflineReason, v))
+
+class SkyLibProtocol(common.protocol):
+ name = service = protocol = 'skype'
+ Reasons = SkyLibOfflineReasons
+
+ @property
+ def caps(self):
+ from common import caps
+ return [caps.INFO, caps.IM]
+
+ def set_buddy_icon(self, *a, **k):
+ pass
+
+ def __init__(self, username, password, msgHub, server=None,
+ login_as='online', *a, **k):
+ super(SkyLibProtocol, self).__init__(username, password, msgHub)
+ self.skylib = None
+ self.skyacct = None
+ self.root_group = Group('Root', self, 'Root')
+ self.buddies = observable_dict()
+ self.conversations = observable_dict()
+
+ def Connect(self, invisible=False):
+ import skylibdriver
+ port = skylibdriver.start(self)
+ import time; time.sleep(2)
+ self.skylib = GetSkyLib(port)
+ self.skyacct = self.skylib.GetAccount(self.username)
+ self.skyacct.OnPropertyChange = self.OnPropertyChange
+ self.skyacct.LoginWithPassword(self.password, False, False)
+
+ def OnConversationListChange(self, conversation, type, added):
+ if type != 'DIALOG':
+ return
+ if not added:
+ return
+ for p in conversation.GetParticipants():
+ b = self.get_buddy(p.identity)
+ if b is not self.self_buddy and b not in self.conversations:
+ convo = self.conversations.setdefault(b,
+ SkyLibConversation(self, b))
+ convo.buddy_join(self.self_buddy)
+ convo.buddy_join(b)
+
+ def OnPropertyChange(self, prop):
+ print self, prop, getattr(self.skyacct, prop)
+ if prop == 'status' and self.skyacct.status in ('LOGGED_IN', 7):
+ self.change_state(self.Statuses.LOADING_CONTACT_LIST)
+ self.self_buddy = SkypeBuddy(self.skylib.GetContact(
+ self.skyacct.skypename), self)
+ d = {self.self_buddy.name: self.self_buddy}
+ g = []
+ for c in self.skylib.GetHardwiredContactGroup('SKYPE_BUDDIES').GetContacts():
+ b = SkypeBuddy(c, self)
+ d[b.name] = b
+ g.append(Contact(b, b.name))
+ self.buddies.update(d)
+ with self.root_group.frozen():
+ self.root_group[:] = g
+ self.cs = []
+ for c in self.skylib.GetConversationList('ALL_CONVERSATIONS'):
+ c.OnMessage = self.a_message
+ self.cs.append(c)
+ self.change_state(self.Statuses.ONLINE)
+ if prop == 'status' and self.skyacct.status == 'LOGGED_OUT':
+ print self.skyacct.logoutreason
+ self.set_offline(getattr(self.Reasons, self.skyacct.logoutreason))
+
+ def Disconnect(self):
+ self.skyacct.Logout(True)
+ super(SkyLibProtocol, self).Disconnect()
+
+ def get_buddy(self, name):
+ return self.buddies[name]
+
+ def convo_for(self, buddy):
+ if not isinstance(buddy, SkypeBuddy):
+ buddy = buddy.buddy
+ if buddy in self.conversations:
+ convo = self.conversations[buddy]
+ else:
+ convo = self.conversations.setdefault(buddy,
+ SkyLibConversation(self, buddy))
+ convo.buddy_join(self.self_buddy)
+ convo.buddy_join(buddy)
+ return convo
+
+ def set_invisible(self, invisible):
+ self.invisible = invisible
+ self.set_message(None, 'invisible')
+
+ def set_message(self, message, status, format = None, default_status='away'):
+# state = self.status_state_map.get(status.lower(), default_status)
+ if status.lower() == 'away':
+ a = 'AWAY'
+ else:
+ a = 'ONLINE'
+ if getattr(self, 'invisible', False):
+ a = 'INVISIBLE'
+ self.skyacct.SetAvailability(a)
+ if message is not None:
+ self.skyacct.SetStrProperty('mood_text', message)
+
+ def a_message(self, message):
+ print message
+# if message.type != 'POSTED_TEXT':
+# return
+ buddy = self.get_buddy(message.author)
+ assert buddy not in self.conversations
+ convo = self.convo_for(buddy)
+ convo.OnMessage(message)
+
+DIGSBY_AVAILABLE_MAP = {
+ 'UNKNOWN' : 'unknown',
+ 'PENDINGAUTH' : 'unknown',
+ 'BLOCKED' : 'unknown',
+ 'BLOCKED_SKYPEOUT' : 'unknown',
+ 'SKYPEOUT' : 'available',
+ 'OFFLINE' : 'offline',
+ 'OFFLINE_BUT_VM_ABLE' : 'offline',
+ 'OFFLINE_BUT_CF_ABLE' : 'offline',
+ 'ONLINE' : 'available',
+ 'AWAY' : 'away',
+ 'NOT_AVAILABLE' : 'away',
+ 'DO_NOT_DISTURB' : 'away',
+ 'SKYPE_ME' : 'available',
+ 'INVISIBLE' : 'invisible',
+ 'CONNECTING' : 'available',
+ 'ONLINE_FROM_MOBILE' : 'available',
+ 'AWAY_FROM_MOBILE' : 'away',
+ 'NOT_AVAILABLE_FROM_MOBILE' : 'away',
+ 'DO_NOT_DISTURB_FROM_MOBILE' : 'away',
+ 'SKYPE_ME_FROM_MOBILE' : 'available',
+ }
+
+class SkypeContact(Contact):
+ pass
+
+class SkypeBuddy(Buddy):
+ service = 'skype'
+
+ def __init__(self, skylib_contact, protocol):
+ self.skycontact = skylib_contact
+ self.skycontact.OnPropertyChange = self.OnPropertyChange
+ self._status_message = None
+ super(SkypeBuddy, self).__init__(self.skycontact.skypename, protocol)
+
+ def OnPropertyChange(self, prop):
+ if prop == 'availability':
+ self.notify('status')
+
+ @property
+ def status(self):
+ return DIGSBY_AVAILABLE_MAP[self.skycontact.availability]
+
+ @property
+ def status_message(self):
+ if self._status_message is not None:
+ return self._status_message
+ return self.skycontact.mood_text or ''
+
+ @status_message.setter
+ def status_message(self, val):
+ self._status_message = val
+
+ @property
+ def idle(self):
+ return False
+
+ @property
+ def online(self):
+ return self.status not in ('offline', 'unknown')
+
+ @property
+ def mobile(self):
+ return 'MOBILE' in self.skycontact.availability
+
+ @property
+ def away(self):
+ return self.status == 'away'
+
+ @property
+ def blocked(self):
+ return 'BLOCKED' in self.skycontact.availability
diff --git a/digsby/devplugins/skype/skypekit.py b/digsby/devplugins/skype/skypekit.py
new file mode 100644
index 0000000..d6d6534
--- /dev/null
+++ b/digsby/devplugins/skype/skypekit.py
@@ -0,0 +1,633 @@
+#!/usr/bin/python
+#__LICENSE_GOES_HERE__
+
+import Queue
+import array
+from collections import deque
+import socket
+import sys
+import weakref
+import threading
+from new import instancemethod
+import glob
+import logging
+import logging.handlers
+import time
+
+class StatLogger:
+ def __init__(self):
+ self.log = open("pyskypekit.stats", "w")
+ def CreateObj(self, modid, oid):
+ self.log.write('CreateObj(%f,%d,%d)\n' % (time.time(), modid, oid))
+ def ReachObj(self, modid, oid, hit, reached_from):
+ self.log.write('ReachObj(%f,%d,%d,%s,"%s")\n' % (time.time(), modid, oid, hit, reached_from))
+ def ReachProp(self, modid, oid, propid, hit, reached_from):
+ self.log.write('ReachProp(%f,%d,%d,%d,%s,"%s")\n' % (time.time(), modid, oid, propid, hit, reached_from))
+ def XcallBegin(self, mid, method, rid, oid):
+ self.log.write('XcallBegin(%f,%d,%d,%d,%d)\n' % (time.time(), mid, method, rid, oid))
+ def XcallEnd(self, rid):
+ self.log.write('XcallEnd(%f,%d)\n' % (time.time(), rid))
+ def Event(self, mid, method, oid, dispatched):
+ self.log.write('DispatchEvent(%f,%d,%d,%d)\n' % (time.time(), mid, method, oid))
+stat_logger = None #StatLogger()
+
+LOG_FILENAME = 'pyskypekit.out'
+
+''' Protocol error.
+'''
+class Error(Exception):
+ def __init__(self, msg):
+ self.msg = msg
+
+ def __str__(self):
+ return self.msg
+
+class ConnectionClosed(Error):
+ def __init__(self):
+ Error.__init__(self, "Connection closed")
+
+class ResponseError(Error):
+ def __init__(self):
+ Error.__init__(self, "response error (either invalid in parameters for the call or call isn't allowed or call failed")
+
+
+class InvalidObjectIdError(Error):
+ def __init__(self):
+ Error.__init__(self, "object id is 0")
+
+module_id2classes = { }
+
+class ScopedLock(object):
+ def __init__(self, mutex):
+ self.mutex = mutex
+ self.mutex.acquire();
+ def __del__(self):
+ self.mutex.release();
+
+class Cached(object):
+ '''Base class for all cached objects.
+
+ Every object is identified by an Id specified as first parameter of the constructor.
+ Trying to create two objects with same Id yields the same object. Uses weak references
+ to allow the objects to be deleted normally.
+
+ @warning: C{__init__()} is always called, don't use it to prevent initializing an already
+ initialized object. Use C{_Init()} instead, it is called only once.
+ '''
+ _lock_ = threading.Lock()
+ _cache_ = weakref.WeakValueDictionary()
+ def __new__(cls, Id, *args, **kwargs):
+ if Id == 0: return False # invalid id, still return something not to shift parameters
+ sl = ScopedLock(cls._lock_)
+ h = cls, Id
+ hit = True
+ o = None
+ try:
+ o = cls._cache_[h]
+ except KeyError:
+ #stat_logger.CreateObj(cls.module_id, Id)
+ o = object.__new__(cls)
+ h = cls, Id
+ cls._cache_[h] = o
+ if hasattr(o, '_Init'):
+ o._Init(Id, *args, **kwargs)
+ return o
+ @staticmethod
+ def exists(cls, Id, src):
+ if Id == 0: return None # invalid id
+ sl = ScopedLock(cls._lock_)
+ h = cls, Id
+ try:
+ return cls._cache_[h]
+ except KeyError:
+ return None
+ def __copy__(self):
+ return self
+
+class Object(Cached):
+ rwlock = threading.Lock()
+ def _Init(self, object_id, transport):
+ self.transport = transport
+ self.object_id = object_id
+ self.properties= {}
+ if transport.logger: transport.logger.info('INSTANTIATING mod=%d oid=%d' % (self.module_id,object_id))
+ ''' Retrieve given property id.
+ '''
+ def _Property(self, header, prop_id, cached):
+ hit = cached #True
+ val = 0
+ try:
+ self.rwlock.acquire()
+ if hit: val = self.properties[prop_id]
+ self.rwlock.release()
+ except KeyError:
+ self.rwlock.release()
+ hit=False
+ if not hit:
+ val = self.transport.Get(GetRequest(header, self.object_id))
+ #stat_logger.ReachProp(self.module_id, self.object_id, prop_id, hit, 'Get')
+ return val
+ def _propkey(self, propname, t):
+ for p,l in self.propid2label.items():
+ # don't set the property value, as it shall be notified by a property change event
+ if l == propname:
+ if p in self.properties: del self.properties[p] # clean it...
+ return p*4+t
+ return None
+ def multiget(self, header):
+ self.transport.Get(GetRequest(header, self.object_id))
+''' Connection class that implements Skype IPC.
+'''
+class SkypeKit:
+ decoders={}
+
+ class EventDispatcher(threading.Thread):
+ def __init__(self, connection):
+ self.connection = connection
+ threading.Thread.__init__(self)
+ self.setName('event thread')
+ def run(self):
+ try:
+ self.connection.EventThread()
+ except:
+ self.connection.Stop()
+ raise
+
+ class ResponseListener(threading.Thread):
+ def __init__(self, connection):
+ self.connection = connection
+ threading.Thread.__init__(self)
+ self.setName('responser listener thread')
+ def run(self):
+ try:
+ self.connection.Start()
+ except:
+ self.connection.Stop()
+ raise
+
+ def __init__(self, has_event_thread = True, host = '127.0.0.1', port = 8963, logging_level = logging.NOTSET, logging_file = LOG_FILENAME, noncacheable = 'z', logtransport=False):
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, True)
+ sock.settimeout(30.5)
+ self.pending_requests = {}
+ self.pending_gets = deque()
+ self.pending_lock = threading.Lock()
+ self.encoding_lock = threading.Lock()
+ self.decoded = threading.Event()
+ self.event_queue = Queue.Queue()
+ self.inlog = False
+ self.outlog = False
+ if logtransport:
+ try:
+ self.inlog = open(logtransport+'_log_in.1', 'wb')
+ except IOError:
+ self.inlog = False
+ try:
+ self.outlog = open(logtransport+'_log_out.1', 'wb')
+ except IOError:
+ self.outlog = False
+ self.logger = False
+ if logging_level != logging.NOTSET:
+ self.logger = logging.getLogger('SkypeKitLogger')
+ self.logger.setLevel(logging_level)
+ handler = logging.handlers.RotatingFileHandler(logging_file, maxBytes=2**29, backupCount=5)
+ self.logger.addHandler(handler)
+ self.stopped = False
+ self.socket = sock
+ retry = 3
+ while retry > 0:
+ try:
+ sock.connect((host, port))
+ retry = -1
+ except:
+ retry = retry - 1
+ if retry == 0:
+ raise
+ time.sleep(5)
+ self.read_buffer = ''
+ sock.sendall('z')
+ if has_event_thread:
+ self.event_dispatcher = SkypeKit.EventDispatcher(self)
+ self.event_dispatcher.start()
+ self.listener = SkypeKit.ResponseListener(self)
+ self.listener.start()
+
+ def setRoot(self, root): self.root = root
+
+ def __del__(self):
+ if self.socket != None:
+ self.socket.close()
+ if self.inlog: self.inlog.close()
+ if self.outlog: self.outlog.close()
+
+ def ReadByte(self, num_bytes_to_read = 1, timeout = True):
+ def isprint(c):
+ if ord(c) >= 32 and ord(c) <= 127: return c
+ return ' '
+ result = self.read_buffer
+ while not self.stopped and len(result) < num_bytes_to_read:
+ try:
+ read = self.socket.recv(4096)
+ if not read:
+ self.Stop()
+ raise ConnectionClosed
+ result += read
+ if self.inlog:
+ try:
+ self.inlog.write(read)
+ except IOError:
+ self.inlog.close()
+ self.inlog = False
+ except socket.timeout:
+ pass # retry always: if connection is closed we will see it at next read
+ except:
+ self.Stop()
+ raise
+ if self.stopped: return None
+ self.read_buffer = result[num_bytes_to_read:]
+ result = result[:num_bytes_to_read]
+ if self.logger:
+ if len(result) == 1:
+ self.logger.debug('reading %s %3d %2x' % (isprint(result), ord(result), ord(result)))
+ else:
+ self.logger.debug('reading %3d bytes ' % (len(result)))
+ return result
+
+ def EventThread(self):
+ while True:
+ e = self.event_queue.get()
+ if self.stopped: return
+ e.dispatch()
+
+ def DispatchEvent(self):
+ while not self.event_queue.empty():
+ e = self.event_queue.get()
+ if self.stopped: return
+ e.dispatch()
+
+ def Xcall(self, request):
+ ev = threading.Event()
+ self.encoding_lock.acquire()
+ self.pending_lock.acquire()
+ self.pending_requests[request.rid] = ev
+ self.pending_lock.release()
+ if self.logger: self.logger.info('CALLING mod=%d mid=%d rid=%d' % (request.module_id, request.method_id, request.rid))
+ #stat_logger.XcallBegin(request.module_id, request.method_id, request.rid, request.oid)
+ rq = request.Send()
+ self.socket.sendall(rq)
+ if self.outlog:
+ try:
+ self.outlog.write(rq)
+ except IOError:
+ self.outlog.close()
+ self.outlog = False
+ self.encoding_lock.release()
+ ev.wait() # no need to clear: one shot
+ if self.stopped: raise ConnectionClosed()
+ response = self.decode_parms()
+ #stat_logger.XcallEnd(request.rid)
+ return response
+
+ def multiget(self, header, objects):
+ if len(objects) > 0: self.Get(MultiGetRequest(header, objects))
+
+ def Get(self, request):
+ ev = threading.Event()
+ self.encoding_lock.acquire()
+ self.pending_lock.acquire()
+ self.pending_gets.append(ev)
+ self.pending_lock.release()
+ rq = request.Send()
+ self.socket.sendall(rq)
+ if self.outlog:
+ try:
+ self.outlog.write(rq)
+ except IOError:
+ self.outlog.close()
+ self.outlog = False
+ self.encoding_lock.release() # wait until response is here
+ ev.wait()
+ if self.stopped: raise ConnectionClosed()
+ # process the response with patching the instances...
+ response = None
+ mresponse = {}
+ continue_sign = ','
+ count = 0
+ while continue_sign == ',':
+ modid = self.decode_varuint() # modid
+ while continue_sign == ',':
+ oid = self.decode_varuint() # oid
+ o = module_id2classes[modid](oid,self)
+ if not o in mresponse: mresponse[o] = {}
+ kind = self.ReadByte()
+ while kind != ']':
+ propid = self.decode_varuint() # propid
+ if kind != 'N':
+ response = self.decoders[kind](self)
+ mresponse[o][propid] = response
+ o.rwlock.acquire()
+ o.properties[propid] = response
+ o.rwlock.release()
+ count = count + 1
+ kind = self.ReadByte() # ] finish the list
+ if kind != ']': raise ResponseError()
+ continue_sign = self.ReadByte()
+ if continue_sign != ']': raise ResponseError()
+ continue_sign = self.ReadByte()
+ if continue_sign != ']': raise ResponseError()
+ if self.ReadByte() != 'z': raise ResponseError()
+ self.decoded.set()
+ if count > 1: response = mresponse
+ return response
+
+ def GetResponse(self):
+ self.pending_lock.acquire()
+ self.pending_gets.popleft().set()
+ self.pending_lock.release()
+ decoders['g'] = GetResponse
+
+ def decode_varuint(self):
+ shift = 0
+ result = 0
+ while 1:
+ value = ord(self.ReadByte()) & 0xff
+ result = result | ((value & 0x7f) << shift)
+ shift = shift + 7
+ if not (value & 0x80): break
+ return result
+ decoders['u'] = decode_varuint
+ decoders['O'] = decode_varuint
+ decoders['e'] = decode_varuint
+
+ def decode_varint(self):
+ value = self.decode_varuint()
+ if not value & 0x1:
+ return value >> 1
+ return (value >> 1) ^ (~0)
+ decoders['i'] = decode_varint
+
+ def decode_true(self):
+ return True
+ decoders['T'] = decode_true
+
+ def decode_false(self):
+ return False
+ decoders['F'] = decode_false
+
+ def decode_list(self):
+ l = []
+ while True:
+ b = self.ReadByte()
+ if b == ']': return l
+ m = self.decoders[b]
+ if m: l.append(m(self))
+ decoders['['] = decode_list
+
+ def decode_binary(self):
+ length = self.decode_varuint()
+ v = ''
+ if length>0:
+ v = self.ReadByte(length)
+ return v
+
+ def decode_string(self):
+ s = self.decode_binary()
+ return s.decode('utf-8')
+ decoders['f'] = decode_string
+ decoders['B'] = decode_binary
+ decoders['S'] = decode_string
+ decoders['X'] = decode_string
+
+ class Parms(dict):
+ def get(self, index, defval = None):
+ try:
+ return self[index]
+ except:
+ if defval == None: defval = 0
+ return defval
+
+ def decode_parms(self):
+ parms = self.Parms()
+ m = True
+ while m != None:
+ b = self.ReadByte()
+ if self.stopped or b == 'z': break
+ if b != 'N':
+ m = self.decoders[b]
+ tag = self.decode_varuint()
+ if m: parms[tag] = m(self)
+ else:
+ #print "response error ", self.ReadByte() # shall be z
+ self.decoded.set()
+ raise ResponseError
+ self.decoded.set()
+ return parms
+
+ class Event(object):
+ def __init__(self, transport):
+ self.module_id = transport.decode_varuint()
+ self.target = transport.root
+ self.event_id = transport.decode_varuint()
+ self.transport = transport
+ self.parms = transport.decode_parms()
+ def dispatch(self):
+ target = self.target
+ if self.module_id != 0:
+ target = Cached.exists(module_id2classes[self.module_id],self.parms[0], 'Event')
+ if target == None:
+ if self.transport.logger: self.transport.logger.debug('IGNORE EVENT mod=%d ev=%d oid=%d' % (self.module_id,self.event_id,self.parms[0]))
+ return
+ #else:
+ # stat_logger.ReachObj(0, 0, True, 'Event')
+ if self.transport.logger: self.transport.logger.info('DISPATCH EVENT mod=%d ev=%d oid=%d' % (self.module_id,self.event_id,target.object_id))
+ getattr(target,target.event_handlers[self.event_id])(self.parms)
+
+ def decode_event(self):
+ # push the event in the event queue
+ self.event_queue.put(SkypeKit.Event(self))
+ decoders['E'] = decode_event
+
+ class PropertyChange(object):
+ def __init__(self, transport):
+ self.logger = transport.logger
+ self.transport = transport
+ self.modid = transport.decode_varuint()
+ self.oid = transport.decode_varuint() # obj id
+ kind = transport.ReadByte() # prop kind
+ self.propid = transport.decode_varuint() # prop id
+ if kind != 'N': self.val = transport.decoders[kind](transport)
+ transport.ReadByte(4) # ]]]z
+ transport.decoded.set()
+ def dispatch(self):
+ o = Cached.exists(module_id2classes[self.modid],self.oid, 'PropertyChangeEvent')
+ if o == None:
+ if self.logger: self.logger.debug('IGNORE CHANGE PROPERTY mod=%d oid=%d prop=%d' % (self.modid, self.oid, self.propid))
+ return
+ try:
+ propname = o.propid2label[self.propid]
+ except KeyError:
+ return
+ o.rwlock.acquire()
+ o.properties[self.propid] = self.val
+ o.rwlock.release()
+ if self.logger: self.logger.info('CHANGED PROPERTY mod=%d oid=%d prop=%s' % (self.modid, self.oid, propname))
+ #stat_logger.ReachProp(self.modid, self.oid, self.propid, self.propid in o.properties, 'PropertyChangeEvent')
+ print o,'.OnPropertyChange(',propname,'): ',repr(self.val)
+ o.OnPropertyChange(propname)
+
+ def decode_property_change(self):
+ # push the event in the event queue
+ self.event_queue.put(SkypeKit.PropertyChange(self))
+ decoders['C'] = decode_property_change
+
+ def XCallResponse(self):
+ rid = self.decode_varuint()
+ self.pending_lock.acquire()
+ ev = self.pending_requests[rid]
+ del self.pending_requests[rid]
+ self.pending_lock.release()
+ ev.set()
+ decoders['r'] = XCallResponse
+
+ def Start(self):
+ while not self.stopped:
+ if self.ReadByte(1,False) == 'Z':
+ if self.stopped: return
+ cmd = self.ReadByte()
+ if self.stopped: return
+ if self.logger: self.logger.debug('Processing %c' % cmd)
+ m = self.decoders[cmd]
+ if m:
+ m(self)
+ self.decoded.wait()
+ self.decoded.clear() # shall be done immediatly after set?
+ if self.logger: self.logger.debug('Done processing %c' % cmd)
+
+ def Stop(self):
+ if not self.stopped:
+ self.stopped = True
+ if self.logger: self.logger.info('stopping...')
+ self.decoded.set() # ensure that Listener thread resumes
+ self.event_queue.put({}) # ensure that event thread resumes
+ for e in self.pending_gets: e.set()
+ for k in self.pending_requests: self.pending_requests[k].set()
+ if self.socket:
+ self.socket.close()
+ self.socket = None
+
+
+class Request:
+ def __init__(self):
+ self.tokens = array.array('B')
+ #self.tokens.append(ord('Z'))
+ def Send(self):
+ tok = self.tokens
+ tok.append(ord('z'))
+ self.tokens = None
+ return tok
+ encoders = { }
+
+ def encode_varint(self, number):
+ if number >= 0: number = number << 1
+ else: number = (number << 1) ^ (~0)
+ self.encode_varuint(number)
+ encoders['i'] = encode_varint
+
+ def encode_varuint(self, number):
+ tok = self.tokens
+ while 1:
+ towrite = number & 0x7f
+ number = number >> 7
+ if number == 0:
+ tok.append(towrite)
+ break
+ tok.append(0x80|towrite)
+ encoders['u'] = encode_varuint
+ encoders['e'] = encode_varuint
+ encoders['o'] = encode_varuint
+
+ def encode_objectid(self, val):
+ self.encode_varuint(val.object_id)
+ encoders['O'] = encode_objectid
+
+ def encode_string(self, val):
+ tok = self.tokens
+ if isinstance(val, unicode):
+ val=val.encode('utf-8')
+ length = len(val)
+ self.encode_varuint(length)
+ if length>0:
+ tok.fromstring(val)
+ encoders['S'] = encode_string
+ encoders['X'] = encode_string
+ encoders['f'] = encode_string
+ encoders['B'] = encode_string
+
+ def AddParm(self, kind, tag, val):
+ tok = self.tokens
+ if isinstance(val, list):
+ tok.append(ord('['))
+ self.encode_varuint(tag)
+ encoder = self.encoders[kind]
+ for v in val:
+ if kind != 'b':
+ tok.append(ord(kind))
+ encoder(self, v)
+ else:
+ if v: tok.append(ord('T'))
+ else: tok.append(ord('F'))
+ tok.append(ord(']'))
+ elif kind != 'b':
+ tok.append(ord(kind))
+ if tag == 0: self.oid = val.object_id
+ self.encode_varuint(tag)
+ self.encoders[kind](self, val)
+ else:
+ if val: tok.append(ord('T'))
+ else: tok.append(ord('F'))
+ self.encode_varuint(tag)
+ return self
+
+class XCallRequest(Request):
+ __request_id = 0
+ def __init__(self, header, module_id, method_id):
+ Request.__init__(self)
+ self.tokens.fromstring(header)
+ self.module_id = module_id
+ self.method_id = method_id
+ self.oid = 0
+ tok = self.tokens
+ #tok.append(ord('R'))
+ self.rid = XCallRequest.__request_id
+ XCallRequest.__request_id = XCallRequest.__request_id + 1 # mutexed?
+ #self.encode_varuint(module_id)
+ #self.encode_varuint(method_id)
+ self.encode_varuint(self.rid)
+
+class GetRequest(Request):
+ def __init__(self, header, object_id):
+ Request.__init__(self)
+ tok = self.tokens
+ tok.fromstring(header)
+ self.encode_varuint(object_id)
+ tok.fromstring(']]z')
+ def Send(self):
+ tok = self.tokens
+ self.tokens = None
+ return tok
+
+class MultiGetRequest(Request):
+ def __init__(self, header, objects):
+ Request.__init__(self)
+ tok = self.tokens
+ tok.fromstring(header)
+ pref = ''
+ for o in objects:
+ tok.fromstring(pref)
+ self.encode_varuint(o.object_id)
+ pref = ','
+ tok.fromstring(']]z')
+ def Send(self):
+ tok = self.tokens
+ self.tokens = None
+ return tok
diff --git a/digsby/digsby-pylint.rc b/digsby/digsby-pylint.rc
new file mode 100644
index 0000000..04d69cb
--- /dev/null
+++ b/digsby/digsby-pylint.rc
@@ -0,0 +1,309 @@
+# lint Python modules using external checkers.
+#
+# This is the main checker controlling the other ones and the reports
+# generation. It is itself both a raw checker and an astng checker in order
+# to:
+# * handle message activation / deactivation at the module level
+# * handle some basic but necessary stats'data (number of classes, methods...)
+#
+[MASTER]
+
+# Specify a configuration file.
+#rcfile=
+
+# Python code to execute, usually for sys.path manipulation such as
+# pygtk.require().
+#init-hook=
+
+# Profiled execution.
+profile=no
+
+# Add