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 &lt;jid&gt;: Ping a user/component/server."), 2493 _("ping &lt;jid&gt;: 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