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

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use DB, Twitter;
  5. use \App\PhoneNumber;
  6. class SMSController extends Controller
  7. {
  8. /**
  9. * Create a new controller instance.
  10. *
  11. * @return void
  12. */
  13. public function __construct()
  14. {
  15. $this->middleware('auth');
  16. }
  17. private function max_message_length($numbers) {
  18. $max_name_length = 0;
  19. foreach($numbers as $n) {
  20. if(strlen($n->name) > $max_name_length) {
  21. $max_name_length = strlen($n->name);
  22. }
  23. }
  24. return 160 - $max_name_length - 1;
  25. }
  26. public function index() {
  27. $this->authorize('admin');
  28. $numbers = PhoneNumber::orderBy('name')->get();
  29. $maxlen = $this->max_message_length($numbers);
  30. return view('sms', [
  31. 'numbers' => $numbers,
  32. 'maxlen' => $maxlen
  33. ]);
  34. }
  35. public function save(Request $request) {
  36. $this->authorize('admin');
  37. if(preg_match_all('/(.+)\s+([0-9\-]+)/', $request->input('input'), $matches)) {
  38. $contacts = [];
  39. $errors = [];
  40. foreach($matches[1] as $i=>$name) {
  41. if(preg_match('/^1?(\d{3})-?(\d{3})-?(\d{4})$/', $matches[2][$i], $pm)) {
  42. $contacts[] = [trim($name), $pm[1].'-'.$pm[2].'-'.$pm[3]];
  43. } else {
  44. $errors[] = $matches[0][$i];
  45. }
  46. }
  47. if(count($errors)) {
  48. $request->session()->flash('status', 'danger');
  49. $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)));
  50. } else {
  51. DB::table('phone_numbers')->delete();
  52. foreach($contacts as $c) {
  53. $p = new PhoneNumber;
  54. $p->name = $c[0];
  55. $p->phone = $c[1];
  56. $p->save();
  57. }
  58. $request->session()->flash('status', 'success');
  59. $request->session()->flash('status-message', 'Phone numbers saved!');
  60. }
  61. } else {
  62. $request->session()->flash('status', 'danger');
  63. $request->session()->flash('status-message', 'Invalid input, phone numbers were not modified');
  64. }
  65. return redirect('sms');
  66. }
  67. public function send(Request $request) {
  68. $this->authorize('admin');
  69. $numbers = PhoneNumber::orderBy('name')->get();
  70. $maxlen = $this->max_message_length($numbers);
  71. if(strlen($request->input('text')) <= $maxlen) {
  72. $client = new \Twilio\Rest\Client(env('TWILIO_SID'), env('TWILIO_TOKEN'));
  73. foreach($numbers as $number) {
  74. $text = $request->input('text');
  75. $text = str_replace('{name}', $number->name, $text);
  76. $message = $client->messages->create(
  77. '+1'.str_replace('-','',$number->phone),
  78. array(
  79. 'from' => env('TWILIO_NUMBER'),
  80. 'body' => $text
  81. )
  82. );
  83. }
  84. $request->session()->flash('status', 'success');
  85. $request->session()->flash('status-message', 'Message was sent! It will take about 1 second per number to deliver all the messages!');
  86. } else {
  87. $request->session()->flash('status', 'danger');
  88. $request->session()->flash('status-message', 'Your message was too long!');
  89. }
  90. return redirect('sms');
  91. }
  92. }