/* SYNTAX: PRESENCE SUBSCRIBE <jid> [<reason>] */ static void cmd_presence_subscribe(const char *data, XMPP_SERVER_REC *server) { LmMessage *lmsg; const char *jid, *reason; char *recoded; void *free_arg; CMD_XMPP_SERVER(server); if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST, &jid, &reason)) return; if (*jid == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); recoded = xmpp_recode_out(jid); lmsg = lm_message_new_with_sub_type(recoded, LM_MESSAGE_TYPE_PRESENCE, LM_MESSAGE_SUB_TYPE_SUBSCRIBE); g_free(recoded); if (*reason != '\0') { recoded = xmpp_recode_out(reason); lm_message_node_add_child(lmsg->node, "status", recoded); g_free(recoded); } signal_emit("xmpp send presence", 2, server, lmsg); lm_message_unref(lmsg); cmd_params_free(free_arg); }
/* SYNTAX: XMPPPASSWD -yes <old_password> <new_password> */ static void cmd_xmpppasswd(const char *data, SERVER_REC *server, WI_ITEM_REC *item) { GHashTable *optlist; char *old_password, *new_password, *recoded; LmMessage *lmsg; LmMessageNode *node; void *free_arg; CMD_XMPP_SERVER(server); if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTIONS, "xmpppasswd", &optlist, &old_password, &new_password)) return; if (g_hash_table_lookup(optlist, "yes") == NULL) cmd_param_error(CMDERR_NOT_GOOD_IDEA); if (strcmp(old_password, server->connrec->password) != 0) cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); lmsg = lm_message_new_with_sub_type(XMPP_SERVER(server)->domain, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET); node = lm_message_node_add_child(lmsg->node, "query", NULL); lm_message_node_set_attribute(node, XMLNS, XMLNS_REGISTER); recoded = xmpp_recode_out(XMPP_SERVER(server)->user); lm_message_node_add_child(node, "username", recoded); g_free(recoded); recoded = xmpp_recode_out(new_password); lm_message_node_add_child(node, "password", recoded); g_free(recoded); signal_emit("xmpp send iq", 2, server, lmsg); lm_message_unref(lmsg); cmd_params_free(free_arg); }
/* SYNTAX: ROSTER REMOVE <jid> */ static void cmd_roster_remove(const char *data, XMPP_SERVER_REC *server) { LmMessage *lmsg; LmMessageNode *query_node, *item_node; XMPP_ROSTER_USER_REC *user; const char *jid; char *recoded; void *free_arg; CMD_XMPP_SERVER(server); if (!cmd_get_params(data, &free_arg, 1, &jid)) return; if (*jid == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); user = rosters_find_user(server->roster, jid, NULL, NULL); if (user == NULL) { signal_emit("xmpp not in roster", 2, server, jid); goto out; } lmsg = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET); query_node = lm_message_node_add_child(lmsg->node, "query", NULL); lm_message_node_set_attribute(query_node, "xmlns", "jabber:iq:roster"); item_node = lm_message_node_add_child(query_node, "item", NULL); recoded = xmpp_recode_out(jid); lm_message_node_set_attribute(item_node, "jid", recoded); g_free(recoded); lm_message_node_set_attribute(item_node, "subscription", "remove"); signal_emit("xmpp send iq", 2, server, lmsg); lm_message_unref(lmsg); out: cmd_params_free(free_arg); }
/* SYNTAX: ROSTER ADD <jid> */ static void cmd_roster_add(const char *data, XMPP_SERVER_REC *server) { LmMessage *lmsg; LmMessageNode *query_node, *item_node; GHashTable *optlist; const char *jid; char *jid_recoded; void *free_arg; CMD_XMPP_SERVER(server); if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS, "roster add", &optlist, &jid)) return; if (*jid == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); lmsg = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET); query_node = lm_message_node_add_child(lmsg->node, "query", NULL); lm_message_node_set_attribute(query_node, "xmlns", "jabber:iq:roster"); jid_recoded = xmpp_recode_out(jid); item_node = lm_message_node_add_child(query_node, "item", NULL); lm_message_node_set_attribute(item_node, "jid", jid_recoded); signal_emit("xmpp send iq", 2, server, lmsg); lm_message_unref(lmsg); if (g_hash_table_lookup(optlist, "nosub") == NULL) { lmsg = lm_message_new_with_sub_type(jid_recoded, LM_MESSAGE_TYPE_PRESENCE, LM_MESSAGE_SUB_TYPE_SUBSCRIBE); signal_emit("xmpp send presence", 2, server, lmsg); lm_message_unref(lmsg); } g_free(jid_recoded); cmd_params_free(free_arg); }
/* SYNTAX: PRESENCE */ static void cmd_presence(const char *data, XMPP_SERVER_REC *server, WI_ITEM_REC *item) { CMD_XMPP_SERVER(server); if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); else command_runsub(xmpp_commands[XMPP_COMMAND_PRESENCE], data, server, item); }
/* SYNTAX: ROSTER */ static void cmd_roster(const char *data, XMPP_SERVER_REC *server, WI_ITEM_REC *item) { CMD_XMPP_SERVER(server); if (*data == '\0') signal_emit("xmpp roster show", 1, server); else command_runsub(xmpp_commands[XMPP_COMMAND_ROSTER], data, server, item); }
/* SYNTAX: ROSTER FULL */ static void cmd_roster_full(const char *data, XMPP_SERVER_REC *server, WI_ITEM_REC *item) { gboolean oldvalue; CMD_XMPP_SERVER(server); oldvalue = settings_get_bool("xmpp_roster_show_offline"); if (!oldvalue) settings_set_bool("xmpp_roster_show_offline", TRUE); signal_emit("xmpp roster show", 1, server); if (!oldvalue) settings_set_bool("xmpp_roster_show_offline", oldvalue); }
/* SYNTAX: VER [[<jid>[/<resource>]]|[<name]] */ static void cmd_ver(const char *data, XMPP_SERVER_REC *server, WI_ITEM_REC *item) { char *cmd_dest, *dest; void *free_arg; CMD_XMPP_SERVER(server); if (!cmd_get_params(data, &free_arg, 1, &cmd_dest)) return; dest = xmpp_get_dest(cmd_dest, server, item); request_version(server, dest); g_free(dest); cmd_params_free(free_arg); }
/* SYNTAX: QUOTE <raw_command> */ static void cmd_quote(const char *data, XMPP_SERVER_REC *server) { char *recoded; CMD_XMPP_SERVER(server); if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); g_strstrip((char *)data); if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); signal_emit("xmpp xml out", 2, server, data); recoded = xmpp_recode_out(data); lm_connection_send_raw(server->lmconn, recoded, NULL); g_free(recoded); }
/* SYNTAX: AWAY [-one | -all] [away|dnd|xa|chat] [<reason>] */ static void cmd_away(const char *data, XMPP_SERVER_REC *server) { GHashTable *optlist; char *reason; void *free_arg; CMD_XMPP_SERVER(server); if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS | PARAM_FLAG_GETREST, "away", &optlist, &reason)) return; if (g_hash_table_lookup(optlist, "one") != NULL) set_away(server, reason); else g_slist_foreach(servers, (GFunc)set_away, reason); cmd_params_free(free_arg); }
/* SYNTAX: PRESENCE UNSUBSCRIBE <jid> */ static void cmd_presence_unsubscribe(const char *data, XMPP_SERVER_REC *server) { LmMessage *lmsg; const char *jid; char *recoded; void *free_arg; CMD_XMPP_SERVER(server); if (!cmd_get_params(data, &free_arg, 1, &jid)) return; if (*jid == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); recoded = xmpp_recode_out(jid); lmsg = lm_message_new_with_sub_type(recoded, LM_MESSAGE_TYPE_PRESENCE, LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE); g_free(recoded); signal_emit("xmpp send presence", 2, server, lmsg); lm_message_unref(lmsg); cmd_params_free(free_arg); }
/* SYNTAX: XMPPUNREGISTER -yes */ static void cmd_xmppunregister(const char *data, SERVER_REC *server, WI_ITEM_REC *item) { GHashTable *optlist; LmMessage *lmsg; LmMessageNode *node; void *free_arg; CMD_XMPP_SERVER(server); if (!cmd_get_params(data, &free_arg, 0 | PARAM_FLAG_OPTIONS, "xmppunregister", &optlist)) return; if (g_hash_table_lookup(optlist, "yes") == NULL) cmd_param_error(CMDERR_NOT_GOOD_IDEA); lmsg = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET); node = lm_message_node_add_child(lmsg->node, "query", NULL); lm_message_node_set_attribute(node, XMLNS, XMLNS_REGISTER); lm_message_node_add_child(node, "remove", NULL); signal_emit("xmpp send iq", 2, server, lmsg); lm_message_unref(lmsg); cmd_params_free(free_arg); }
/* SYNTAX: ME <message> */ static void cmd_me(const char *data, XMPP_SERVER_REC *server, WI_ITEM_REC *item) { const char *target; char *str, *recoded; int type; CMD_XMPP_SERVER(server); if (*data == '\0') return; g_strstrip((char *)data); if (*data == '\0') return; target = window_item_get_target(item); type = IS_CHANNEL(item) ? SEND_TARGET_CHANNEL : SEND_TARGET_NICK; if (type == SEND_TARGET_NICK) signal_emit("message xmpp own_action", 4, server, data, target, SEND_TARGET_NICK); str = g_strconcat("/me ", data, (void *)NULL); recoded = recode_out(SERVER(server), str, target); g_free(str); server->send_message(SERVER(server), target, recoded, type); g_free(recoded); }