<?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 sender's Display Name
            $getacdata = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
            $getacdatares = $getacdata->execute(['phone', $recmessagearr[2]]);

            $acdatausers = [];
            while ($acusrfetched = $getacdatares->fetch()) {
                   $acdatausers[] = $acusrfetched['uid'];
            }
            $getacdatares->closeCursor();

            if ($acdatausers) {

                $acdatausrdn = [];
                foreach ($acdatausers as $dnkey => $dnvalue) {

                     $getacdatadn = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
	             $getacdatadnres = $getacdatadn->execute([$dnvalue, 'displayname']);

		     while ($acusrdnfetched = $getacdatadnres->fetch()) {
		            $acdatausrdn[] = $acusrdnfetched['value'];
		     }
		     $getacdatadnres->closeCursor();
                }

                if ($acdatausrdn) {

                    if (count($acdatausrdn) == 1) {

                        $authorDisplayNm = $acdatausrdn[0];
                        $internalSender = 1;

                    } elseif (count($acdatausrdn) > 1) {

                        $authorDisplayNm = implode("/", $acdatausrdn);
                        $internalSender = 1;
                    }

                } else { $authorDisplayNm = ''; $internalSender = 0; }

            } else {

                  // Search for the associated Display Name in the previous messages coming from the same number
                  $getdspnm = $this->connection->prepare('SELECT `from`, `author_displayname` FROM `*PREFIX*sms_relent_received` WHERE `from` = ? LIMIT 1');
	          $getdspnmres = $getdspnm->execute([$recmessagearr[2]]);
                  $dspnmfetched = $getdspnmres->fetch();
		  $authorDisplayNm = $dspnmfetched['author_displayname'];
		  $getdspnmres->closeCursor();
                  $internalSender = 0;
            }


            $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
            $getacdatast = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ? AND `value` = ?');
            $getacdatastres = $getacdatast->execute(['phone', $msgsentfrom]);

            $acdatausersst = [];
            while ($acusrstfetched = $getacdatastres->fetch()) {
                   $acdatausersst[] = $acusrstfetched['uid'];
            }
            $getacdatastres->closeCursor();

            if ($acdatausersst) {

                $acdatausrdnst = [];
                foreach ($acdatausersst as $dnstkey => $dnstvalue) {

                     $getacdatadnst = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `uid` = ? AND `name` = ?');
	             $getacdatadnstres = $getacdatadnst->execute([$dnstvalue, 'displayname']);

		     while ($acusrdnstfetched = $getacdatadnstres->fetch()) {
		            $acdatausrdnst[] = $acusrdnstfetched['value'];
		     }
		     $getacdatadnstres->closeCursor();
                }

                if ($acdatausrdnst) {

                    if (count($acdatausrdnst) == 1) {

                        $authorDisplayName = $acdatausrdnst[0];

                    } elseif (count($acdatausrdnst) > 1) {

                        $authorDisplayName = implode("/", $acdatausrdnst);
                    }

                } else { $authorDisplayName = ''; }

            } else { $authorDisplayName = ''; }


            $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();

        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`');
	        $rcresult = $getrectable->execute();
            } else {
	        $getrectable = $this->connection->prepare('
			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`, `internal_sender`
			FROM  `*PREFIX*sms_relent_received`');
	        $rcresult = $getrectable->execute();
            }

        } 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)) {

            return $recdatafromdb;

        } else {

            // 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();

            if ($restrdata) {

                // 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 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 phone numbers that are not allowed for the current user
                $restrPhoneNb = [];
                foreach ($restrdata as $rskey => $rsvalue) {

                       $restrgrparr = explode("|", $rsvalue['groups']);
                       $chck = 0;
                       foreach ($restrgrparr as $rkey => $rvalue) {
                                if (str_contains(implode("|", $usergrps), $rvalue)) { $chck++; }
                       }
                       if (str_contains($rsvalue['users'], $cruserdname)) { $chck++; }

                       if ($chck == 0) { $restrPhoneNb[] = $rsvalue['phone_number']; }
                }

                $restrPhoneNmbrs = array_unique($restrPhoneNb);

                // 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 ($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);

                return $recdatafdbproc;
            }
        }

     }


     /**
      * @NoAdminRequired
      */
     public function getreceivedtablefordel($userId) {

        if ($this->groupManager->isAdmin($userId)) {

            $getrecfordl = $this->connection->prepare('
			SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `message`
			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();

        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`');
                $resultsent = $getsenttbl->execute();
            } else {
                $getsenttbl = $this->connection->prepare('
		       SELECT `id`, `user_id`, `message_id`, `date`, `from`, `to`, `network`, `price`, `status`, `deliveryreceipt`, `message`
		       FROM  `*PREFIX*sms_relent_sent`');
                $resultsent = $getsenttbl->execute();
            }

        } 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)) {

            return $sentdatafromdb;

        } else {

            // 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();

            if ($restrdata) {

                // 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 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 phone numbers that are not allowed for the current user
                $restrPhoneNb = [];
                foreach ($restrdata as $rskey => $rsvalue) {

                       $restrgrparr = explode("|", $rsvalue['groups']);
                       $chck = 0;
                       foreach ($restrgrparr as $rkey => $rvalue) {
                                if (str_contains(implode("|", $usergrps), $rvalue)) { $chck++; }
                       }
                       if (str_contains($rsvalue['users'], $cruserdname)) { $chck++; }

                       if ($chck == 0) { $restrPhoneNb[] = $rsvalue['phone_number']; }
                }

                $restrPhoneNmbrs = array_unique($restrPhoneNb);

                // 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);

                return $sentdatadbproc;
            }
        }
     }


     /**
      * @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`
		          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();


        // Get all the received messages
        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`');
	    $getrecmsgsres = $getrecmsgs->execute();

        } else {

            $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]);
        }

        $recmsgs = [];
        while ($rcrowsfetch = $getrecmsgsres->fetch()) {
               $rcrowsfetch['deliveryreceipt'] = '';
               $rcrowsfetch['table'] = 'received';
               $recmsgs[] = $rcrowsfetch;
        }
	$getrecmsgsres->closeCursor();


        // Get all the sent messages
        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`');
            $getsentmsgsres = $getsentmsgs->execute();

        } 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 {

            // 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();

            if ($restrdata) {

                // 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 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 phone numbers that are not allowed for the current user
                $restrPhoneNb = [];
                foreach ($restrdata as $rskey => $rsvalue) {

                       $restrgrparr = explode("|", $rsvalue['groups']);
                       $chck = 0;
                       foreach ($restrgrparr as $rkey => $rvalue) {
                                if (str_contains(implode("|", $usergrps), $rvalue)) { $chck++; }
                       }
                       if (str_contains($rsvalue['users'], $cruserdname)) { $chck++; }

                       if ($chck == 0) { $restrPhoneNb[] = $rsvalue['phone_number']; }
                }

                $restrPhoneNmbrs = array_unique($restrPhoneNb);

                // 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['user_id'] == $userId) {

                        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]);
                                }
                            }
                        }

                    } else { unset($groupedfromdb[$gmdkey]); }

                }

                $groupedfdbproc = array_values($groupedfromdb);

                return $groupedfdbproc;
            }
        }
     }


     /**
      * @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();


        // Get all the received messages for the current number
        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 ?');
	    $getrecmsgsres = $getrecmsgs->execute([$phoneNumber, $phoneNumberpr]);

        } 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 all the sent messages
        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` = ?');
            $getsentmsgsres = $getsentmsgs->execute([$phoneNumberpr, $phoneNumber]);

        } 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 {

            // 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();

            if ($restrdata) {

                // 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 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 phone numbers that are not allowed for the current user
                $restrPhoneNb = [];
                foreach ($restrdata as $rskey => $rsvalue) {

                       $restrgrparr = explode("|", $rsvalue['groups']);
                       $chck = 0;
                       foreach ($restrgrparr as $rkey => $rvalue) {
                                if (str_contains(implode("|", $usergrps), $rvalue)) { $chck++; }
                       }
                       if (str_contains($rsvalue['users'], $cruserdname)) { $chck++; }

                       if ($chck == 0) { $restrPhoneNb[] = $rsvalue['phone_number']; }
                }

                $restrPhoneNmbrs = array_unique($restrPhoneNb);

                // 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['user_id'] == $userId) {

                        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]);
                                }
                            }
                        }

                    } else { unset($groupedpernb[$gmdkey]); }
                }

                $groupedpernb = array_values($groupedpernb);

                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_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`, `show_display_names`
		    FROM  `*PREFIX*sms_relent_settings`
		    WHERE `user_id` = ?');

        $resultsettings = $getsettings->execute([$userId]);

        $settingsfromdb = $resultsettings->fetch();

        $resultsettings->closeCursor();

        if ($settingsfromdb) {

            if ($settingsfromdb['telapi_key'] != '') {

                // Send a placeholder to the browser, instead of the real API key
                $settingsfromdb['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 ($settingsfromdb['tel_pub_key'] != '') {
                $settingsfromdb['tel_pub_key'] = "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
            }
            if ($settingsfromdb['messaging_profile_id'] != '') {
                $settingsfromdb['messaging_profile_id'] = "%20%20%20%20%20%20%20%20%20%20%20%20";
            }
            if ($settingsfromdb['nexapi_key'] != '') {
                $settingsfromdb['nexapi_key'] = "%20%20%20%20%20%20%20%20%20";
            }
            if ($settingsfromdb['nexapi_secret'] != '') {
                $settingsfromdb['nexapi_secret'] = "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
            }
            if ($settingsfromdb['twilapi_key'] != '') {
                $settingsfromdb['twilapi_key'] = "%20%20%20%20%20%20%20%20%20";
            }
            if ($settingsfromdb['twilapi_secret'] != '') {
                $settingsfromdb['twilapi_secret'] = "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
            }
            if ($settingsfromdb['flowapi_key'] != '') {
                $settingsfromdb['flowapi_key'] = "%20%20%20%20%20%20%20%20%20";
            }
            if ($settingsfromdb['flowapi_secret'] != '') {
                $settingsfromdb['flowapi_secret'] = "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20";
            }

            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;
        }
     }


     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)) {

	    // Get the 'show_all_messages' option for the current admin
	    $getsettingsadm = $this->connection->prepare('SELECT `user_id`, `show_all_messages` FROM `*PREFIX*sms_relent_settings` WHERE `user_id` = ?');
	    $getadmsetresult = $getsettingsadm->execute([$userId]);
	    $settingsfdbadm = $getadmsetresult->fetch();
	    $getadmsetresult->closeCursor();

	    if ($settingsfdbadm) {

		    // 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 groups
		    $getgroups = $this->connection->prepare('SELECT `gid`, `displayname` FROM `*PREFIX*groups`');
		    $getgroupsres = $getgroups->execute();

		    $groupsArr = [];
		    while ($groupsfetched = $getgroupsres->fetch()) {
		           $groupsArr[] = $groupsfetched;
		    }
		    $getgroupsres->closeCursor();

		    if ($groupsArr) { $allgroups = $groupsArr; } else { $allgroups = ''; }


		    // Get the name of all users
		    $getusers = $this->connection->prepare('SELECT `uid`, `name`, `value` FROM `*PREFIX*accounts_data` WHERE `name` = ?');
		    $getusersres = $getusers->execute(['displayname']);

		    $usersArr = [];
		    while ($usersfetched = $getusersres->fetch()) {
		           $usersArr[] = $usersfetched;
		    }
		    $getusersres->closeCursor();

		    if ($usersArr) { $allusers = $usersArr; } else { $allusers = ''; }


		    $settingsadm = ['show_all_messages' => $settingsfdbadm['show_all_messages'], 'admdisplayname' => $cruserdname, 'restrictions' => $restrictedUsers, 
		                    'allgroups' => $allgroups, 'allusers' => $allusers];

		    return $settingsadm;
	    }
        }
     }


     /**
      * @NoAdminRequired
      *
      */
     public function updatesettings($userId, $telapiKey, $telPubKey, $telapiUrlRec, $telapiUrl, $messagingProfileId, $nexapiKey, $nexapiSecret, $nexapiUrlRec, $nexapiUrl,
                                    $telSenderName, $nexSenderName, $messagesperpage, $getNotify, $notificationEmail, $getsmsinemail, $twilapiKey, $twilapiSecret, 
                                    $twilapiUrlRec, $twilapiUrl, $twilSenderName, $flowapiKey, $flowapiSecret, $flowapiUrlRec, $flowapiUrl, $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`, `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`, `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`, `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`,
                                         `show_display_names`)
				VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
			');
	    $sql->execute([$userId, $telapikeystrenc, $telpubkeystrenc, $telapiUrlRec, $telapiUrl, $messagingprofenc, $nexapikeystrenc, $nexapisecretstrenc, $nexapiUrlRec, $nexapiUrl, 
	                   $telSenderName, $nexSenderName, $messagesperpage, $getNotify, $notificationEmail, $getsmsinemail, $twilapikeystrenc, $twilapisecretstrenc, $twilapiUrlRec, 
	                   $twilapiUrl, $twilSenderName, $flowapikeystrenc, $flowapisecretstrenc, $flowapiUrlRec, $flowapiUrl, $showDisplayNames]);

        } 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` = ?, `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` = ?, `show_display_names` = ?
	                WHERE `user_id` = ?');
	    $updateRes = $sqlupdatedb->execute([$telapikeystrenc, $telpubkeystrenc, $telapiUrlRec, $telapiUrl, $messagingprofenc, $nexapikeystrenc, $nexapisecretstrenc, $nexapiUrlRec,
	                                        $nexapiUrl, $telSenderName, $nexSenderName, $messagesperpage, $getNotify, $notificationEmail, $getsmsinemail, $twilapikeystrenc, 
	                                        $twilapisecretstrenc, $twilapiUrlRec, $twilapiUrl, $twilSenderName, $flowapikeystrenc, $flowapisecretstrenc, $flowapiUrlRec, 
	                                        $flowapiUrl, $showDisplayNames, $userId]);
	    $updateRes->closeCursor();

	}
     }


    public function updateadminsettings($userId, $showAllMessages) {

        if ($this->groupManager->isAdmin($userId)) {

            $upsettingsadm = $this->connection->prepare('SELECT `id`, `user_id`, `show_all_messages` FROM `*PREFIX*sms_relent_settings` WHERE `user_id` = ?');

            $resultstngadm = $upsettingsadm->execute([$userId]);

            $rowupadm = $resultstngadm->fetch();

            $resultstngadm->closeCursor();

            if ($resultstngadm && !$rowupadm) {

	        $sqladm = $this->connection->prepare('INSERT INTO `*PREFIX*sms_relent_settings` (`user_id`, `show_all_messages`) VALUES (?, ?)');
	        $sqladm->execute([$userId, $showAllMessages]);

            } elseif ($resultstngadm && $rowupadm) {

	        $sqlupdatedbadm = $this->connection->prepare('UPDATE `*PREFIX*sms_relent_settings` SET `show_all_messages` = ? WHERE `user_id` = ?');
	        $updateResadm = $sqlupdatedbadm->execute([$showAllMessages, $userId]);
	        $updateResadm->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;
    }
}