######## Presence server module ######## #!trydef PRESENCE_MIN_EXPIRES 300 #!trydef PRESENCE_MIN_EXPIRES_ACTION 1 #!trydef PRESENCE_MAX_EXPIRES 3600 modparam("htable", "htable", "p=>size=32;autoexpire=3600;") loadmodule "presence.so" loadmodule "presence_dialoginfo.so" loadmodule "presence_mwi.so" loadmodule "presence_xml.so" modparam("presence_dialoginfo", "force_dummy_dialog", 1) modparam("presence_xml", "force_active", 1) modparam("presence", "subs_db_mode", 3) modparam("presence", "expires_offset", 60) modparam("presence", "send_fast_notify", 1) modparam("presence", "clean_period", 30) modparam("presence", "publ_cache", 0) modparam("presence", "min_expires_action", PRESENCE_MIN_EXPIRES_ACTION) modparam("presence", "min_expires", PRESENCE_MIN_EXPIRES) modparam("presence", "max_expires", PRESENCE_MAX_EXPIRES) modparam("presence", "sip_uri_match", 1) modparam("presence", "waitn_time", 1) modparam("presence", "notifier_processes", 5) modparam("presence", "db_url", "KAZOO_DB_URL") modparam("kazoo", "db_url", "KAZOO_DB_URL") modparam("kazoo", "pua_mode", 1) ####### Presence Logic ######## route[HANDLE_SUBSCRIBE] { if (is_method("SUBSCRIBE")) { #!ifdef NAT-TRAVERSAL-ROLE route(NAT_TEST_AND_CORRECT); #!endif if (!t_newtran()) { sl_reply_error(); exit; } if ($tU == $null) { xlog("L_INFO", "$ci|stop|ignoring subscribe with empty TO username from a $ua"); sl_send_reply(400, "Missing TO username"); t_release(); exit; } if ($fU == $null) { xlog("L_INFO", "$ci|stop|ignoring subscribe with empty FROM username from a $ua"); sl_send_reply(400, "Missing FROM username"); t_release(); exit; } if (!handle_subscribe()) { xlog("L_INFO", "$ci|stop|unsupported subsribe"); t_release(); exit; } $var(Expires) = $hdr(Expires); if($var(Expires) < PRESENCE_MIN_EXPIRES) { $var(Expires) = PRESENCE_MIN_EXPIRES; } else if($var(Expires) > PRESENCE_MAX_EXPIRES) { $var(Expires) = PRESENCE_MAX_EXPIRES; } ##RabbitMQ $var(fs_path) = "%3C" + $rz + "%3A" + $Ri + "%3A" + $Rp + "%3Btransport=" + $proto + "%3Blr%3Breceived=" + $si+":"+$sp+"%3E"; $var(fs_contact) = "<" + $(ct{tobody.uri}) + ";fs_path=" + $var(fs_path) + ">"; if($(ct{tobody.params}) != $null) { $var(fs_contact) = $var(fs_contact) + ";" + $(ct{tobody.params}); } $var(amqp_payload_request) = '{"Event-Category" : "presence", "Event-Name" : "subscription", "Event-Package" : "$hdr(event)", "Expires" : "$var(Expires)", "Queue" : "BLF-MY_HOSTNAME", "Server-ID" : "BLF-MY_HOSTNAME" , "Contact" : "$(ct{s.escape.common})", "Call-ID" : "$ci", "From" : "$fu", "User" : "$subs(uri)", "User-Agent" : "$(ua{s.escape.common})" }'; kazoo_publish("dialoginfo_subs", "dialoginfo_subs", $var(amqp_payload_request)); t_release(); exit; } } route[HANDLE_PUBLISH] { if (is_method("PUBLISH")) { if (!t_newtran()) { sl_reply_error(); exit; } if($hdr(Sender)!= $null) handle_publish("$hdr(Sender)"); else handle_publish(); t_release(); exit; } } event_route[kazoo:consumer-event-presence-update] { $var(call-id) = $(kzE{kz.json,Call-ID}); if( $(kzE{kz.json,Event-Package}) == "dialog") { if($sht(p=>$var(call-id)) != $(kzE{kz.json,State}) || $(kzE{kz.json,Flush-Level}) != $null) { xlog("L_INFO", "$(kzE{kz.json,Target-Call-ID})|log|received $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) state $(kzE{kz.json,State})"); $sht(p=>$(kzE{kz.json,Call-ID})) = $(kzE{kz.json,State}); #!ifdef FAST_PICKUP-ROLE route(FAST_PICKUP_INIT); #!endif kazoo_pua_publish($kzE); pres_refresh_watchers("$(kzE{kz.json,From})", "$(kzE{kz.json,Event-Package})", 1); } else { xlog("L_INFO", "$var(call-id)|log|received duplicate $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) state $(kzE{kz.json,State})"); xlog("L_INFO", "$var(call-id)|log|payload $kzE"); } } else { xlog("L_INFO", "$var(call-id)|log|received $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) $kzE"); kazoo_pua_publish($kzE); pres_refresh_watchers("$(kzE{kz.json,From})", "$(kzE{kz.json,Event-Package})", 1); } } # vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab