diff --git a/kamailio/presence-role.cfg b/kamailio/presence-role.cfg index ecfe2de..89088a2 100644 --- a/kamailio/presence-role.cfg +++ b/kamailio/presence-role.cfg @@ -144,7 +144,7 @@ route[HANDLE_SUBSCRIBE] route[DELETE_DUPLICATED_SUBSCRIPTIONS] { - sql_query("exec", '$_s(DELETE FROM ACTIVE_WATCHERS WHERE FROM_USER = "$subs(from_user)" AND FROM_DOMAIN="$subs(from_domain)" AND EVENT="$subs(event)" AND PRESENTITY_URI="$subs(uri)" AND CALLID <> "$subs(callid)")'); + sql_query("exec", '$_s(DELETE FROM ACTIVE_WATCHERS WHERE PRESENTITY_URI="$subs(uri)" AND EVENT="$subs(event)" AND FROM_USER = "$subs(from_user)" AND FROM_DOMAIN="$subs(from_domain)" AND CALLID <> "$subs(callid)")'); } route[HANDLE_RESUBSCRIBE] @@ -355,6 +355,21 @@ route[COUNT_SUBSCRIBERS] xavp_params_explode($var(p), "watchers"); } +route[PRESENCE_STATE] +{ + $var(state) = ""; + if($(var(payload){kz.json,State}) == "terminated") { + $var(state) = "available"; + } else if($(var(payload){kz.json,State}) == "early") { + $var(state) = "busy"; + } else if($(var(payload){kz.json,State}) == "confirmed") { + $var(state) = "onthephone"; + } + + $var(Query) = $_s(KZQ_FETCH_PRESENCE); + sql_xquery("cb", "$var(Query)", "presence"); +} + event_route[kazoo:consumer-event-presence-dialog-update] { $var(kz_presence_log_level) = $(sel(cfg_get.kazoo.presence_no_targets_log_level){s.int}); @@ -443,6 +458,7 @@ event_route[kazoo:consumer-event-presence-update] route[PRESENCE_UPDATE] { + $var(callid) = $(var(payload){kz.json,Call-ID}); if($(var(payload){kz.json,State}) == "terminated") { route(COUNT_PRESENTITIES); } else { @@ -482,18 +498,36 @@ route[PRESENCE_UPDATE] } if($xavp(watchers=>presence) > 0) { - $var(kz_presence_log_level) = $(sel(cfg_get.kazoo.presence_with_targets_log_level){s.int}); - xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|publishing $var(presentity) presence update for $xavp(watchers=>presence) watchers\n"); - kazoo_pua_publish_presence($var(payload)); - pres_refresh_watchers("$var(presentity)", "presence", 1); + route(PRESENCE_STATE); + xlog("L_DEBUG", "presence state => $(var(payload){kz.json,Call-ID})|log|$xavp(presence=>callid) , $var(callid), $xavp(presence=>state), $var(state)\n"); + if($xavp(presence=>callid) == $var(callid) + || $var(state) == "onthephone" + || ($var(state) == "busy" && $xavp(presence=>state) != "onthephone") + ) { + + $var(kz_presence_log_level) = $(sel(cfg_get.kazoo.presence_with_targets_log_level){s.int}); + xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|publishing $var(presentity) presence update for $xavp(watchers=>presence) watchers\n"); + if(kazoo_pua_publish_presence($var(JObj)) == 1) { + pres_refresh_watchers("$var(presentity)", "presence", 1); + } else { + xlog("L_ERR", "$(var(payload){kz.json,Call-ID})|log|error publishing $var(presentity) presence update\n"); + }; + } } else { #!ifdef PRESENCE_TRACK_ALL_PKG_PRESENCE if($(kzE{kz.json,Event-Package}) == "presence") { - $var(kz_presence_log_level) = $(sel(cfg_get.kazoo.presence_with_targets_log_level){s.int}); - xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|saving $var(presentity) from presence update => $var(payload)\n"); - if(kazoo_pua_publish_presence($var(JObj)) != 1) { - xlog("L_ERR", "$(var(payload){kz.json,Call-ID})|log|error publishing $var(presentity) presence update => $var(payload)\n"); - } + route(PRESENCE_STATE); + xlog("L_DEBUG", "presence state => $(var(payload){kz.json,Call-ID})|log|$xavp(presence=>callid) , $var(callid), $xavp(presence=>state), $var(state)\n"); + if($xavp(presence=>callid) == $var(callid) + || $var(state) == "onthephone" + || ($var(state) == "busy" && $xavp(presence=>state) != "onthephone") + ) { + $var(kz_presence_log_level) = $(sel(cfg_get.kazoo.presence_with_targets_log_level){s.int}); + xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|saving $var(presentity) from presence update => $var(payload)\n"); + if(kazoo_pua_publish_presence($var(JObj)) != 1) { + xlog("L_ERR", "$(var(payload){kz.json,Call-ID})|log|error publishing $var(presentity) presence update => $var(payload)\n"); + } + } } #!else xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|skip presence update for $var(presentity)\n");