Mercurial > pidgin
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 <jid>: Ping a user/component/server."), | 2643 _("ping <jid>: 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 |