From 7f9f4c9e263e77fdb81d3d8b3411b936ed2330ed Mon Sep 17 00:00:00 2001 From: lazedo Date: Fri, 9 Feb 2018 17:26:42 +0000 Subject: [PATCH] handle extended-presence-id from mwi payload --- kamailio/presence-role.cfg | 92 +++++++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 35 deletions(-) diff --git a/kamailio/presence-role.cfg b/kamailio/presence-role.cfg index 9393ff3..0d93714 100644 --- a/kamailio/presence-role.cfg +++ b/kamailio/presence-role.cfg @@ -261,32 +261,12 @@ event_route[kazoo:consumer-event-presence-dialog-update] #!ifdef FAST_PICKUP_ROLE route(FAST_PICKUP_INIT); #!endif - + $var(presentity) = $(kzE{kz.json,From}); - - if($(kzE{kz.json,State}) == "terminated") { - route(COUNT_PRESENTITIES); - } else { - route(COUNT_SUBSCRIBERS); - } + $var(payload) = $kzE; + + route(PRESENCE_UPDATE); - if($xavp(watchers=>dialog) > 0) { - xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|publishing $(kzE{kz.json,From}) dialog update for $xavp(watchers=>dialog) watchers\n"); - kazoo_pua_publish_dialoginfo($var(JObj)); - pres_refresh_watchers("$(kzE{kz.json,From})", "dialog", 1); - } else { - xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|skip dialog update for $(kzE{kz.json,From})\n"); - } - - - if($xavp(watchers=>presence) > 0) { - xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|publishing $(kzE{kz.json,From}) presence update for $xavp(watchers=>presence) watchers\n"); - kazoo_pua_publish_presence($kzE); - pres_refresh_watchers("$(kzE{kz.json,From})", "presence", 1); - } else { - xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|skip presence update for $(kzE{kz.json,From})\n"); - } - xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|finished processing $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) state $(kzE{kz.json,State}) from $(kzE{kz.json,Switch-URI}) at $(kzE{kz.json,AMQP-Received})/$var(Now)/$TS\n"); } @@ -301,40 +281,82 @@ event_route[kazoo:consumer-event-presence-mwi-update] kazoo_pua_publish_mwi($kzE); pres_refresh_watchers("$(kzE{kz.json,From})", "message-summary", 1); } else { - xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|skip message-summary update for $(kzE{kz.json,From})\n"); + xlog("L_DEBUG", "$(kzE{kz.json,Call-ID})|log|skip message-summary update for $(kzE{kz.json,From})\n"); } + + route(MWI_AS_PRESENCE); + xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|finished processing message-summary update for $(kzE{kz.json,From}) light should be on ? $(kzE{kz.json,Messages-Waiting}) at $(kzE{kz.json,AMQP-Received})/$var(Now)/$TS\n"); + } event_route[kazoo:consumer-event-presence-update] { xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|received presence update for $(kzE{kz.json,Presence-ID}) : $kzE\n"); - + $var(JObj) = $kzE; $var(presentity) = $_s(sip:$(kzE{kz.json,Presence-ID})); + $var(payload) = $kzE; + route(PRESENCE_UPDATE); - if($(kzE{kz.json,State}) == "terminated") { + xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|finished processing $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) state $(kzE{kz.json,State}) from $(kzE{kz.json,Switch-URI}) at $(kzE{kz.json,AMQP-Received})/$var(Now)/$TS\n"); +} + +route[PRESENCE_UPDATE] +{ + if($(var(payload){kz.json,State}) == "terminated") { route(COUNT_PRESENTITIES); } else { route(COUNT_SUBSCRIBERS); } - + if($xavp(watchers=>dialog) > 0) { - xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|publishing $var(presentity) dialog update for $xavp(watchers=>dialog) watchers\n"); - kazoo_pua_publish_dialoginfo($kzE); + xlog("L_INFO", "$(var(payload){kz.json,Call-ID})|log|publishing $var(presentity) dialog update for $xavp(watchers=>dialog) watchers\n"); + kazoo_pua_publish_dialoginfo($var(JObj)); pres_refresh_watchers("$var(presentity)", "dialog", 1); } else { - xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|skip dialog update for $var(presentity)\n"); + xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|skip dialog update for $var(presentity)\n"); } - + if($xavp(watchers=>presence) > 0) { - xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|publishing $var(presentity) presence update for $xavp(watchers=>presence) watchers\n"); - kazoo_pua_publish_presence($kzE); + xlog("L_INFO", "$(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); } else { - xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|skip presence update for $var(presentity)\n"); + xlog("L_DEBUG", "$(kzE{kz.json,Call-ID})|log|skip presence update for $var(presentity)\n"); } } +#!define MWI_PRESENCE_BODY $(kzE{re.subst,/"Messages-Waiting"\s*\:\s*"[^"]*"/"State" : "$var(State)"/} \ +{re.subst,/"From"\s*\:\s*"[^"]*"/"From" : "$var(presentity)"/} \ +{re.subst,/"From-User"\s*\:\s*"[^"]*"/"From-User" : "$var(user)"/} \ +{re.subst,/"To"\s*\:\s*"[^"]*"/"To" : "$var(presentity)"/} \ +{re.subst,/"To-User"\s*\:\s*"[^"]*"/"To-User" : "$var(user)"/} \ +{re.subst,/"Messages-New"\s*\:\s*[^,]*/"Direction" : "initiator"/} \ +{re.subst,/"Event-Name"\s*\:\s*"[^"]*"/"Event-Name" : "presence"/}); + + +route[MWI_AS_PRESENCE] +{ + if( $(kzE{kz.json,Extended-Presence-ID}) == "" ) { + return; + } + + $var(realm) = $(kzE{kz.json,From-Realm}); + $var(user) = $(kzE{kz.json,Extended-Presence-ID}); + $var(presentity) = $_s(sip:$var(user)@$var(realm)); + if( $(kzE{kz.json,Messages-Waiting}) == "yes" ) { + $var(State) = "confirmed"; + } else { + $var(State) = "terminated"; + } + + $var(payload) = MWI_PRESENCE_BODY + $var(JObj) = $var(payload); + + route(PRESENCE_UPDATE); + +} + #!include_file "presence-reset.cfg" route[PRESENCE_BINDINGS]