Call pickup
https://opensips.org/html/docs/modules/3.2.x/event_routing.html
The scenario is Alice calling to bob, Bob does not pickup and Charlie is performing call pickup (to get the call from Alice)
We use notify_on_event to link the two calls: the one from Alice to Bob and the one from Charlie to call pickup service.
Schematics: when we send a call to a user within a pickup group, we subscribe to see if there is any call to the pickup service (from another member of the same pickup group).
When we have a call to the pickup service, we raise from script an event - this event will be notified to the first call and we cancel the branches to Bob and inject the registered contacts for the user calling to pickup group (Charlie).
... route[handle_call] if ($rU=="33") { ## this is a call to the pickup service ## (Charlie calling 33) # reject incoming call as we will generate an back call # from the original call (Alice to Bob) t_newtran(); send_reply(480,"Gone"); # raise the pickup custom event # with pickup group 1 and picker being Charlie (caller) $avp(attr-name) = "group"; $avp(attr-val) = "1"; $avp(attr-name) = "picker"; $avp(attr-val) = $fu; raise_event("E_CALL_PICKUP", $avp(attr-name), $avp(attr-val)); exit; } else { ## this is a call to a subscriber ## (Alice calls Bob) # apply user location if (!lookup("location","m")) { send_reply(404, "Not Found"); exit; } # prepare transaction for branch injection; it is mandatory # to create the transaction before the subscription, otherwise # the EBR module will not pass the transaction ID into the # notification route t_newtran(); # subscribe to a call pickup event, but for our group only $avp(filter) = "group=1"; notify_on_event("E_CALL_PICKUP",$avp(filter), "handle_pickup", 20); t_relay(); } exit; } route[handle_pickup] { xlog("call picked by $avp(picker), fetching its contacts\n"); if (lookup("location","", $avp(picker))) { # take the contacts retured by lookup() (for Charlie) # and inject them into the original call, but also cancel # any existing ongoing branch (ringing to Bob) t_inject_branches("msg","cancel"); } }