diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c index 2b44abc05b..2ee751e876 100644 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -41,6 +41,84 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load); SWITCH_MODULE_DEFINITION(mod_commands, mod_commands_load, NULL, NULL); +SWITCH_STANDARD_API(user_data_function) +{ + switch_xml_t x_domain, xml = NULL, x_user, x_param, x_params; + int argc; + char *mydata = NULL, *argv[3]; + char *key = NULL, *type = NULL, *user, *domain; + char delim = ' '; + const char *err = NULL; + const char *container = "params", *elem = "param"; + char *params = NULL; + + if (!cmd) { + err = "bad args"; + goto end; + } + + mydata = strdup(cmd); + assert(mydata); + + argc = switch_separate_string(mydata, delim, argv, (sizeof(argv) / sizeof(argv[0]))); + + if (argc < 3) { + err = "bad args"; + goto end; + } + + user = argv[0]; + type = argv[1]; + key = argv[2]; + + if ((domain = strchr(user, '@'))) { + *domain++ = '\0'; + } else { + domain = "cluecon.com"; + } + + params = switch_mprintf("user=%s&domain=%s&type=%s&key=%s", user, domain, type, key); + + if (switch_xml_locate_user("id", user, domain, NULL, &xml, &x_domain, &x_user, params) != SWITCH_STATUS_SUCCESS) { + err = "can't find user"; + goto end; + } + + + end: + + if (xml) { + if (err) { + //stream->write_function(stream, "-Error %s\n", err); + } else { + if (!strcmp(type, "var")) { + container = "variables"; + elem = "variable"; + } + + if ((x_params = switch_xml_child(x_user, container))) { + for (x_param = switch_xml_child(x_params, elem); x_param; x_param = x_param->next) { + const char *var = switch_xml_attr(x_param, "name"); + const char *val = switch_xml_attr(x_param, "value"); + + if (!strcasecmp(var, key)) { + stream->write_function(stream, "%s", val); + break; + } + + } + } + } + switch_xml_free(xml); + } + + free(mydata); + switch_safe_free(params); + + return SWITCH_STATUS_SUCCESS; + +} + SWITCH_STANDARD_API(find_user_function) { switch_xml_t x_domain = NULL, x_user = NULL, xml = NULL; @@ -1949,6 +2027,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load) SWITCH_ADD_API(commands_api_interface, "uuid_chat", "Send a chat message", uuid_chat, UUID_CHAT_SYNTAX); SWITCH_ADD_API(commands_api_interface, "find_user_xml", "find a user", find_user_function, " @"); SWITCH_ADD_API(commands_api_interface, "xml_locate", "find some xml", xml_locate_function, "[root |
]"); + SWITCH_ADD_API(commands_api_interface, "user_data", "find user data", user_data_function, "@ [var|param] "); /* indicate that the module should continue to be loaded */ return SWITCH_STATUS_NOUNLOAD; diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c index 8630972a2b..92c8228182 100644 --- a/src/mod/applications/mod_dptools/mod_dptools.c +++ b/src/mod/applications/mod_dptools/mod_dptools.c @@ -1420,6 +1420,78 @@ SWITCH_STANDARD_APP(audio_bridge_function) } + +/* fake chan_user */ +switch_endpoint_interface_t *user_endpoint_interface; +static switch_call_cause_t user_outgoing_channel(switch_core_session_t *session, + switch_caller_profile_t *outbound_profile, + switch_core_session_t **new_session, switch_memory_pool_t **pool); +switch_io_routines_t user_io_routines = { + /*.outgoing_channel */ user_outgoing_channel +}; + +static switch_call_cause_t user_outgoing_channel(switch_core_session_t *session, + switch_caller_profile_t *outbound_profile, + switch_core_session_t **new_session, switch_memory_pool_t **pool) +{ + switch_xml_t x_domain, xml = NULL, x_user, x_param, x_params; + char *user = NULL, *domain = NULL; + const char *dest = NULL; + static switch_call_cause_t cause; + unsigned int timelimit = 60; + + user = switch_core_session_strdup(session, outbound_profile->destination_number); + + if (!(domain = strchr(user, '@'))) { + goto done; + } + + *domain++ = '\0'; + + if (switch_xml_locate_user("id", user, domain, NULL, &xml, &x_domain, &x_user, "as_channel=true") != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "can't find user [%s@%s]\n", user, domain); + goto done; + } + + if ((x_params = switch_xml_child(x_user, "params"))) { + for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) { + const char *var = switch_xml_attr(x_param, "name"); + const char *val = switch_xml_attr(x_param, "value"); + + if (!strcasecmp(var, "dial-string")) { + dest = val; + break; + } + + } + } + + done: + + if (dest) { + const char *var; + switch_channel_t *channel; + + channel = switch_core_session_get_channel(session); + if ((var = switch_channel_get_variable(channel, "call_timeout"))) { + timelimit = atoi(var); + } + + if (switch_ivr_originate(session, new_session, &cause, dest, timelimit, NULL, NULL, NULL, NULL) == SWITCH_STATUS_SUCCESS) { + switch_core_session_rwunlock(*new_session); + } + } + + if (xml) { + switch_xml_free(xml); + } + + + return cause; + +} + + #define SPEAK_DESC "Speak text to a channel via the tts interface" #define DISPLACE_DESC "Displace audio from a file to the channels input" #define SESS_REC_DESC "Starts a background recording of the entire session" @@ -1443,6 +1515,11 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_dptools_load) /* connect my internal structure to the blank pointer passed to me */ *module_interface = switch_loadable_module_create_module_interface(pool, modname); + user_endpoint_interface = switch_loadable_module_create_interface(*module_interface, SWITCH_ENDPOINT_INTERFACE); + user_endpoint_interface->interface_name = "USER"; + user_endpoint_interface->io_routines = &user_io_routines; + + SWITCH_ADD_API(api_interface, "strepoch", "Convert a date string into epoch time", strepoch_api_function, ""); SWITCH_ADD_API(api_interface, "chat", "chat", chat_api_function, "|||"); SWITCH_ADD_API(api_interface, "strftime", "strftime", strftime_api_function, "");