Mercurial > pidgin
comparison libpurple/protocols/jabber/jabber.c @ 25226:25e6f323b68f
propagate from branch 'im.pidgin.pidgin' (head 6a13176e096cf5e7cefc5716496a0a7afd2e2621)
to branch 'im.pidgin.cpw.malu.xmpp.attention' (head d027e41df4b69f14cba595d2e9f20efc47496887)
author | Marcus Lundblad <ml@update.uu.se> |
---|---|
date | Tue, 09 Dec 2008 20:31:43 +0000 |
parents | 641fe4c2b2a5 e1331f6126ba |
children | 7a9306bf1110 |
comparison
equal
deleted
inserted
replaced
24669:c0226e400836 | 25226:25e6f323b68f |
---|---|
1650 GList *jabber_status_types(PurpleAccount *account) | 1650 GList *jabber_status_types(PurpleAccount *account) |
1651 { | 1651 { |
1652 PurpleStatusType *type; | 1652 PurpleStatusType *type; |
1653 GList *types = NULL; | 1653 GList *types = NULL; |
1654 PurpleValue *priority_value; | 1654 PurpleValue *priority_value; |
1655 PurpleValue *buzz_enabled; | |
1655 | 1656 |
1656 priority_value = purple_value_new(PURPLE_TYPE_INT); | 1657 priority_value = purple_value_new(PURPLE_TYPE_INT); |
1657 purple_value_set_int(priority_value, 1); | 1658 purple_value_set_int(priority_value, 1); |
1659 buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN); | |
1660 purple_value_set_boolean(buzz_enabled, TRUE); | |
1658 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE, | 1661 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE, |
1659 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_ONLINE), | 1662 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_ONLINE), |
1660 NULL, TRUE, TRUE, FALSE, | 1663 NULL, TRUE, TRUE, FALSE, |
1661 "priority", _("Priority"), priority_value, | 1664 "priority", _("Priority"), priority_value, |
1662 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), | 1665 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), |
1663 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), | 1666 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), |
1664 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), | 1667 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), |
1665 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), | 1668 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), |
1666 "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), | 1669 "buzz", _("Allow Buzz"), buzz_enabled, |
1667 NULL); | 1670 NULL); |
1668 types = g_list_append(types, type); | 1671 types = g_list_append(types, type); |
1669 | 1672 |
1670 priority_value = purple_value_new(PURPLE_TYPE_INT); | 1673 priority_value = purple_value_new(PURPLE_TYPE_INT); |
1671 purple_value_set_int(priority_value, 1); | 1674 purple_value_set_int(priority_value, 1); |
1675 buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN); | |
1676 purple_value_set_boolean(buzz_enabled, TRUE); | |
1672 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE, | 1677 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE, |
1673 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_CHAT), | 1678 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_CHAT), |
1674 _("Chatty"), TRUE, TRUE, FALSE, | 1679 _("Chatty"), TRUE, TRUE, FALSE, |
1675 "priority", _("Priority"), priority_value, | 1680 "priority", _("Priority"), priority_value, |
1676 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), | 1681 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), |
1677 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), | 1682 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), |
1678 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), | 1683 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), |
1679 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), | 1684 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), |
1680 "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), | 1685 "buzz", _("Allow Buzz"), buzz_enabled, |
1681 NULL); | 1686 NULL); |
1682 types = g_list_append(types, type); | 1687 types = g_list_append(types, type); |
1683 | 1688 |
1684 priority_value = purple_value_new(PURPLE_TYPE_INT); | 1689 priority_value = purple_value_new(PURPLE_TYPE_INT); |
1685 purple_value_set_int(priority_value, 0); | 1690 purple_value_set_int(priority_value, 0); |
1691 buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN); | |
1692 purple_value_set_boolean(buzz_enabled, TRUE); | |
1686 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AWAY, | 1693 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AWAY, |
1687 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_AWAY), | 1694 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_AWAY), |
1688 NULL, TRUE, TRUE, FALSE, | 1695 NULL, TRUE, TRUE, FALSE, |
1689 "priority", _("Priority"), priority_value, | 1696 "priority", _("Priority"), priority_value, |
1690 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), | 1697 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), |
1691 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), | 1698 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), |
1692 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), | 1699 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), |
1693 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), | 1700 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), |
1694 "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), | 1701 "buzz", _("Allow Buzz"), buzz_enabled, |
1695 NULL); | 1702 NULL); |
1696 types = g_list_append(types, type); | 1703 types = g_list_append(types, type); |
1697 | 1704 |
1698 priority_value = purple_value_new(PURPLE_TYPE_INT); | 1705 priority_value = purple_value_new(PURPLE_TYPE_INT); |
1699 purple_value_set_int(priority_value, 0); | 1706 purple_value_set_int(priority_value, 0); |
1707 buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN); | |
1708 purple_value_set_boolean(buzz_enabled, TRUE); | |
1700 type = purple_status_type_new_with_attrs(PURPLE_STATUS_EXTENDED_AWAY, | 1709 type = purple_status_type_new_with_attrs(PURPLE_STATUS_EXTENDED_AWAY, |
1701 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_XA), | 1710 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_XA), |
1702 NULL, TRUE, TRUE, FALSE, | 1711 NULL, TRUE, TRUE, FALSE, |
1703 "priority", _("Priority"), priority_value, | 1712 "priority", _("Priority"), priority_value, |
1704 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), | 1713 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), |
1705 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), | 1714 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), |
1706 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), | 1715 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), |
1707 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), | 1716 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), |
1708 "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), | 1717 "buzz", _("Allow Buzz"), buzz_enabled, |
1709 NULL); | 1718 NULL); |
1710 types = g_list_append(types, type); | 1719 types = g_list_append(types, type); |
1711 | 1720 |
1712 priority_value = purple_value_new(PURPLE_TYPE_INT); | 1721 priority_value = purple_value_new(PURPLE_TYPE_INT); |
1713 purple_value_set_int(priority_value, 0); | 1722 purple_value_set_int(priority_value, 0); |
1717 "priority", _("Priority"), priority_value, | 1726 "priority", _("Priority"), priority_value, |
1718 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), | 1727 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), |
1719 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), | 1728 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), |
1720 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), | 1729 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), |
1721 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), | 1730 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), |
1722 "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), | |
1723 NULL); | 1731 NULL); |
1724 types = g_list_append(types, type); | 1732 types = g_list_append(types, type); |
1725 | 1733 |
1726 /* | 1734 /* |
1727 if(js->protocol_version == JABBER_PROTO_0_9) | 1735 if(js->protocol_version == JABBER_PROTO_0_9) |
2300 | 2308 |
2301 static gboolean _jabber_send_buzz(JabberStream *js, const char *username, char **error) { | 2309 static gboolean _jabber_send_buzz(JabberStream *js, const char *username, char **error) { |
2302 | 2310 |
2303 JabberBuddy *jb; | 2311 JabberBuddy *jb; |
2304 JabberBuddyResource *jbr; | 2312 JabberBuddyResource *jbr; |
2305 GList *iter; | 2313 PurpleConnection *gc = js->gc; |
2306 | 2314 PurpleAccount *account = purple_connection_get_account(gc); |
2315 PurpleConversation *conv = | |
2316 purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY, username, | |
2317 account); | |
2318 gchar *str; | |
2319 | |
2307 if(!username) | 2320 if(!username) |
2308 return FALSE; | 2321 return FALSE; |
2309 | 2322 |
2310 jb = jabber_buddy_find(js, username, FALSE); | 2323 jb = jabber_buddy_find(js, username, FALSE); |
2311 if(!jb) { | 2324 if(!jb) { |
2312 *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), username); | 2325 *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), username); |
2313 return FALSE; | 2326 return FALSE; |
2314 } | 2327 } |
2315 | 2328 |
2316 jbr = jabber_buddy_find_resource(jb, NULL); | 2329 jbr = jabber_buddy_find_resource(jb, NULL); |
2317 if(!jbr) { | 2330 if (!jbr) { |
2318 *error = g_strdup_printf(_("Unable to buzz, because user %s might be offline."), username); | 2331 *error = g_strdup_printf(_("Unable to buzz, because user %s might be offline."), |
2332 username); | |
2319 return FALSE; | 2333 return FALSE; |
2320 } | 2334 } |
2321 | 2335 |
2322 if(!jbr->caps) { | 2336 if (jabber_resource_has_capability(jbr, XEP_0224_NAMESPACE)) { |
2323 *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), username); | 2337 xmlnode *buzz, *msg = xmlnode_new("message"); |
2338 gchar *to; | |
2339 | |
2340 to = g_strdup_printf("%s/%s", username, jbr->name); | |
2341 xmlnode_set_attrib(msg, "to", to); | |
2342 g_free(to); | |
2343 | |
2344 /* avoid offline storage */ | |
2345 xmlnode_set_attrib(msg, "type", "headline"); | |
2346 | |
2347 buzz = xmlnode_new_child(msg, "attention"); | |
2348 xmlnode_set_namespace(buzz, XEP_0224_NAMESPACE); | |
2349 | |
2350 jabber_send(js, msg); | |
2351 xmlnode_free(msg); | |
2352 | |
2353 str = g_strdup_printf(_("Buzzing %s..."), username); | |
2354 purple_conversation_write(conv, NULL, str, | |
2355 PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NOTIFY, time(NULL)); | |
2356 g_free(str); | |
2357 | |
2358 return TRUE; | |
2359 } else { | |
2360 *error = g_strdup_printf(_("Unable to buzz, because the user %s does not support it."), username); | |
2324 return FALSE; | 2361 return FALSE; |
2325 } | 2362 } |
2326 | |
2327 for(iter = jbr->caps->features; iter; iter = g_list_next(iter)) { | |
2328 if(!strcmp(iter->data, "http://www.xmpp.org/extensions/xep-0224.html#ns")) { | |
2329 xmlnode *buzz, *msg = xmlnode_new("message"); | |
2330 gchar *to; | |
2331 | |
2332 to = g_strdup_printf("%s/%s", username, jbr->name); | |
2333 xmlnode_set_attrib(msg, "to", to); | |
2334 g_free(to); | |
2335 | |
2336 /* avoid offline storage */ | |
2337 xmlnode_set_attrib(msg, "type", "headline"); | |
2338 | |
2339 buzz = xmlnode_new_child(msg, "attention"); | |
2340 xmlnode_set_namespace(buzz, "http://www.xmpp.org/extensions/xep-0224.html#ns"); | |
2341 | |
2342 jabber_send(js, msg); | |
2343 xmlnode_free(msg); | |
2344 | |
2345 return TRUE; | |
2346 } | |
2347 } | |
2348 | |
2349 *error = g_strdup_printf(_("Unable to buzz, because the user %s does not support it."), username); | |
2350 return FALSE; | |
2351 } | 2363 } |
2352 | 2364 |
2353 static PurpleCmdRet jabber_cmd_buzz(PurpleConversation *conv, | 2365 static PurpleCmdRet jabber_cmd_buzz(PurpleConversation *conv, |
2354 const char *cmd, char **args, char **error, void *data) | 2366 const char *cmd, char **args, char **error, void *data) |
2355 { | 2367 { |
2356 JabberStream *js = conv->account->gc->proto_data; | 2368 JabberStream *js = conv->account->gc->proto_data; |
2357 | 2369 const gchar *who; |
2358 if(!args || !args[0]) | 2370 |
2359 return PURPLE_CMD_RET_FAILED; | 2371 if (!args || !args[0]) { |
2360 | 2372 /* use the buddy from conversation, if it's a one-to-one conversation */ |
2361 return _jabber_send_buzz(js, args[0], error) ? PURPLE_CMD_RET_OK : PURPLE_CMD_RET_FAILED; | 2373 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { |
2374 who = purple_conversation_get_name(conv); | |
2375 } else { | |
2376 return PURPLE_CMD_RET_FAILED; | |
2377 } | |
2378 } else { | |
2379 who = args[0]; | |
2380 } | |
2381 | |
2382 return _jabber_send_buzz(js, who, error) ? PURPLE_CMD_RET_OK : PURPLE_CMD_RET_FAILED; | |
2362 } | 2383 } |
2363 | 2384 |
2364 GList *jabber_attention_types(PurpleAccount *account) | 2385 GList *jabber_attention_types(PurpleAccount *account) |
2365 { | 2386 { |
2366 static GList *types = NULL; | 2387 static GList *types = NULL; |
2469 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM | | 2490 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM | |
2470 PURPLE_CMD_FLAG_PRPL_ONLY, | 2491 PURPLE_CMD_FLAG_PRPL_ONLY, |
2471 "prpl-jabber", jabber_cmd_ping, | 2492 "prpl-jabber", jabber_cmd_ping, |
2472 _("ping <jid>: Ping a user/component/server."), | 2493 _("ping <jid>: Ping a user/component/server."), |
2473 NULL); | 2494 NULL); |
2474 purple_cmd_register("buzz", "s", PURPLE_CMD_P_PRPL, | 2495 purple_cmd_register("buzz", "w", PURPLE_CMD_P_PRPL, |
2475 PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY, | 2496 PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY | |
2497 PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, | |
2476 "prpl-jabber", jabber_cmd_buzz, | 2498 "prpl-jabber", jabber_cmd_buzz, |
2477 _("buzz: Buzz a user to get their attention"), NULL); | 2499 _("buzz: Buzz a user to get their attention"), NULL); |
2478 } | 2500 } |
2479 | 2501 |
2480 void | 2502 void |