lib/Service/SmsrelentlessService.php
8a51e7d9
 <?php
 /**
  * @copyright 2021 Double Bastion LLC <www.doublebastion.com>
  *
  * @author Double Bastion LLC
  *
  * @license GNU AGPL version 3 or any later version
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
  * License as published by the Free Software Foundation; either
  * version 3 of the License, or any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
  *
  * You should have received a copy of the GNU Affero General Public
  * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  */
 
 declare(strict_types=1);
 
 namespace OCA\SMSRelentless\Service;
 
 use OCP\IDBConnection;
 use OCP\Security\ICrypto;
 use OCP\AppFramework\ApiController;
 use OCP\AppFramework\Controller;
 use OCP\IRequest;
 use OCP\IGroupManager;
 
 
 class SmsrelentlessService {
 
      private $connection;
      private $crypto;
      private $groupManager;
 
      public function __construct(IDBConnection $connection, ICrypto $crypto, IGroupManager $groupManager) {
 
                 $this->connection = $connection;
                 $this->crypto = $crypto;
                 $this->groupManager = $groupManager;
      }
 
 
      /**
       * @NoAdminRequired
       *
       */
      public function insertrecsms($userId, $recmessagearr) {
 
             $authorDisplayNm = '';
             $internalSender = 0;
 
             // Search for the associated Display Name in the previous messages sent from the same phone number, in the 'sms_relent_sent' table
             $recmsgfromprc = '%' . $recmessagearr[2];
             $getdspnmst = $this->connection->prepare('SELECT `from`, `author_displayname` FROM `*PREFIX*sms_relent_sent` WHERE `from` LIKE ?');
             $getdspnmstres = $getdspnmst->execute([$recmsgfromprc]);
 
             $dispnamearr = [];
             while ($dspnmstfetched = $getdspnmstres->fetch()) {
                    $dispnamearr[] = $dspnmstfetched['author_displayname'];
             }
 	    $getdspnmstres->closeCursor();
 
             if ($dispnamearr) {
                 $descdspnmarr = array_reverse($dispnamearr);
                 $authorDisplayNm = $descdspnmarr[0];
                 $internalSender = 1;
             } else { $authorDisplayNm = ''; $internalSender = 0; }
 
 
             if (!$authorDisplayNm) {
 
                 // Search for the associated Display Name in the previous messages coming from the same phone number, in the 'sms_relent_received' table
                 $getdspnm = $this->connection->prepare('SELECT `from`, `author_displayname` FROM `*PREFIX*sms_relent_received` WHERE `from` = ?');
                 $getdspnmres = $getdspnm->execute([$recmessagearr[2]]);
 
                 $dspnmearr = [];
                 while ($dspnmfetched = $getdspnmres->fetch()) {
                        if ($dspnmfetched['author_displayname']) {
                            $dspnmearr[] = $dspnmfetched['author_displayname'];
                        }
                 }
 	        $getdspnmres->closeCursor();
 
                 if ($dspnmearr) {
                     $descdisplaynmarr = array_reverse($dspnmearr);
                     $authorDisplayNm = $descdisplaynmarr[0];
                     $internalSender = 0;
                 } else { $authorDisplayNm = ''; $internalSender = 0; }
             }
 
             // Insert the received message in the 'sms_relent_received' table
             $escapedmessagepre = $recmessagearr[4];
             $escapedmessage = nl2br($escapedmessagepre);
 
             $sql = $this->connection->prepare('
 				INSERT INTO `*PREFIX*sms_relent_received`
 					(`user_id`, `message_id`, `date`, `from`, `to`, `message`, `author_displayname`, `internal_sender`)
 				VALUES (?, ?, ?, ?, ?, ?, ?, ?)
 			');
 	    $sql->execute([$userId, $recmessagearr[0], $recmessagearr[1], $recmessagearr[2], $recmessagearr[3], $escapedmessage, $authorDisplayNm, $internalSender]);
      }
 
 
      /**
       * @NoAdminRequired
       *
       */
      public function insertsentsms($userId, $sentmessagearr) {
 
             $authorDisplayName = '';
             $msgsentfrompre = explode("+", $sentmessagearr[2]);
             $msgsentfrom = "+" . $msgsentfrompre[1];
 
             // Search for the sender's Display Name
             $getacdatadnst = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
             $getacdatadnstres = $getacdatadnst->execute([$userId, 'displayname']);
 	    $acusrdnstfetched = $getacdatadnstres->fetch();
             $getacdatadnstres->closeCursor();
 
             if ($acusrdnstfetched) {
 	        $authorDisplayName = $acusrdnstfetched['value'];
 	    }
 
             $textwithnl = nl2br($sentmessagearr[8]);
             $sql = $this->connection->prepare('
 				INSERT INTO `*PREFIX*sms_relent_sent`
 					(`user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`, `author_displayname`)
 				VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
 			');
 	    $sql->execute([$userId, $sentmessagearr[0], $sentmessagearr[1], $sentmessagearr[2], $sentmessagearr[3], $sentmessagearr[4], $sentmessagearr[5], $sentmessagearr[6], 
                            $sentmessagearr[7], $textwithnl, $authorDisplayName]);
      }
 
 
      /**
       * @NoAdminRequired
       *
       */
      public function updatedeliverystatustel($ncuserfortelnyxdel, $messageid, $network, $messageprice, $messagestatus, $deliverystatus) {
 
 	    $sqlupdateds = $this->connection->prepare('
 			UPDATE `*PREFIX*sms_relent_sent`
 			SET `price` = ?, `status` = ?, `deliveryreceipt` = ?, `network` = ?
                         WHERE `message_id` = ? AND `user_id` = ? ');
 	    $updateRes = $sqlupdateds->execute([$messageprice, $messagestatus, $deliverystatus, $network, $messageid, $ncuserfortelnyxdel]);
 	    $updateRes->closeCursor();
      }
 
 
      /**
       * @NoAdminRequired
       *
       */
      public function updatedeliverystatusnex($ncuserforplivodel, $messageid, $networkcode, $messageprice, $mStatus, $deliverystatus) {
 
 	    $sqlupdatedspl = $this->connection->prepare('
 			UPDATE `*PREFIX*sms_relent_sent`
 			SET `price` = ?, `deliveryreceipt` = ?, `status` = ?, `network` = ?
                         WHERE `message_id` = ? AND `user_id` = ? ');
 	    $updateResdspl = $sqlupdatedspl->execute([$messageprice, $deliverystatus, $mStatus, $networkcode, $messageid, $ncuserforplivodel]);
 	    $updateResdspl->closeCursor();
      }
 
 
      /**
       * @NoAdminRequired
       *
       */
      public function updatedeliverystatustwil($ncuserfortwildel, $messageid, $networkcode, $messageprice, $mStatus, $deliverystatus) {
 
 	    $sqlupdatedstw = $this->connection->prepare('
 			UPDATE `*PREFIX*sms_relent_sent`
 			SET `price` = ?, `deliveryreceipt` = ?, `status` = ?, `network` = ?
                         WHERE `message_id` = ? AND `user_id` = ? ');
 	    $updateResdstw = $sqlupdatedstw->execute([$messageprice, $deliverystatus, $mStatus, $networkcode, $messageid, $ncuserfortwildel]);
 	    $updateResdstw->closeCursor();
      }
 
 
      /**
       * @NoAdminRequired
       *
       */
      public function updatedeliverystatusflow($ncuserforflowdel, $messageid, $networkcode, $messageprice, $mStatus, $deliverystatus) {
 
 	    $sqlupdatedsfl = $this->connection->prepare('
 			UPDATE `*PREFIX*sms_relent_sent`
 			SET `price` = ?, `deliveryreceipt` = ?, `status` = ?, `network` = ?
                         WHERE `message_id` = ? AND `user_id` = ? ');
 	    $updateResdsfl = $sqlupdatedsfl->execute([$messageprice, $deliverystatus, $mStatus, $networkcode, $messageid, $ncuserforflowdel]);
 	    $updateResdsfl->closeCursor();
      }
 
 
      /**
       * @NoAdminRequired
       */
      public function getreceivedtable($userId) {
 
         // Get the user's preferences from the settings
         $getgamcheckrc = $this->connection->prepare('
 		       SELECT `user_id`, `show_all_messages`, `show_display_names`
 		       FROM  `*PREFIX*sms_relent_settings` WHERE `user_id` = ?');
         $getgamcheckrcres = $getgamcheckrc->execute([$userId]);
         $getcrgamsrcpref = $getgamcheckrcres->fetch();
         $crgamsrcpref = $getcrgamsrcpref['show_all_messages'];
         $crdnmsrcpref = $getcrgamsrcpref['show_display_names'];
         $getgamcheckrcres->closeCursor();
 
 
         // Collect the users with whom the current admin is sharing his API keys and whose messages he will be able to see
         if ($crgamsrcpref == 1 && $this->groupManager->isAdmin($userId)) {
 
             // Get the users that belong to the 'admin' group
             $getadmn = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
             $getadmnres = $getadmn->execute(['admin']);
 
             $usersadminsd = [];
             while ($getadmnusrs = $getadmnres->fetch()) {
                    $usersadminsd[] = $getadmnusrs['uid'];
             }
             $getadmnres->closeCursor();
 
             // Get the groups and users that were allowed access to the API keys
             $getgrps = $this->connection->prepare('SELECT `user_id`, `tnx_groups_allowed`, `tnx_users_allowed`, `plv_groups_allowed`, `plv_users_allowed`,
                                                   `twl_groups_allowed`, `twl_users_allowed`, `flr_groups_allowed`, `flr_users_allowed` FROM `*PREFIX*sms_relent_subac`
                                                    WHERE `user_id` = ?');
             $getgrpsres = $getgrps->execute([$userId]);
             $getgrpsusr = $getgrpsres->fetch();
             $getgrpsres->closeCursor();
 
             if ($getgrpsusr) {
 
                 if ($getgrpsusr['tnx_users_allowed']) { $tnxusers = explode("|", $getgrpsusr['tnx_users_allowed']); } else { $tnxusers = []; }
                 if ($getgrpsusr['plv_users_allowed']) { $plvusers = explode("|", $getgrpsusr['plv_users_allowed']); } else { $plvusers = []; }
                 if ($getgrpsusr['twl_users_allowed']) { $twlusers = explode("|", $getgrpsusr['twl_users_allowed']); } else { $twlusers = []; }
                 if ($getgrpsusr['flr_users_allowed']) { $flrusers = explode("|", $getgrpsusr['flr_users_allowed']); } else { $flrusers = []; }
 
                 $allwdusersarr = array_merge($tnxusers, $plvusers, $twlusers, $flrusers);
                 $allwdusersunq = array_filter(array_unique($allwdusersarr));
 
                 if ($getgrpsusr['tnx_groups_allowed']) { $tnxgroups = explode("|", $getgrpsusr['tnx_groups_allowed']); } else { $tnxgroups = []; }
                 if ($getgrpsusr['plv_groups_allowed']) { $plvgroups = explode("|", $getgrpsusr['plv_groups_allowed']); } else { $plvgroups = []; }
                 if ($getgrpsusr['twl_groups_allowed']) { $twlgroups = explode("|", $getgrpsusr['twl_groups_allowed']); } else { $twlgroups = []; }
                 if ($getgrpsusr['flr_groups_allowed']) { $flrgroups = explode("|", $getgrpsusr['flr_groups_allowed']); } else { $flrgroups = []; }
 
                 $allwdgroupsarr = array_merge($tnxgroups, $plvgroups, $twlgroups, $flrgroups);
                 $allwdgroupsunq = array_filter(array_unique($allwdgroupsarr));
 
             } else {
                 $allwdusersunq = [];
                 $allwdgroupsunq = [];
             }
 
             // Get the username for each Display Name of the allowed users
             $allwdusersfnl = [];
             foreach ($allwdusersunq as $alwdusrkey => $alwdusrvalue) {
 
                          $getacdatausrnm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
 		         $getacdatausrnmres = $getacdatausrnm->execute(['displayname', $alwdusrvalue]);
 		         $acdatausrname = $getacdatausrnmres->fetch();
                          if ($acdatausrname) {
                              $allwdusersfnl[] = $acdatausrname['uid'];
                          }
                          $getacdatausrnmres->closeCursor();
             }
 
             // Get the users from all the allowed groups
             $allwdusersgrpmlt = [];
             foreach ($allwdgroupsunq as $prgrpkey => $prgrpvalue) {
 
                          // Get all the users that belong to the current group
                          $getusringroup = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
 		         $getusringroupres = $getusringroup->execute([$prgrpvalue]);
 
 		         while ($getusrname = $getusringroupres->fetch()) {
 
 	                        // Ensure the current user is not an admin
                                 if (!in_array($getusrname['uid'], $usersadminsd)) {
                                      $allwdusersgrpmlt[] = $getusrname['uid'];
                                 }
                          }
 		         $getusringroupres->closeCursor();
             }
             $allwdusersgrpfnl = array_unique($allwdusersgrpmlt);
             
             $allusr = array_merge($allwdusersfnl, $allwdusersgrpfnl);
             $allusruniquest = array_unique($allusr);
 
             if ($allusruniquest) {
                 array_unshift($allusruniquest, $userId);
                 $allusruniquerc = $allusruniquest;
             } else { $allusruniquerc = [$userId]; }
 
             $procardatarc = implode(',', array_fill(0, count($allusruniquerc), '?'));
         }
 
         // If the user is an admin and he wants to see his messages and the messages of all the users with whom he shares his API keys
         if ($crgamsrcpref == 1 && $this->groupManager->isAdmin($userId)) {
 
             if ($crdnmsrcpref == 1) {
 	        $getrectable = $this->connection->prepare('
 			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `author_displayname`, `internal_sender`
 			FROM `*PREFIX*sms_relent_received` 
                         WHERE `user_id` IN (' . $procardatarc . ')');
 	        $rcresult = $getrectable->execute($allusruniquerc);
             } else {
 	        $getrectable = $this->connection->prepare('
 			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `internal_sender`
 			FROM `*PREFIX*sms_relent_received` 
                         WHERE `user_id` IN (' . $procardatarc . ')');
 	        $rcresult = $getrectable->execute($allusruniquerc);
             }
 
         // If the user is an admin and he wants to see only his messages
         } elseif ($crgamsrcpref == 0 && $this->groupManager->isAdmin($userId)) {
 
             if ($crdnmsrcpref == 1) {
 	        $getrectable = $this->connection->prepare('
 			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `author_displayname`, `internal_sender`
 			FROM `*PREFIX*sms_relent_received` 
                         WHERE `user_id` = ?');
 	        $rcresult = $getrectable->execute([$userId]);
             } else {
 	        $getrectable = $this->connection->prepare('
 			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `internal_sender`
 			FROM `*PREFIX*sms_relent_received` 
                         WHERE `user_id` = ?');
 	        $rcresult = $getrectable->execute([$userId]);
             }
 
         // If the user is not an admin 
         } elseif (!$this->groupManager->isAdmin($userId)) {
 
 	    // Get the Display Name of the current user
 	    $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
 	    $getacdatadnres = $getacdatadn->execute([$userId, 'displayname']);
 	    $acdatausrdnadm = $getacdatadnres->fetch();
 	    $cruserdname = $acdatausrdnadm['value'];
 	    $getacdatadnres->closeCursor();
 
             // Get the groups to which the current user belongs
             $getusrgrp = $this->connection->prepare('
 	          SELECT `gid`, `uid`
 	          FROM  `*PREFIX*group_user`
                   WHERE `uid` = ?');
             $getusrgrpres = $getusrgrp->execute([$userId]);
 
             $usergrps = [];
             while ($fetchedgrps = $getusrgrpres->fetch()) {
                    $usergrps[] = $fetchedgrps['gid'];
             }
             $getusrgrpres->closeCursor();
 
             // Get the restrictions from the 'sms_relent_restrict' table
             $getrestr = $this->connection->prepare('
 		       SELECT `phone_number`, `groups`, `users`
 		       FROM  `*PREFIX*sms_relent_restrict`');
             $getrestrres = $getrestr->execute();
 
             $restrdata = [];
             while ($restrfetched = $getrestrres->fetch()) {
                    $restrdata[] = $restrfetched;
             }
             $getrestrres->closeCursor();
 
             // Get the phone numbers that the user is allowed/not allowed to use
             if ($restrdata) {
 
                 $restrPhoneNmbrs = [];
                 $allowedPhoneNmbrs = [];
                 foreach ($restrdata as $rskey => $rsvalue) {
 
                          $chck = 0;
                          $restrgrparr = explode("|", $rsvalue['groups']);
                          foreach ($restrgrparr as $rkey => $rvalue) {
                                   if ($rvalue) {
                                       if (strpos(implode("|", $usergrps), $rvalue) !== false) { $chck++; }
                                   }
                          }
                          if (strpos($rsvalue['users'], $cruserdname) !== false) { $chck++; }
 
                          if ($chck == 0) { 
                              $restrPhoneNmbrs[] = $rsvalue['phone_number']; 
                          } else {
                              $crphnmbr = explode(": ", $rsvalue['phone_number']);
                              if ($crphnmbr[0] == 'Tx') {
                                  $allowedPhoneNmbrs[] = 'Telnyx: ' . $crphnmbr[1];
                              } elseif ($crphnmbr[0] == 'Pl') {
                                  $allowedPhoneNmbrs[] = 'Plivo: ' . $crphnmbr[1];
                              } elseif ($crphnmbr[0] == 'Tw') {
                                  $allowedPhoneNmbrs[] = 'Twilio: ' . $crphnmbr[1];
                              } elseif ($crphnmbr[0] == 'Fl') {
                                  $allowedPhoneNmbrs[] = 'Flowroute: ' . $crphnmbr[1];
                              }
                          }
                 }
 
                 $procalwdphnmbrs = implode(',', array_fill(0, count($allowedPhoneNmbrs), '?'));
                 array_unshift($allowedPhoneNmbrs, $userId);
                 $procalwduid = $allowedPhoneNmbrs;
 
                 if ($crdnmsrcpref == 1) {
 	            $getrectable = $this->connection->prepare('
 			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `author_displayname`, `internal_sender`
 			FROM `*PREFIX*sms_relent_received`
 			WHERE `user_id` = ? OR `to` IN (' . $procalwdphnmbrs . ')');
 	            $rcresult = $getrectable->execute($procalwduid);
                 } else {
 	            $getrectable = $this->connection->prepare('
 			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `internal_sender`
 			FROM `*PREFIX*sms_relent_received`
 			WHERE `user_id` = ? OR `to` IN (' . $procalwdphnmbrs . ')');
 	            $rcresult = $getrectable->execute($procalwduid);
                 }
 
             } else {
 
                 if ($crdnmsrcpref == 1) {
 	            $getrectable = $this->connection->prepare('
 			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `author_displayname`, `internal_sender`
 			FROM `*PREFIX*sms_relent_received`
 			WHERE `user_id` = ?');
 	            $rcresult = $getrectable->execute([$userId]);
                 } else {
 	            $getrectable = $this->connection->prepare('
 			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `internal_sender`
 			FROM `*PREFIX*sms_relent_received`
 			WHERE `user_id` = ?');
 	            $rcresult = $getrectable->execute([$userId]);
                 }
             }
         }
 
         $recdatatable = [];
         while ($rowfetched = $rcresult->fetch()) {
                $recdatatable[] = $rowfetched;
         }
 	$rcresult->closeCursor();
 
         $recdatafromdb = $recdatatable;
 
 
         if ($this->groupManager->isAdmin($userId)) {
 
               $recdatafdb = ['datarows' => $recdatafromdb, 'showdispnm' => $crdnmsrcpref];
               return $recdatafdb;
 
         } else {
 
             if ($restrdata) {
 
                 // Clean the 'not allowed' phone numbers from tags
                 $restrPhfin = [];
                 foreach ($restrPhoneNmbrs as $phkey => $phvalue) {
 
                     $restrpharr = explode(": ", $phvalue);
                     $restrPhfin[] = $restrpharr[1];
                 }
 
                 // Assemble the array of message rows that excludes the rows for the 'not allowed' phone numbers
                 foreach ($recdatafromdb as $mdkey => $mdvalue) {
 
                     if (str_contains($mdvalue['to'], "+")) {
                         $fromnmbrarr = explode("+", $mdvalue['to']);
                         if (in_array("+" . $fromnmbrarr[1], $restrPhfin)) {
                             unset($recdatafromdb[$mdkey]);
                         }
                     } else {
                         $tonmbrarr = explode(": ", $mdvalue['to']);
                         if (count($tonmbrarr) == 2) {
                             $tonmbrtbcmprd = $tonmbrarr[1];
                         } else {
                             $tonmbrtbcmprd = $tonmbrarr[0];
                         }
                         if (in_array($tonmbrtbcmprd, $restrPhfin)) {
                             unset($recdatafromdb[$mdkey]);
                         }
                     }
                 }
 
                 $recdatafdbproc = array_values($recdatafromdb);
 
                 $recdataproc = ['datarows' => $recdatafdbproc, 'showdispnm' => $crdnmsrcpref];
                 return $recdataproc;
 
             } else {
 
                 $recdatafdb = ['datarows' => $recdatafromdb, 'showdispnm' => $crdnmsrcpref];
                 return $recdatafdb;
             }
         }
      }
 
 
      /**
       * @NoAdminRequired
       */
      public function getreceivedtablefordel($userId) {
 
         if ($this->groupManager->isAdmin($userId)) {
 
             $getrecfordl = $this->connection->prepare('
 			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `author_displayname`, `internal_sender`
 			FROM  `*PREFIX*sms_relent_received`
 			WHERE `user_id` = ?');
 	    $resultdl = $getrecfordl->execute([$userId]);
 
             $recdatatable = [];
             while ($rowfetched = $resultdl->fetch()) {
                    $recdatatable[] = $rowfetched;
             }
             $resultdl->closeCursor();
 
             $recdatafromdb = $recdatatable;
 
             return $recdatafromdb;
 
         } else { return "not permitted"; }
      }
 
 
      /**
       * @NoAdminRequired
       */
      public function removerecrows($userId, $recmessagedbIDs) {
 
         foreach ($recmessagedbIDs as $key => $rowtodel) {
 		 $query = $this->connection->prepare('
 		       DELETE FROM `*PREFIX*sms_relent_received`
 		       WHERE `id` = ?');
 		 $deleteResult = $query->execute([$rowtodel]);
 		 $deleteResult->closeCursor();
         }
 
 	$sqlupdate = $this->connection->prepare('
                   SET @resetrec = 0;
 		  UPDATE `*PREFIX*sms_relent_received`
 		  SET `id` = @resetrec := @resetrec + 1;
                   ALTER TABLE `*PREFIX*sms_relent_received` auto_increment=1;');
 	$updateRes = $sqlupdate->execute();
 	$updateRes->closeCursor();
      }
 
 
      /**
       * @NoAdminRequired
       */
      public function getsenttable($userId) {
 
         // Get the user's preferences from the settings
         $getgamcheck = $this->connection->prepare('
 		       SELECT `user_id`, `show_all_messages`, `show_display_names`
 		       FROM  `*PREFIX*sms_relent_settings` WHERE `user_id` = ?');
         $getgamcheckres = $getgamcheck->execute([$userId]);
         $getcrgamspref = $getgamcheckres->fetch();
         $crgamspref = $getcrgamspref['show_all_messages'];
         $crdnamespref = $getcrgamspref['show_display_names'];
         $getgamcheckres->closeCursor();
 
 
         // Collect the users with whom the current admin is sharing his API keys and whose messages he will be able to see
         if ($crgamspref == 1 && $this->groupManager->isAdmin($userId)) {
 
             // Get the users that belong to the 'admin' group
             $getadmn = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
             $getadmnres = $getadmn->execute(['admin']);
 
             $usersadminsd = [];
             while ($getadmnusrs = $getadmnres->fetch()) {
                    $usersadminsd[] = $getadmnusrs['uid'];
             }
             $getadmnres->closeCursor();
 
             // Get the groups and users that were allowed access to the API keys
             $getgrps = $this->connection->prepare('SELECT `user_id`, `tnx_groups_allowed`, `tnx_users_allowed`, `plv_groups_allowed`, `plv_users_allowed`,
                                                   `twl_groups_allowed`, `twl_users_allowed`, `flr_groups_allowed`, `flr_users_allowed` FROM `*PREFIX*sms_relent_subac`
                                                    WHERE `user_id` = ?');
             $getgrpsres = $getgrps->execute([$userId]);
             $getgrpsusr = $getgrpsres->fetch();
             $getgrpsres->closeCursor();
 
             if ($getgrpsusr) {
 
                 if ($getgrpsusr['tnx_users_allowed']) { $tnxusers = explode("|", $getgrpsusr['tnx_users_allowed']); } else { $tnxusers = []; }
                 if ($getgrpsusr['plv_users_allowed']) { $plvusers = explode("|", $getgrpsusr['plv_users_allowed']); } else { $plvusers = []; }
                 if ($getgrpsusr['twl_users_allowed']) { $twlusers = explode("|", $getgrpsusr['twl_users_allowed']); } else { $twlusers = []; }
                 if ($getgrpsusr['flr_users_allowed']) { $flrusers = explode("|", $getgrpsusr['flr_users_allowed']); } else { $flrusers = []; }
 
                 $allwdusersarr = array_merge($tnxusers, $plvusers, $twlusers, $flrusers);
                 $allwdusersunq = array_filter(array_unique($allwdusersarr));
 
                 if ($getgrpsusr['tnx_groups_allowed']) { $tnxgroups = explode("|", $getgrpsusr['tnx_groups_allowed']); } else { $tnxgroups = []; }
                 if ($getgrpsusr['plv_groups_allowed']) { $plvgroups = explode("|", $getgrpsusr['plv_groups_allowed']); } else { $plvgroups = []; }
                 if ($getgrpsusr['twl_groups_allowed']) { $twlgroups = explode("|", $getgrpsusr['twl_groups_allowed']); } else { $twlgroups = []; }
                 if ($getgrpsusr['flr_groups_allowed']) { $flrgroups = explode("|", $getgrpsusr['flr_groups_allowed']); } else { $flrgroups = []; }
 
                 $allwdgroupsarr = array_merge($tnxgroups, $plvgroups, $twlgroups, $flrgroups);
                 $allwdgroupsunq = array_filter(array_unique($allwdgroupsarr));
 
             } else {
                 $allwdusersunq = [];
                 $allwdgroupsunq = [];
             }
 
             // Get the username for each Display Name of the allowed users
             $allwdusersfnl = [];
             foreach ($allwdusersunq as $alwdusrkey => $alwdusrvalue) {
 
                          $getacdatausrnm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
 		         $getacdatausrnmres = $getacdatausrnm->execute(['displayname', $alwdusrvalue]);
 		         $acdatausrname = $getacdatausrnmres->fetch();
                          if ($acdatausrname) {
                              $allwdusersfnl[] = $acdatausrname['uid'];
                          }
                          $getacdatausrnmres->closeCursor();
             }
 
             // Get the users from all the allowed groups
             $allwdusersgrpmlt = [];
             foreach ($allwdgroupsunq as $prgrpkey => $prgrpvalue) {
 
                          // Get all the users that belong to the current group
                          $getusringroup = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
 		         $getusringroupres = $getusringroup->execute([$prgrpvalue]);
 
 		         while ($getusrname = $getusringroupres->fetch()) {
 
 	                        // Ensure the current user is not an admin
                                 if (!in_array($getusrname['uid'], $usersadminsd)) {
                                      $allwdusersgrpmlt[] = $getusrname['uid'];
                                 }
                          }
 		         $getusringroupres->closeCursor();
             }
             $allwdusersgrpfnl = array_unique($allwdusersgrpmlt);
             
             $allusr = array_merge($allwdusersfnl, $allwdusersgrpfnl);
             $allusruniquest = array_unique($allusr);
 
             if ($allusruniquest) {
                 array_unshift($allusruniquest, $userId);
                 $allusrunique = $allusruniquest;
             } else { $allusrunique = [$userId]; }
 
             $procardata = implode(',', array_fill(0, count($allusrunique), '?'));
         }
 
         // If the user is an admin and he wants to see his messages and the messages of all the users with whom he shares his API keys
         if ($crgamspref == 1 && $this->groupManager->isAdmin($userId)) {
 
             if ($crdnamespref == 1) {
                 $getsenttbl = $this->connection->prepare('
 		       SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`, `author_displayname`
 		       FROM  `*PREFIX*sms_relent_sent` 
                        WHERE `user_id` IN (' . $procardata . ')');
                 $resultsent = $getsenttbl->execute($allusrunique);
             } else {
                 $getsenttbl = $this->connection->prepare('
 		       SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`
 		       FROM  `*PREFIX*sms_relent_sent` 
                        WHERE `user_id` IN (' . $procardata . ')');
                 $resultsent = $getsenttbl->execute($allusrunique);
             }
 
         // If the user is an admin and he wants to see only his messages
         } elseif ($crgamspref == 0 && $this->groupManager->isAdmin($userId)) {
 
             if ($crdnamespref == 1) {
                 $getsenttbl = $this->connection->prepare('
 		       SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`, `author_displayname`
 		       FROM  `*PREFIX*sms_relent_sent` 
                        WHERE `user_id` = ?');
                 $resultsent = $getsenttbl->execute([$userId]);
             } else {
                 $getsenttbl = $this->connection->prepare('
 		       SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`
 		       FROM  `*PREFIX*sms_relent_sent` 
                        WHERE `user_id` = ?');
                 $resultsent = $getsenttbl->execute([$userId]);
             }
 
         // If the user is not an admin 
         } elseif (!$this->groupManager->isAdmin($userId)) {
 
 	    // Get the Display Name of the current user
 	    $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
 	    $getacdatadnres = $getacdatadn->execute([$userId, 'displayname']);
 	    $acdatausrdnadm = $getacdatadnres->fetch();
 	    $cruserdname = $acdatausrdnadm['value'];
 	    $getacdatadnres->closeCursor();
 
             // Get the groups to which the current user belongs
             $getusrgrp = $this->connection->prepare('
 	          SELECT `gid`, `uid`
 	          FROM  `*PREFIX*group_user`
                   WHERE `uid` = ?');
             $getusrgrpres = $getusrgrp->execute([$userId]);
 
             $usergrps = [];
             while ($fetchedgrps = $getusrgrpres->fetch()) {
                    $usergrps[] = $fetchedgrps['gid'];
             }
             $getusrgrpres->closeCursor();
 
             // Get the restrictions from the 'sms_relent_restrict' table
             $getrestr = $this->connection->prepare('
 		       SELECT `phone_number`, `groups`, `users`
 		       FROM  `*PREFIX*sms_relent_restrict`');
             $getrestrres = $getrestr->execute();
 
             $restrdata = [];
             while ($restrfetched = $getrestrres->fetch()) {
                    $restrdata[] = $restrfetched;
             }
             $getrestrres->closeCursor();
 
             // Get the phone numbers that the user is allowed/not allowed to use
             if ($restrdata) {
 
                 $restrPhoneNmbrs = [];
                 $allowedPhoneNmbrs = [];
                 foreach ($restrdata as $rskey => $rsvalue) {
 
                          $chck = 0;
                          $restrgrparr = explode("|", $rsvalue['groups']);
                          foreach ($restrgrparr as $rkey => $rvalue) {
                                   if ($rvalue) {
                                       if (strpos(implode("|", $usergrps), $rvalue) !== false) { $chck++; }
                                   }
                          }
                          if (strpos($rsvalue['users'], $cruserdname) !== false) { $chck++; }
 
                          if ($chck == 0) { 
                              $restrPhoneNmbrs[] = $rsvalue['phone_number']; 
                          } else {
                              $crphnmbr = explode(": ", $rsvalue['phone_number']);
                              if ($crphnmbr[0] == 'Tx') {
                                  $allowedPhoneNmbrs[] = 'Telnyx: ' . $crphnmbr[1];
                              } elseif ($crphnmbr[0] == 'Pl') {
                                  $allowedPhoneNmbrs[] = 'Plivo: ' . $crphnmbr[1];
                              } elseif ($crphnmbr[0] == 'Tw') {
                                  $allowedPhoneNmbrs[] = 'Twilio: ' . $crphnmbr[1];
                              } elseif ($crphnmbr[0] == 'Fl') {
                                  $allowedPhoneNmbrs[] = 'Flowroute: ' . $crphnmbr[1];
                              }
                          }
                 }
 
                 $procalwdphnmbrs = implode(',', array_fill(0, count($allowedPhoneNmbrs), '?'));
                 array_unshift($allowedPhoneNmbrs, $userId);
                 $procalwduid = $allowedPhoneNmbrs;
 
                 if ($crdnamespref == 1) {
 	            $getsenttbl = $this->connection->prepare('
 		        SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`, `author_displayname`
 		        FROM `*PREFIX*sms_relent_sent`
 			WHERE `user_id` = ? OR `from` IN (' . $procalwdphnmbrs . ')');
 	            $resultsent = $getsenttbl->execute($procalwduid);
                 } else {
 	            $getsenttbl = $this->connection->prepare('
 		        SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`
 		        FROM `*PREFIX*sms_relent_sent`
 			WHERE `user_id` = ? OR `from` IN (' . $procalwdphnmbrs . ')');
 	            $resultsent = $getsenttbl->execute($procalwduid);
                 }
 
             } else {
 
                 if ($crdnamespref == 1) {
                     $getsenttbl = $this->connection->prepare('
 		       SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`, `author_displayname`
 		       FROM `*PREFIX*sms_relent_sent`
 		       WHERE `user_id` = ?');
                     $resultsent = $getsenttbl->execute([$userId]);
                 } else {
                     $getsenttbl = $this->connection->prepare('
 		       SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`
 		       FROM `*PREFIX*sms_relent_sent`
 		       WHERE `user_id` = ?');
                     $resultsent = $getsenttbl->execute([$userId]);
                 }
             }
         }
 
 
         $sentdatatable = [];
         while ($rowfetched = $resultsent->fetch()){
                $sentdatatable[] = $rowfetched;
         }
         $resultsent->closeCursor();
 
         $sentdatafromdb = $sentdatatable;
 
 
         if ($this->groupManager->isAdmin($userId)) {
 
             $sentdatafdb = ['datarows' => $sentdatafromdb, 'showdispnm' => $crdnamespref];
             return $sentdatafdb;
 
         } else {
 
             if ($restrdata) {
 
                 // Clean the phone numbers from tags
                 $restrPhfin = [];
                 foreach ($restrPhoneNmbrs as $phkey => $phvalue) {
 
                     $restrpharr = explode(": ", $phvalue);
                     $restrPhfin[] = $restrpharr[1];
                 }
 
                 // Assemble the array of message rows that excludes the rows for the restricted phone numbers
                 foreach ($sentdatafromdb as $smdkey => $smdvalue) {
 
                     if (str_contains($smdvalue['from'], "+")) {
                         $fromnmbrarr = explode("+", $smdvalue['from']);
                         if (in_array("+" . $fromnmbrarr[1], $restrPhfin)) {
                             unset($sentdatafromdb[$smdkey]);
                         }
                     } else {
                         $frmnmbrarr = explode(": ", $smdvalue['from']);
                         if (count($frmnmbrarr) == 2) {
                             $nmbtbcmprd = $frmnmbrarr[1];
                         } else { 
                             $nmbtbcmprd = $frmnmbrarr[0];
                         }
 
                         if (in_array($nmbtbcmprd, $restrPhfin)) {
                             unset($sentdatafromdb[$smdkey]);
                         }
                     }
                 }
 
                 $sentdatadbproc = array_values($sentdatafromdb);
 
                 $sentdatafdb = ['datarows' => $sentdatadbproc, 'showdispnm' => $crdnamespref];
                 return $sentdatafdb;
 
             } else {
 
                 $sentdatafdb = ['datarows' => $sentdatafromdb, 'showdispnm' => $crdnamespref];
                 return $sentdatafdb;
             }
         }
      }
 
 
      /**
       * @NoAdminRequired
       */
      public function getsenttablefordel($userId) {
 
         if ($this->groupManager->isAdmin($userId)) {
 
             $getsenttbldel = $this->connection->prepare('
 		          SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`, `author_displayname`
 		          FROM  `*PREFIX*sms_relent_sent`
 		          WHERE `user_id` = ?');
             $resultsentdl = $getsenttbldel->execute([$userId]);
 
             $sentdatatable = [];
             while ($rowfetched = $resultsentdl->fetch()){
                    $sentdatatable[] = $rowfetched;
             }
             $resultsentdl->closeCursor();
 
             $sentdatafromdb = $sentdatatable;
 
             return $sentdatafromdb;
 
         } else { return "not permitted"; }
      }
 
 
      /**
       * @NoAdminRequired
       */
      public function removesentrows($userId, $sentmessagedbIDs) {
 
         foreach ($sentmessagedbIDs as $key => $sentrowtodel) {
 		 $query = $this->connection->prepare('
 		       DELETE FROM `*PREFIX*sms_relent_sent`
 		       WHERE `id` = ?');
 		 $deleteResult = $query->execute([$sentrowtodel]);
 		 $deleteResult->closeCursor();
         }
 
 	$sqlupdate = $this->connection->prepare('
                   SET @resetsent = 0;
 		  UPDATE `*PREFIX*sms_relent_sent`
 		  SET `id` = @resetsent := @resetsent + 1;
                   ALTER TABLE `*PREFIX*sms_relent_sent` auto_increment=1;');
 	$updateRes = $sqlupdate->execute();
 	$updateRes->closeCursor();
      }
 
 
      /**
       * @NoAdminRequired
       */
      public function getgroupedtable($userId) {
 
 
         // Get the user's preferences from the settings
         $getpref = $this->connection->prepare('
 		       SELECT `user_id`, `show_all_messages`
 		       FROM  `*PREFIX*sms_relent_settings` WHERE `user_id` = ?');
         $getprefres = $getpref->execute([$userId]);
         $getprefresdata = $getprefres->fetch();
         $crsampref = $getprefresdata['show_all_messages'];
         $getprefres->closeCursor();
 
 
         // Collect the users with whom the current admin is sharing his API keys and whose messages he will be able to see
         if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
 
             // Get the users that belong to the 'admin' group
             $getadmn = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
             $getadmnres = $getadmn->execute(['admin']);
 
             $usersadminsd = [];
             while ($getadmnusrs = $getadmnres->fetch()) {
                    $usersadminsd[] = $getadmnusrs['uid'];
             }
             $getadmnres->closeCursor();
 
             // Get the groups and users that were allowed access to the API keys
             $getgrps = $this->connection->prepare('SELECT `user_id`, `tnx_groups_allowed`, `tnx_users_allowed`, `plv_groups_allowed`, `plv_users_allowed`,
                                                   `twl_groups_allowed`, `twl_users_allowed`, `flr_groups_allowed`, `flr_users_allowed` FROM `*PREFIX*sms_relent_subac`
                                                    WHERE `user_id` = ?');
             $getgrpsres = $getgrps->execute([$userId]);
             $getgrpsusr = $getgrpsres->fetch();
             $getgrpsres->closeCursor();
 
             if ($getgrpsusr) {
 
                 if ($getgrpsusr['tnx_users_allowed']) { $tnxusers = explode("|", $getgrpsusr['tnx_users_allowed']); } else { $tnxusers = []; }
                 if ($getgrpsusr['plv_users_allowed']) { $plvusers = explode("|", $getgrpsusr['plv_users_allowed']); } else { $plvusers = []; }
                 if ($getgrpsusr['twl_users_allowed']) { $twlusers = explode("|", $getgrpsusr['twl_users_allowed']); } else { $twlusers = []; }
                 if ($getgrpsusr['flr_users_allowed']) { $flrusers = explode("|", $getgrpsusr['flr_users_allowed']); } else { $flrusers = []; }
 
                 $allwdusersarr = array_merge($tnxusers, $plvusers, $twlusers, $flrusers);
                 $allwdusersunq = array_filter(array_unique($allwdusersarr));
 
                 if ($getgrpsusr['tnx_groups_allowed']) { $tnxgroups = explode("|", $getgrpsusr['tnx_groups_allowed']); } else { $tnxgroups = []; }
                 if ($getgrpsusr['plv_groups_allowed']) { $plvgroups = explode("|", $getgrpsusr['plv_groups_allowed']); } else { $plvgroups = []; }
                 if ($getgrpsusr['twl_groups_allowed']) { $twlgroups = explode("|", $getgrpsusr['twl_groups_allowed']); } else { $twlgroups = []; }
                 if ($getgrpsusr['flr_groups_allowed']) { $flrgroups = explode("|", $getgrpsusr['flr_groups_allowed']); } else { $flrgroups = []; }
 
                 $allwdgroupsarr = array_merge($tnxgroups, $plvgroups, $twlgroups, $flrgroups);
                 $allwdgroupsunq = array_filter(array_unique($allwdgroupsarr));
 
             } else {
                 $allwdusersunq = [];
                 $allwdgroupsunq = [];
             }
 
             // Get the username for each Display Name of the allowed users
             $allwdusersfnl = [];
             foreach ($allwdusersunq as $alwdusrkey => $alwdusrvalue) {
 
                          $getacdatausrnm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
 		         $getacdatausrnmres = $getacdatausrnm->execute(['displayname', $alwdusrvalue]);
 		         $acdatausrname = $getacdatausrnmres->fetch();
                          if ($acdatausrname) {
                              $allwdusersfnl[] = $acdatausrname['uid'];
                          }
                          $getacdatausrnmres->closeCursor();
             }
 
             // Get the users from all the allowed groups
             $allwdusersgrpmlt = [];
             foreach ($allwdgroupsunq as $prgrpkey => $prgrpvalue) {
 
                          // Get all the users that belong to the current group
                          $getusringroup = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
 		         $getusringroupres = $getusringroup->execute([$prgrpvalue]);
 
 		         while ($getusrname = $getusringroupres->fetch()) {
 
 	                        // Ensure the current user is not an admin
                                 if (!in_array($getusrname['uid'], $usersadminsd)) {
                                      $allwdusersgrpmlt[] = $getusrname['uid'];
                                 }
                          }
 		         $getusringroupres->closeCursor();
             }
             $allwdusersgrpfnl = array_unique($allwdusersgrpmlt);
             
             $allusr = array_merge($allwdusersfnl, $allwdusersgrpfnl);
             $allusruniquest = array_unique($allusr);
 
             if ($allusruniquest) {
                 array_unshift($allusruniquest, $userId);
                 $allusruniquegr = $allusruniquest;
             } else { $allusruniquegr = [$userId]; }
 
             $procardatagr = implode(',', array_fill(0, count($allusruniquegr), '?'));
         }
 
         // Get received messages
 
         // If the user is an admin and he wants to see his messages and the messages of all the users with whom he shares his API keys
         if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
 
             $getrecmsgs = $this->connection->prepare('
 			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
 			FROM `*PREFIX*sms_relent_received` WHERE `user_id` IN (' . $procardatagr . ')');
 	    $getrecmsgsres = $getrecmsgs->execute($allusruniquegr);
 
         // If the user is an admin and he wants to see only his messages
         } elseif ($crsampref == 0 && $this->groupManager->isAdmin($userId)) {
 
             $getrecmsgs = $this->connection->prepare('
 			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
 			FROM `*PREFIX*sms_relent_received` WHERE `user_id` = ?');
 	    $getrecmsgsres = $getrecmsgs->execute([$userId]);
 
         // If the user is not an admin 
         } elseif (!$this->groupManager->isAdmin($userId)) {
 
 	    // Get the Display Name of the current user
 	    $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
 	    $getacdatadnres = $getacdatadn->execute([$userId, 'displayname']);
 	    $acdatausrdnadm = $getacdatadnres->fetch();
 	    $cruserdname = $acdatausrdnadm['value'];
 	    $getacdatadnres->closeCursor();
 
             // Get the groups to which the current user belongs
             $getusrgrp = $this->connection->prepare('
 	          SELECT `gid`, `uid`
 	          FROM  `*PREFIX*group_user`
                   WHERE `uid` = ?');
             $getusrgrpres = $getusrgrp->execute([$userId]);
 
             $usergrps = [];
             while ($fetchedgrps = $getusrgrpres->fetch()) {
                    $usergrps[] = $fetchedgrps['gid'];
             }
             $getusrgrpres->closeCursor();
 
             // Get the restrictions from the 'sms_relent_restrict' table
             $getrestr = $this->connection->prepare('
 		       SELECT `phone_number`, `groups`, `users`
 		       FROM  `*PREFIX*sms_relent_restrict`');
             $getrestrres = $getrestr->execute();
 
             $restrdata = [];
             while ($restrfetched = $getrestrres->fetch()) {
                    $restrdata[] = $restrfetched;
             }
             $getrestrres->closeCursor();
 
             // Get the phone numbers that the user is allowed/not allowed to use
             if ($restrdata) {
 
                 $restrPhoneNmbrs = [];
                 $allowedPhoneNmbrs = [];
                 foreach ($restrdata as $rskey => $rsvalue) {
 
                          $chck = 0;
                          $restrgrparr = explode("|", $rsvalue['groups']);
                          foreach ($restrgrparr as $rkey => $rvalue) {
                                   if ($rvalue) {
                                       if (strpos(implode("|", $usergrps), $rvalue) !== false) { $chck++; }
                                   }
                          }
                          if (strpos($rsvalue['users'], $cruserdname) !== false) { $chck++; }
 
                          if ($chck == 0) { 
                              $restrPhoneNmbrs[] = $rsvalue['phone_number']; 
                          } else {
                              $crphnmbr = explode(": ", $rsvalue['phone_number']);
                              if ($crphnmbr[0] == 'Tx') {
                                  $allowedPhoneNmbrs[] = 'Telnyx: ' . $crphnmbr[1];
                              } elseif ($crphnmbr[0] == 'Pl') {
                                  $allowedPhoneNmbrs[] = 'Plivo: ' . $crphnmbr[1];
                              } elseif ($crphnmbr[0] == 'Tw') {
                                  $allowedPhoneNmbrs[] = 'Twilio: ' . $crphnmbr[1];
                              } elseif ($crphnmbr[0] == 'Fl') {
                                  $allowedPhoneNmbrs[] = 'Flowroute: ' . $crphnmbr[1];
                              }
                          }
                 }
 
                 $procalwdphnmbrs = implode(',', array_fill(0, count($allowedPhoneNmbrs), '?'));
                 array_unshift($allowedPhoneNmbrs, $userId);
                 $procalwduid = $allowedPhoneNmbrs;
 
 
 	        $getrectable = $this->connection->prepare('
 			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
 			FROM `*PREFIX*sms_relent_received`
 			WHERE `user_id` = ? OR `to` IN (' . $procalwdphnmbrs . ')');
 	        $getrecmsgsres = $getrectable->execute($procalwduid);
 
             } else {
 
 	        $getrectable = $this->connection->prepare('
 			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
 			FROM `*PREFIX*sms_relent_received`
 			WHERE `user_id` = ?');
 	        $getrecmsgsres = $getrectable->execute([$userId]);
             }
         }
 
         $recmsgs = [];
         while ($rcrowsfetch = $getrecmsgsres->fetch()) {
                $rcrowsfetch['deliveryreceipt'] = '';
                $rcrowsfetch['table'] = 'received';
                $recmsgs[] = $rcrowsfetch;
         }
 	$getrecmsgsres->closeCursor();
 
 
         // Get sent messages
 
         // If the user is an admin and he wants to see his messages and the messages of all the users with whom he shares his API keys
         if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
 
             $getsentmsgs = $this->connection->prepare('
 		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
 		       FROM  `*PREFIX*sms_relent_sent` 
                        WHERE `user_id` IN (' . $procardatagr . ')');
             $getsentmsgsres = $getsentmsgs->execute($allusruniquegr);
 
         // If the user is an admin and he wants to see only his messages
         } elseif ($crsampref == 0 && $this->groupManager->isAdmin($userId)) {
 
             $getsentmsgs = $this->connection->prepare('
 		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
 		       FROM  `*PREFIX*sms_relent_sent`
 		       WHERE `user_id` = ?');
             $getsentmsgsres = $getsentmsgs->execute([$userId]);
 
         // If the user is not an admin 
         } elseif (!$this->groupManager->isAdmin($userId)) {
 
             if ($restrdata) {
 
                 $getsentmsgs = $this->connection->prepare('
 		        SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
 		        FROM  `*PREFIX*sms_relent_sent`
 			WHERE `user_id` = ? OR `from` IN (' . $procalwdphnmbrs . ')');
 	        $getsentmsgsres = $getsentmsgs->execute($procalwduid);
 
             } else {
 
                 $getsentmsgs = $this->connection->prepare('
 		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
 		       FROM  `*PREFIX*sms_relent_sent`
 		       WHERE `user_id` = ?');
                 $getsentmsgsres = $getsentmsgs->execute([$userId]);
             }
         }
 
 
         $sentmsgs = [];
         while ($rowfetchedsmsg = $getsentmsgsres->fetch()) {
                $rowfetchedsmsg['table'] = 'sent';
                $sentmsgs[] = $rowfetchedsmsg;
         }
         $getsentmsgsres->closeCursor();
 
         $groupedfromdb = array_merge($recmsgs, $sentmsgs);
 
         if ($this->groupManager->isAdmin($userId)) {
 
             return $groupedfromdb;
 
         } else {
 
             if ($restrdata) {
 
                 // Clean the phone numbers from tags
                 $restrPhfin = [];
                 foreach ($restrPhoneNmbrs as $phkey => $phvalue) {
 
                     $restrpharr = explode(": ", $phvalue);
                     $restrPhfin[] = $restrpharr[1];
                 }
 
                 // Assemble the array of message rows that excludes the rows for the restricted phone numbers
                 foreach ($groupedfromdb as $gmdkey => $gmdvalue) {
 
                          if ($gmdvalue['table'] == 'sent') {
 
                              if (str_contains($gmdvalue['from'], "+")) {
                                  $fromnmbrarr = explode("+", $gmdvalue['from']);
                                  if (in_array("+" . $fromnmbrarr[1], $restrPhfin)) {
                                      unset($groupedfromdb[$gmdkey]);
                                  }
                              } else {
                                  $frmnmbrarr = explode(": ", $gmdvalue['from']);
                                  if (count($frmnmbrarr) == 2) {
                                      $nmbtbcmprd = $frmnmbrarr[1];
                                  } else { 
                                      $nmbtbcmprd = $frmnmbrarr[0];
                                  }
                                  if (in_array($nmbtbcmprd, $restrPhfin)) {
                                      unset($groupedfromdb[$gmdkey]);
                                  }
                              }
 
                          } elseif ($gmdvalue['table'] == 'received') {
 
                              if (str_contains($gmdvalue['to'], "+")) {
                                  $fromnmbrarr = explode("+", $gmdvalue['to']);
                                  if (in_array("+" . $fromnmbrarr[1], $restrPhfin)) {
                                      unset($groupedfromdb[$gmdkey]);
                                  }
                              } else {
                                  $tonmbrarr = explode(": ", $gmdvalue['to']);
                                  if (count($tonmbrarr) == 2) {
                                      $tonmbrtbcmprd = $tonmbrarr[1];
                                  } else {
                                      $tonmbrtbcmprd = $tonmbrarr[0];
                                  }
                                  if (in_array($tonmbrtbcmprd, $restrPhfin)) {
                                      unset($groupedfromdb[$gmdkey]);
                                  }
                              }
                          }
 
                 }
 
                 $groupedfdbproc = array_values($groupedfromdb);
 
                 return $groupedfdbproc;
 
             } else { return $groupedfromdb; }
         }
      }
 
 
      /**
       * @NoAdminRequired
       */
      public function getgroupedpernumber($userId, $phoneNumber) {
 
         $phoneNumberpr = "%" . $phoneNumber;
 
         // Get the user's preferences from the settings
         $getpref = $this->connection->prepare('
 		       SELECT `user_id`, `show_all_messages`
 		       FROM  `*PREFIX*sms_relent_settings` WHERE `user_id` = ?');
         $getprefres = $getpref->execute([$userId]);
         $getprefresdata = $getprefres->fetch();
         $crsampref = $getprefresdata['show_all_messages'];
         $getprefres->closeCursor();
 
 
         // Collect the users with whom the current admin is sharing his API keys and whose messages he will be able to see
         if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
 
             // Get the users that belong to the 'admin' group
             $getadmn = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
             $getadmnres = $getadmn->execute(['admin']);
 
             $usersadminsd = [];
             while ($getadmnusrs = $getadmnres->fetch()) {
                    $usersadminsd[] = $getadmnusrs['uid'];
             }
             $getadmnres->closeCursor();
 
             // Get the groups and users that were allowed access to the API keys
             $getgrps = $this->connection->prepare('SELECT `user_id`, `tnx_groups_allowed`, `tnx_users_allowed`, `plv_groups_allowed`, `plv_users_allowed`,
                                                   `twl_groups_allowed`, `twl_users_allowed`, `flr_groups_allowed`, `flr_users_allowed` FROM `*PREFIX*sms_relent_subac`
                                                    WHERE `user_id` = ?');
             $getgrpsres = $getgrps->execute([$userId]);
             $getgrpsusr = $getgrpsres->fetch();
             $getgrpsres->closeCursor();
 
             if ($getgrpsusr) {
 
                 if ($getgrpsusr['tnx_users_allowed']) { $tnxusers = explode("|", $getgrpsusr['tnx_users_allowed']); } else { $tnxusers = []; }
                 if ($getgrpsusr['plv_users_allowed']) { $plvusers = explode("|", $getgrpsusr['plv_users_allowed']); } else { $plvusers = []; }
                 if ($getgrpsusr['twl_users_allowed']) { $twlusers = explode("|", $getgrpsusr['twl_users_allowed']); } else { $twlusers = []; }
                 if ($getgrpsusr['flr_users_allowed']) { $flrusers = explode("|", $getgrpsusr['flr_users_allowed']); } else { $flrusers = []; }
 
                 $allwdusersarr = array_merge($tnxusers, $plvusers, $twlusers, $flrusers);
                 $allwdusersunq = array_filter(array_unique($allwdusersarr));
 
                 if ($getgrpsusr['tnx_groups_allowed']) { $tnxgroups = explode("|", $getgrpsusr['tnx_groups_allowed']); } else { $tnxgroups = []; }
                 if ($getgrpsusr['plv_groups_allowed']) { $plvgroups = explode("|", $getgrpsusr['plv_groups_allowed']); } else { $plvgroups = []; }
                 if ($getgrpsusr['twl_groups_allowed']) { $twlgroups = explode("|", $getgrpsusr['twl_groups_allowed']); } else { $twlgroups = []; }
                 if ($getgrpsusr['flr_groups_allowed']) { $flrgroups = explode("|", $getgrpsusr['flr_groups_allowed']); } else { $flrgroups = []; }
 
                 $allwdgroupsarr = array_merge($tnxgroups, $plvgroups, $twlgroups, $flrgroups);
                 $allwdgroupsunq = array_filter(array_unique($allwdgroupsarr));
 
             } else {
                 $allwdusersunq = [];
                 $allwdgroupsunq = [];
             }
 
             // Get the username for each Display Name of the allowed users
             $allwdusersfnl = [];
             foreach ($allwdusersunq as $alwdusrkey => $alwdusrvalue) {
 
                          $getacdatausrnm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
 		         $getacdatausrnmres = $getacdatausrnm->execute(['displayname', $alwdusrvalue]);
 		         $acdatausrname = $getacdatausrnmres->fetch();
                          if ($acdatausrname) {
                              $allwdusersfnl[] = $acdatausrname['uid'];
                          }
                          $getacdatausrnmres->closeCursor();
             }
 
             // Get the users from all the allowed groups
             $allwdusersgrpmlt = [];
             foreach ($allwdgroupsunq as $prgrpkey => $prgrpvalue) {
 
                          // Get all the users that belong to the current group
                          $getusringroup = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
 		         $getusringroupres = $getusringroup->execute([$prgrpvalue]);
 
 		         while ($getusrname = $getusringroupres->fetch()) {
 
 	                        // Ensure the current user is not an admin
                                 if (!in_array($getusrname['uid'], $usersadminsd)) {
                                      $allwdusersgrpmlt[] = $getusrname['uid'];
                                 }
                          }
 		         $getusringroupres->closeCursor();
             }
             $allwdusersgrpfnl = array_unique($allwdusersgrpmlt);
             
             $allusr = array_merge($allwdusersfnl, $allwdusersgrpfnl);
             $allusruniquest = array_unique($allusr);
 
             if ($allusruniquest) {
                 array_unshift($allusruniquest, $userId);
                 $allusruniquepn = $allusruniquest;
             } else { $allusruniquepn = [$userId]; }
 
             $allusruniquepnst = $allusruniquepn;
 
             $procardatapn = implode(',', array_fill(0, count($allusruniquepn), '?'));
 
             array_unshift($allusruniquepn, $phoneNumber, $phoneNumberpr);
             $allusruniquead = $allusruniquepn;
 
             array_unshift($allusruniquepnst, $phoneNumberpr, $phoneNumber);
             $allusruniqueadst = $allusruniquepnst;
         }
 
 
         // Get received messages
 
         // If the user is an admin and he wants to see his messages and the messages of all the users with whom he shares his API keys
         if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
 
             $getrecmsgs = $this->connection->prepare('
 			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
 			FROM `*PREFIX*sms_relent_received` 
                         WHERE (`from` = ? OR `to` LIKE ?) AND `user_id` IN (' . $procardatapn . ')');
 	    $getrecmsgsres = $getrecmsgs->execute($allusruniquead);
 
         // If the user is an admin and he wants to see only his messages
         } elseif ($crsampref == 0 && $this->groupManager->isAdmin($userId)) {
 
             $getrecmsgs = $this->connection->prepare('
 			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
 			FROM `*PREFIX*sms_relent_received` 
                         WHERE `user_id` = ? AND (`from` = ? OR `to` LIKE ?)');
 	    $getrecmsgsres = $getrecmsgs->execute([$userId, $phoneNumber, $phoneNumberpr]);
 
         // If the user is not an admin 
         } elseif (!$this->groupManager->isAdmin($userId)) {
 
 	    // Get the Display Name of the current user
 	    $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
 	    $getacdatadnres = $getacdatadn->execute([$userId, 'displayname']);
 	    $acdatausrdnadm = $getacdatadnres->fetch();
 	    $cruserdname = $acdatausrdnadm['value'];
 	    $getacdatadnres->closeCursor();
 
             // Get the groups to which the current user belongs
             $getusrgrp = $this->connection->prepare('
 	          SELECT `gid`, `uid`
 	          FROM  `*PREFIX*group_user`
                   WHERE `uid` = ?');
             $getusrgrpres = $getusrgrp->execute([$userId]);
 
             $usergrps = [];
             while ($fetchedgrps = $getusrgrpres->fetch()) {
                    $usergrps[] = $fetchedgrps['gid'];
             }
             $getusrgrpres->closeCursor();
 
             // Get the restrictions from the 'sms_relent_restrict' table
             $getrestr = $this->connection->prepare('
 		       SELECT `phone_number`, `groups`, `users`
 		       FROM  `*PREFIX*sms_relent_restrict`');
             $getrestrres = $getrestr->execute();
 
             $restrdata = [];
             while ($restrfetched = $getrestrres->fetch()) {
                    $restrdata[] = $restrfetched;
             }
             $getrestrres->closeCursor();
 
             // Get the phone numbers that the user is allowed/not allowed to use
             if ($restrdata) {
 
                 $restrPhoneNmbrs = [];
                 $allowedPhoneNmbrs = [];
                 foreach ($restrdata as $rskey => $rsvalue) {
 
                          $chck = 0;
                          $restrgrparr = explode("|", $rsvalue['groups']);
                          foreach ($restrgrparr as $rkey => $rvalue) {
                                   if ($rvalue) {
                                       if (strpos(implode("|", $usergrps), $rvalue) !== false) { $chck++; }
                                   }
                          }
                          if (strpos($rsvalue['users'], $cruserdname) !== false) { $chck++; }
 
                          if ($chck == 0) { 
                              $restrPhoneNmbrs[] = $rsvalue['phone_number']; 
                          } else {
                              $crphnmbr = explode(": ", $rsvalue['phone_number']);
                              if ($crphnmbr[0] == 'Tx') {
                                  $allowedPhoneNmbrs[] = 'Telnyx: ' . $crphnmbr[1];
                              } elseif ($crphnmbr[0] == 'Pl') {
                                  $allowedPhoneNmbrs[] = 'Plivo: ' . $crphnmbr[1];
                              } elseif ($crphnmbr[0] == 'Tw') {
                                  $allowedPhoneNmbrs[] = 'Twilio: ' . $crphnmbr[1];
                              } elseif ($crphnmbr[0] == 'Fl') {
                                  $allowedPhoneNmbrs[] = 'Flowroute: ' . $crphnmbr[1];
                              }
                          }
                 }
 
                 $allowedPhoneNmbrscp = $allowedPhoneNmbrs;
 
                 $procalwdphnmbrs = implode(',', array_fill(0, count($allowedPhoneNmbrs), '?'));
 
                 array_unshift($allowedPhoneNmbrs, $userId);
                 array_push($allowedPhoneNmbrs, $phoneNumber, $phoneNumberpr);
                 $procalwduid = $allowedPhoneNmbrs;
 
                 array_unshift($allowedPhoneNmbrscp, $userId);
                 array_push($allowedPhoneNmbrscp, $phoneNumberpr, $phoneNumber);
                 $procalwduidcp = $allowedPhoneNmbrscp;
 
 	        $getrecmsgs = $this->connection->prepare('
 			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
 			FROM `*PREFIX*sms_relent_received`
 			WHERE (`user_id` = ? OR `to` IN (' . $procalwdphnmbrs . ')) AND (`from` = ? OR `to` LIKE ?)');
 	        $getrecmsgsres = $getrecmsgs->execute($procalwduid);
 
             } else {
 
                 $getrecmsgs = $this->connection->prepare('
 			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
 			FROM `*PREFIX*sms_relent_received`
 			WHERE `user_id` = ? AND (`from` = ? OR `to` LIKE ?)');
 	        $getrecmsgsres = $getrecmsgs->execute([$userId, $phoneNumber, $phoneNumberpr]);
             }
         }
 
 
         $recmsgs = [];
         while ($rcrowsfetch = $getrecmsgsres->fetch()) {
                $rcrowsfetch['deliveryreceipt'] = '';
                $rcrowsfetch['table'] = 'received';
                $recmsgs[] = $rcrowsfetch;
         }
 	$getrecmsgsres->closeCursor();
 
 
         // Get sent messages
 
         // If the user is an admin and he wants to see his messages and the messages of all the users with whom he shares his API keys
         if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
 
             $getsentmsgs = $this->connection->prepare('
 		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
 		       FROM  `*PREFIX*sms_relent_sent` 
                        WHERE (`from` LIKE ? OR `to` = ?) AND `user_id` IN (' . $procardatapn . ')');
             $getsentmsgsres = $getsentmsgs->execute($allusruniqueadst);
 
 
         // If the user is an admin and he wants to see only his messages
         } elseif ($crsampref == 0 && $this->groupManager->isAdmin($userId)) {
 
             $getsentmsgs = $this->connection->prepare('
 		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
 		       FROM  `*PREFIX*sms_relent_sent`
 		       WHERE `user_id` = ? AND (`from` LIKE ? OR `to` = ?)');
             $getsentmsgsres = $getsentmsgs->execute([$userId, $phoneNumberpr, $phoneNumber]);
 
 
         // If the user is not an admin 
         } elseif (!$this->groupManager->isAdmin($userId)) {
 
             if ($restrdata) {
 
                 $getsentmsgs = $this->connection->prepare('
 		        SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
 		        FROM  `*PREFIX*sms_relent_sent`
 			WHERE (`user_id` = ? OR `from` IN (' . $procalwdphnmbrs . ')) AND (`from` LIKE ? OR `to` = ?)');
 	        $getsentmsgsres = $getsentmsgs->execute($procalwduidcp);
 
             } else {
 
                 $getsentmsgs = $this->connection->prepare('
 		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
 		       FROM  `*PREFIX*sms_relent_sent`
 		       WHERE `user_id` = ? AND (`from` LIKE ? OR `to` = ?)');
                 $getsentmsgsres = $getsentmsgs->execute([$userId, $phoneNumberpr, $phoneNumber]);
             }
         }
 
         $sentmsgs = [];
         while ($rowfetchedsmsg = $getsentmsgsres->fetch()) {
                $rowfetchedsmsg['table'] = 'sent';
                $sentmsgs[] = $rowfetchedsmsg;
         }
         $getsentmsgsres->closeCursor();
 
         $groupedpernb = array_merge($recmsgs, $sentmsgs);
 
         if ($this->groupManager->isAdmin($userId)) {
 
             return $groupedpernb;
 
         } else {
 
             if ($restrdata) {
 
                 // Clean the phone numbers from tags
                 $restrPhfin = [];
                 foreach ($restrPhoneNmbrs as $phkey => $phvalue) {
 
                     $restrpharr = explode(": ", $phvalue);
                     $restrPhfin[] = $restrpharr[1];
                 }
 
                 // Assemble the array of message rows that excludes the rows for the restricted phone numbers
                 foreach ($groupedpernb as $gmdkey => $gmdvalue) {
 
                          if ($gmdvalue['table'] == 'sent') {
 
                              if (str_contains($gmdvalue['from'], "+")) {
                                  $fromnmbrarr = explode("+", $gmdvalue['from']);
                                  if (in_array("+" . $fromnmbrarr[1], $restrPhfin)) {
                                      unset($groupedpernb[$gmdkey]);
                                  }
                              } else {
                                  $frmnmbrarr = explode(": ", $gmdvalue['from']);
                                  if (count($frmnmbrarr) == 2) {
                                      $nmbtbcmprd = $frmnmbrarr[1];
                                  } else { 
                                      $nmbtbcmprd = $frmnmbrarr[0];
                                  }
                                  if (in_array($nmbtbcmprd, $restrPhfin)) {
                                      unset($groupedpernb[$gmdkey]);
                                  }
                              }
 
                          } elseif ($gmdvalue['table'] == 'received') {
 
                              if (str_contains($gmdvalue['to'], "+")) {
                                  $fromnmbrarr = explode("+", $gmdvalue['to']);
                                  if (in_array("+" . $fromnmbrarr[1], $restrPhfin)) {
                                      unset($groupedpernb[$gmdkey]);
                                  }
                              } else {
                                  $tonmbrarr = explode(": ", $gmdvalue['to']);
                                  if (count($tonmbrarr) == 2) {
                                      $tonmbrtbcmprd = $tonmbrarr[1];
                                  } else {
                                      $tonmbrtbcmprd = $tonmbrarr[0];
                                  }
                                  if (in_array($tonmbrtbcmprd, $restrPhfin)) {
                                      unset($groupedpernb[$gmdkey]);
                                  }
                              }
                          }
 
                 }
 
                 $groupedpernbprc = array_values($groupedpernb);
 
                 return $groupedpernbprc;
 
             } else { return $groupedpernb; }
         }
      }
 
 
      /**
       * @NoAdminRequired
       */
      public function getgroupedforreply($userId, $phoneNmbrFrom, $phoneNmbrTo) {
 
         $phoneNmbrFrompr = "%" . $phoneNmbrFrom;
         $phoneNmbrTopr = "%" . $phoneNmbrTo;
 
         // Get the user's preferences from the settings
         $getpref = $this->connection->prepare('
 		       SELECT `user_id`, `show_all_messages`
 		       FROM  `*PREFIX*sms_relent_settings` WHERE `user_id` = ?');
         $getprefres = $getpref->execute([$userId]);
         $getprefresdata = $getprefres->fetch();
         $crsampref = $getprefresdata['show_all_messages'];
         $getprefres->closeCursor();
 
 
         // Collect the users with whom the current admin is sharing his API keys and whose messages he will be able to see
         if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
 
             // Get the users that belong to the 'admin' group
             $getadmn = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
             $getadmnres = $getadmn->execute(['admin']);
 
             $usersadminsd = [];
             while ($getadmnusrs = $getadmnres->fetch()) {
                    $usersadminsd[] = $getadmnusrs['uid'];
             }
             $getadmnres->closeCursor();
 
             // Get the groups and users that were allowed access to the API keys
             $getgrps = $this->connection->prepare('SELECT `user_id`, `tnx_groups_allowed`, `tnx_users_allowed`, `plv_groups_allowed`, `plv_users_allowed`,
                                                   `twl_groups_allowed`, `twl_users_allowed`, `flr_groups_allowed`, `flr_users_allowed` FROM `*PREFIX*sms_relent_subac`
                                                    WHERE `user_id` = ?');
             $getgrpsres = $getgrps->execute([$userId]);
             $getgrpsusr = $getgrpsres->fetch();
             $getgrpsres->closeCursor();
 
             if ($getgrpsusr) {
 
                 if ($getgrpsusr['tnx_users_allowed']) { $tnxusers = explode("|", $getgrpsusr['tnx_users_allowed']); } else { $tnxusers = []; }
                 if ($getgrpsusr['plv_users_allowed']) { $plvusers = explode("|", $getgrpsusr['plv_users_allowed']); } else { $plvusers = []; }
                 if ($getgrpsusr['twl_users_allowed']) { $twlusers = explode("|", $getgrpsusr['twl_users_allowed']); } else { $twlusers = []; }
                 if ($getgrpsusr['flr_users_allowed']) { $flrusers = explode("|", $getgrpsusr['flr_users_allowed']); } else { $flrusers = []; }
 
                 $allwdusersarr = array_merge($tnxusers, $plvusers, $twlusers, $flrusers);
                 $allwdusersunq = array_filter(array_unique($allwdusersarr));
 
                 if ($getgrpsusr['tnx_groups_allowed']) { $tnxgroups = explode("|", $getgrpsusr['tnx_groups_allowed']); } else { $tnxgroups = []; }
                 if ($getgrpsusr['plv_groups_allowed']) { $plvgroups = explode("|", $getgrpsusr['plv_groups_allowed']); } else { $plvgroups = []; }
                 if ($getgrpsusr['twl_groups_allowed']) { $twlgroups = explode("|", $getgrpsusr['twl_groups_allowed']); } else { $twlgroups = []; }
                 if ($getgrpsusr['flr_groups_allowed']) { $flrgroups = explode("|", $getgrpsusr['flr_groups_allowed']); } else { $flrgroups = []; }
 
                 $allwdgroupsarr = array_merge($tnxgroups, $plvgroups, $twlgroups, $flrgroups);
                 $allwdgroupsunq = array_filter(array_unique($allwdgroupsarr));
 
             } else {
                 $allwdusersunq = [];
                 $allwdgroupsunq = [];
             }
 
             // Get the username for each Display Name of the allowed users
             $allwdusersfnl = [];
             foreach ($allwdusersunq as $alwdusrkey => $alwdusrvalue) {
 
                          $getacdatausrnm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
 		         $getacdatausrnmres = $getacdatausrnm->execute(['displayname', $alwdusrvalue]);
 		         $acdatausrname = $getacdatausrnmres->fetch();
                          if ($acdatausrname) {
                              $allwdusersfnl[] = $acdatausrname['uid'];
                          }
                          $getacdatausrnmres->closeCursor();
             }
 
             // Get the users from all the allowed groups
             $allwdusersgrpmlt = [];
             foreach ($allwdgroupsunq as $prgrpkey => $prgrpvalue) {
 
                          // Get all the users that belong to the current group
                          $getusringroup = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
 		         $getusringroupres = $getusringroup->execute([$prgrpvalue]);
 
 		         while ($getusrname = $getusringroupres->fetch()) {
 
 	                        // Ensure the current user is not an admin
                                 if (!in_array($getusrname['uid'], $usersadminsd)) {
                                      $allwdusersgrpmlt[] = $getusrname['uid'];
                                 }
                          }
 		         $getusringroupres->closeCursor();
             }
             $allwdusersgrpfnl = array_unique($allwdusersgrpmlt);
             
             $allusr = array_merge($allwdusersfnl, $allwdusersgrpfnl);
             $allusruniquest = array_unique($allusr);
 
             if ($allusruniquest) {
                 array_unshift($allusruniquest, $userId);
                 $allusruniquerp = $allusruniquest;
             } else { $allusruniquerp = [$userId]; }
 
             $allusruniquerpst = $allusruniquerp;
 
             $procardatarp = implode(',', array_fill(0, count($allusruniquerp), '?'));
 
             array_unshift($allusruniquerp, $phoneNmbrFrom, $phoneNmbrTopr, $phoneNmbrTo, $phoneNmbrFrompr);
             $allusruniqueadrp = $allusruniquerp;
 
             array_unshift($allusruniquerpst, $phoneNmbrFrompr, $phoneNmbrTo, $phoneNmbrTopr, $phoneNmbrFrom);
             $allusruniqueadrpst = $allusruniquerpst;
         }
 
 
         // Get received messages
 
         // If the user is an admin and he wants to see his messages and the messages of all the users with whom he shares his API keys
         if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
 
             $getrecmsgs = $this->connection->prepare('
 			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
 			FROM `*PREFIX*sms_relent_received` 
                         WHERE ((`from` = ? AND `to` LIKE ?) OR (`from` = ? AND `to` LIKE ?)) AND `user_id` IN (' . $procardatarp . ')');
 	    $getrecmsgsres = $getrecmsgs->execute($allusruniqueadrp);
 
         // If the user is an admin and he wants to see only his messages
         } elseif ($crsampref == 0 && $this->groupManager->isAdmin($userId)) {
 
             $getrecmsgs = $this->connection->prepare('
 			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
 			FROM  `*PREFIX*sms_relent_received`
 			WHERE `user_id` = ? AND ((`from` = ? AND `to` LIKE ?) OR (`from` = ? AND `to` LIKE ?))');
 	    $getrecmsgsres = $getrecmsgs->execute([$userId, $phoneNmbrFrom, $phoneNmbrTopr, $phoneNmbrTo, $phoneNmbrFrompr]);
 
         // If the user is not an admin 
         } elseif (!$this->groupManager->isAdmin($userId)) {
 
 	    // Get the Display Name of the current user
 	    $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
 	    $getacdatadnres = $getacdatadn->execute([$userId, 'displayname']);
 	    $acdatausrdnadm = $getacdatadnres->fetch();
 	    $cruserdname = $acdatausrdnadm['value'];
 	    $getacdatadnres->closeCursor();
 
             // Get the groups to which the current user belongs
             $getusrgrp = $this->connection->prepare('
 	          SELECT `gid`, `uid`
 	          FROM  `*PREFIX*group_user`
                   WHERE `uid` = ?');
             $getusrgrpres = $getusrgrp->execute([$userId]);
 
             $usergrps = [];
             while ($fetchedgrps = $getusrgrpres->fetch()) {
                    $usergrps[] = $fetchedgrps['gid'];
             }
             $getusrgrpres->closeCursor();
 
             // Get the restrictions from the 'sms_relent_restrict' table
             $getrestr = $this->connection->prepare('
 		       SELECT `phone_number`, `groups`, `users`
 		       FROM  `*PREFIX*sms_relent_restrict`');
             $getrestrres = $getrestr->execute();
 
             $restrdata = [];
             while ($restrfetched = $getrestrres->fetch()) {
                    $restrdata[] = $restrfetched;
             }
             $getrestrres->closeCursor();
 
             // Get the phone numbers that the user is allowed/not allowed to use
             if ($restrdata) {
 
                 $restrPhoneNmbrs = [];
                 $allowedPhoneNmbrs = [];
                 foreach ($restrdata as $rskey => $rsvalue) {
 
                          $chck = 0;
                          $restrgrparr = explode("|", $rsvalue['groups']);
                          foreach ($restrgrparr as $rkey => $rvalue) {
                                   if ($rvalue) {
                                       if (strpos(implode("|", $usergrps), $rvalue) !== false) { $chck++; }
                                   }
                          }
                          if (strpos($rsvalue['users'], $cruserdname) !== false) { $chck++; }
 
                          if ($chck == 0) { 
                              $restrPhoneNmbrs[] = $rsvalue['phone_number']; 
                          } else {
                              $crphnmbr = explode(": ", $rsvalue['phone_number']);
                              if ($crphnmbr[0] == 'Tx') {
                                  $allowedPhoneNmbrs[] = 'Telnyx: ' . $crphnmbr[1];
                              } elseif ($crphnmbr[0] == 'Pl') {
                                  $allowedPhoneNmbrs[] = 'Plivo: ' . $crphnmbr[1];
                              } elseif ($crphnmbr[0] == 'Tw') {
                                  $allowedPhoneNmbrs[] = 'Twilio: ' . $crphnmbr[1];
                              } elseif ($crphnmbr[0] == 'Fl') {
                                  $allowedPhoneNmbrs[] = 'Flowroute: ' . $crphnmbr[1];
                              }
                          }
                 }
 
                 $allowedPhoneNmbrscpr = $allowedPhoneNmbrs;
 
                 $procalwdphnmbrs = implode(',', array_fill(0, count($allowedPhoneNmbrs), '?'));
 
                 array_unshift($allowedPhoneNmbrs, $userId);
                 array_push($allowedPhoneNmbrs, $phoneNmbrFrom, $phoneNmbrTopr, $phoneNmbrTo, $phoneNmbrFrompr);
                 $procalwduid = $allowedPhoneNmbrs;
 
                 array_unshift($allowedPhoneNmbrscpr, $userId);
                 array_push($allowedPhoneNmbrscpr, $phoneNmbrFrompr, $phoneNmbrTo, $phoneNmbrTopr, $phoneNmbrFrom);
                 $procalwduidcpr = $allowedPhoneNmbrscpr;
 
 	        $getrecmsgs = $this->connection->prepare('
 			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
 			FROM `*PREFIX*sms_relent_received`
 			WHERE (`user_id` = ? OR `to` IN (' . $procalwdphnmbrs . ')) AND ((`from` = ? AND `to` LIKE ?) OR (`from` = ? AND `to` LIKE ?))');
 	        $getrecmsgsres = $getrecmsgs->execute($procalwduid);
 
             } else {
 
                 $getrecmsgs = $this->connection->prepare('
 			SELECT `id`, `user_id`, `date`, `from`, `to`, `message`, `author_displayname`
 			FROM  `*PREFIX*sms_relent_received`
 			WHERE `user_id` = ? AND ((`from` = ? AND `to` LIKE ?) OR (`from` = ? AND `to` LIKE ?))');
 	        $getrecmsgsres = $getrecmsgs->execute([$userId, $phoneNmbrFrom, $phoneNmbrTopr, $phoneNmbrTo, $phoneNmbrFrompr]);
             }
         }
 
         $recmsgs = [];
         while ($rcrowsfetch = $getrecmsgsres->fetch()) {
                $rcrowsfetch['deliveryreceipt'] = '';
                $rcrowsfetch['table'] = 'received';
                $recmsgs[] = $rcrowsfetch;
         }
 	$getrecmsgsres->closeCursor();
 
 
         // Get sent messages
 
         // If the user is an admin and he wants to see his messages and the messages of all the users with whom he shares his API keys
         if ($crsampref == 1 && $this->groupManager->isAdmin($userId)) {
 
             $getsentmsgs = $this->connection->prepare('
 		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
 		       FROM  `*PREFIX*sms_relent_sent` 
                        WHERE ((`from` LIKE ? AND `to` = ?) OR (`from` LIKE ? AND `to` = ?)) AND `user_id` IN (' . $procardatarp . ')');
             $getsentmsgsres = $getsentmsgs->execute($allusruniqueadrpst);
 
         // If the user is an admin and he wants to see only his messages
         } elseif ($crsampref == 0 && $this->groupManager->isAdmin($userId)) {
 
             $getsentmsgs = $this->connection->prepare('
 		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
 		       FROM `*PREFIX*sms_relent_sent`
 		       WHERE `user_id` = ? AND ((`from` LIKE ? AND `to` = ?) OR (`from` LIKE ? AND `to` = ?))');
             $getsentmsgsres = $getsentmsgs->execute([$userId, $phoneNmbrFrompr, $phoneNmbrTo, $phoneNmbrTopr, $phoneNmbrFrom]);
 
         // If the user is not an admin
         } elseif (!$this->groupManager->isAdmin($userId)) {
 
             if ($restrdata) {
 
                 $getsentmsgs = $this->connection->prepare('
 		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
 		       FROM `*PREFIX*sms_relent_sent`
 		       WHERE (`user_id` = ? OR `from` IN (' . $procalwdphnmbrs . ')) AND ((`from` LIKE ? AND `to` = ?) OR (`from` LIKE ? AND `to` = ?))');
 	        $getsentmsgsres = $getsentmsgs->execute($procalwduidcpr);
 
             } else {
 
                 $getsentmsgs = $this->connection->prepare('
 		       SELECT `id`, `user_id`, `date`, `from`, `to`,`message`, `author_displayname`, `deliveryreceipt`
 		       FROM `*PREFIX*sms_relent_sent`
 		       WHERE `user_id` = ? AND ((`from` LIKE ? AND `to` = ?) OR (`from` LIKE ? AND `to` = ?))');
                 $getsentmsgsres = $getsentmsgs->execute([$userId, $phoneNmbrFrompr, $phoneNmbrTo, $phoneNmbrTopr, $phoneNmbrFrom]);
             }
         }
 
         $sentmsgs = [];
         while ($rowfetchedsmsg = $getsentmsgsres->fetch()) {
                $rowfetchedsmsg['table'] = 'sent';
                $sentmsgs[] = $rowfetchedsmsg;
         }
         $getsentmsgsres->closeCursor();
 
         $groupedpernb = array_merge($recmsgs, $sentmsgs);
 
         if ($this->groupManager->isAdmin($userId)) {
 
             return $groupedpernb;
 
         } else {
 
             if ($restrdata) {
 
                 // Clean the phone numbers from tags
                 $restrPhfin = [];
                 foreach ($restrPhoneNmbrs as $phkey => $phvalue) {
 
                     $restrpharr = explode(": ", $phvalue);
                     $restrPhfin[] = $restrpharr[1];
                 }
 
                 // Assemble the array of message rows that excludes the rows for the restricted phone numbers
                 foreach ($groupedpernb as $gmdkey => $gmdvalue) {
 
                          if ($gmdvalue['table'] == 'sent') {
 
                              if (str_contains($gmdvalue['from'], "+")) {
                                  $fromnmbrarr = explode("+", $gmdvalue['from']);
                                  if (in_array("+" . $fromnmbrarr[1], $restrPhfin)) {
                                      unset($groupedpernb[$gmdkey]);
                                  }
                              } else {
                                  $frmnmbrarr = explode(": ", $gmdvalue['from']);
                                  if (count($frmnmbrarr) == 2) {
                                      $nmbtbcmprd = $frmnmbrarr[1];
                                  } else { 
                                      $nmbtbcmprd = $frmnmbrarr[0];
                                  }
                                  if (in_array($nmbtbcmprd, $restrPhfin)) {
                                      unset($groupedpernb[$gmdkey]);
                                  }
                              }
 
                          } elseif ($gmdvalue['table'] == 'received') {
 
                              if (str_contains($gmdvalue['to'], "+")) {
                                  $fromnmbrarr = explode("+", $gmdvalue['to']);
                                  if (in_array("+" . $fromnmbrarr[1], $restrPhfin)) {
                                      unset($groupedpernb[$gmdkey]);
                                  }
                              } else {
                                  $tonmbrarr = explode(": ", $gmdvalue['to']);
                                  if (count($tonmbrarr) == 2) {
                                      $tonmbrtbcmprd = $tonmbrarr[1];
                                  } else {
                                      $tonmbrtbcmprd = $tonmbrarr[0];
                                  }
                                  if (in_array($tonmbrtbcmprd, $restrPhfin)) {
                                      unset($groupedpernb[$gmdkey]);
                                  }
                              }
                          }
 
                 }
 
                 $groupedperconv = array_values($groupedpernb);
 
                 return $groupedperconv;
 
             } else { return $groupedpernb; }
         }
      }
 
 
 
      /**
       * @NoAdminRequired
       */
      public function savedisplayname($userId, $authorDisplayname, $from) {
 
         if ($this->groupManager->isAdmin($userId)) {
 
 	    $updatedispnm = $this->connection->prepare('
 			UPDATE `*PREFIX*sms_relent_received`
 			SET `author_displayname` = ?
                         WHERE `from` = ?');
 	    $updatedispnmres = $updatedispnm->execute([$authorDisplayname, $from]);
 
             if ($updatedispnmres) {
                 return $respupdname = "The new Display Name has been saved. If on the Settings page, the option 'Add the display name of the message author, before each message' is checked, when you refresh the page you will see the new Display Name before the messages.";
             } else {
                 return $respupdname = "Error while trying to save the new Display Name to the database.";
             }
 	    $updatedispnmres->closeCursor();
 
         } else { return $respupdname = "Only admins can save Display Names for phone numbers that are not associated with Nextcloud users."; }
      }
 
      /**
       * @NoAdminRequired
       */
      public function getmessagesperpage($userId) {
 
         $sqlmpp = $this->connection->prepare('
 	       SELECT `user_id`, `messagesperpage` 
                FROM `*PREFIX*sms_relent_settings`
                WHERE `user_id` = ?');
 	$result = $sqlmpp->execute([$userId]);
         $mesppdata = $result->fetch();
         $result->closeCursor();
         if ($mesppdata) {
             $mesperpagedb = $mesppdata['messagesperpage'];
             return $mesperpagedb;
         }
      }
 
 
      /**
       * @NoAdminRequired
       */
      public function getsettings($userId) {
 
         $getsettings = $this->connection->prepare('
                     SELECT `id`, `user_id`, `telapi_url_rec`, `telapi_url`, `nexapi_url_rec`, `nexapi_url`, `twilapi_url_rec`, `twilapi_url`, `flowapi_url_rec`, `flowapi_url`, 
                            `messagesperpage`, `get_notify`, `notification_email`, `getsmsinemail`, `show_display_names`                           
 		    FROM  `*PREFIX*sms_relent_settings`
 		    WHERE `user_id` = ?');
         $resultsettings = $getsettings->execute([$userId]);
 
         $settingsfromdb = $resultsettings->fetch();
 
         $resultsettings->closeCursor();
 
         if ($settingsfromdb) {
 
             if ($this->groupManager->isAdmin($userId)) { $adminreguser = 'admin'; } else { $adminreguser = 'reguser'; }
             $settingsfromdb['adminornot'] = $adminreguser;
 
             return $settingsfromdb;
         }
 
      }
 
 
      public function updatenumberrestrictions($userId, $savedByDsplname, $phoneNumber, $groups, $users) {
 
         if ($this->groupManager->isAdmin($userId)) {
 
             $groupsproc = implode("|", $groups);
             $usersproc = implode("|", $users);
 
             // Get the restrictions for the current number from the 'sms_relent_restrict' table
             $getrestr = $this->connection->prepare('SELECT `user_id`, `saved_by_dsplname`, `phone_number`, `groups`, `users` FROM `*PREFIX*sms_relent_restrict` WHERE
                                                    `phone_number` = ?');
             $getrestrresult = $getrestr->execute([$phoneNumber]);
             $crntrestr = $getrestrresult->fetch();
             $getrestrresult->closeCursor();
 
             if ($getrestrresult && !$crntrestr) {
 
 	        $insertphrestr = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_restrict` (`user_id`, `saved_by_dsplname`, `phone_number`, `groups`, `users`) VALUES
                                                              (?, ?, ?, ?, ?)');
 	        if ($insertphrestr->execute([$userId, $savedByDsplname, $phoneNumber, $groupsproc, $usersproc])) { $messagetosend = 'success'; } else { $messagetosend = 'failure'; }  
          
             } elseif ($getrestrresult && $crntrestr) {
 
 	        $updatephrestr = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_restrict` SET `user_id` = ?, `saved_by_dsplname` = ?, `groups` = ?, `users` = ? WHERE 
                                                             `phone_number` = ?');
 	        if ($admupdatephonerestr = $updatephrestr->execute([$userId, $savedByDsplname, $groupsproc, $usersproc, $phoneNumber])) { 
                     $messagetosend = 'success';
                 } else { 
                     $messagetosend = 'failure'; 
                 }
 
 	        $admupdatephonerestr->closeCursor();
             }
             return $messagetosend;
         }
      }
 
 
      private function updateusercredentials($userId, $usersarr, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, $plivoapisecret, $plivosendernm, 
                                             $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret) {
 
         $msgtosend = 'success';
 
         foreach ($usersarr as $usrkey => $usrvalue) {
 
             $getusrset = $this->connection->prepare('SELECT `user_id` FROM `*PREFIX*sms_relent_settings` WHERE `user_id` = ?');
 	    $getusrsetres = $getusrset->execute([$usrvalue]);
 	    $getcrunmdata = $getusrsetres->fetch();
 	    $getusrsetres->closeCursor();
 
             if ($getcrunmdata) {
 
                 if ($provider == "tnx") {
 
                     $upusrset = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `telapi_key` = ?, `tel_pub_key` = ?, `messaging_profile_id` = ?,
                                                            `tel_sender_name` = ? WHERE `user_id` = ?');
                     if ($upusrsetres = $upusrset->execute([$telapiKey, $telpubKey, $telmsgprofid, $telsendername, $usrvalue])) {
                         $msgtosend = 'success';
                     } else { $msgtosend = 'failure'; }
                     $upusrsetres->closeCursor();
 
                 } elseif ($provider == "plv") {
 
                     $upusrset = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `nexapi_key` = ?, `nexapi_secret` = ?, `nex_sender_name` = ?
                                                             WHERE `user_id` = ?');
                     if ($upusrsetres = $upusrset->execute([$plivoapikey, $plivoapisecret, $plivosendernm, $usrvalue])) {
                         $msgtosend = 'success';
                     } else { $msgtosend = 'failure'; }
                     $upusrsetres->closeCursor();
 
                 } elseif ($provider == "twl") {
 
                     $upusrset = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `twilapi_key` = ?, `twilapi_secret` = ?, `twil_sender_name` = ?
                                                             WHERE `user_id` = ?');
                     if ($upusrsetres = $upusrset->execute([$twilapikey, $twilapisecret, $twilsendernm, $usrvalue])) {
                         $msgtosend = 'success';
                     } else { $msgtosend = 'failure'; }
                     $upusrsetres->closeCursor();
 
                 } elseif ($provider == "flr") {
 
                     $upusrset = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `flowapi_key` = ?, `flowapi_secret` = ? WHERE `user_id` = ?');
                     if ($upusrsetres = $upusrset->execute([$flowapikey, $flowapisecret, $usrvalue])) {
                         $msgtosend = 'success';
                     } else { $msgtosend = 'failure'; }
                     $upusrsetres->closeCursor();
                 }
 
             } else {
 
                 $emptfld = "";
 
                 if ($provider == "tnx") {
 
                     $upusrset = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_settings` (`user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`,
                                                            `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`, `nexapi_url`, `twilapi_key`, `twilapi_secret`,
                                                            `twilapi_url_rec`, `twilapi_url`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, `tel_sender_name`) 
                                                             VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
                     if ($upusrsetres = $upusrset->execute([$usrvalue, $telapiKey, $telpubKey, $emptfld, $emptfld, $telmsgprofid, $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, 
                                                            $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $telsendername])) {
                         $msgtosend = 'success';
                     } else { $msgtosend = 'failure'; }
                     $upusrsetres->closeCursor();
 
                 } elseif ($provider == "plv") {
 
                     $upusrset = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_settings` (`user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`,
                                                            `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`, `nexapi_url`, `twilapi_key`, `twilapi_secret`,
                                                            `twilapi_url_rec`, `twilapi_url`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, `nex_sender_name`)
                                                             VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
                     if ($upusrsetres = $upusrset->execute([$usrvalue, $telapiKey, $telpubKey, $emptfld, $emptfld, $telmsgprofid, $plivoapikey, $plivoapisecret, $emptfld, $emptfld, 
                                                            $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $plivosendernm])) {
                         $msgtosend = 'success';
                     } else { $msgtosend = 'failure'; }
                     $upusrsetres->closeCursor();
 
                 } elseif ($provider == "twl") {
 
                     $upusrset = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_settings` (`user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`,
                                                            `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`, `nexapi_url`, `twilapi_key`, `twilapi_secret`,
                                                            `twilapi_url_rec`, `twilapi_url`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, `twil_sender_name`)
                                                             VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
                     if ($upusrsetres = $upusrset->execute([$usrvalue, $telapiKey, $telpubKey, $emptfld, $emptfld, $telmsgprofid, $plivoapikey, $plivoapisecret, $emptfld, $emptfld, 
                                                            $twilapikey, $twilapisecret, $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $emptfld, $twilsendernm])) {
                         $msgtosend = 'success';
                     } else { $msgtosend = 'failure'; }
                     $upusrsetres->closeCursor();
 
                 } elseif ($provider == "flr") {
 
                     $upusrset = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_settings` (`user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`,
                                                            `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`, `nexapi_url`, `twilapi_key`, `twilapi_secret`,
                                                            `twilapi_url_rec`, `twilapi_url`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`)
                                                             VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
                     if ($upusrsetres = $upusrset->execute([$usrvalue, $telapiKey, $telpubKey, $emptfld, $emptfld, $telmsgprofid, $plivoapikey, $plivoapisecret, $emptfld, $emptfld, 
                                                            $twilapikey, $twilapisecret, $emptfld, $emptfld, $flowapikey, $flowapisecret, $emptfld, $emptfld])) {
                         $msgtosend = 'success';
                     } else { $msgtosend = 'failure'; }
                     $upusrsetres->closeCursor();
                 }
 
             }                 
         }
 
         return $msgtosend;
      }
 
 
      private function removeusercredentials($userId, $usersarr, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, $plivoapisecret, $plivosendernm, 
                                             $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret) {
 
         $msgtosend = 'success';
 
         foreach ($usersarr as $usrkey => $usrvalue) {
 
                 $emptyfld = "";
 
                 if ($provider == "tnx") {
 
                     $upusrset = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `telapi_key` = ?, `tel_pub_key` = ?, `messaging_profile_id` = ?,
                                                            `tel_sender_name` = ? WHERE `user_id` = ?');
                     if ($upusrsetres = $upusrset->execute([$emptyfld, $emptyfld, $emptyfld, $emptyfld, $usrvalue])) {
                         $msgtosend = 'success';
                     } else { $msgtosend = 'failure'; }
                     $upusrsetres->closeCursor();
 
                 } elseif ($provider == "plv") {
 
                     $upusrset = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `nexapi_key` = ?, `nexapi_secret` = ?, `nex_sender_name` = ?
                                                             WHERE `user_id` = ?');
                     if ($upusrsetres = $upusrset->execute([$emptyfld, $emptyfld, $emptyfld, $usrvalue])) {
                         $msgtosend = 'success';
                     } else { $msgtosend = 'failure'; }
                     $upusrsetres->closeCursor();
 
                 } elseif ($provider == "twl") {
 
                     $upusrset = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `twilapi_key` = ?, `twilapi_secret` = ?, `twil_sender_name` = ?
                                                             WHERE `user_id` = ?');
                     if ($upusrsetres = $upusrset->execute([$emptyfld, $emptyfld, $emptyfld, $usrvalue])) {
                         $msgtosend = 'success';
                     } else { $msgtosend = 'failure'; }
                     $upusrsetres->closeCursor();
 
                 } elseif ($provider == "flr") {
 
                     $upusrset = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `flowapi_key` = ?, `flowapi_secret` = ? WHERE `user_id` = ?');
                     if ($upusrsetres = $upusrset->execute([$emptyfld, $emptyfld, $usrvalue])) {
                         $msgtosend = 'success';
                     } else { $msgtosend = 'failure'; }
                     $upusrsetres->closeCursor();
                 }
         }
 
         return $msgtosend;
      }
 
 
      public function updatekeysallowedusers($userId, $groups, $users, $provider) {
 
        if ($this->groupManager->isAdmin($userId)) {
 
           $msgtosend = 'success';
 
           // Get the users that belong to the 'admin' group
           $getadmn = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
           $getadmnres = $getadmn->execute(['admin']);
 
           $usersadmin = [];
           while ($getadmnusrs = $getadmnres->fetch()) {
                  $usersadmin[] = $getadmnusrs['uid'];
           }
           $getadmnres->closeCursor();
           
           // Get the API keys and alphanumeric sender IDs for the current admin, from the 'sms_relent_settings' table
           $getadmset = $this->connection->prepare('SELECT `user_id`, `telapi_key`, `tel_pub_key`, `messaging_profile_id`, `tel_sender_name`, `nexapi_key`, `nexapi_secret`,
                                                   `nex_sender_name`, `twilapi_key`, `twilapi_secret`, `twil_sender_name`, `flowapi_key`, `flowapi_secret` 
                                                    FROM `*PREFIX*sms_relent_settings` WHERE `user_id` = ?');
 	  $getadmsetres = $getadmset->execute([$userId]);
 	  $getcradmdata = $getadmsetres->fetch();
           $telapiKey = $getcradmdata['telapi_key'];
           $telpubKey = $getcradmdata['tel_pub_key'];
           $telmsgprofid = $getcradmdata['messaging_profile_id'];
           $telsendername = $getcradmdata['tel_sender_name'];
           $plivoapikey = $getcradmdata['nexapi_key'];
           $plivoapisecret = $getcradmdata['nexapi_secret'];
           $plivosendernm = $getcradmdata['nex_sender_name'];
           $twilapikey = $getcradmdata['twilapi_key'];
           $twilapisecret = $getcradmdata['twilapi_secret'];
           $twilsendernm = $getcradmdata['twil_sender_name'];
           $flowapikey = $getcradmdata['flowapi_key'];
           $flowapisecret = $getcradmdata['flowapi_secret'];
 	  $getadmsetres->closeCursor();
 
           if ($getcradmdata) {
 
             if ($provider == "tnx") {
 
                 $getalwd = $this->connection->prepare('SELECT `user_id`, `tnx_groups_allowed`, `tnx_users_allowed` FROM `*PREFIX*sms_relent_subac`');
                 $getalwdres = $getalwd->execute();
 
                 $upchck = 0;
                 $seldataarr = [];
                 $groupsPerProvider = '';
                 $usersPerProvider = '';
                 while ($crntrestr = $getalwdres->fetch()) {
                        if ($crntrestr['user_id'] != $userId) {
                            $seldataarr[] = ['userid' => $crntrestr['user_id'], 'groupsallowed' => $crntrestr['tnx_groups_allowed'], 'usersallowed' => $crntrestr['tnx_users_allowed']];
                        } else {
                            $upchck++;
                            $groupsPerProvider = $crntrestr['tnx_groups_allowed'];
                            $usersPerProvider = $crntrestr['tnx_users_allowed'];
                        }
                 }
                 $getalwdres->closeCursor();
 
 
             } elseif ($provider == "plv") {
 
                 $getalwd = $this->connection->prepare('SELECT `user_id`, `plv_groups_allowed`, `plv_users_allowed` FROM `*PREFIX*sms_relent_subac`');
                 $getalwdres = $getalwd->execute();
 
                 $upchck = 0;
                 $seldataarr = [];
                 $groupsPerProvider = '';
                 $usersPerProvider = '';
                 while ($crntrestr = $getalwdres->fetch()) {
                        if ($crntrestr['user_id'] != $userId) {
                            $seldataarr[] = ['userid' => $crntrestr['user_id'], 'groupsallowed' => $crntrestr['plv_groups_allowed'], 'usersallowed' => $crntrestr['plv_users_allowed']];
                        } else {
                            $upchck++;
                            $groupsPerProvider = $crntrestr['plv_groups_allowed'];
                            $usersPerProvider = $crntrestr['plv_users_allowed'];
                        }
                 }
                 $getalwdres->closeCursor();
 
             } elseif ($provider == "twl") {
 
                 $getalwd = $this->connection->prepare('SELECT `user_id`, `twl_groups_allowed`, `twl_users_allowed` FROM `*PREFIX*sms_relent_subac`');
                 $getalwdres = $getalwd->execute();
 
                 $upchck = 0;
                 $seldataarr = [];
                 $groupsPerProvider = '';
                 $usersPerProvider = '';
                 while ($crntrestr = $getalwdres->fetch()) {
                        if ($crntrestr['user_id'] != $userId) {
                            $seldataarr[] = ['userid' => $crntrestr['user_id'], 'groupsallowed' => $crntrestr['twl_groups_allowed'], 'usersallowed' => $crntrestr['twl_users_allowed']];
                        } else {
                            $upchck++;
                            $groupsPerProvider = $crntrestr['twl_groups_allowed'];
                            $usersPerProvider = $crntrestr['twl_users_allowed'];
                        }
                 }
                 $getalwdres->closeCursor();
 
             } elseif ($provider == "flr") {
 
                 $getalwd = $this->connection->prepare('SELECT `user_id`, `flr_groups_allowed`, `flr_users_allowed` FROM `*PREFIX*sms_relent_subac`');
                 $getalwdres = $getalwd->execute();
 
                 $upchck = 0;
                 $seldataarr = [];
                 $groupsPerProvider = '';
                 $usersPerProvider = '';
                 while ($crntrestr = $getalwdres->fetch()) {
                        if ($crntrestr['user_id'] != $userId) {
                            $seldataarr[] = ['userid' => $crntrestr['user_id'], 'groupsallowed' => $crntrestr['flr_groups_allowed'], 'usersallowed' => $crntrestr['flr_users_allowed']];
                        } else {
                            $upchck++;
                            $groupsPerProvider = $crntrestr['flr_groups_allowed'];
                            $usersPerProvider = $crntrestr['flr_users_allowed'];
                        }
                 }
                 $getalwdres->closeCursor();
 
             }
 
 
             if ($seldataarr) {
 
                 // Check if any of the current users are among the already saved ones (for the same provider)
                 $usrchck = 0;
                 $usrmsgarr = [];
                 foreach ($users as $ukey => $uvalue) {
                          if ($uvalue != '') {
                              for ($j = 0; $j < count($seldataarr); $j++) {
                                   if (str_contains($seldataarr[$j]['usersallowed'], $uvalue)) {
                                       $usrchck++;
                                       $usrmsgarr[] = "The admin " . $seldataarr[$j]['userid'] . " has already allowed the user " . $uvalue . " to access his API keys for this provider.";
                                   }
                              }
                          }
                 }
 
                 // Check if any of the current groups are among the already saved ones (for the same provider)
                 $grchck = 0;
                 $grmsgarr = [];
                 foreach ($groups as $gkey => $gvalue) {
                          if ($gvalue != '') {
                              for ($k = 0; $k < count($seldataarr); $k++) {
                                   if (str_contains($seldataarr[$k]['groupsallowed'], $gvalue)) {
                                       $grchck++;
                                       $grmsgarr[] = "The admin " . $seldataarr[$k]['userid'] . " has already allowed the group " . $gvalue . " to access his API keys for this provider.";
                                   }
                              }
                          }
                 }
 
                 if ($usrchck == 0 && $grchck == 0) {
 
 
                     // Remove the previously saved API keys for each user in the specified groups, for the current provider
                     if ($groupsPerProvider != '') {
 
                         $groupsPerProvarr = explode("|", $groupsPerProvider);
                         foreach ($groupsPerProvarr as $prgrkey => $prgrvalue) {
 
                                  if ($prgrvalue != "admin" && $prgrvalue != '') {
 
                                      // Get all the users that belong to the group
 	                             $getusringrp = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
 			             $getusringrpres = $getusringrp->execute([$prgrvalue]);
 
                                      $usersingroup = [];
 			             while ($getusrnm = $getusringrpres->fetch()) {
                                             if ($getusrnm['uid'] != $userId) {
 
 		                                // Ensure the current user is not an admin
                                                 if (!in_array($getusrnm['uid'], $usersadmin)) {
                                                      $usersingroup[] = $getusrnm['uid'];
                                                 }
                                             }
                                      }
 			             $getusringrpres->closeCursor();
 
                                      if ($usersingroup) {
                                          $msgtosend = $this->removeusercredentials($userId, $usersingroup, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, 
                                                                                $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
                                      }
                                  }
 
                         }
                     }
 
 
                     // Remove the previously saved API keys for each user, for the current provider
                     if ($usersPerProvider != '') {
 
                         $usersPerProvarr = explode("|", $usersPerProvider);
                         if ($usersPerProvarr) {
 
                             $ctusernamearrpr = [];
                             foreach ($usersPerProvarr as $usrKeypr => $usrValuepr) {
 
 		                 // Get the username for this Display Name
 		                 $getacdataunmpr = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
 		                 $getacdataunmprres = $getacdataunmpr->execute(['displayname', $usrValuepr]);
 		                 $acdatausrnamepr = $getacdataunmprres->fetch();
                                  if ($acdatausrnamepr['uid'] != $userId) {
 
 		                     // Ensure the current user is not an admin
                                      if (!in_array($acdatausrnamepr['uid'], $usersadmin)) {
                                           $ctusernamearrpr[] = $acdatausrnamepr['uid'];
                                      }
 
                                  }
 		                 $getacdataunmprres->closeCursor();
                             }
 
                             $msgtosend = $this->removeusercredentials($userId, $ctusernamearrpr, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey,
                                                                       $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
                         }
                     }
 
 
                     // Insert the provider's API keys for the allowed users
                     if ($users) {
 
                         $ctusernamearruid = [];
                         $ctusernamearr = [];
                         foreach ($users as $usrKey => $usrValue) {
                              if ($usrValue != '') {
 		                 // Get the username for this Display Name
 		                 $getacdataunm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
 		                 $getacdataunmres = $getacdataunm->execute(['displayname', $usrValue]);
 		                 $acdatausrname = $getacdataunmres->fetch();
                                  if ($acdatausrname['uid'] != $userId) {
 
 		                     // Ensure the current user is not an admin
                                      if (!in_array($acdatausrname['uid'], $usersadmin)) {
                                          $ctusernamearruid[] = $acdatausrname['uid'];
                                          $ctusernamearr[] = $usrValue;
                                      }
 
                                  }
 		                 $getacdataunmres->closeCursor();
                              }
                         }
 
 
                         // Insert/update the allowed users in the 'sms_relent_subac' table
                         $usersalwdrs = implode("|", $ctusernamearr);
 
                         if ($upchck == 0) {
 
 		            if ($provider == "tnx") {
 
 	                        $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `tnx_users_allowed`) VALUES (?, ?)');
 	                        if ($datalwdres = $insertalwd->execute([$userId, $usersalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
                                 $upchck++;
 
 		            } elseif ($provider == "plv") {
 
 	                        $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `plv_users_allowed`) VALUES (?, ?)');
 	                        if ($datalwdres = $insertalwd->execute([$userId, $usersalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; } 
                                 $upchck++;
 
 		            } elseif ($provider == "twl") {
 
 	                        $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `twl_users_allowed`) VALUES (?, ?)');
 	                        if ($datalwdres = $insertalwd->execute([$userId, $usersalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; } 
                                 $upchck++;
 
 		            } elseif ($provider == "flr") {
 
 	                        $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `flr_users_allowed`) VALUES (?, ?)');
 	                        if ($datalwdres = $insertalwd->execute([$userId, $usersalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
                                 $upchck++;
 		            }
 
                         } else {
 
 		            if ($provider == "tnx") {
 
 	                        $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `tnx_users_allowed` = ? WHERE `user_id` = ?');
 	                        if ($datalwdres = $updatealwd->execute([$usersalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 
 		            } elseif ($provider == "plv") {
 
 	                        $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `plv_users_allowed` = ? WHERE `user_id` = ?');
 	                        if ($datalwdres = $updatealwd->execute([$usersalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 
 		            } elseif ($provider == "twl") {
 
 	                        $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `twl_users_allowed` = ? WHERE `user_id` = ?');
 	                        if ($datalwdres = $updatealwd->execute([$usersalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 
 		            } elseif ($provider == "flr") {
 
 	                        $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `flr_users_allowed` = ? WHERE `user_id` = ?');
 	                        if ($datalwdres = $updatealwd->execute([$usersalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 		            }
                         }
 
                         $datalwdres->closeCursor();
 
 
                         // Insert/update the credentials in the 'sms_relent_settings' table, for each allowed user
                         $msgtosend = $this->updateusercredentials($userId, $ctusernamearruid, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, 
                                                                   $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
                     }
 
                     // Insert the provider's API keys for the allowed groups
                     if ($groups) {
 
                         $allwdgrps = [];
                         foreach ($groups as $groupkey => $groupvalue) {
 
                                  if ($groupvalue != "admin" && $groupvalue != '') {
 
                                      $allwdgrps[] = $groupvalue;
 
                                      // Get all the users that belong to the group
 			             $getacdusr = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
 			             $getacdusrres = $getacdusr->execute([$groupvalue]);
 
                                      $usersingrp = [];
 			             while ($getacdusrnm = $getacdusrres->fetch()) {
                                             if ($getacdusrnm['uid'] != $userId) {
 
 		                                // Ensure the current user is not an admin
                                                 if (!in_array($getacdusrnm['uid'], $usersadmin)) {
                                                      $usersingrp[] = $getacdusrnm['uid'];
                                                 }
                                             }
                                      }
 			             $getacdusrres->closeCursor();
 
                                      // Insert the provider's API keys for each user of the allowed groups
                                      if ($usersingrp) {
                                          $msgtosend = $this->updateusercredentials($userId, $usersingrp, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, 
                                                              $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
                                      }
                                  }
 
 
 		                // Insert/update the allowed groups in the 'sms_relent_subac' table
 		                $groupsalwdrs = implode("|", $allwdgrps);
 
 		                if ($upchck == 0) {
 
 				    if ($provider == "tnx") {
 
 			                $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `tnx_groups_allowed`) VALUES (?, ?)');
 			                if ($datalwdres = $insertalwd->execute([$userId, $groupsalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
                                         $upchck++;
 
 				    } elseif ($provider == "plv") {
 
 			                $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `plv_groups_allowed`) VALUES (?, ?)');
 			                if ($datalwdres = $insertalwd->execute([$userId, $groupsalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
                                         $upchck++;
 
 				    } elseif ($provider == "twl") {
 
 			                $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `twl_groups_allowed`) VALUES (?, ?)');
 			                if ($datalwdres = $insertalwd->execute([$userId, $groupsalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
                                         $upchck++;
 
 				    } elseif ($provider == "flr") {
 
 			                $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `flr_groups_allowed`) VALUES (?, ?)');
 			                if ($datalwdres = $insertalwd->execute([$userId, $groupsalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
                                         $upchck++;
 				    }
 
 		                } else {
 
 				    if ($provider == "tnx") {
 
 			                $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `tnx_groups_allowed` = ? WHERE `user_id` = ?');
 			                if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 
 				    } elseif ($provider == "plv") {
 
 			                $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `plv_groups_allowed` = ? WHERE `user_id` = ?');
 			                if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 
 				    } elseif ($provider == "twl") {
 
 			                $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `twl_groups_allowed` = ? WHERE `user_id` = ?');
 			                if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 
 				    } elseif ($provider == "flr") {
 
 			                $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `flr_groups_allowed` = ? WHERE `user_id` = ?');
 			                if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 				    }
 		                }
 
 		                $datalwdres->closeCursor();
                         }
 
                     }
 
                 } else {
 
                         if ($grmsgarr) {
                             $grppart = implode(" ", $grmsgarr) . " A group cannot be allowed access to 2 different sets of API keys for the same SMS provider.";
                         } else { $grppart = ''; }
 
                         if ($usrmsgarr) {
                             $usrpart = implode(" ", $usrmsgarr) . " A user cannot be allowed access to 2 different sets of API keys for the same SMS provider.";
                         } else { $usrpart = ''; }
 
                     $msgtosend = $grppart . $usrpart;
                 }
 
 
             } else {
 
                 if ($upchck == 0) {
 
                     // Insert the provider's API keys for the allowed users
                     if ($users) {
 
                         $ctusernamearruid = [];
                         $ctusernamearr = [];
                         foreach ($users as $usrKey => $usrValue) {
                              if ($usrValue != '') {
 		                 // Get the username for this Display Name
 		                 $getacdataunm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
 		                 $getacdataunmres = $getacdataunm->execute(['displayname', $usrValue]);
 		                 $acdatausrname = $getacdataunmres->fetch();
                                  if ($acdatausrname['uid'] != $userId) {
 
 		                     // Ensure the current user is not an admin
                                      if (!in_array($acdatausrname['uid'], $usersadmin)) {
                                          $ctusernamearruid[] = $acdatausrname['uid'];
                                          $ctusernamearr[] = $usrValue;
                                      }
 
                                  }
 		                 $getacdataunmres->closeCursor();
                              }
                         }
 
 
                         // Insert the allowed users into the 'sms_relent_subac' table
                         $usersalwdrs = implode("|", $ctusernamearr);
 
 		        if ($provider == "tnx") {
 
 	                    $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `tnx_users_allowed`) VALUES (?, ?)');
 	                    if ($datalwdres = $insertalwd->execute([$userId, $usersalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; } 
                             $upchck++;
 
 		        } elseif ($provider == "plv") {
 
 	                    $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `plv_users_allowed`) VALUES (?, ?)');
 	                    if ($datalwdres = $insertalwd->execute([$userId, $usersalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
                             $upchck++;
 
 		        } elseif ($provider == "twl") {
 
 	                    $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `twl_users_allowed`) VALUES (?, ?)');
 	                    if ($datalwdres = $insertalwd->execute([$userId, $usersalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
                             $upchck++;
 
 		        } elseif ($provider == "flr") {
 
 	                    $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `flr_users_allowed`) VALUES (?, ?)');
 	                    if ($datalwdres = $insertalwd->execute([$userId, $usersalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
                             $upchck++;
 		        }
 
                         $datalwdres->closeCursor();
 
 
                         // Insert/update the credentials in the 'sms_relent_settings' table, for each allowed user
                         $msgtosend = $this->updateusercredentials($userId, $ctusernamearruid, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, 
                                                                   $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
                     }
 
                     // Insert the provider's API keys for the allowed groups
                     if ($groups) {
 
                         $allwdgrps = [];
                         foreach ($groups as $groupkey => $groupvalue) {
 
                                  if ($groupvalue != "admin" && $groupvalue != '') {
 
                                      $allwdgrps[] = $groupvalue;
 
                                      // Get all the users that belong to the group
 			             $getacdusr = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
 			             $getacdusrres = $getacdusr->execute([$groupvalue]);
 
                                      $usersingrp = [];
 			             while ($getacdusrnm = $getacdusrres->fetch()) {
                                             if ($getacdusrnm['uid'] != $userId) {
 
 		                                // Ensure the current user is not an admin
                                                 if (!in_array($getacdusrnm['uid'], $usersadmin)) {
                                                      $usersingrp[] = $getacdusrnm['uid'];
                                                 }
                                             }
                                      }
 			             $getacdusrres->closeCursor();
 
                                      // Insert the provider's API keys for each user of the allowed groups
                                      if ($usersingrp) {
                                          $msgtosend = $this->updateusercredentials($userId, $usersingrp, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, 
                                                              $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
                                      }
                                  }
 
 
 		                // Insert the allowed groups into the 'sms_relent_subac' table
 		                $groupsalwdrs = implode("|", $allwdgrps);
 
                                 if ($upchck == 0) {
 
 				    if ($provider == "tnx") {
 
 			                $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `tnx_groups_allowed`) VALUES (?, ?)');
 			                if ($datalwdres = $insertalwd->execute([$userId, $groupsalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; } 
 
 				    } elseif ($provider == "plv") {
 
 			                $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `plv_groups_allowed`) VALUES (?, ?)');
 			                if ($datalwdres = $insertalwd->execute([$userId, $groupsalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; } 
 
 				    } elseif ($provider == "twl") {
 
 			                $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `twl_groups_allowed`) VALUES (?, ?)');
 			                if ($datalwdres = $insertalwd->execute([$userId, $groupsalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; } 
 
 				    } elseif ($provider == "flr") {
 
 			                $insertalwd = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_subac` (`user_id`, `flr_groups_allowed`) VALUES (?, ?)');
 			                if ($datalwdres = $insertalwd->execute([$userId, $groupsalwdrs])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; } 
 				    }
 
                                 } else {
 
 				    if ($provider == "tnx") {
 
 			                $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `tnx_groups_allowed` = ? WHERE `user_id` = ?');
 			                if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 
 				    } elseif ($provider == "plv") {
 
 			                $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `plv_groups_allowed` = ? WHERE `user_id` = ?');
 			                if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 
 				    } elseif ($provider == "twl") {
 
 			                $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `twl_groups_allowed` = ? WHERE `user_id` = ?');
 			                if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 
 				    } elseif ($provider == "flr") {
 
 			                $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `flr_groups_allowed` = ? WHERE `user_id` = ?');
 			                if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 				    }
 
                                 }
 
 		                $datalwdres->closeCursor();
                         }
 
                     }
 
                 } else {
 
                     // Remove the previously saved API keys for each user in the specified groups, for the current provider
                     if ($groupsPerProvider != '') {
 
                         $groupsPerProvarr = explode("|", $groupsPerProvider);
                         foreach ($groupsPerProvarr as $prgrkey => $prgrvalue) {
 
                                  if ($prgrvalue != "admin" && $prgrvalue != '') {
 
                                      // Get all the users that belong to the group
 	                             $getusringrp = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
 			             $getusringrpres = $getusringrp->execute([$prgrvalue]);
 
                                      $usersingroup = [];
 			             while ($getusrnm = $getusringrpres->fetch()) {
                                             if ($getusrnm['uid'] != $userId) {
 
 		                                // Ensure the current user is not an admin
                                                 if (!in_array($getusrnm['uid'], $usersadmin)) {
                                                      $usersingroup[] = $getusrnm['uid'];
                                                 }
                                             }
                                      }
 			             $getusringrpres->closeCursor();
 
                                      if ($usersingroup) {
                                          $msgtosend = $this->removeusercredentials($userId, $usersingroup, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, 
                                                              $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
                                      }
                                  }
 
                         }
                     }
 
 
                     // Remove the previously saved API keys for each user, for the current provider
                     if ($usersPerProvider != '') {
 
                         $usersPerProvarr = explode("|", $usersPerProvider);
                         if ($usersPerProvarr) {
 
                             $ctusernamearrpr = [];
                             foreach ($usersPerProvarr as $usrKeypr => $usrValuepr) {
 
 		                 // Get the username for this Display Name
 		                 $getacdataunmpr = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
 		                 $getacdataunmprres = $getacdataunmpr->execute(['displayname', $usrValuepr]);
 		                 $acdatausrnamepr = $getacdataunmprres->fetch();
                                  if ($acdatausrnamepr['uid'] != $userId) {
 
 		                     // Ensure the current user is not an admin
                                      if (!in_array($acdatausrnamepr['uid'], $usersadmin)) {
                                           $ctusernamearrpr[] = $acdatausrnamepr['uid'];
                                      }
 
                                  }
 		                 $getacdataunmprres->closeCursor();
                             }
 
                             $msgtosend = $this->removeusercredentials($userId, $ctusernamearrpr, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey,
                                                                       $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
                         }
                     }
 
 
 
                     // Insert the provider's API keys for the allowed users
                     if ($users) {
 
                         $ctusernamearruid = [];
                         $ctusernamearr = [];
                         foreach ($users as $usrKey => $usrValue) {
                              if ($usrValue != '') {
 		                 // Get the username for this Display Name
 		                 $getacdataunm = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
 		                 $getacdataunmres = $getacdataunm->execute(['displayname', $usrValue]);
 		                 $acdatausrname = $getacdataunmres->fetch();
                                  if ($acdatausrname['uid'] != $userId) {
 
 		                     // Ensure the current user is not an admin
                                      if (!in_array($acdatausrname['uid'], $usersadmin)) {
                                          $ctusernamearruid[] = $acdatausrname['uid'];
                                          $ctusernamearr[] = $usrValue;
 
                                      }
 
                                  }
 		                 $getacdataunmres->closeCursor();
                              }
                         }
 
 
                         // Update the allowed users in the 'sms_relent_subac' table
                         $usersalwdrs = implode("|", $ctusernamearr);
 
 		        if ($provider == "tnx") {
 
 	                    $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `tnx_users_allowed` = ? WHERE `user_id` = ?');
 	                    if ($datalwdres = $updatealwd->execute([$usersalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 
 		        } elseif ($provider == "plv") {
 
 	                    $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `plv_users_allowed` = ? WHERE `user_id` = ?');
 	                    if ($datalwdres = $updatealwd->execute([$usersalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 
 		        } elseif ($provider == "twl") {
 
 	                    $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `twl_users_allowed` = ? WHERE `user_id` = ?');
 	                    if ($datalwdres = $updatealwd->execute([$usersalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 
 		        } elseif ($provider == "flr") {
 
 	                    $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `flr_users_allowed` = ? WHERE `user_id` = ?');
 	                    if ($datalwdres = $updatealwd->execute([$usersalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 		        }
 
                         $datalwdres->closeCursor();
 
 
                         // Insert/update the credentials in the 'sms_relent_settings' table, for each allowed user
                         $msgtosend = $this->updateusercredentials($userId, $ctusernamearruid, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, 
                                                                   $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
                     }
 
                     // Insert the provider's API keys for the allowed groups
                     if ($groups) {
 
                         $allwdgrps = [];
                         foreach ($groups as $groupkey => $groupvalue) {
 
                                  if ($groupvalue != "admin" && $groupvalue != '') {
 
                                      $allwdgrps[] = $groupvalue;
 
                                      // Get all the users that belong to the group
 			             $getacdusr = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
 			             $getacdusrres = $getacdusr->execute([$groupvalue]);
 
                                      $usersingrp = [];
 			             while ($getacdusrnm = $getacdusrres->fetch()) {
                                             if ($getacdusrnm['uid'] != $userId) {
 
 		                                // Ensure the current user is not an admin
                                                 if (!in_array($getacdusrnm['uid'], $usersadmin)) {
                                                      $usersingrp[] = $getacdusrnm['uid'];
                                                 }
                                             }
                                      }
 			             $getacdusrres->closeCursor();
 
                                      // Insert the provider's API keys for each user of the allowed groups
                                      if ($usersingrp) {
                                          $msgtosend = $this->updateusercredentials($userId, $usersingrp, $provider, $telapiKey, $telpubKey, $telmsgprofid, $telsendername, $plivoapikey, 
                                                              $plivoapisecret, $plivosendernm, $twilapikey, $twilapisecret, $twilsendernm, $flowapikey, $flowapisecret);
                                      }
                                  }
 
 
 		                 // Update the allowed groups in the 'sms_relent_subac' table
 		                 $groupsalwdrs = implode("|", $allwdgrps);
 
 				 if ($provider == "tnx") {
 
 			             $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `tnx_groups_allowed` = ? WHERE `user_id` = ?');
 			             if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 
 				 } elseif ($provider == "plv") {
 
 			             $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `plv_groups_allowed` = ? WHERE `user_id` = ?');
 			             if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 
 				 } elseif ($provider == "twl") {
 
 			             $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `twl_groups_allowed` = ? WHERE `user_id` = ?');
 			             if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 
 				 } elseif ($provider == "flr") {
 
 			             $updatealwd = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_subac` SET `flr_groups_allowed` = ? WHERE `user_id` = ?');
 			             if ($datalwdres = $updatealwd->execute([$groupsalwdrs, $userId])) { $msgtosend = 'success'; } else { $msgtosend = 'failure'; }
 				 }
 
 		                 $datalwdres->closeCursor();
                         }
 
                     }
 
                 }
 
             }
 
           } else { $msgtosend = "You have to save your credentials first, by clicking the 'Save' button at the bottom of this page, and then share your API keys with other users."; }
 
           return $msgtosend;
        }
      }
 
 
      public function removenumberrestrictions($userId, $phoneNumber) {
 
         if ($this->groupManager->isAdmin($userId)) {
 
                 // Remove the restrictions for the given phone number
 		$delrstr = $this->connection->prepare('
 		       DELETE FROM `*PREFIX*sms_relent_restrict`
 		       WHERE `phone_number` = ?');
                 if ($delrstrres = $delrstr->execute([$phoneNumber])) { $delresult = "success"; } else { $delresult = "failure"; }
 		$delrstrres->closeCursor();
 
 	        $updateind = $this->connection->prepare('
                        SET @resetrec = 0;
 		       UPDATE `*PREFIX*sms_relent_restrict`
 		       SET `id` = @resetrec := @resetrec + 1;
                        ALTER TABLE `*PREFIX*sms_relent_restrict` auto_increment=1;');
 	        $updateindres = $updateind->execute();
 	        $updateindres->closeCursor();
 
                 return $delresult;
         }
      }
 
 
     /**
      * @NoAdminRequired
      */
     public function updateautoreplies($userId, $savedByDsplname, $phoneNumber, $daysOfWeek, $dailyStart, $dailyEnd, $vacationStart, $vacationEnd, $messageText) {
 
         // Get the auto-reply for the current number from the 'sms_relent_autorply' table
         $getarpl = $this->connection->prepare('SELECT `user_id`, `saved_by_dsplname`, `phone_number`, `days_of_week`, `daily_start`, `daily_end`, `vacation_start`,
                                               `vacation_end`, `message_text` FROM `*PREFIX*sms_relent_autorply` WHERE `phone_number` = ?');
         $getarplresult = $getarpl->execute([$phoneNumber]);
         $crntarpl = $getarplresult->fetch();
         $getarplresult->closeCursor();
 
         if ($getarplresult && !$crntarpl) {
 
 	    $insertpharpl = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_autorply` (`user_id`, `saved_by_dsplname`, `phone_number`, `days_of_week`, 
                                                        `daily_start`, `daily_end`, `vacation_start`, `vacation_end`, `message_text`) VALUES
                                                         (?, ?, ?, ?, ?, ?, ?, ?, ?)');
 	    if ($insertpharpl->execute([$userId, $savedByDsplname, $phoneNumber, $daysOfWeek, $dailyStart, $dailyEnd, $vacationStart, $vacationEnd, $messageText])) { 
                 $messagetosend = 'success'; 
             } else { 
                 $messagetosend = 'failure'; 
             }
          
         } elseif ($getarplresult && $crntarpl) {
 
             if ($this->groupManager->isAdmin($userId)) {
 
                 $updatepharpl = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_autorply` SET `user_id` = ?, `saved_by_dsplname` = ?, `days_of_week` = ?, `daily_start` = ?,
                                                            `daily_end` = ?, `vacation_start` = ?, `vacation_end` = ?, `message_text` = ?  WHERE `phone_number` = ?');
 	        if ($updatephnmbrarpl = $updatepharpl->execute([$userId, $savedByDsplname, $daysOfWeek, $dailyStart, $dailyEnd, $vacationStart, $vacationEnd, $messageText,
                                                                 $phoneNumber])) { 
                     $messagetosend = 'success';
                 } else { 
                     $messagetosend = 'failure'; 
                 }
 	        $updatephnmbrarpl->closeCursor();
 
             } else {
 
                 // Check if the current user is the author of the existing version of the auto-reply
                 if ($userId == $crntarpl['user_id']) {
 
                     $updatepharpl = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_autorply` SET `user_id` = ?, `saved_by_dsplname` = ?, `days_of_week` = ?, `daily_start` = ?,
                                                                `daily_end` = ?, `vacation_start` = ?, `vacation_end` = ?, `message_text` = ?  WHERE `phone_number` = ?');
 	            if ($updatephnmbrarpl = $updatepharpl->execute([$userId, $savedByDsplname, $daysOfWeek, $dailyStart, $dailyEnd, $vacationStart, $vacationEnd, $messageText,
                                                                     $phoneNumber])) { 
                         $messagetosend = 'success';
                     } else { 
                         $messagetosend = 'failure'; 
                     }
 	            $updatephnmbrarpl->closeCursor();
 
                 } else { $messagetosend = 'not allowed'; }
             }
         }
 
         return $messagetosend;
     }
 
 
     /**
      * @NoAdminRequired
      */
     public function removeautoreplies($userId, $phoneNumber) {
 
         if ($this->groupManager->isAdmin($userId)) {
 
                 // Remove the auto-reply for the given phone number
 		$delarpl = $this->connection->prepare('
 		       DELETE FROM `*PREFIX*sms_relent_autorply`
 		       WHERE `phone_number` = ?');
                 if ($delarplres = $delarpl->execute([$phoneNumber])) { $delarplresult = "success"; } else { $delarplresult = "failure"; }
 		$delarplres->closeCursor();
 
 	        $updateindarpl = $this->connection->prepare('
                        SET @resetarpl = 0;
 		       UPDATE `*PREFIX*sms_relent_autorply`
 		       SET `id` = @resetarpl := @resetarpl + 1;
                        ALTER TABLE `*PREFIX*sms_relent_autorply` auto_increment=1;');
 	        $updateindarplres = $updateindarpl->execute();
 	        $updateindarplres->closeCursor();
 
                 return $delarplresult;
 
         } else {
                 // Get the author of the auto-reply for the given phone number
 		$getarplusr = $this->connection->prepare('SELECT `user_id`, `phone_number` FROM `*PREFIX*sms_relent_autorply` WHERE `phone_number` = ?');
 		$getarplusrres = $getarplusr->execute([$phoneNumber]);
 		$crntarpldata = $getarplusrres->fetch();
                 $crntarpluser = $crntarpldata['user_id'];
 		$getarplusrres->closeCursor();
 
                 // If the author of the auto-reply is the current user, allow the removal
                 if ($crntarpluser == $userId) {
 
                     // Remove the auto-reply for the given phone number
 		    $delarpl = $this->connection->prepare('
 		           DELETE FROM `*PREFIX*sms_relent_autorply`
 		           WHERE `phone_number` = ?');
                     if ($delarplres = $delarpl->execute([$phoneNumber])) { $delarplresult = "success"; } else { $delarplresult = "failure"; }
 		    $delarplres->closeCursor();
 
 	            $updateindarpl = $this->connection->prepare('
                            SET @resetarpl = 0;
 		           UPDATE `*PREFIX*sms_relent_autorply`
 		           SET `id` = @resetarpl := @resetarpl + 1;
                            ALTER TABLE `*PREFIX*sms_relent_autorply` auto_increment=1;');
 	            $updateindarplres = $updateindarpl->execute();
 	            $updateindarplres->closeCursor();
 
                     return $delarplresult;
 
                 } else { 
                     return $delarplresult = 'not allowed';
                 }
         }
     }
 
 
     public function getadminsettings($userId) {
 
         if ($this->groupManager->isAdmin($userId)) {
 
 
 	    $getsettings = $this->connection->prepare('
                             SELECT `id`, `user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`, `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`,
                                    `nexapi_url`, `twilapi_key`, `twilapi_secret`, `twilapi_url_rec`, `twilapi_url`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, 
                                    `tel_sender_name`, `nex_sender_name`, `twil_sender_name`, `flow_sender_name`, `messagesperpage`, `get_notify`, `notification_email`, `getsmsinemail`, 
                                    `show_all_messages`
 			    FROM  `*PREFIX*sms_relent_settings`
 			    WHERE `user_id` = ?');
 
 	    $resultsettings = $getsettings->execute([$userId]);
 
             $settingsadm = $resultsettings->fetch();
 
 	    $resultsettings->closeCursor();
 
 	    if ($settingsadm) {
 
 		    if ($settingsadm['telapi_key'] != '') {
 
 		        // Send a placeholder to the browser, instead of the real API key
 		        $settingsadm['telapi_key'] = "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
 		    }
 		    if ($settingsadm['tel_pub_key'] != '') {
 		        $settingsadm['tel_pub_key'] = "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
 		    }
 		    if ($settingsadm['messaging_profile_id'] != '') {
 		        $settingsadm['messaging_profile_id'] = "%20%20%20%20%20%20%20%20%20%20%20%20";
 		    }
 		    if ($settingsadm['nexapi_key'] != '') {
 		        $settingsadm['nexapi_key'] = "%20%20%20%20%20%20%20%20%20";
 		    }
 		    if ($settingsadm['nexapi_secret'] != '') {
 		        $settingsadm['nexapi_secret'] = "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
 		    }
 		    if ($settingsadm['twilapi_key'] != '') {
 		        $settingsadm['twilapi_key'] = "%20%20%20%20%20%20%20%20%20";
 		    }
 		    if ($settingsadm['twilapi_secret'] != '') {
 		        $settingsadm['twilapi_secret'] = "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
 		    }
 		    if ($settingsadm['flowapi_key'] != '') {
 		        $settingsadm['flowapi_key'] = "%20%20%20%20%20%20%20%20%20";
 		    }
 		    if ($settingsadm['flowapi_secret'] != '') {
 		        $settingsadm['flowapi_secret'] = "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
 		    }
 
 
 		    // Get the Display Name of the current admin
 		    $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
 		    $getacdatadnres = $getacdatadn->execute([$userId, 'displayname']);
 		    $acdatausrdnadm = $getacdatadnres->fetch();
 		    $cruserdname = $acdatausrdnadm['value'];
 		    $getacdatadnres->closeCursor();
 
 		    // Get all the restrictions on phone numbers
 		    $getrestr = $this->connection->prepare('SELECT `saved_by_dsplname`, `phone_number`, `groups`, `users` FROM `*PREFIX*sms_relent_restrict`');
 		    $getrestres = $getrestr->execute();
 
 		    $restrictedArr = [];
 		    while ($restrfetched = $getrestres->fetch()) {
 		           $restrictedArr[] = $restrfetched;
 		    }
 		    $getrestres->closeCursor();
 
 		    if ($restrictedArr) { $restrictedUsers = $restrictedArr; } else { $restrictedUsers = ''; }
 
 
 		    // Get the name of all the groups
 		    $getgroups = $this->connection->prepare('SELECT `gid`, `displayname` FROM `*PREFIX*groups`');
 		    $getgroupsres = $getgroups->execute();
 
 		    $groupsArr = [];
                     $allgroupswadmarr = [];
 		    while ($groupsfetched = $getgroupsres->fetch()) {
 
 		           $groupsArr[] = $groupsfetched['gid'];
                            if ($groupsfetched['gid'] != 'admin') { $allgroupswadmarr[] = $groupsfetched['gid']; }
 		    }
 		    $getgroupsres->closeCursor();
 
 		    if ($groupsArr) { $allgroups = $groupsArr; } else { $allgroups = ''; }
                     if ($allgroupswadmarr) { $allgroupswadm = $allgroupswadmarr; } else { $allgroupswadm = ''; }
 
 		    // Get the users that belong to the 'admin' group
 		    $getadmnsc = $this->connection->prepare('SELECT `gid`, `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?');
 		    $getadmnscres = $getadmnsc->execute(['admin']);
 
 		    $usersadminsc = [];
 		    while ($getadmnusrsc = $getadmnscres->fetch()) {
 		           $usersadminsc[] = $getadmnusrsc['uid'];
 		    }
 		    $getadmnscres->closeCursor();
 
 
 		    // Get the display name of all the users
 		    $getusers = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ?');
 		    $getusersres = $getusers->execute(['displayname']);
 
 		    $usersArr = [];
                     $alluserswadmarr = [];
 		    while ($usersfetched = $getusersres->fetch()) {
 
 		           $usersArr[] = $usersfetched['value'];
                            if (!in_array($usersfetched['uid'], $usersadminsc)) { $alluserswadmarr[] = $usersfetched['value']; }
 		    }
 		    $getusersres->closeCursor();
 
 		    if ($usersArr) { $allusers = $usersArr; } else { $allusers = ''; }
                     if ($alluserswadmarr) { $alluserswadm = $alluserswadmarr; } else { $alluserswadm = ''; }
 
                     // Get the groups and users that are allowed to use the API Keys, for each provider
                     $getalwdall = $this->connection->prepare('SELECT `user_id`, `tnx_groups_allowed`, `tnx_users_allowed`, `plv_groups_allowed`, `plv_users_allowed`,
                                                              `twl_groups_allowed`, `twl_users_allowed`, `flr_groups_allowed`, `flr_users_allowed` FROM `*PREFIX*sms_relent_subac`
                                                               WHERE `user_id` = ?');
                     $getalwdallres = $getalwdall->execute([$userId]);
                     $crtdtrow = $getalwdallres->fetch();
                     if ($crtdtrow) {
                         $allowedgrps = ['tnx_groups_allowed' => $crtdtrow['tnx_groups_allowed'], 'tnx_users_allowed' => $crtdtrow['tnx_users_allowed'], 
                                         'plv_groups_allowed' => $crtdtrow['plv_groups_allowed'], 'plv_users_allowed' => $crtdtrow['plv_users_allowed'],
                                         'twl_groups_allowed' => $crtdtrow['twl_groups_allowed'], 'twl_users_allowed' => $crtdtrow['twl_users_allowed'],
                                         'flr_groups_allowed' => $crtdtrow['flr_groups_allowed'], 'flr_users_allowed' => $crtdtrow['flr_users_allowed']];
                         $getalwdallres->closeCursor();
                     } else { $allowedgrps = []; }
 
 
                     $settingsadm['admdisplayname'] = $cruserdname;
                     $settingsadm['restrictions'] = $restrictedUsers;
                     $settingsadm['allgroups'] = $allgroups;
                     $settingsadm['allusers'] = $allusers;
                     $settingsadm['allgroupswadm'] = $allgroupswadm;
                     $settingsadm['alluserswadm'] = $alluserswadm;  
                     $settingsadm['allowedkeysuse'] = $allowedgrps;
 
 		    return $settingsadm;
 	    }
         }
      }
 
 
      /**
       * @NoAdminRequired
       *
       */
      public function updatesettings($userId, $telapiUrlRec, $telapiUrl, $nexapiUrlRec, $nexapiUrl, $twilapiUrlRec, $twilapiUrl, $flowapiUrlRec, $flowapiUrl, $messagesperpage, 
                                     $getNotify, $notificationEmail, $getsmsinemail, $showDisplayNames) {
         $upsettings = $this->connection->prepare('
                         SELECT `id`, `user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`, `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`,
                            `nexapi_url`, `twilapi_key`, `twilapi_secret`, `twilapi_url_rec`, `twilapi_url`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, 
                            `tel_sender_name`, `nex_sender_name`, `twil_sender_name`, `flow_sender_name`, `messagesperpage`, `get_notify`, `notification_email`, `getsmsinemail`, 
                            `show_all_messages`, `show_display_names`
 		        FROM  `*PREFIX*sms_relent_settings`
 		        WHERE `user_id` = ?');
 
         $resultstng = $upsettings->execute([$userId]);
 
         $rowup = $resultstng->fetch();
 
         $resultstng->closeCursor();
 
         if ($resultstng && !$rowup) {
 
 	    $sql = $this->connection->prepare('
 				INSERT INTO `*PREFIX*sms_relent_settings`
 					(`user_id`, `telapi_url_rec`, `telapi_url`, `nexapi_url_rec`, `nexapi_url`, `twilapi_url_rec`, `twilapi_url`, `flowapi_url_rec`, `flowapi_url`, 
                                          `messagesperpage`, `get_notify`, `notification_email`, `getsmsinemail`, `show_display_names`)
 				VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
 			');
 	    $sql->execute([$userId, $telapiUrlRec, $telapiUrl, $nexapiUrlRec, $nexapiUrl, $twilapiUrlRec, $twilapiUrl, $flowapiUrlRec, $flowapiUrl, $messagesperpage, $getNotify, 
                            $notificationEmail, $getsmsinemail, $showDisplayNames]);
 
         } elseif ($resultstng && $rowup) {
 
 	    $sqlupdatedb = $this->connection->prepare('
 			UPDATE `*PREFIX*sms_relent_settings`
 			SET `telapi_url_rec` = ?, `telapi_url` = ?, `nexapi_url_rec` = ?, `nexapi_url` = ?, `twilapi_url_rec` = ?, `twilapi_url` = ?, `flowapi_url_rec` = ?, 
                             `flowapi_url` = ?, `messagesperpage` = ?, `get_notify` = ?, `notification_email` = ?, `getsmsinemail` = ?, `show_display_names` = ?
 	                WHERE `user_id` = ?');
 	    $updateRes = $sqlupdatedb->execute([$telapiUrlRec, $telapiUrl, $nexapiUrlRec, $nexapiUrl, $twilapiUrlRec, $twilapiUrl, $flowapiUrlRec, $flowapiUrl, $messagesperpage, 
                                                 $getNotify, $notificationEmail, $getsmsinemail, $showDisplayNames, $userId]);
 	    $updateRes->closeCursor();
 
 	}
      }
 
 
      public function updateadminsettings($userId, $telapiKey, $telPubKey, $telapiUrlRec, $telapiUrl, $messagingProfileId, $nexapiKey, $nexapiSecret, $nexapiUrlRec, $nexapiUrl,
                                          $telSenderName, $nexSenderName, $twilapiKey, $twilapiSecret,
                                          $twilapiUrlRec, $twilapiUrl, $twilSenderName, $flowapiKey, $flowapiSecret, $flowapiUrlRec, $flowapiUrl, $showAllMessages) {
 
         if ($this->groupManager->isAdmin($userId)) {
 
             $upsettings = $this->connection->prepare('
                         SELECT `id`, `user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`, `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`,
                            `nexapi_url`, `twilapi_key`, `twilapi_secret`, `twilapi_url_rec`, `twilapi_url`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, 
                            `tel_sender_name`, `nex_sender_name`, `twil_sender_name`, `flow_sender_name`, `messagesperpage`, `get_notify`, `notification_email`, `getsmsinemail`, 
                            `show_all_messages`, `show_display_names`
 		        FROM  `*PREFIX*sms_relent_settings`
 		        WHERE `user_id` = ?');
 
             $resultstng = $upsettings->execute([$userId]);
 
             $rowup = $resultstng->fetch();
 
             $resultstng->closeCursor();
 
             if ($resultstng && !$rowup) {
 
 	        if ($telapiKey != '') {
 	            $telapikeystrenc = $this->crypto->encrypt($telapiKey);             
 	        } else { $telapikeystrenc = ''; }
 
 	        if ($telPubKey != '') {
 	            $telpubkeystrenc =  $this->crypto->encrypt($telPubKey);             
 	        } else { $telpubkeystrenc = ''; }
 
 	        if ($messagingProfileId != '') {
 	            $messagingprofenc = $this->crypto->encrypt($messagingProfileId);             
 	        } else { $messagingprofenc = ''; }
 
 	        if ($nexapiKey != '') {
 	            $nexapikeystrenc = $this->crypto->encrypt($nexapiKey);             
 	        } else { $nexapikeystrenc = ''; }
 
 	        if ($nexapiSecret != '') {
 	            $nexapisecretstrenc = $this->crypto->encrypt($nexapiSecret);             
 	        } else { $nexapisecretstrenc = ''; }
 
 	        if ($twilapiKey != '') {
 	            $twilapikeystrenc = $this->crypto->encrypt($twilapiKey);             
 	        } else { $twilapikeystrenc = ''; }
 
 	        if ($twilapiSecret != '') {
 	            $twilapisecretstrenc = $this->crypto->encrypt($twilapiSecret);             
 	        } else { $twilapisecretstrenc = ''; }
 
 	        if ($flowapiKey != '') {
 	            $flowapikeystrenc = $this->crypto->encrypt($flowapiKey);             
 	        } else { $flowapikeystrenc = ''; }
 
 	        if ($flowapiSecret != '') {
 	            $flowapisecretstrenc = $this->crypto->encrypt($flowapiSecret);             
 	        } else { $flowapisecretstrenc = ''; }
 
 
 	        $sql = $this->connection->prepare('
 				INSERT INTO `*PREFIX*sms_relent_settings`
 					(`user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`, `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`, 
 	                                 `nexapi_url`, `tel_sender_name`, `nex_sender_name`, `twilapi_key`, `twilapi_secret`, `twilapi_url_rec`, `twilapi_url`, `twil_sender_name`, 
                                          `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, `show_all_messages`)
 				VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
 			');
 	        $sql->execute([$userId, $telapikeystrenc, $telpubkeystrenc, $telapiUrlRec, $telapiUrl, $messagingprofenc, $nexapikeystrenc, $nexapisecretstrenc, $nexapiUrlRec, 
                                $nexapiUrl, $telSenderName, $nexSenderName, $twilapikeystrenc, $twilapisecretstrenc, $twilapiUrlRec, $twilapiUrl, $twilSenderName, $flowapikeystrenc, 
                                $flowapisecretstrenc, $flowapiUrlRec, $flowapiUrl, $showAllMessages]);
 
             } elseif ($resultstng && $rowup) {
 
 	        // Check if the value of the field is the placeholder or an empty string
 	        if ($telapiKey != '' && $telapiKey != "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
 	            $telapikeystrenc = $this->crypto->encrypt($telapiKey);                
 	        } elseif ($telapiKey == "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
 	            $telapikeystrenc = $rowup['telapi_key'];
 	        } elseif ($telapiKey == '') {
 	            $telapikeystrenc = '';
 	        }
 
 	        if ($telPubKey != '' && $telPubKey != "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
 	            $telpubkeystrenc = $this->crypto->encrypt($telPubKey);                
 	        } elseif ($telPubKey == "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
 	            $telpubkeystrenc = $rowup['tel_pub_key'];
 	        } elseif ($telPubKey == '') {
 	            $telpubkeystrenc = '';
 	        }
 
 	        if ($messagingProfileId != '' && $messagingProfileId != "%20%20%20%20%20%20%20%20%20%20%20%20") {
 	            $messagingprofenc = $this->crypto->encrypt($messagingProfileId);                
 	        } elseif ($messagingProfileId == "%20%20%20%20%20%20%20%20%20%20%20%20") {
 	            $messagingprofenc = $rowup['messaging_profile_id'];
 	        } elseif ($messagingProfileId == '') {
 	            $messagingprofenc = '';
 	        }
 
 	        if ($nexapiKey != '' && $nexapiKey != "%20%20%20%20%20%20%20%20%20") {
 	            $nexapikeystrenc = $this->crypto->encrypt($nexapiKey);                
 	        } elseif ($nexapiKey == "%20%20%20%20%20%20%20%20%20") {
 	            $nexapikeystrenc = $rowup['nexapi_key'];
 	        } elseif ($nexapiKey == '') {
 	            $nexapikeystrenc = '';
 	        }
 
 	        if ($twilapiKey != '' && $twilapiKey != "%20%20%20%20%20%20%20%20%20") {
 	            $twilapikeystrenc = $this->crypto->encrypt($twilapiKey);                
 	        } elseif ($twilapiKey == "%20%20%20%20%20%20%20%20%20") {
 	            $twilapikeystrenc = $rowup['twilapi_key'];
 	        } elseif ($twilapiKey == '') {
 	            $twilapikeystrenc = '';
 	        }
 
 	        if ($flowapiKey != '' && $flowapiKey != "%20%20%20%20%20%20%20%20%20") {
 	            $flowapikeystrenc = $this->crypto->encrypt($flowapiKey);                
 	        } elseif ($flowapiKey == "%20%20%20%20%20%20%20%20%20") {
 	            $flowapikeystrenc = $rowup['flowapi_key'];
 	        } elseif ($flowapiKey == '') {
 	            $flowapikeystrenc = '';
 	        }
 
 	        if ($nexapiSecret != '' && $nexapiSecret != "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
 	            $nexapisecretstrenc = $this->crypto->encrypt($nexapiSecret);                
 	        } elseif ($nexapiSecret == "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
 	            $nexapisecretstrenc = $rowup['nexapi_secret'];
 	        } elseif ($nexapiSecret == '') {
 	            $nexapisecretstrenc = '';
 	        }
 
 	        if ($twilapiSecret != '' && $twilapiSecret != "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
 	            $twilapisecretstrenc = $this->crypto->encrypt($twilapiSecret);                
 	        } elseif ($twilapiSecret == "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
 	            $twilapisecretstrenc = $rowup['twilapi_secret'];
 	        } elseif ($twilapiSecret == '') {
 	            $twilapisecretstrenc = '';
 	        }
 
 	        if ($flowapiSecret != '' && $flowapiSecret != "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
 	            $flowapisecretstrenc = $this->crypto->encrypt($flowapiSecret);                
 	        } elseif ($flowapiSecret == "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20") {
 	            $flowapisecretstrenc = $rowup['flowapi_secret'];
 	        } elseif ($flowapiSecret == '') {
 	            $flowapisecretstrenc = '';
 	        }
 
 	        $sqlupdatedb = $this->connection->prepare('
 			UPDATE `*PREFIX*sms_relent_settings`
 			SET `telapi_key` = ?, `tel_pub_key` = ?, `telapi_url_rec` = ?, `telapi_url` = ?, `messaging_profile_id` = ?, `nexapi_key` = ?, `nexapi_secret` = ?,
 	                    `nexapi_url_rec` = ?, `nexapi_url` = ?, `tel_sender_name` = ?, `nex_sender_name` = ?, `twilapi_key` = ?, `twilapi_secret` = ?, `twilapi_url_rec` = ?, `twilapi_url` = ?, `twil_sender_name` = ?, `flowapi_key` = ?, 
 	                    `flowapi_secret` = ?, `flowapi_url_rec` = ?, `flowapi_url` = ?, `show_all_messages` = ?
 	                WHERE `user_id` = ?');
 	        $updateRes = $sqlupdatedb->execute([$telapikeystrenc, $telpubkeystrenc, $telapiUrlRec, $telapiUrl, $messagingprofenc, $nexapikeystrenc, $nexapisecretstrenc, 
                                                     $nexapiUrlRec, $nexapiUrl, $telSenderName, $nexSenderName, $twilapikeystrenc, $twilapisecretstrenc, $twilapiUrlRec, $twilapiUrl, 
                                                     $twilSenderName, $flowapikeystrenc, $flowapisecretstrenc, $flowapiUrlRec, $flowapiUrl, $showAllMessages, $userId]);
 	        $updateRes->closeCursor();
 
 	    }
         }
      }
 
 
      public function updatepersadmnsettings($userId, $messagesperpage, $getNotify, $notificationEmail, $getsmsinemail, $showDisplayNames) {
 
         if ($this->groupManager->isAdmin($userId)) {
 
             $upsettings = $this->connection->prepare('
                         SELECT `id`, `user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`, `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`,
                            `nexapi_url`, `twilapi_key`, `twilapi_secret`, `twilapi_url_rec`, `twilapi_url`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url`, 
                            `tel_sender_name`, `nex_sender_name`, `twil_sender_name`, `flow_sender_name`, `messagesperpage`, `get_notify`, `notification_email`, `getsmsinemail`, 
                            `show_all_messages`, `show_display_names`
 		        FROM  `*PREFIX*sms_relent_settings`
 		        WHERE `user_id` = ?');
 
             $resultstng = $upsettings->execute([$userId]);
 
             $rowup = $resultstng->fetch();
 
             $resultstng->closeCursor();
 
             if ($resultstng && !$rowup) {
 
 	        $sql = $this->connection->prepare('
 				INSERT INTO `*PREFIX*sms_relent_settings` (`user_id`, `messagesperpage`, `get_notify`, `notification_email`, `getsmsinemail`, `show_display_names`)
 				VALUES (?, ?, ?, ?, ?, ?)');
 	        $sql->execute([$userId, $messagesperpage, $getNotify, $notificationEmail, $getsmsinemail, $showDisplayNames]);
 
             } elseif ($resultstng && $rowup) {
 
 	        $sqlupdatedb = $this->connection->prepare('
 			UPDATE `*PREFIX*sms_relent_settings`
 			SET `messagesperpage` = ?, `get_notify` = ?, `notification_email` = ?, `getsmsinemail` = ?, `show_display_names` = ?
 	                WHERE `user_id` = ?');
 	        $updateRes = $sqlupdatedb->execute([$messagesperpage, $getNotify, $notificationEmail, $getsmsinemail, $showDisplayNames, $userId]);
 	        $updateRes->closeCursor();
             }
         }
      }
 
 
      /**
       * @NoAdminRequired
       */
      public function getapicredentials($userId) {
 
         $sqlcr = $this->connection->prepare('
               SELECT `id`, `user_id`, `telapi_key`, `tel_pub_key`, `telapi_url_rec`, `telapi_url`, `messaging_profile_id`, `nexapi_key`, `nexapi_secret`, `nexapi_url_rec`, `nexapi_url`,
                      `tel_sender_name`, `nex_sender_name`, `messagesperpage`, `get_notify`, `notification_email`, `getsmsinemail`, `twilapi_key`, `twilapi_secret`, `twilapi_url_rec`, 
                      `twilapi_url`, `twil_sender_name`, `flowapi_key`, `flowapi_secret`, `flowapi_url_rec`, `flowapi_url` FROM `*PREFIX*sms_relent_settings`
 	      WHERE `user_id` = ?');
 	$resultcr = $sqlcr->execute([$userId]);
         $settingsfrdb = $resultcr->fetch();
         $resultcr->closeCursor();
 
         if (($settingsfrdb['telapi_key'] != '') && ($settingsfrdb['telapi_key'] != 'undefined') && ($settingsfrdb['telapi_key'] != null)) { 
              $telapikeystrdec = $this->crypto->decrypt($settingsfrdb['telapi_key']); 
         } else { $telapikeystrdec = ''; }
 
         if (($settingsfrdb['tel_pub_key'] != '') && ($settingsfrdb['tel_pub_key'] != 'undefined') && ($settingsfrdb['tel_pub_key'] != null)) {
              $telpubkeystrdec = $this->crypto->decrypt($settingsfrdb['tel_pub_key']); 
         } else { $telpubkeystrdec = ''; }
 
         $telapiurlrec = $settingsfrdb['telapi_url_rec'];
         $telapiurlstr = $settingsfrdb['telapi_url'];
 
         if (($settingsfrdb['messaging_profile_id'] != '') && ($settingsfrdb['messaging_profile_id'] != 'undefined') && ($settingsfrdb['messaging_profile_id'] != null)) {
              $messagingprofid = $this->crypto->decrypt($settingsfrdb['messaging_profile_id']); 
         } else { $messagingprofid = ''; }
 
         if (($settingsfrdb['nexapi_key'] != '') && ($settingsfrdb['nexapi_key'] != 'undefined') && ($settingsfrdb['nexapi_key'] != null)) { 
              $nexapikeystr = $this->crypto->decrypt($settingsfrdb['nexapi_key']); 
         } else { $nexapikeystr = ''; }
 
         if (($settingsfrdb['nexapi_secret'] != '') && ($settingsfrdb['nexapi_secret'] != 'undefined') && ($settingsfrdb['nexapi_secret'] != null)) { 
              $nexapisecretstr = $this->crypto->decrypt($settingsfrdb['nexapi_secret']); 
         } else { $nexapisecretstr = ''; }
 
         if (($settingsfrdb['twilapi_key'] != '') && ($settingsfrdb['twilapi_key'] != 'undefined') && ($settingsfrdb['twilapi_key'] != null)) { 
              $twilapikeystr = $this->crypto->decrypt($settingsfrdb['twilapi_key']); 
         } else { $twilapikeystr = ''; }
 
         if (($settingsfrdb['twilapi_secret'] != '') && ($settingsfrdb['twilapi_secret'] != 'undefined') && ($settingsfrdb['twilapi_secret'] != null)) { 
              $twilapisecretstr = $this->crypto->decrypt($settingsfrdb['twilapi_secret']); 
         } else { $twilapisecretstr = ''; }
 
         if (($settingsfrdb['flowapi_key'] != '') && ($settingsfrdb['flowapi_key'] != 'undefined') && ($settingsfrdb['flowapi_key'] != null)) { 
              $flowapikeystr = $this->crypto->decrypt($settingsfrdb['flowapi_key']); 
         } else { $flowapikeystr = ''; }
 
         if (($settingsfrdb['flowapi_secret'] != '') && ($settingsfrdb['flowapi_secret'] != 'undefined') && ($settingsfrdb['flowapi_secret'] != null)) { 
              $flowapisecretstr = $this->crypto->decrypt($settingsfrdb['flowapi_secret']); 
         } else { $flowapisecretstr = ''; }
 
         $nexapiurlrecsms = $settingsfrdb['nexapi_url_rec'];
         $nexapiurldelrcpt = $settingsfrdb['nexapi_url'];
         $twilapiurlrecsms = $settingsfrdb['twilapi_url_rec'];
         $twilapiurldelrcpt = $settingsfrdb['twilapi_url'];
         $flowapiurlrecsms = $settingsfrdb['flowapi_url_rec'];
         $flowapiurldelrcpt = $settingsfrdb['flowapi_url'];
         $gettelsendername = $settingsfrdb['tel_sender_name'];
         $getnexsendername = $settingsfrdb['nex_sender_name'];
         $gettwilsendername = $settingsfrdb['twil_sender_name'];
         $getmessagesperpage = $settingsfrdb['messagesperpage'];
         $getnotification = $settingsfrdb['get_notify'];
         $notifyemail = $settingsfrdb['notification_email'];
         $includesmsinemail = $settingsfrdb['getsmsinemail'];
 
         return [$telapikeystrdec, $telpubkeystrdec, $telapiurlrec, $telapiurlstr, $messagingprofid, $nexapikeystr, $nexapisecretstr, $nexapiurlrecsms, $nexapiurldelrcpt,
                 $gettelsendername, $getnexsendername, $getmessagesperpage, $getnotification, $notifyemail, $includesmsinemail, $twilapikeystr, $twilapisecretstr, $twilapiurlrecsms, 
                 $twilapiurldelrcpt, $gettwilsendername,  $flowapikeystr, $flowapisecretstr, $flowapiurlrecsms, $flowapiurldelrcpt];
      }
 
      /**
       * @NoAdminRequired
       */
      public function getuserbytelrecwhurl($recsmswebhookurl) {
 
         $sqlrec = $this->connection->prepare('SELECT `user_id`, `telapi_url_rec` FROM `*PREFIX*sms_relent_settings` WHERE `telapi_url_rec` = ?');
 	$result = $sqlrec->execute([$recsmswebhookurl]);
         $datafromdb = $result->fetch();
         $result->closeCursor();
         $ncusertelrec = $datafromdb['user_id'];
 
         return $ncusertelrec;
      }
 
      /**
       * @NoAdminRequired
       */
      public function getuserbyteldelrwhurl($delsmswebhookurl) {
 
         $sqldel = $this->connection->prepare('SELECT `user_id`, `telapi_url` FROM `*PREFIX*sms_relent_settings` WHERE `telapi_url` = ?');
 	$ressqldel = $sqldel->execute([$delsmswebhookurl]);
         $datafromdbdel = $ressqldel->fetch();
         $ressqldel->closeCursor();
         $ncuserteldel = $datafromdbdel['user_id'];
 
         return $ncuserteldel;
      }
 
      /**
       * @NoAdminRequired
       */
      public function getuserbyplivorecwhurl($plivorecurl) {
 
         $sqlrecpl = $this->connection->prepare('SELECT `user_id`, `nexapi_url_rec` FROM `*PREFIX*sms_relent_settings` WHERE `nexapi_url_rec` = ?');
 	$plresrecsql = $sqlrecpl->execute([$plivorecurl]);
         $pldatafromdb = $plresrecsql->fetch();
         $plresrecsql->closeCursor();
         $ncuserplrec = $pldatafromdb['user_id'];
 
         return $ncuserplrec;
      }
 
      /**
       * @NoAdminRequired
       */
      public function getuserbyplivodelrwhurl($plivodrurl) {
 
         $sqldrpl = $this->connection->prepare('SELECT `user_id`, `nexapi_url` FROM `*PREFIX*sms_relent_settings` WHERE `nexapi_url` = ?');
 	$ressqldelrec = $sqldrpl->execute([$plivodrurl]);
         $datafromdbdr = $ressqldelrec->fetch();
         $ressqldelrec->closeCursor();
         $ncuserplivodel = $datafromdbdr['user_id'];
 
         return $ncuserplivodel;
      }
 
      /**
       * @NoAdminRequired
       */
      public function getuserbytwilrecwhurl($twilrecurl) {
 
         $sqlrectw = $this->connection->prepare('SELECT `user_id`, `twilapi_url_rec` FROM `*PREFIX*sms_relent_settings` WHERE `twilapi_url_rec` = ?');
 	$twresrecsql = $sqlrectw->execute([$twilrecurl]);
         $twdatafromdb = $twresrecsql->fetch();
         $twresrecsql->closeCursor();
         $ncusertwrec = $twdatafromdb['user_id'];
 
         return $ncusertwrec;
      }
 
      /**
       * @NoAdminRequired
       */
      public function getuserbytwildelrwhurl($twildrurl) {
 
         $sqldrtw = $this->connection->prepare('SELECT `user_id`, `twilapi_url` FROM `*PREFIX*sms_relent_settings` WHERE `twilapi_url` = ?');
 	$ressqldelrectw = $sqldrtw->execute([$twildrurl]);
         $datafromdbdrtw = $ressqldelrectw->fetch();
         $ressqldelrectw->closeCursor();
         $ncusertwildel = $datafromdbdrtw['user_id'];
 
         return $ncusertwildel;
      }
 
      /**
       * @NoAdminRequired
       */
      public function getuserbyflowrecwhurl($flowrecurl) {
 
         $sqlrecfl = $this->connection->prepare('SELECT `user_id`, `flowapi_url_rec` FROM `*PREFIX*sms_relent_settings` WHERE `flowapi_url_rec` = ?');
 	$flresrecsql = $sqlrecfl->execute([$flowrecurl]);
         $fldatafromdb = $flresrecsql->fetch();
         $flresrecsql->closeCursor();
         $ncuserflrec = $fldatafromdb['user_id'];
 
         return $ncuserflrec;
      }
 
      /**
       * @NoAdminRequired
       */
      public function getuserbyflowdelrwhurl($flowdrurl) {
 
         $sqldrfl = $this->connection->prepare('SELECT `user_id`, `flowapi_url` FROM `*PREFIX*sms_relent_settings` WHERE `flowapi_url` = ?');
 	$ressqldelrecfl = $sqldrfl->execute([$flowdrurl]);
         $datafromdbdrfl = $ressqldelrecfl->fetch();
         $ressqldelrecfl->closeCursor();
         $ncuserflowdel = $datafromdbdrfl['user_id'];
 
         return $ncuserflowdel;
      }
 }