CrestRoad/laravel/app/Http/Controllers/BotController.php

513 lines
28 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Rapiwha;
use App\Models\Session;
use Illuminate\Support\Str;
use App\Http\Requests\LambdaRequest;
use Illuminate\Support\Facades\Http;
use App\Http\Requests\Creation;
use Log;
use DB;
use App\Models\User;
use App\Services\SessionCommunicationService;
class BotController extends LocalController
{
protected $comm;
public function __construct(SessionCommunicationService $comm)
{
$this->comm = $comm;
}
protected function interaktAuthHeader(): string
{
return env('INTERAKT_API_AUTH', 'Basic S1BnVWoxRGZUcWpTYVl2OG9ZN3lEbkk2YjlXTzUtZXhvOWpMQ3RIN3ZJVTo=');
}
protected function sendMsg($number, $message) {
Log::debug(print_r([$number, $message], true));
$params = ["countryCode" => "+91",
"phoneNumber" => $number,
"callbackData" => "some text here",
"type" => "Text",
"data" => ["message" => $message]
];
$response = Http::withHeaders(['Authorization' => $this->interaktAuthHeader()])
->post('https://api.interakt.ai/v1/public/message/', $params);
Log::debug(print_r($response, true));
}
protected function deliverSessionText($number, $message, $session, $contact): void
{
if (!$session || !$contact) {
$this->sendMsg($number, $message);
return;
}
$mode = $this->comm->resolveMode($session);
if ($this->comm->shouldSendWhatsApp($mode)) {
$this->sendMsg($number, $message);
}
if ($this->comm->shouldSendEmail($mode)) {
$this->comm->queueEmailFromText($session, $contact, $message);
}
}
public function webhook(Request $request) {
Log::debug('===== Webhook ======');
$post = $request->all();
Log::debug(print_r($post, true));
if(isset($post['type']) && $post['type'] == "message_received") {
return response()->json([]);
}
if(!isset($post['entry'][0]['changes'][0]['value']['messages'][0])) {
return response()->json([]);
}
$post = $post['entry'][0]['changes'][0]['value']['messages'][0];
//Log::debug(print_r($post, true));
$domain = 'https://road.xltr.in/';
// $number = $post['data']['customer']['phone_number'];
// $data['from'] = '91'.$post['data']['customer']['phone_number'];
// $data['text'] = $post['data']['message']['message'];
$number = substr($post['from'], -10);
$data['from'] = $post['from'];
$data['text'] = $post['text']['body'];
//CREST_VERIFY_LMS_1692788174-76994ced-b2da-4920-814b-df2cbb10aC4c
$reply = '';
$session_data = [];
$sessions = [];
$finalised = false;
$botSess = Rapiwha::where('from', $data['from'])->where('created_at', '>=', date("Y-m-d H:i:s", strtotime("now")-88200 ) )->orderby('created_at', 'desc')->first();
Log::debug(print_r($data, true));
if(strpos($data['text'],'CREST_VERIFY_') === 0) {
list($code, $uid) = explode('_', str_replace('CREST_VERIFY_', '', $data['text']) );
if($code == 'LMS') {
$contact = LambdaRequest::getrequest('contact', 'contact/get_one', ['id'=>$uid], env('LAMBDA_ACCESS_TOKEN', 'default_value') );
$contact = $contact->data->item;
$access_token = User::where('user_id', $contact->user_id)->first()->access_token;
$response = LambdaRequest::postrequest('contact', 'contact/update', ['id' => $uid, 'position'=>$contact->position, 'is_verified' => true ], $access_token );
$reply = 'Greetings ' . $response->data->item->name ."\n";
$reply .= 'You have Successfully registered for Paramedic Training Course'."\n";
$reply .= "\n" . 'Please click on the below link to view the available courses and start learning.';
$reply .= "\n" . 'https://road.xltr.in/lmscourse/'.$response->data->item->id;
$rsdata = ['to' => $number,
'text' => json_encode(['countryCode'=>'+91','phoneNumber'=>$number,'callbackData'=>rand(10000,99999).'-'.$response->data->item->id,'type'=>'Template','template'=>['name'=>'paramedic_course_registration_success','languageCode'=>'en','bodyValues'=>[$response->data->item->name,$response->data->item->id] ] ]),
'is_sent' => 0,
'session_id' => 0,
'contact_id' => $response->data->item->id,
'status' => 1
];
DB::table("raphiwa_send")->insert($rsdata);
return response()->json([]);
} else if($code == 'USER') {
$user = LambdaRequest::getrequest('ums', 'users/get_one', ['id'=>$uid], env('LAMBDA_ACCESS_TOKEN', 'default_value') );
$user = $user->data->item;
$toupdate = ['id' => $user->id, 'pincode' => $user->pincode, 'address' => $user->address, 'city' => $user->city, 'state' => $user->state, 'email' => $user->email, 'is_active' => true, 'status' => 'active' ];
$response = LambdaRequest::postrequest('ums', 'users/update', $toupdate, env('LAMBDA_ACCESS_TOKEN', 'default_value') );
Log::debug(print_r($toupdate, true));
$reply = 'Dear ' . $user->firstname .','."\n";
$reply .= 'You have successfully verified your CREST account'."\n";
$reply .= "\n" . 'You can now login to your CREST app using the email and password you have used while registering';
$reply .= "\n" . 'Email: '.$user->email;
$reply .= "\n" . 'Password: '.$user->password;
$reply .= "\n" ."\n" . 'Greetings'."\n" .'CREST Team';
} else {
$response = LambdaRequest::postrequest('contact', 'contact/update', ['id' => $uid, 'position'=>'india', 'is_verified' => true ], env('LAMBDA_ACCESS_TOKEN', 'default_value') );
$session = Session::where('code', $code)->first();
$contact = $response->data->item;
$reply = 'Greetings ' . $contact->name ."\n";
$reply .= 'You have Successfully registered for Crest session "'.$session->number.' ('.$session->type.') "'."\n";
$reply .= 'Please find the details below'."\n";
$reply .= 'Venue: ' . $session->venue . "\n";
$reply .= 'Address: ' . $session->address . "\n";
$reply .= 'Timings:' . "\n";
$dates = json_decode($session->dates);
foreach($dates->date as $i => $date){
$reply .= date("d M, Y", strtotime($date) ) . ' at ' . date("h:iA", strtotime($dates->start[$i]) ) .' - ' . date("h:iA", strtotime($dates->end[$i]) ) . "\n";
}
$reply .= "\n" . 'You can use this chat as your self assistance for getting details, download your certificate etc.';
Session::where('code', $code)->increment('reg_confirmed');
$this->deliverSessionText($number, $reply, $session, $contact);
return response()->json([]);
}
$this->sendMsg($number, $reply);
return response()->json([]);
// if($code == 'Y8WUVES7VIdRNB4gOEe7') {
// return response()->json(['autoreply' => $reply]);
// } else {
// return response()->json([]);
// }
}
if($botSess && !$finalised) {
$session_data = (array)json_decode($botSess->session_data);
Log::debug(print_r($session_data, true));
if(isset($session_data['session'])) {
$sess = $session_data['session_data'];
$reply = 'We can see that you have registered for '.ucwords($sess->type).' ('.$sess->number.') on '.date("d M Y", strtotime($sess->start_date)). ' at ' . $sess->venue."\n\n";
//$finalised = true;
}
}
//Log::debug($reply);
if(!$botSess && !$finalised) {
$response = LambdaRequest::getrequest('contact', 'contact/get_all', ['source'=>'dynamodb', 'search' => json_encode(['phone' => $number]), 'fields' => json_encode(['session_code', 'present', 'type']) ], env('LAMBDA_ACCESS_TOKEN', 'default_value') );
$users = [];
Log::debug(print_r($response, true));
if( sizeof($response->data->items) > 0 ) {
foreach($response->data->items as $item) {
if(isset($item->type) && $item->type == 'lmsuser') {
$reply = 'Greetings ' . $item->name ."\n";
$reply .= 'You have Successfully registered for Paramedic Training Course'."\n";
$reply .= "\n" . 'Please click on the below link to view the available courses and start learning.';
$reply .= "\n" . 'https://road.xltr.in/lmscourse/'.$item->id;
$this->sendMsg($number, $reply);
$rsdata = ['to' => $number,
'text' => json_encode(['countryCode'=>'+91','phoneNumber'=>$number,'callbackData'=>rand(10000,99999).'-'.$item->id,'type'=>'Template','template'=>['name'=>'paramedic_course_registration_success','languageCode'=>'en','bodyValues'=>[$item->name,$item->id] ] ]),
'is_sent' => 0,
'session_id' => 0,
'contact_id' => $item->id,
'status' => 1
];
DB::table("raphiwa_send")->insert($rsdata);
return response()->json([]);
return response()->json([]);
}
if( isset($item->session_code) ) {
$sessions[] = $item->session_code;
$users[$item->session_code] = $item->id;
}
}
//Log::debug(print_r($sessions, true));
$sessions = DB::table('sessions')->wherein('code', $sessions)->orderby('created_at', 'desc')->get();
//$sessions = DB::table('sessions')->wherein('code', $sessions)->where('start_date', '>=', date("Y-m-d 00:00:00", strtotime("now") ) )->orderby('created_at', 'desc')->get();
//Log::debug(print_r($sessions, true));
if($sessions->count() > 1) {
$reply = 'We can see that you have registered for multiple future Crest events. Please reply for which crest session you want to communicate'."\n\n";
$session_data['available_sessions'] = $sessions->toArray();
$session_data['available_users'] = $users;
$count = 1;
foreach($sessions->toArray() as $sess) {
$session_data['session_selection'] = [(string)$count => $sess->code ];
$reply .= 'Reply '.$count.' if you want to select '.ucwords($sess->type).' ('.$sess->number.') on '.date("d M Y", strtotime($sess->start_date)). ' at ' . $sess->venue."\n\n";
$count++;
}
$finalised = true;
} else {
$sess = $sessions->toArray();
$sess = $sess[0];
$session_data['session'] = $sess->code;
$session_data['session_data'] = $sess;
$session_data['user'] = $users[$sess->code];
$reply = 'We can see that you have registered for '.ucwords($sess->type).' ('.$sess->number.') on '.date("d M Y", strtotime($sess->start_date)). ' at ' . $sess->venue."\n\n";
}
} else {
$reply = 'Thank you for your interest in Crest. we can see that you have not registered for amy future Crest event.';
$finalised = true;
}
}
//echo '<pre>'; print_r($session_data); exit;
if(!isset($session_data['session']) && !$finalised ) {
$count = 1;
if(isset($session_data['available_sessions'])) {
foreach($session_data['available_sessions'] as $sess) {
if($count == $data['text']) {
$session_data['session'] = $sess->code;
$session_data['session_data'] = $sess;
$session_data['user'] = $session_data['available_users']->{$sess->code};
$reply = 'You have selected '.ucwords($sess->type).' ('.$sess->number.') on '.date("d M Y", strtotime($sess->start_date)). ' at ' . $sess->venue."\n\n";
$data['text'] = 'hi';
//$finalised = true;
}
$count++;
}
}
}
if(isset($session_data['session']) && !$finalised) {
switch(Str::slug($data['text'], '_')) {
case '1':
$reply = 'Here is the link to the session website: ' . $domain . 'microsite/' . $session_data['session_data']->type . '-' . $session_data['session_data']->code;
break;
case '2':
$reply = 'Please find the details below'."\n\n";
$reply .= 'Venue: ' . $session_data['session_data']->venue . "\n\n";
$reply .= 'Address: ' . $session_data['session_data']->address . "\n\n" . "\n\n";
$reply .= 'Timings:' . "\n\n";
$dates = json_decode($session_data['session_data']->dates);
foreach($dates->date as $i => $date){
$reply .= date("d M, Y", strtotime($date) ) . ' at ' . date("h:iA", strtotime($dates->start[$i]) ) .' - ' . date("h:iA", strtotime($dates->end[$i]) ) . "\n\n";
}
break;
case '3':
$reply = 'Here is the link to the session website: ' . $domain . 'brochure/' . $session_data['session_data']->code;
break;
case '4':
$response = LambdaRequest::getrequest('contact', 'contact/get_one', ['id'=>$session_data['user']], env('LAMBDA_ACCESS_TOKEN', 'default_value') );
$doctor = $response->data->item;
if(isset($doctor->present) && $doctor->present == 'yes' && isset($doctor->feedback) && $doctor->feedback == 'yes') {
$output = Creation::certificate($session_data['session_data'], $doctor);
$filename = $output['filename'];
$certUrl = $domain . 'storage/certificate/'.$session_data['session_data']->type.'/'.$filename;
$sess = Session::find($session_data['session_data']->id);
if ($sess) {
$this->comm->dispatchForContact($sess, $doctor, [
'id' => 0,
'template_code' => 'crest_certificate_attached',
'template_body' => "Dear {{RECIPIENT_NAME}},\n\nYour certificate for {{SESSION_NAME}} on {{SESSION_DATE}} is ready.\n\nView your certificate: " . $certUrl,
'template_title' => 'Your CREST Certificate',
'header_values' => [$certUrl],
'body_params' => 'RECIPIENT_NAME||SESSION_NAME||SESSION_DATE',
'button_params' => '',
]);
}
$reply = 'We will generate your certificate and send it to you in a while, please give us few minutes.';
} else if(isset($doctor->present) && $doctor->present == 'yes') {
$reply = 'You have not filled up the feedback form sent to you. Please submit the feedback and request for certificate again.';
} else {
$reply = 'You have not attended the session or not marked attended.';
}
break;
default:
$reply .= 'Please select what do you want to do'."\n\n";
$reply .= 'Reply 1 if you want link to the session website'."\n\n";
$reply .= 'Reply 2 if you want to know about session location and timings'."\n\n";
//$reply .= 'Reply 3 if you want to know about session agenda and speakers'."\n\n";
$reply .= 'Reply 3 if you want to download session brochure'."\n\n";
$reply .= 'Reply 4 if you want to download your certificate'."\n\n";
break;
}
}
$data['session_data'] = json_encode($session_data);
//echo $reply; echo '<pre>'; print_r($data); exit;
if($botSess) {
unset($data['event']);
$data['msg_history'] = json_decode($botSess->msg_history);
$data['msg_history'][] = $data['text'];
$data['msg_history'] = json_encode($data['msg_history']);
Rapiwha::where('id', $botSess->id)->update($data);
} else {
$data['msg_history'] = json_encode([$data['text']]);
Rapiwha::create($data);
}
$this->deliverBotReply($number, $reply, $session_data);
return response()->json([]);
}
protected function deliverBotReply($number, $reply, array $session_data): void
{
if (!isset($session_data['session_data']) || !isset($session_data['user'])) {
$this->sendMsg($number, $reply);
return;
}
$sess = Session::find($session_data['session_data']->id ?? 0);
if (!$sess) {
$this->sendMsg($number, $reply);
return;
}
$response = LambdaRequest::getrequest(
'contact',
'contact/get_one',
['id' => $session_data['user']],
env('LAMBDA_ACCESS_TOKEN', 'default_value')
);
$contact = $response->data->item ?? null;
if ($contact) {
$this->deliverSessionText($number, $reply, $sess, $contact);
} else {
$this->sendMsg($number, $reply);
}
}
public function receive(Request $request) {
Log::debug('===== Receive ======');
$domain = 'https://road.xltr.in/';
$post = $request->input();
$data = (array)json_decode($post['data']);
//$data = (array)($post['data']);
Log::debug(print_r($data, true));
$number = substr($data['from'], -10);
$reply = '';
$session_data = [];
$sessions = [];
$finalised = false;
$botSess = Rapiwha::where('from', $data['from'])->where('created_at', '>=', date("Y-m-d H:i:s", strtotime("now")-88200 ) )->orderby('created_at', 'desc')->first();
if(strpos($data['text'],'CREST_VERIFY_') === 0) {
list($code, $uid) = explode('_', str_replace('CREST_VERIFY_', '', $data['text']) );
$response = LambdaRequest::postrequest('contact', 'contact/update', ['id' => $uid, 'position'=>'india', 'is_verified' => true ], env('LAMBDA_ACCESS_TOKEN', 'default_value') );
$session = (object)Session::where('code', $code)->first()->toArray();
$reply = 'Greetings ' . $response->data->item->name ."\n";
$reply .= 'You have Successfully registered for Crest session "'.$session->number.' ('.$session->type.') "'."\n";
$reply .= 'Please find the details below'."\n";
$reply .= 'Venue: ' . $session->venue . "\n";
$reply .= 'Address: ' . $session->address . "\n";
$reply .= 'Timings:' . "\n";
$dates = json_decode($session->dates);
foreach($dates->date as $i => $date){
$reply .= date("d M, Y", strtotime($date) ) . ' at ' . date("h:iA", strtotime($dates->start[$i]) ) .' - ' . date("h:iA", strtotime($dates->end[$i]) ) . "\n";
}
$reply .= "\n" . 'You can use this chat as your self assistance for getting details, download your certificate etc.';
Session::where('code', $code)->increment('reg_confirmed');
Log::debug($reply);
Log::debug($code);
if($code == 'Y8WUVES7VIdRNB4gOEe7') {
return response()->json(['autoreply' => $reply]);
} else {
return response()->json([]);
}
}
if($botSess && !$finalised) {
$session_data = (array)json_decode($botSess->session_data);
if(isset($session_data['session'])) {
$sess = $session_data['session_data'];
$reply = 'We can see that you have registered for '.ucwords($sess->type).' ('.$sess->number.') on '.date("d M Y", strtotime($sess->start_date)). ' at ' . $sess->venue."\n\n";
//$finalised = true;
}
}
if(!$botSess && !$finalised) {
$response = LambdaRequest::getrequest('contact', 'contact/get_all', ['source'=>'dynamodb', 'search' => json_encode(['phone' => $number]), 'fields' => json_encode(['session_code', 'present']) ], env('LAMBDA_ACCESS_TOKEN', 'default_value') );
$users = [];
if( sizeof($response->data->items) > 0 ) {
foreach($response->data->items as $item) {
if( isset($item->session_code) ) {
$sessions[] = $item->session_code;
$users[$item->session_code] = $item->id;
}
}
//Log::debug(print_r($sessions, true));
$sessions = DB::table('sessions')->wherein('code', $sessions)->orderby('created_at', 'desc')->get();
//$sessions = DB::table('sessions')->wherein('code', $sessions)->where('start_date', '>=', date("Y-m-d 00:00:00", strtotime("now") ) )->orderby('created_at', 'desc')->get();
//Log::debug(print_r($sessions, true));
if($sessions->count() > 1) {
$reply = 'We can see that you have registered for multiple future Crest events. Please reply for which crest session you want to communicate'."\n\n";
$session_data['available_sessions'] = $sessions->toArray();
$session_data['available_users'] = $users;
$count = 1;
foreach($sessions->toArray() as $sess) {
$session_data['session_selection'] = [(string)$count => $sess->code ];
$reply .= 'Reply '.$count.' if you want to select '.ucwords($sess->type).' ('.$sess->number.') on '.date("d M Y", strtotime($sess->start_date)). ' at ' . $sess->venue."\n\n";
$count++;
}
$finalised = true;
} else {
$sess = $sessions->toArray();
$sess = $sess[0];
$session_data['session'] = $sess->code;
$session_data['session_data'] = $sess;
$session_data['user'] = $users[$sess->code];
$reply = 'We can see that you have registered for '.ucwords($sess->type).' ('.$sess->number.') on '.date("d M Y", strtotime($sess->start_date)). ' at ' . $sess->venue."\n\n";
}
} else {
$reply = 'Thank you for your interest in Crest. we can see that you have not registered for amy future Crest event.';
$finalised = true;
}
}
//echo '<pre>'; print_r($session_data); exit;
if(!isset($session_data['session']) && !$finalised ) {
$count = 1;
foreach($session_data['available_sessions'] as $sess) {
if($count == $data['text']) {
$session_data['session'] = $sess->code;
$session_data['session_data'] = $sess;
$session_data['user'] = $session_data['available_users']->{$sess->code};
$reply = 'You have selected '.ucwords($sess->type).' ('.$sess->number.') on '.date("d M Y", strtotime($sess->start_date)). ' at ' . $sess->venue."\n\n";
$data['text'] = 'hi';
//$finalised = true;
}
$count++;
}
}
if(isset($session_data['session']) && !$finalised) {
switch(Str::slug($data['text'], '_')) {
case '1':
$reply = 'Here is the link to the session website: ' . $domain . 'microsite/' . $session_data['session_data']->type . '-' . $session_data['session_data']->code;
break;
case '2':
$reply = 'Please find the details below'."\n\n";
$reply .= 'Venue: ' . $session_data['session_data']->venue . "\n\n";
$reply .= 'Address: ' . $session_data['session_data']->address . "\n\n" . "\n\n";
$reply .= 'Timings:' . "\n\n";
$dates = json_decode($session_data['session_data']->dates);
foreach($dates->date as $i => $date){
$reply .= date("d M, Y", strtotime($date) ) . ' at ' . date("h:iA", strtotime($dates->start[$i]) ) .' - ' . date("h:iA", strtotime($dates->end[$i]) ) . "\n\n";
}
break;
case '3':
$reply = 'Here is the link to the session website: ' . $domain . 'brochure/' . $session_data['session_data']->code;
break;
case '4':
$response = LambdaRequest::getrequest('contact', 'contact/get_one', ['id'=>$session_data['user']], env('LAMBDA_ACCESS_TOKEN', 'default_value') );
$doctor = $response->data->item;
$output = Creation::certificate($session_data['session_data'], $doctor);
$filename = $output['filename'];
DB::table('raphiwa_send')->insert(['to'=> $data['from'], 'text' => $domain . 'storage/certificate/'.$session_data['session_data']->code.'/'.$session_data['session_data']->type.'/'.$filename ]);
$reply = 'We will generate your certificate and send it to you in a while, please give us few minutes.';
break;
default:
$reply .= 'Please select what do you want to do'."\n\n";
$reply .= 'Reply 1 if you want link to the session website'."\n\n";
$reply .= 'Reply 2 if you want to know about session location and timings'."\n\n";
//$reply .= 'Reply 3 if you want to know about session agenda and speakers'."\n\n";
$reply .= 'Reply 3 if you want to download session brochure'."\n\n";
$reply .= 'Reply 4 if you want to download your certificate'."\n\n";
break;
}
}
$data['session_data'] = json_encode($session_data);
//echo $reply; echo '<pre>'; print_r($data); exit;
if($botSess) {
unset($data['event']);
$data['msg_history'] = json_decode($botSess->msg_history);
$data['msg_history'][] = $data['text'];
$data['msg_history'] = json_encode($data['msg_history']);
Rapiwha::where('id', $botSess->id)->update($data);
} else {
$data['msg_history'] = json_encode([$data['text']]);
Rapiwha::create($data);
}
return response()->json(['autoreply' => $reply]);
// if(Str::slug($data['text'], '_') == 'hi_pulmoflix') {
// return response()->json(['autoreply' => 'Thank you for showing interest in Pulmoflix. To access the website use the link https://pulmoflix.com']);
// } elseif(Str::slug($data['text'], '_') == 'hi_napcon') {
// return response()->json(['autoreply' => 'Dear Doctor, Please click on the link and download the NAPCON 2022 Application, for a better NAPCON Experience'."\n\n".'Android:'."\n".'https://play.google.com/store/apps/details?id=com.startawiz.napcon'."\n\n".'iOS:'."\n".'https://apps.apple.com/in/app/napcon/id1615285887']);
// } else {
// return response()->json([]);
// }
}
}