<?php
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use DB, Twitter;
|
|
use \App\PhoneNumber;
|
|
|
|
class SMSController extends Controller
|
|
{
|
|
/**
|
|
* Create a new controller instance.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __construct()
|
|
{
|
|
$this->middleware('auth');
|
|
}
|
|
|
|
private function max_message_length($numbers) {
|
|
$max_name_length = 0;
|
|
foreach($numbers as $n) {
|
|
if(strlen($n->name) > $max_name_length) {
|
|
$max_name_length = strlen($n->name);
|
|
}
|
|
}
|
|
return 160 - $max_name_length - 1;
|
|
}
|
|
|
|
public function index() {
|
|
$this->authorize('admin');
|
|
|
|
$numbers = PhoneNumber::orderBy('name')->get();
|
|
$maxlen = $this->max_message_length($numbers);
|
|
|
|
return view('sms', [
|
|
'numbers' => $numbers,
|
|
'maxlen' => $maxlen
|
|
]);
|
|
}
|
|
|
|
public function save(Request $request) {
|
|
$this->authorize('admin');
|
|
|
|
if(preg_match_all('/(.+)\s+([0-9\-]+)/', $request->input('input'), $matches)) {
|
|
|
|
$contacts = [];
|
|
$errors = [];
|
|
foreach($matches[1] as $i=>$name) {
|
|
if(preg_match('/^1?(\d{3})-?(\d{3})-?(\d{4})$/', $matches[2][$i], $pm)) {
|
|
$contacts[] = [trim($name), $pm[1].'-'.$pm[2].'-'.$pm[3]];
|
|
} else {
|
|
$errors[] = $matches[0][$i];
|
|
}
|
|
}
|
|
|
|
if(count($errors)) {
|
|
$request->session()->flash('status', 'danger');
|
|
$request->session()->flash('status-message', 'There was a problem with some of your entries. No numbers were changed. The lines below had errors:<br>'.implode('<br>', array_map('htmlspecialchars', $errors)));
|
|
|
|
} else {
|
|
DB::table('phone_numbers')->delete();
|
|
foreach($contacts as $c) {
|
|
$p = new PhoneNumber;
|
|
$p->name = $c[0];
|
|
$p->phone = $c[1];
|
|
$p->save();
|
|
}
|
|
|
|
$request->session()->flash('status', 'success');
|
|
$request->session()->flash('status-message', 'Phone numbers saved!');
|
|
}
|
|
|
|
|
|
} else {
|
|
$request->session()->flash('status', 'danger');
|
|
$request->session()->flash('status-message', 'Invalid input, phone numbers were not modified');
|
|
}
|
|
|
|
return redirect('sms');
|
|
}
|
|
|
|
public function send(Request $request) {
|
|
$this->authorize('admin');
|
|
|
|
$numbers = PhoneNumber::orderBy('name')->get();
|
|
$maxlen = $this->max_message_length($numbers);
|
|
|
|
if(strlen($request->input('text')) <= $maxlen) {
|
|
|
|
$client = new \Twilio\Rest\Client(env('TWILIO_SID'), env('TWILIO_TOKEN'));
|
|
foreach($numbers as $number) {
|
|
$text = $request->input('text');
|
|
$text = str_replace('{name}', $number->name, $text);
|
|
$message = $client->messages->create(
|
|
'+1'.str_replace('-','',$number->phone),
|
|
array(
|
|
'from' => env('TWILIO_NUMBER'),
|
|
'body' => $text
|
|
)
|
|
);
|
|
}
|
|
|
|
$request->session()->flash('status', 'success');
|
|
$request->session()->flash('status-message', 'Message was sent! It will take about 1 second per number to deliver all the messages!');
|
|
} else {
|
|
$request->session()->flash('status', 'danger');
|
|
$request->session()->flash('status-message', 'Your message was too long!');
|
|
}
|
|
|
|
return redirect('sms');
|
|
}
|
|
|
|
}
|