comparison libpurple/protocols/jabber/jabber.c @ 25713:fa22ec9d1e84

propagate from branch 'im.pidgin.pidgin' (head b79100551ea19cf35ee8952a34a44b97204e75f3) to branch 'im.pidgin.cpw.malu.xmpp.attention' (head f69342263cd52989b48a99f90e368a32d58325db)
author Marcus Lundblad <ml@update.uu.se>
date Thu, 12 Feb 2009 21:49:21 +0000
parents 256fbe98f6be 3c9af6627767
children a1a0293df07f
comparison
equal deleted inserted replaced
25449:fa5987472e00 25713:fa22ec9d1e84
1784 GList *jabber_status_types(PurpleAccount *account) 1784 GList *jabber_status_types(PurpleAccount *account)
1785 { 1785 {
1786 PurpleStatusType *type; 1786 PurpleStatusType *type;
1787 GList *types = NULL; 1787 GList *types = NULL;
1788 PurpleValue *priority_value; 1788 PurpleValue *priority_value;
1789 PurpleValue *buzz_enabled;
1789 1790
1790 priority_value = purple_value_new(PURPLE_TYPE_INT); 1791 priority_value = purple_value_new(PURPLE_TYPE_INT);
1791 purple_value_set_int(priority_value, 1); 1792 purple_value_set_int(priority_value, 1);
1793 buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN);
1794 purple_value_set_boolean(buzz_enabled, TRUE);
1792 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE, 1795 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE,
1793 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_ONLINE), 1796 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_ONLINE),
1794 NULL, TRUE, TRUE, FALSE, 1797 NULL, TRUE, TRUE, FALSE,
1795 "priority", _("Priority"), priority_value, 1798 "priority", _("Priority"), priority_value,
1796 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), 1799 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING),
1797 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), 1800 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING),
1798 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), 1801 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING),
1799 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), 1802 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING),
1800 "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), 1803 "buzz", _("Allow Buzz"), buzz_enabled,
1801 NULL); 1804 NULL);
1802 types = g_list_append(types, type); 1805 types = g_list_append(types, type);
1803 1806
1804 priority_value = purple_value_new(PURPLE_TYPE_INT); 1807 priority_value = purple_value_new(PURPLE_TYPE_INT);
1805 purple_value_set_int(priority_value, 1); 1808 purple_value_set_int(priority_value, 1);
1809 buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN);
1810 purple_value_set_boolean(buzz_enabled, TRUE);
1806 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE, 1811 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE,
1807 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_CHAT), 1812 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_CHAT),
1808 _("Chatty"), TRUE, TRUE, FALSE, 1813 _("Chatty"), TRUE, TRUE, FALSE,
1809 "priority", _("Priority"), priority_value, 1814 "priority", _("Priority"), priority_value,
1810 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), 1815 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING),
1811 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), 1816 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING),
1812 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), 1817 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING),
1813 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), 1818 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING),
1814 "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), 1819 "buzz", _("Allow Buzz"), buzz_enabled,
1815 NULL); 1820 NULL);
1816 types = g_list_append(types, type); 1821 types = g_list_append(types, type);
1817 1822
1818 priority_value = purple_value_new(PURPLE_TYPE_INT); 1823 priority_value = purple_value_new(PURPLE_TYPE_INT);
1819 purple_value_set_int(priority_value, 0); 1824 purple_value_set_int(priority_value, 0);
1825 buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN);
1826 purple_value_set_boolean(buzz_enabled, TRUE);
1820 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AWAY, 1827 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AWAY,
1821 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_AWAY), 1828 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_AWAY),
1822 NULL, TRUE, TRUE, FALSE, 1829 NULL, TRUE, TRUE, FALSE,
1823 "priority", _("Priority"), priority_value, 1830 "priority", _("Priority"), priority_value,
1824 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), 1831 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING),
1825 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), 1832 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING),
1826 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), 1833 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING),
1827 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), 1834 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING),
1828 "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), 1835 "buzz", _("Allow Buzz"), buzz_enabled,
1829 NULL); 1836 NULL);
1830 types = g_list_append(types, type); 1837 types = g_list_append(types, type);
1831 1838
1832 priority_value = purple_value_new(PURPLE_TYPE_INT); 1839 priority_value = purple_value_new(PURPLE_TYPE_INT);
1833 purple_value_set_int(priority_value, 0); 1840 purple_value_set_int(priority_value, 0);
1841 buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN);
1842 purple_value_set_boolean(buzz_enabled, TRUE);
1834 type = purple_status_type_new_with_attrs(PURPLE_STATUS_EXTENDED_AWAY, 1843 type = purple_status_type_new_with_attrs(PURPLE_STATUS_EXTENDED_AWAY,
1835 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_XA), 1844 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_XA),
1836 NULL, TRUE, TRUE, FALSE, 1845 NULL, TRUE, TRUE, FALSE,
1837 "priority", _("Priority"), priority_value, 1846 "priority", _("Priority"), priority_value,
1838 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), 1847 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING),
1839 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), 1848 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING),
1840 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), 1849 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING),
1841 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), 1850 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING),
1842 "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), 1851 "buzz", _("Allow Buzz"), buzz_enabled,
1843 NULL); 1852 NULL);
1844 types = g_list_append(types, type); 1853 types = g_list_append(types, type);
1845 1854
1846 priority_value = purple_value_new(PURPLE_TYPE_INT); 1855 priority_value = purple_value_new(PURPLE_TYPE_INT);
1847 purple_value_set_int(priority_value, 0); 1856 purple_value_set_int(priority_value, 0);
1851 "priority", _("Priority"), priority_value, 1860 "priority", _("Priority"), priority_value,
1852 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), 1861 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING),
1853 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), 1862 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING),
1854 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), 1863 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING),
1855 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), 1864 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING),
1856 "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN),
1857 NULL); 1865 NULL);
1858 types = g_list_append(types, type); 1866 types = g_list_append(types, type);
1859 1867
1860 /* 1868 /*
1861 if(js->protocol_version == JABBER_PROTO_0_9) 1869 if(js->protocol_version == JABBER_PROTO_0_9)
2434 2442
2435 static gboolean _jabber_send_buzz(JabberStream *js, const char *username, char **error) { 2443 static gboolean _jabber_send_buzz(JabberStream *js, const char *username, char **error) {
2436 2444
2437 JabberBuddy *jb; 2445 JabberBuddy *jb;
2438 JabberBuddyResource *jbr; 2446 JabberBuddyResource *jbr;
2439 GList *iter; 2447 PurpleConnection *gc = js->gc;
2440 2448 PurpleBuddy *buddy =
2449 purple_find_buddy(purple_connection_get_account(gc), username);
2450 const gchar *alias =
2451 buddy ? purple_buddy_get_contact_alias(buddy) : username;
2452
2441 if(!username) 2453 if(!username)
2442 return FALSE; 2454 return FALSE;
2443 2455
2444 jb = jabber_buddy_find(js, username, FALSE); 2456 jb = jabber_buddy_find(js, username, FALSE);
2445 if(!jb) { 2457 if(!jb) {
2446 *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), username); 2458 *error = g_strdup_printf(_("Unable to buzz, because there is nothing "
2459 "known about %s."), alias);
2447 return FALSE; 2460 return FALSE;
2448 } 2461 }
2449 2462
2450 jbr = jabber_buddy_find_resource(jb, NULL); 2463 jbr = jabber_buddy_find_resource(jb, NULL);
2451 if(!jbr) { 2464 if (!jbr) {
2452 *error = g_strdup_printf(_("Unable to buzz, because user %s might be offline."), username); 2465 *error = g_strdup_printf(_("Unable to buzz, because %s might be offline."),
2466 alias);
2453 return FALSE; 2467 return FALSE;
2454 } 2468 }
2455 2469
2456 if(!jbr->caps) { 2470 if (jabber_resource_has_capability(jbr, XEP_0224_NAMESPACE)) {
2457 *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), username); 2471 xmlnode *buzz, *msg = xmlnode_new("message");
2472 gchar *to;
2473
2474 to = g_strdup_printf("%s/%s", username, jbr->name);
2475 xmlnode_set_attrib(msg, "to", to);
2476 g_free(to);
2477
2478 /* avoid offline storage */
2479 xmlnode_set_attrib(msg, "type", "headline");
2480
2481 buzz = xmlnode_new_child(msg, "attention");
2482 xmlnode_set_namespace(buzz, XEP_0224_NAMESPACE);
2483
2484 jabber_send(js, msg);
2485 xmlnode_free(msg);
2486
2487 return TRUE;
2488 } else {
2489 *error = g_strdup_printf(_("Unable to buzz, because %s does "
2490 "not support it or do not wish to receive buzzes now."), alias);
2458 return FALSE; 2491 return FALSE;
2459 } 2492 }
2460
2461 for(iter = jbr->caps->features; iter; iter = g_list_next(iter)) {
2462 if(!strcmp(iter->data, "http://www.xmpp.org/extensions/xep-0224.html#ns")) {
2463 xmlnode *buzz, *msg = xmlnode_new("message");
2464 gchar *to;
2465
2466 to = g_strdup_printf("%s/%s", username, jbr->name);
2467 xmlnode_set_attrib(msg, "to", to);
2468 g_free(to);
2469
2470 /* avoid offline storage */
2471 xmlnode_set_attrib(msg, "type", "headline");
2472
2473 buzz = xmlnode_new_child(msg, "attention");
2474 xmlnode_set_namespace(buzz, "http://www.xmpp.org/extensions/xep-0224.html#ns");
2475
2476 jabber_send(js, msg);
2477 xmlnode_free(msg);
2478
2479 return TRUE;
2480 }
2481 }
2482
2483 *error = g_strdup_printf(_("Unable to buzz, because the user %s does not support it."), username);
2484 return FALSE;
2485 } 2493 }
2486 2494
2487 static PurpleCmdRet jabber_cmd_buzz(PurpleConversation *conv, 2495 static PurpleCmdRet jabber_cmd_buzz(PurpleConversation *conv,
2488 const char *cmd, char **args, char **error, void *data) 2496 const char *cmd, char **args, char **error, void *data)
2489 { 2497 {
2490 JabberStream *js = conv->account->gc->proto_data; 2498 JabberStream *js = conv->account->gc->proto_data;
2491 2499 const gchar *who;
2492 if(!args || !args[0]) 2500
2501 if (!args || !args[0]) {
2502 /* use the buddy from conversation, if it's a one-to-one conversation */
2503 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
2504 who = purple_conversation_get_name(conv);
2505 } else {
2506 return PURPLE_CMD_RET_FAILED;
2507 }
2508 } else {
2509 who = args[0];
2510 }
2511
2512 if (_jabber_send_buzz(js, who, error)) {
2513 const gchar *alias;
2514 gchar *str;
2515 PurpleBuddy *buddy =
2516 purple_find_buddy(purple_connection_get_account(conv->account->gc),
2517 who);
2518
2519 if (buddy != NULL)
2520 alias = purple_buddy_get_contact_alias(buddy);
2521 else
2522 alias = who;
2523
2524 str = g_strdup_printf(_("Buzzing %s..."), alias);
2525 purple_conversation_write(conv, NULL, str,
2526 PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NOTIFY, time(NULL));
2527 g_free(str);
2528
2529 return PURPLE_CMD_RET_OK;
2530 } else {
2493 return PURPLE_CMD_RET_FAILED; 2531 return PURPLE_CMD_RET_FAILED;
2494 2532 }
2495 return _jabber_send_buzz(js, args[0], error) ? PURPLE_CMD_RET_OK : PURPLE_CMD_RET_FAILED;
2496 } 2533 }
2497 2534
2498 GList *jabber_attention_types(PurpleAccount *account) 2535 GList *jabber_attention_types(PurpleAccount *account)
2499 { 2536 {
2500 static GList *types = NULL; 2537 static GList *types = NULL;
2603 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM | 2640 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM |
2604 PURPLE_CMD_FLAG_PRPL_ONLY, 2641 PURPLE_CMD_FLAG_PRPL_ONLY,
2605 "prpl-jabber", jabber_cmd_ping, 2642 "prpl-jabber", jabber_cmd_ping,
2606 _("ping &lt;jid&gt;: Ping a user/component/server."), 2643 _("ping &lt;jid&gt;: Ping a user/component/server."),
2607 NULL); 2644 NULL);
2608 purple_cmd_register("buzz", "s", PURPLE_CMD_P_PRPL, 2645 purple_cmd_register("buzz", "w", PURPLE_CMD_P_PRPL,
2609 PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY, 2646 PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY |
2647 PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS,
2610 "prpl-jabber", jabber_cmd_buzz, 2648 "prpl-jabber", jabber_cmd_buzz,
2611 _("buzz: Buzz a user to get their attention"), NULL); 2649 _("buzz: Buzz a user to get their attention"), NULL);
2612 } 2650 }
2613 2651
2614 void 2652 void