diff options
Diffstat (limited to 'fs_selfservice/fri/modules/followme.module')
-rw-r--r-- | fs_selfservice/fri/modules/followme.module | 678 |
1 files changed, 678 insertions, 0 deletions
diff --git a/fs_selfservice/fri/modules/followme.module b/fs_selfservice/fri/modules/followme.module new file mode 100644 index 0000000..85a1f37 --- /dev/null +++ b/fs_selfservice/fri/modules/followme.module @@ -0,0 +1,678 @@ +<?php + +/** + * @file + * Functions for the interface to the call monitor recordings + */ + +/** + * Class for Followme + */ +class followme { + + var $protocol_table; + var $protocol_config_files; + + /* + * rank (for prioritizing modules) + */ + function rank() { + + $rank = 5; + return $rank; + } + + /* + * init + */ + function init() { + + } + + /* + * Adds menu item to nav menu + * + * @param $args + * Common arguments + */ + function navMenu($args) { + global $ARI_ADMIN_USERNAME; + + $exten = $_SESSION['ari_user']['extension']; + if ($exten!=$ARI_ADMIN_USERNAME) { + $ret .= "<p><small><small><a href='" . $_SESSION['ARI_ROOT'] . "?m=followme&f=display'>" . _("Follow Me") . "</a></small></small></p>"; + } + + return $ret; + } + + /* + * Acts on the user settings + * + * @param $args + * Common arguments + * @param $a + * action + */ + function action($args) { + + global $STANDALONE; + global $ARI_ADMIN_USERNAME; + global $SETTINGS_ALLOW_VMX_SETTINGS; + + // args + $m = getArgument($args,'m'); + $a = getArgument($args,'a'); + + $lang_code = getArgument($args,'lang_code'); + + $follow_me_prering_time = getArgument($args,'follow_me_prering_time'); + $follow_me_listring_time = getArgument($args,'follow_me_listring_time'); + $follow_me_list = getArgument($args,'follow_me_list'); + $follow_me_confirm = getArgument($args,'follow_me_confirm'); + $follow_me_ddial = getArgument($args,'follow_me_ddial'); + $follow_me_disabled = getArgument($args,'follow_me_disabled'); + + $language = new Language(); + + // Lets see if we can make heads or tails of this code?!? + + // The action is 'update + if ($a=='update') { + + // Get the extension and make sure we are not in + // admin mode + $exten = $_SESSION['ari_user']['extension']; + if ($exten!=$ARI_ADMIN_USERNAME) { + + + // Make sure Follow-Me setup has not been deleted for this user since the last refresh + $follow_me_disabled_delayed = $_COOKIE['ari_follow_me_disabled']; + if (! $_COOKIE['ari_follow_me_disabled']) { + + $follow_me_disabled = ($this->getFollowMeListRingTime($exten) > 0)?0:1; + + if ($follow_me_disabled) { + + setcookie("ari_follow_me_disabled", $follow_me_disabled, time()+365*24*60*60); + $follow_me_disabled_delayed = $follow_me_disabled; + $_SESSION['ari_error'] = + _("Your Follow-Me has been disabled, REFRESH your browser to remove this message") . "<br>" . + sprintf(_("Check with your Telephone System Administrator if you think there is a problem")); + } + } + + + + if (! $follow_me_disabled_delayed) { + + // assume no errors, don't update SQL if errors occured + $follow_me_update_succeeded=1; + + // update follow me pre-ring time + if (!$STANDALONE['use']) { + + $stripped_follow_me_prering_time = preg_replace('/-|\s/','',$follow_me_prering_time); + if (!is_numeric($stripped_follow_me_prering_time)) { + $_SESSION['ari_error'] = + _("Follow-Me pre-ring time not changed") . "<br>" . + sprintf(_("Number %s must be an interger number of seconds"),$follow_me_prering_time); + $follow_me_update_succeeded=0; + } + else { + + // set database + $this->setFollowMePreRingTime($exten,$stripped_follow_me_prering_time); + + // store cookie + $stripped = preg_replace('/-|\s/','',$_COOKIE['ari_follow_me_prering_time']); + if ($follow_me_prering_time && $stripped!=$stripped_follow_me_prering_time) { + setcookie("ari_follow_me_prering_time", $follow_me_prering_time, time()+365*24*60*60); + } + } + } + + // update follow me list ring time + if (!$STANDALONE['use']) { + + $stripped_follow_me_listring_time = preg_replace('/-|\s/','',$follow_me_listring_time); + if (!is_numeric($stripped_follow_me_listring_time)) { + $_SESSION['ari_error'] = + _("Follow-Me list ring time not changed") . "<br>" . + sprintf(_("Number %s must be an interger number of seconds"),$follow_me_listring_time); + $follow_me_update_succeeded=0; + } + else { + + // set database + $this->setFollowMeListRingTime($exten,$stripped_follow_me_listring_time); + + // store cookie + $stripped = preg_replace('/-|\s/','',$_COOKIE['ari_follow_me_listring_time']); + if ($follow_me_listring_time && $stripped!=$stripped_follow_me_listring_time) { + setcookie("ari_follow_me_listring_time", $follow_me_listring_time, time()+365*24*60*60); + } + } + } + + // update follow me list + if (!$STANDALONE['use']) { + + $grplist = explode("\n", $follow_me_list); + + if (!$grplist) { + $grplist = null; + } + + foreach (array_keys($grplist) as $key) { + //trim it + $grplist[$key] = trim($grplist[$key]); + + // Lookup the extension and append hash if not a user, and remove invalid chars + $grplist[$key] = $this->lookupSetExtensionFormat($grplist[$key]); + + // remove blanks + if ($grplist[$key] == "") unset($grplist[$key]); + } + + // check for duplicates, and re-sequence + $grplist = array_values(array_unique($grplist)); + + $stripped_follow_me_list = implode("-",$grplist); + + if ($stripped_follow_me_list == "") { + $_SESSION['ari_error'] = + _("Follow-Me list must contain at least one valid number") . "<br>" . + sprintf(_("The following: %s is not valid"),$follow_me_list); + $follow_me_update_succeeded=0; + } + else { + + // set database + $this->setFollowMeList($exten,$stripped_follow_me_list); + + // store cookie + $stripped = preg_replace('/|\(|\)|\s/','',$_COOKIE['ari_follow_me_list']); + if ($follow_me_list && $stripped!=$stripped_follow_me_list) { + setcookie("ari_follow_me_list", $follow_me_list, time()+365*24*60*60); + } + } + } + + // update follow me confirm + if (!$STANDALONE['use']) { + + // set database + $this->setFollowMeConfirm($exten,$follow_me_confirm); + $this->setFollowMeDDial($exten,$follow_me_ddial); + + // store cookie + setcookie("ari_follow_me_confirm", $follow_me_confirm, time()+365*24*60*60); + setcookie("ari_follow_me_ddial", $follow_me_ddial, time()+365*24*60*60); + } + + //If no errors than update the SQL table to keep in sync + if ($follow_me_update_succeeded) { + $this->setFollowMeMySQL($exten, $follow_me_prering_time, $follow_me_listring_time, $follow_me_list, $follow_me_confirm); + } + + } //if !follow_me_disabled + } + } + + // redirect to see updated page + $ret .= " + <head> + <script> + <!-- + window.location = \"" . $_SESSION['ARI_ROOT'] . "?m=" . $m . "\" + // --> + </script> + </head>"; + + return $ret; + } + + /* + * Displays stats page + * + * @param $args + * Common arguments + */ + function display($args) { + + global $STANDALONE; + global $ARI_ADMIN_USERNAME; + global $SETTINGS_PRERING_LOW; + global $SETTINGS_PRERING_HIGH; + global $SETTINGS_LISTRING_LOW; + global $SETTINGS_LISTRING_HIGH; + + global $SETTINGS_FOLLOW_ME_LIST_MAX; + + global $loaded_modules; + + // args + $m = getArgument($args,'m'); + $q = getArgument($args,'q'); + $start = getArgument($args,'start'); + $span = getArgument($args,'span'); + + $displayname = $_SESSION['ari_user']['displayname']; + $exten = $_SESSION['ari_user']['extension']; + + $language = new Language(); + $display = new DisplaySearch(); + + // build controls + if ($exten!=$ARI_ADMIN_USERNAME) { + + // call forward settings + if (!$STANDALONE['use']) { + + $follow_me_prering_time = $this->getFollowMePreRingTime($exten); + $follow_me_listring_time = $this->getFollowMeListRingTime($exten); + $follow_me_list = explode("-", $this->getFollowMeList($exten) ); + $follow_me_confirm = $this->getFollowMeConfirm($exten); + $follow_me_ddial = $this->getFollowMeDDial($exten); + + $FOLLOW_ME_LIST_MAX = (count($follow_me_list) > $SETTINGS_FOLLOW_ME_LIST_MAX) ? count($follow_me_list):$SETTINGS_FOLLOW_ME_LIST_MAX; + + //TODO: Set this better than this? + $follow_me_disabled = ($follow_me_listring_time > 0)?0:1; + setcookie("ari_follow_me_disabled", $follow_me_disabled, time()+365*24*60*60); + + $followme_text.= "<table class='settings'>"; + + if (!$follow_me_disabled) { + // $followme_text .= "<tr><td><h3><br>" . _("Follow Me") . "</h3></td></tr>"; + $followme_text .= "<tr><td> </td></tr>"; // Blank Line + + $followme_text .= "<tr><td><a href='#' class='info'>" . _("Enable") . "<span>"; + $followme_text .= _( "Dial-by-name Directory, IVR, and internal + calls will ring the numbers in the FollowMe + List. Any FreePBX routes that directly + reference a FollowMe are unaffected by this + enable/disable setting."); + $followme_text .= "<br></span></a></td>"; + + $followme_text .= "<td><input " . $follow_me_ddial . " type=checkbox name='follow_me_ddial' value='checked'></td></tr>"; + + $followme_text .= "<tr><td> </td></tr>"; // Blank Line + $followme_text .= "<tr><td valign='top'><a href='#' class='info'>" . _("Follow Me List:"); + $followme_text .= "<span>" . sprintf(_("Extensions and outside numbers to ring next.")) ."<br/><br/>"; + $followme_text .= sprintf(_("Include %s to keep it ringing."),"<strong>".$exten."</strong>") . "<br></span></a></td>"; + $followme_text .= "<td><textarea " . $follow_me_list_options . " id='follow_me_list' name='follow_me_list' type='text' cols='20' rows='".$FOLLOW_ME_LIST_MAX."' value='' onKeyUp='rowCounter(this.form.follow_me_list, ".$FOLLOW_ME_LIST_MAX.");' onKeyDown='rowCounter(this.form.follow_me_list, ".$FOLLOW_ME_LIST_MAX.");'>".implode("\n",$follow_me_list)."</textarea>"; + $followme_text .= "</td></tr>"; + + $followme_text .= "<tr><td> </td></tr>"; // Blank Line + $followme_text .= "<tr><td><a href='#' class='info'>"; + $followme_text .= sprintf(_("Ring %s First For:"), $exten); + $followme_text .= "<span>" . sprintf( _("Time to ring extension %s before ringing the %s Follow Me List %s"), "<strong>".$exten."</strong>","<strong>","</strong>"); + $followme_text .= "<br></span></a></td><td>"; + + $followme_text .= "<select " . $follow_me_prering_time_text_box_options . " name='follow_me_prering_time'/>"; + $default_prering = $follow_me_prering_time; + for ($i=$SETTINGS_PRERING_LOW; $i <= $SETTINGS_PRERING_HIGH; $i++) { + $followme_text .= '<option value="'.$i.'" '.($i == $default_prering ? 'SELECTED' : '').'>'.$i.'</option>'; + } + $followme_text .= "</select>"; + + $followme_text .= "<small>" . _("seconds") . "</small>"; + $followme_text .= "</td></tr>"; + + $followme_text .= "<tr><td><a href='#' class='info'>" . _("Ring Followme List for:") . "<span>" . _("Time to ring the Follow Me List.") . "<br></span></a></td>"; + $followme_text .= "<td>"; + + $followme_text .= "<select " . $follow_me_listring_time_text_box_options . " name='follow_me_listring_time'/>"; + $default_listring = $follow_me_listring_time; + for ($i=$SETTINGS_LISTRING_LOW; $i <= $SETTINGS_LISTRING_HIGH; $i++) { + $followme_text .= '<option value="'.$i.'" '.($i == $default_listring ? 'SELECTED' : '').'>'.$i.'</option>'; + } + $followme_text .= "</select>"; + + $followme_text .= "<small>" . _("seconds") . "</small></td></tr>"; + + + $followme_text .= "<tr><td> </td></tr>"; // Blank Line + + $followme_text .= "<tr><td><a href='#' class='info'>" . _("Use Confirmation:") . "<span>". _("Outside lines that are part of the Follow Me List will be called and offered a menu:<br/><br/> \"You have an incoming call. Press 1 to accept or 2 to decline.\"<br/><br/> This keeps calls from ending up in external voicemail. Make sure that the List Ring Time is long enough to allow for you to hear and react to this message."); + $followme_text .= "<br></span></a></td><td>"; + $followme_text .= "<input " . $follow_me_confirm . " type=checkbox name='follow_me_confirm' value='checked'>"; + $followme_text .= "<small>" . _("Enable") . "</small></td></tr>"; + $followme_text .= "<tr><td> </td></tr>"; // Blank Line + $followme_text .= "</table>"; + } + } + + } + + // build page content + $ret .= checkErrorMessage(); + + if ($_SESSION['ari_user']['admin_settings']) { + $headerText = _("Followme Settings"); + } else { + $headerText = sprintf(_("Followme Settings for %s (%s)"),$displayname,$exten); + } + + $ret .= $display->displayHeaderText($headerText); + $ret .= $display->displayLine(); + + $ret .= + "\n<SCRIPT LANGUAGE='JavaScript'> + <!-- Begin + function rowCounter(field, maxlimit) { + temp = field.value.split('\u000A',maxlimit+1) + field.value = temp.join('\u000A') + if (temp.length == maxlimit+1) { + field.value = field.value.substring(0, field.value.length-1) + } + } + // End --> + </script>\n"; + + $ret .= + "<form class='settings' name='ari_settings' action='' method='GET'> + <input type=hidden name=m value=" . $m . "> + <input type=hidden name=f value='action'> + <input type=hidden name=a value='update'> + " . $followme_text . " + <br> + <input name='submit' type='submit' value='" . _("Update") . "'> + </form>"; + + return $ret; + } + + + /* + * Sets Follow Me Pre-Ring Time + * + * @param $exten + * Extension to modify + * @param $follow_me_prering_time + * Pre-Ring Time to ring + */ + function setFollowMePreRingTime($exten,$follow_me_prering_time) { + + global $asterisk_manager_interface; + + $value_opt = $follow_me_prering_time; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/followme/prering $value_opt\r\n\r\n"); + } + + /* + * Gets Follow Me Pre-Ring Time if set + * + * @param $exten + * Extension to get information about + * @return $number + * follow me pre-ring time returned if set + */ + function getFollowMePreRingTime($exten) { + + global $asterisk_manager_interface; + + $number = ''; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/followme/prering\r\n\r\n"); + if (is_numeric($response)) { + $number = $response; + } + + $stripped = preg_replace('/-|\(|\)|\s/','',$_COOKIE['ari_follow_me_prering_time']); + if ($stripped==$number) { + $number = $_COOKIE['ari_follow_me_prering_time']; + } + + return $number; + } + + /* + * Sets Follow Me List Ring Time + * + * @param $exten + * Extension to modify + * @param $follow_me_listring_time + * List Ring Time to ring + */ + function setFollowMeListRingTime($exten,$follow_me_listring_time) { + + global $asterisk_manager_interface; + + $value_opt = $follow_me_listring_time; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/followme/grptime $value_opt\r\n\r\n"); + } + + /* + * Gets Follow Me List-Ring Time if set + * + * @param $exten + * Extension to get information about + * @return $number + * follow me list-ring time returned if set + */ + function getFollowMeListRingTime($exten) { + + global $asterisk_manager_interface; + + $number = ''; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/followme/grptime\r\n\r\n"); + if (is_numeric($response)) { + $number = $response; + } + + $stripped = preg_replace('/-|\(|\)|\s/','',$_COOKIE['ari_follow_me_listring_time']); + if ($stripped==$number) { + $number = $_COOKIE['ari_follow_me_listring_time']; + } + + return $number; + } + + /* + * Sets Follow Me List + * + * @param $exten + * Extension to modify + * @param $follow_me_list + * Follow Me List + */ + function setFollowMeList($exten,$follow_me_list) { + + global $asterisk_manager_interface; + + $value_opt = $follow_me_list; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/followme/grplist $value_opt\r\n\r\n"); + } + + /* + * Gets Follow Me List if set + * + * @param $exten + * Extension to get information about + * @return $data + * follow me list if set + */ + function getFollowMeList($exten) { + + global $asterisk_manager_interface; + + $number = ''; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/followme/grplist\r\n\r\n"); + + //TODO: really need to check for a bogus response, see how other side does it + // + return preg_replace("/[^0-9*\-]/", "", $response); + } + + /* + * Sets Follow Confirmation Setting + * + * @param $exten + * Extension to modify + * @param $follow_me_cofirm + * Follow Me Confirm Setting + */ + function setFollowMeConfirm($exten,$follow_me_confirm) { + + global $asterisk_manager_interface; + + $value_opt = ($follow_me_confirm)?'ENABLED':'DISABLED'; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/followme/grpconf $value_opt\r\n\r\n"); + } + + /* + * Gets Follow Me Confirmation Setting + * + * @param $exten + * Extension to get information about + * @return $data + * follow me confirm setting + */ + function getFollowMeConfirm($exten) { + + global $asterisk_manager_interface; + + $number = ''; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/followme/grpconf\r\n\r\n"); + + if (preg_match("/ENABLED/",$response)) { + $response='checked'; + } + else { + $response=''; + } + + //TODO: really need to check for a bogus response, see how other side does it + // + return $response; + + } + + /* + * Sets Follow Ddial Setting + * + * @param $exten + * Extension to modify + * @param $follow_me_ddial + * Follow Me Ddial Setting + */ + function setFollowMeDDial($exten,$follow_me_ddial) { + + global $asterisk_manager_interface; + + $value_opt = ($follow_me_ddial)?'DIRECT':'EXTENSION'; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/followme/ddial $value_opt\r\n\r\n"); + } + + /* + * Gets Follow Me Ddial Setting + * + * @param $exten + * Extension to get information about + * @return $data + * follow me ddial setting + */ + function getFollowMeDDial($exten) { + + global $asterisk_manager_interface; + + $response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/followme/ddial\r\n\r\n"); + + if (preg_match("/EXTENSION/",$response)) { + $response=''; + } + else { + $response='checked'; + } + + //TODO: really need to check for a bogus response, see how other side does it + // + return $response; + + } + + + + + + /* + * Gets FreePBX Version + */ + function getFreePBXVersion() { + + if (isset($_SESSION['dbh_asterisk'])) { + $sql = "SELECT * FROM admin WHERE variable = 'version'"; + $results = $_SESSION['dbh_asterisk']->getAll($sql); + if(DB::IsError($results)) { + $_SESSION['ari_error'] = $results->getMessage(); + } + + return $results[0][1]; + } + } + + /* + * Sets Follow-Me Settings in FreePBX MySQL Database + * + * @param $exten + * Extension to modify + * @param $follow_me_prering_time + * Pre-Ring Time to ring + * @param $follow_me_listring_time + * List Ring Time to ring + * @param $follow_me_list + * Follow Me List + * @param $follow_me_list + * Follow Me Confirm Setting + * + */ + function setFollowMeMySQL($exten, $follow_me_prering_time, $follow_me_listring_time, $follow_me_list, $follow_me_confirm) { + + if (isset($_SESSION['dbh_asterisk'])) { + + //format for SQL database + $follow_me_confirm = ($follow_me_confirm)?'CHECKED':''; + + $sql = "UPDATE findmefollow SET grptime = '" . $follow_me_listring_time . "', grplist = '". + str_replace("'", "''", trim($follow_me_list)) . "', pre_ring = '" . $follow_me_prering_time . + "', needsconf = '" . $follow_me_confirm . "' WHERE grpnum = $exten LIMIT 1"; + $results = $_SESSION['dbh_asterisk']->query($sql); + + if(DB::IsError($results)) { + $_SESSION['ari_error'] = $results->getMessage(); + } + + return 1; + } + } + + function lookupSetExtensionFormat($exten) { + + if (trim($exten) == "") return $exten; + + $exten = preg_replace("/[^0-9*]/", "", $exten); + + $sql = "SELECT extension FROM users WHERE extension = '".$exten."'"; + $asa = $_SESSION['dbh_asterisk']->getrow($sql, DB_FETCHMODE_ASSOC); + if (!is_array($asa)) { + return $exten.'#'; + } else { + return $exten; + } + } + + +} // class + +?> |