123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419 |
- <?php
- /**
- * Incoming calls notifications class
- */
- class ForWhomTheBellTolls {
- /**
- * Contains system alter config as key=>value
- *
- * @var array
- */
- protected $altCfg = array();
- /**
- * Contains system billing config as key=>value
- *
- * @var array
- */
- protected $billingCfg = array();
- /**
- * Calls polling interval in ms.
- *
- * @var int
- */
- protected $pollingInterval = 7000;
- /**
- * Notification display timeout in ms.
- *
- * @var int
- */
- protected $popupTimeout = 10000;
- /**
- * System cache object placeholder
- *
- * @var object
- */
- protected $cache = '';
- /**
- * Caching timeout based on polling timeout in seconds.
- *
- * @var int
- */
- protected $cachingTimeout = 7;
- /**
- * Default number position offset
- *
- * @var int
- */
- protected $offsetNumber = 3;
- /**
- * Default call status position offset
- *
- * @var int
- */
- protected $offsetStatus = 5;
- /**
- * Default detected login offset
- *
- * @var int
- */
- protected $offsetLogin = 7;
- /**
- * Render notification code everywhere in web interface or just on taskbar
- *
- * @var bool
- */
- protected $anywhere = false;
- /**
- * Array of administrators for whom display notifications.
- *
- * @var array
- */
- protected $showFor = array();
- /**
- * Contains current instance user login
- *
- * @var string
- */
- protected $myLogin = '';
- /**
- * Default log path to parse
- */
- protected $dataSource = '';
- /**
- * Reply cache key name
- */
- const CACHE_KEY = 'FWTBT_REPLY';
- /**
- * URL with json list of recieved calls
- */
- const URL_CALLS = '?module=fwtbt&getcalls=true';
- /**
- * URL of user profile route
- */
- const URL_PROFILE = '?module=userprofile&username=';
- /**
- * Creates new FWTBT instance
- */
- public function __construct() {
- $this->loadConfig();
- $this->setOptions();
- $this->initCache();
- }
- /**
- * Loads required configs and sets some options
- *
- * @global object $ubillingConfig
- *
- * @return void
- */
- protected function loadConfig() {
- global $ubillingConfig;
- $this->altCfg = $ubillingConfig->getAlter();
- $this->billingCfg = $ubillingConfig->getBilling();
- }
- /**
- * Inits system cache
- *
- * @return void
- */
- protected function initCache() {
- $this->cache = new UbillingCache();
- }
- /**
- * Sets basic object instance options
- *
- * @return void
- */
- protected function setOptions() {
- /**
- * Make his fight on the hill in the early day
- * Constant chill deep inside
- */
- $this->myLogin = whoami();
- $this->dataSource = PBXNum::LOG_PATH;
- if (@$this->altCfg['FWTBT_INTERVAL']) {
- $this->pollingInterval = $this->altCfg['FWTBT_INTERVAL'] * 1000; //option is in seconds
- $this->cachingTimeout = $this->altCfg['FWTBT_INTERVAL'];
- }
- if (@$this->altCfg['FWTBT_TIMER']) {
- $this->popupTimeout = $this->altCfg['FWTBT_TIMER'] * 1000; //option is in seconds
- }
- if (@$this->altCfg['FWTBT_ANYWHERE']) {
- $this->anywhere = true;
- }
- if (@$this->altCfg['FWTBT_ADMINS']) {
- $this->showFor = explode(',', $this->altCfg['FWTBT_ADMINS']);
- $this->showFor = array_flip($this->showFor);
- }
- /**
- * Shouting gun, on they run through the endless grey
- * On the fight, for they are right, yes, by who's to say?
- */
- }
- /**
- * Renders calls data by last minute
- *
- * @return void
- */
- public function getCalls() {
- if (wf_CheckGet(array('getcalls'))) {
- $reply = array();
- $cachedReply = $this->cache->get(self::CACHE_KEY, $this->cachingTimeout);
- if (empty($cachedReply)) {
- $allAddress = zb_AddressGetFulladdresslistCached();
- if (file_exists($this->dataSource)) {
- $curMinute = date("Y-m-d H:i:");
- $command = $this->billingCfg['TAIL'] . ' -n 20 ' . $this->dataSource;
- $rawData = shell_exec($command);
- if (!empty($rawData)) {
- $rawData = explodeRows($rawData);
- $count = 0;
- if (!empty($rawData)) {
- foreach ($rawData as $io => $line) {
- if (!empty($line)) {
- if (ispos($line, $curMinute)) {
- $line = explode(' ', $line);
- @$number = $line[$this->offsetNumber]; //phone number offset
- @$status = $line[$this->offsetStatus]; //call status offset
- if (isset($line[$this->offsetLogin])) { //detected login offset
- $login = $line[$this->offsetLogin];
- } else {
- $login = '';
- }
- switch ($status) {
- case '0':
- //user not found
- $style = 'info';
- $icon = 'skins/call_info.png';
- break;
- case '1':
- //user found and active
- $style = 'success';
- $icon = 'skins/call_success.png';
- break;
- case '2':
- //user is debtor
- $style = 'error';
- $icon = 'skins/wdycnotify.png';
- break;
- case '3':
- //user is frozen
- $style = 'warning';
- $icon = 'skins/call_warning.png';
- break;
- default:
- //user not found
- $style = 'info';
- $icon = 'skins/call_info.png';
- break;
- }
- if (!empty($login)) {
- $profileControl = ' ' . wf_Link(self::URL_PROFILE . $login, web_profile_icon(), false, 'ubButton fwtbtprofile') . ' ';
- $callerName = isset($allAddress[$login]) ? $allAddress[$login] : '';
- $link = self::URL_PROFILE . $login;
- } else {
- $profileControl = '';
- $callerName = '';
- $link = '';
- }
- $notificationText = wf_tag('div', false, 'fwtbttext');
- $notificationText .= __('Calling') . ' ' . $number . ' ' . $callerName;
- $notificationText .= wf_tag('div', true);
- $notificationText .= $profileControl;
- $reply[$count]['text'] = $notificationText;
- $reply[$count]['cleartext'] = $number . ' ' . $callerName;
- $reply[$count]['type'] = $style;
- $reply[$count]['icon'] = $icon;
- $reply[$count]['link'] = $link;
- $reply[$count]['queue'] = 'q' . $count;
- $reply[$count]['number'] = $number;
- $count++;
- }
- }
- }
- }
- }
- }
- $this->cache->set(self::CACHE_KEY, $reply, $this->cachingTimeout);
- } else {
- $reply = $cachedReply;
- }
- die(json_encode($reply));
- }
- }
- /**
- * Returns notification frontend with some background polling
- *
- * @return string
- */
- protected function getCallsNotification() {
- $result = '';
- //some custom style
- $result .= wf_tag('style');
- //this style is inline for preventing of css caching
- $result .= '
- #noty_layout__bottomRight {
- width: 425px !important;
- }
- .fwtbttext {
- float: left;
- display: block;
- height: 32px;
- }
- .fwtbtprofile {
- float: right;
- margin-bottom: 5px;
- }
- ';
- if (@$this->altCfg['FWTBT_DESKTOP']) {
- $result .= '
- #noty_layout__bottomRight {
- margin-bottom: 120px !important;
- }
- ';
- }
- $result .= wf_tag('style', true);
- //basic notification frontend
- $result .= wf_tag('script');
- $result .= '
- $(document).ready(function() {
- Notification.requestPermission().then(function(result) {
- console.log(result);
- });
- $(".dismiss").click(function(){$("#notification").fadeOut("slow");});
- setInterval(
- function() {
- $.get("' . self::URL_CALLS . '&reqadm=' . $this->myLogin . '",function(message) {
- if (message) {
- var data= JSON.parse(message);
- data.forEach(function(key) {
- new Noty({
- theme: \'relax\',
- timeout: \'' . $this->popupTimeout . '\',
- progressBar: true,
- type: key.type,
- layout: \'bottomRight\',
- killer: key.number,
- queue: key.number,
- text: key.text
- }).show();
- if (typeof (sendNotificationDesktop) === "function") {
- var title = "' . __('Calling') . '";
- var options = {
- body: key.cleartext,
- icon: key.icon,
- tag: key.number,
- dir: "auto"
- };
- sendNotificationDesktop(title, options, key.link);
- }
- });
- }
- }
- )
- },
- ' . $this->pollingInterval . ');
- })
- ';
- $result .= wf_tag('script', true);
- if (@$this->altCfg['FWTBT_DESKTOP']) {
- $result .= wf_tag('script');
- $result .= '
- function sendNotificationDesktop(title, options, link) {
- if (Notification.permission === "granted") {
- var notification = new Notification(title, options);
- if(link) {
- notification.onclick = function() {
- window.open(link,"_self");
- }
- }
- } else if (Notification.permission !== "denied") {
- Notification.requestPermission(function (permission) {
- if (permission === "granted") {
- var notification = new Notification(title, options);
- if(link) {
- notification.onclick = function() {
- window.open(link,"_self");
- }
- }
- }
- });
- }
- };
- ';
- $result .= wf_tag('script', true);
- }
- return ($result);
- }
- /**
- * Renders widget code if it required for current situation
- *
- * @return string/void
- */
- public function renderWidget() {
- $result = '';
- if (cfr('FWTBT')) {
- if (@$this->altCfg['FWTBT_ENABLED']) {
- $widget = $this->getCallsNotification();
- if ($this->anywhere) {
- $result .= $widget;
- } else {
- if ((@$_GET['module'] == 'taskbar') OR ( !isset($_GET['module']))) {
- $result .= $widget;
- }
- }
- //per-admin controls
- if ((!empty($this->showFor) AND ( !isset($this->showFor[$this->myLogin])))) {
- $result = '';
- }
- return($result);
- }
- }
- }
- }
|