You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

112 lines
4.9 KiB

######## Presence query server module ########
route[PRESENCE_SEARCH_SUMMARY]
{
xlog("L_INFO", "processing presence summary query for $(kzE{kz.json,Realm})\n");
$var(Queue) = $(kzE{kz.json,Server-ID});
$var(Event) = $(kzE{kz.json,Event-Package});
$var(Domain) = $(kzE{kz.json,Realm});
$var(Username) = $(kzE{kz.json,Username});
$var(Now) = $TS;
$var(Items) = "";
$var(Query) = $_s(select * from active_watchers where watcher_domain = "$var(Domain)");
if($var(Event) != "") {
$var(Query) = $var(Query) + $_s( and event = "$var(Event)");
}
if($var(Username) != "") {
$var(Query) = $var(Query) + $_s( and watcher_username = "$var(Username)");
}
$var(Query) = $var(Query) + " order by presentity_uri, event, watcher_username, callid";
xlog("L_DEBUG", "$ci| QUERY $var(Query)\n");
if (sql_xquery("cb", "$var(Query)", "ra") == 1)
{
$var(Subs) = "";
$var(Sep1) = "";
while($xavp(ra) != $null) {
$var(Username) = $(xavp(ra=>presentity_uri){s.tolower});
$var(Sep2)="";
$var(Evt)="";
while($xavp(ra) != $null && $var(Username) == $(xavp(ra=>presentity_uri){s.tolower}) )
{
$var(Event) = $xavp(ra=>event);
$var(Sep3)="";
$var(Sub)="";
$var(Count) = 0;
while($xavp(ra) != $null && $var(Username) == $(xavp(ra=>presentity_uri){s.tolower}) && $var(Event) == $xavp(ra=>event))
{
$var(Count) = $var(Count) + 1;
pv_unset("$xavp(ra)");
}
$var(Evt) = $var(Evt) + $var(Sep2) + $_s("$var(Event)" : $var(Count));
$var(Sep2)=", ";
}
$var(Subs) = $var(Subs) + $var(Sep1) + $_s("$(var(Username){uri.user})") + " : { " + $var(Evt) + " }";
$var(Sep1)=", ";
}
}
xlog("L_DEBUG", "$ci| RESULT \"Subscriptions\" : { $var(Subs) }\n");
$var(amqp_payload_request) = '{"Event-Category" : "presence", "Event-Name" : "search_resp", "Msg-ID" : "$(kzE{kz.json,Msg-ID})", "Subscriptions" : { $var(Subs) } }';
kazoo_publish("targeted", "$var(Queue)", $var(amqp_payload_request));
}
route[PRESENCE_SEARCH_DETAIL]
{
xlog("L_INFO", "processing presence query detail for $(kzE{kz.json,Username}) in realm $(kzE{kz.json,Realm})\n");
$var(Queue) = $(kzE{kz.json,Server-ID});
$var(Event) = $(kzE{kz.json,Event-Package});
$var(Domain) = $(kzE{kz.json,Realm});
$var(Username) = $(kzE{kz.json,Username});
$var(presentity_uri) = "sip:" + $var(Username) + "@" + $var(Domain);
$var(Now) = $TS;
$var(Items) = "";
$var(Query) = $_s(select * from active_watchers_log where presentity_uri = "$var(presentity_uri)");
if($var(Event) != "") {
$var(Query) = $var(Query) + $_s( and event = "$var(Event)");
}
$var(Query) = $var(Query) + " order by event, watcher_username, callid";
xlog("L_DEBUG", "$ci| STATUS QUERY $var(Query)\n");
if (sql_xquery("cb", "$var(Query)", "ra") == 1) {
while($xavp(ra) != $null) {
$var(Event) = $xavp(ra=>event);
while($xavp(ra) != $null && $var(Event) == $xavp(ra=>event)) {
$var(Sub) = $_s("$var(Username)" : {"$xavp(ra=>event)" : { "$xavp(ra=>watcher_username)" : {"kamailio@MY_HOSTNAME" : {"$xavp(ra=>callid)" : {"time" : $xavp(ra=>time), "result" : $xavp(ra=>result), "sent" : "$(xavp(ra=>sent_msg){s.escape.common}{s.replace,\','}{s.replace,$$,})", "received" : "$(xavp(ra=>received_msg){s.escape.common}{s.replace,\','}{s.replace,$$,})", "user_agent" : "$(xavp(ra=>user_agent){s.escape.common}{s.replace,\','}{s.replace,$$,})"}}}}});
xlog("L_DEBUG", "$ci| RESULT \"Subscriptions\" : { $var(Sub) }\n");
$var(amqp_payload_request) = '{"Event-Category" : "presence", "Event-Name" : "search_partial_resp", "Msg-ID" : "$(kzE{kz.json,Msg-ID})", "Subscriptions" : { $var(Sub) } }';
kazoo_publish("targeted", "$var(Queue)", $var(amqp_payload_request));
pv_unset("$xavp(ra)");
}
}
}
$var(amqp_payload_request) = '{"Event-Category" : "presence", "Event-Name" : "search_resp", "Msg-ID" : "$(kzE{kz.json,Msg-ID})" }';
kazoo_publish("targeted", "$var(Queue)", $var(amqp_payload_request));
}
event_route[kazoo:consumer-event-presence-search-req]
{
switch($(kzE{kz.json,Search-Type})) {
case "summary":
route(PRESENCE_SEARCH_SUMMARY);
break;
case "detail":
route(PRESENCE_SEARCH_DETAIL);
break;
default:
xlog("L_INFO", "$ci|search type '$(kzE{kz.json,Search-Type})' not handled\n");
}
}
route[PRESENCE_QUERY_BINDINGS]
{
$var(payload) = "{ 'exchange' : 'presence' , 'type' : 'topic', 'queue' : 'presence-search-MY_HOSTNAME', 'exclusive' : 0, 'routing' : 'presence.search_req.*', 'federate' : 1 }";
kazoo_subscribe("$var(payload)");
}
# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab