######## 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(KZQ_PRESENCE_SEARCH_SUMMARY); 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) = $_s({"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(Msg-ID) = $(kzE{kz.json,Msg-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(KZQ_PRESENCE_SEARCH_DETAIL); if($var(Event) != "") { $var(Query) = $var(Query) + $_s( and a.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" : "$var(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" : "$var(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) = $_s({"name": "presence-query", "exchange": "presence", "type": "topic", "queue": "presence-search-MY_HOSTNAME", "routing": "presence.search_req.*", "exclusive": 0, "federate": 1 }); kazoo_subscribe("$var(payload)"); } # vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab