You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.1 KiB

<?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');
}
}