!C99Shell v. 2.5 [PHP 8 Update] [24.05.2025]!

Software: Apache. PHP/8.1.30 

uname -a: Linux server1.tuhinhossain.com 5.15.0-151-generic #161-Ubuntu SMP Tue Jul 22 14:25:40 UTC
2025 x86_64
 

uid=1002(picotech) gid=1003(picotech) groups=1003(picotech),0(root)  

Safe-mode: OFF (not secure)

/home/picotech/domains/sms.picotech.app/public_html_old/app/Http/Controllers/   drwxr-xr-x
Free 28.84 GB of 117.98 GB (24.45%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Self remove    Logout    


Viewing file:     ScheduleController.php (9.65 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php

namespace App\Http\Controllers;

use 
App\Events\SendMail;
use 
App\Models\Contact;
use 
App\Models\DynamicGateway;
use 
App\Models\Message;
use 
App\Models\MessageReport;
use 
App\Models\Number;
use 
App\Models\SenderId;
use 
App\Models\SentFail;
use 
App\Models\SmsQueue;
use 
App\Models\WhatsAppNumber;
use 
App\SmsProvider\SendSMS;
use 
App\SmsProvider\SmppBuilder;
use 
App\WhatsAppProvider\SendMessageProcess;
use 
GuzzleHttp\Client;
use 
Illuminate\Support\Facades\Artisan;
use 
Illuminate\Support\Facades\Log;
use 
Illuminate\Support\Carbon;

class 
ScheduleController extends Controller
{
    public function 
process()
    {

        
//TODO:: check exception table for sending sms
        
$totalNewQueueCount 40;
        
$today now()->format('l');
        
$time now()->toTimeString();

        
$sendingServersNotNull DynamicGateway::whereStatus('active')->where('offdays''not like'"%$today%")
            ->
whereNotNull('start_time')
            ->
whereNotNull('end_time')
            ->
whereTime('start_time''<='$time)
            ->
whereTime('end_time''>='$time)
            ->
get();

        
$sendingServersNull DynamicGateway::whereStatus('active')->where('offdays''not like'"%$today%")
            ->
whereNull('start_time')
            ->
whereNull('end_time')
            ->
get();

        
$sendingServers=$sendingServersNotNull->merge($sendingServersNull);


        if (
$sendingServers->isEmpty()) {
            
$this->debugExit("No available servers");
        }

        
#region Minute Limit Check
            
$minuteEmailQueue SmsQueue::selectRaw("count(*) as total,dynamic_gateway_id")
                ->
where('schedule_completed''yes')
                ->
whereBetween('schedule_datetime', [now()->subMinute(), now()])
                ->
whereIn('dynamic_gateway_id'$sendingServers->pluck('id')->toArray())
                ->
groupBy('dynamic_gateway_id')
                ->
pluck('total''dynamic_gateway_id')
                ->
all();

            
$availableMinutelySendingServerIds = [];
            foreach (
$sendingServers as $sendingServer) {
                if (isset(
$minuteEmailQueue[$sendingServer->id])) {
                    
$totalUsed $minuteEmailQueue[$sendingServer->id] + $totalNewQueueCount// count new queue ;
                    
if ($sendingServer->send_limit && ($sendingServer->minute_limit $sendingServer->send_limit) > $totalUsed) {
                        
$availableMinutelySendingServerIds[] = $sendingServer->id;
                    }
                } else {
                    
$availableMinutelySendingServerIds[] = $sendingServer->id;
                }
            }
            if (empty(
$availableMinutelySendingServerIds)) {
                
$this->debugExit("No available sending servers (minute limit)");
            }
        
#endregion

        #region Daily Limit Check
            
$dailyEmailQueue SmsQueue::selectRaw("count(*) as total,dynamic_gateway_id")
                ->
where('schedule_completed''yes')
                ->
whereIn('dynamic_gateway_id'$availableMinutelySendingServerIds)
                ->
whereBetween('schedule_datetime', [now()->subDay(), now()])
                ->
groupBy('dynamic_gateway_id')
                ->
pluck('total''dynamic_gateway_id')
                ->
all();

            
$availableDailySendingServerIds = [];
            foreach (
$sendingServers as $sendingServer) {
                if (isset(
$dailyEmailQueue[$sendingServer->id])) {
                    
$totalUsed $dailyEmailQueue[$sendingServer->id] + $totalNewQueueCount// count new queue ;
                    
if ($sendingServer->daily_limit $totalUsed) {
                        
$availableDailySendingServerIds[] = $sendingServer->id;
                    }
                } else {
                    
$availableDailySendingServerIds[] = $sendingServer->id;
                }
            }
            if (empty(
$availableDailySendingServerIds)) {
                
$this->debugExit("No available sending servers (daily limit)");
            }
        
#endregion

        #region Monthly Limit Check
        
$monthlyEmailQueue SmsQueue::selectRaw("count(*) as total,dynamic_gateway_id")
            ->
where('schedule_completed''yes')
            ->
whereIn('dynamic_gateway_id'$availableDailySendingServerIds)
            ->
whereBetween('schedule_datetime', [now()->subMonth(), now()])
            ->
groupBy('dynamic_gateway_id')
            ->
pluck('total''dynamic_gateway_id')
            ->
all();

        
$availableSendingServerIds = [];
        foreach (
$sendingServers as $sendingServer) {
            if (isset(
$monthlyEmailQueue[$sendingServer->id])) {
                
$totalUsed $monthlyEmailQueue[$sendingServer->id] + $totalNewQueueCount// count new queue ;
                
if ($sendingServer->monthly_limit $totalUsed) {
                    
$availableSendingServerIds[] = $sendingServer->id;
                }
            } else {
                
$availableSendingServerIds[] = $sendingServer->id;
            }
        }
        if (empty(
$availableSendingServerIds)) {
            
$this->debugExit("No available sending servers (monthly limit");
        }
        
#endregion


        
$sendFailed = [];
        
$allNumbers = [];
        
$messages SmsQueue::whereIn('dynamic_gateway_id'$availableSendingServerIds)
            ->
where(['schedule_completed' => 'no'])
            ->
whereNotNull('schedule_datetime')
            ->
whereNull('delivered_at')
            ->
where('schedule_datetime''<'now())
            ->
where('status','running')
            ->
orderBy('schedule_datetime')
            ->
limit($totalNewQueueCount)
            ->
get();

        
$queueIds = [];
        foreach (
$messages as $message) {
                
$queueIds[]=$message->id;
        }
        
SmsQueue::whereIn('id'$queueIds)->update(['schedule_completed'=>'yes']);
        
$messageBody = [];

        foreach (
$messages as $message) {
            
$allNumbers[]=$message->to;
            
$messageBody[$message->to][] = $message->body;

//Manage Wallet
            
$wallet $message->user->wallet()->first();

            
$current_plan=$message->user->plan;

            
$to_number explode(':'$message->to);

            if (isset(
$to_number[0]) && $to_number[0]=='whatsapp' && isset($to_number[1])){
                
$to $to_number[1];
            }else {
                
$to $message->to;
            }

            
$dynamic_gateway DynamicGateway::where('id'$message->dynamic_gateway_id)->first();
            if (
$dynamic_gateway) {
                if(
$dynamic_gateway->name=='Smpp'){
                    
$flowRoute = new SmppBuilder($dynamic_gateway);
                    
$flowRoute->setMessage($message)
                        ->
setType('sent')
                        ->
sendMessage();
                    
$this->failed_sms $flowRoute->getSendFail();
                }else{
                    
$sendSMS = new SendSMS();
                    
$sendSMS->setMessage($message)
                        ->
setType('sent')
                        ->
process();
                    
$sendFailed $sendSMS->get_failed_sms();
                }

                
$message_report=new MessageReport();
                
$message_report->customer_id=$message->customer_id;
                
$message_report->type=$message->from_type;
                
$message_report->sent_type='sent';
                
$message_report->from=$message->from;
                
$message_report->to=$message->to;
                
$message_report->ref_id=$message->message_id;
                
$message_report->save();


            }

            if(
$sendFailed){
                
$totalCount=0;
                
$requestCharacters=$message->body;
                
$characters=mb_strlen($requestCharacters"UTF-8");
                if (
strlen($requestCharacters) != strlen(utf8_decode($requestCharacters))) {
                    if(
$characters && $characters 70){
                        
$grandTotal=ceil($characters 70);
                        if(
$grandTotal 1)
                            
$totalCount$grandTotal 1;
                    }
                }else {
                    if(
$characters && $characters 160){
                        
$grandTotal=ceil($characters 160);
                        if(
$grandTotal 1)
                            
$totalCount$grandTotal;
                    }
                }


                
$plain_sms=$current_plan->plain_sms;
                
$totalFaileReverse=$totalCount $plain_sms;
                if (
$current_plan) {
                    
$wallet->credit $wallet->credit $totalFaileReverse;
                    
$wallet->save();
                }
            }
            if (
count($sendFailed) < 1){
                
$message->update(['delivered_at' => now()]);
            }

        }
        
$failedNumber collect($sendFailed)->pluck('to');
//        Send Mail
        
try {
            
$contacts Contact::whereIn('number'$allNumbers)->whereNotIn('number'$failedNumber)->get();
            foreach (
$contacts as $contact) {
                foreach (
$messageBody[$contact->number] as $msg) {
                    if (
$contact->email && $contact->email_notification=='true') {
                        
SendMail::dispatch($contact->email'New Message'$msg);
                    }
                }
            }

        } catch (
\Exception $ex) {
            
Log::error($ex->getMessage());
        }

        if (
$sendFailed) {
            
SentFail::insert($sendFailed);
        }
    }
    public function 
processEmail(){
        
Artisan::call("queue:work",['--stop-when-empty'=>true]);
    }
    public function 
processDbBackup(){
        
Artisan::call("db:backup");
    }

    protected function 
debugExit($message)
    {
        if (
config('app.debug')) {
            
Log::info($message);
        }
        exit;
    }}

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ ok ]

:: Make Dir ::
 
[ ok ]
:: Make File ::
 
[ ok ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 2.5 [PHP 8 Update] [24.05.2025] | Generation time: 0.0038 ]--