Реализация голосовых напоминаний

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

Re: Реализация голосовых напоминаний

Сообщение xor » Вт апр 24, 2018 2:07 am

А вот ещё
Для шаблона напомни вызываем скрипт, куда передаем $original(ну, или хвост от шаблона без напомни)
Понимает такие фразы и устанавливает напоминания:
'в 7:30 вечера в следующий вторник проверить кое-что';
'проверить кое-что через четверть часа';
'вечером в выходные проверить кое-что';
'проверить в полдень послезавтра кое-что';
скриптПоказать

Код: Выделить всё

 //для шаблона Напомни
if(!$params['txt']) return;
$cmd = $params['txt'];

//https://regexr.com/
//$cmd = 'в 6:30 дня в следующий вторник проверить кое-что';
//$cmd = 'проверить кое-что через четверть часа';
//$cmd = 'вечером в выходные проверить кое-что';
//$cmd = 'проверить кое-что в полдень послезавтра';
//$cmd = 'через два  с половиной часа сделать кое-что';
//$cmd = 'сделать кое-что через два  с половиной часа';
debmes('setMemo - '.$cmd);

$cmd = mb_strtolower($cmd);
$newtime = 0;
$newdate = 0;
$cmd1 = preg_replace('/\s\s+/', ' ', $cmd); //уберём лишние пробелы

$chislo = array('один'=> '1','одну'=> '1','одни'=> '1','полтора' => '1.5','полторы' =>'1.5','два'=> '2','две'=> '2','двое'=> '2','три'=> '3','трое'=> '3','четыре'=> '4','четверо'=> '4','пять'=> '5','шесть'=> '6','семь'=> '7','восемь'=> '8','девять'=> '9');
$tim1 = array('минуту'=>'m','минуты'=>'m','минут'=>'m','часов'=>'H','часа'=>'H','час'=>'H','день'=>'D','дня'=>'D','дней'=>'D','сутки'=>'D','суток'=>'D');
$MonthNames = array("января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря");

//через?
 if(preg_match('/через /isu', $cmd1)){
 if(preg_match('/через полчаса/isu', $cmd1, $m)){
   $cmd1 = str_replace('через полчаса','через 30 минут',$cmd1); //через полчаса -> через 30 минут
 }
 if(preg_match('/через четверть часа/isu', $cmd1, $m)){
   $cmd1 = str_replace('через четверть часа','через 15 минут',$cmd1); //через полчаса -> через 30 минут
 } 
 if(preg_match('/через (час|минуту|день|сутки)/isu', $cmd1, $m)){
    $cmd1 = str_replace('через','через 1',$cmd1); //через час -> через 1 час
 }
 $half = 0; 
  if(preg_match('/(часов|часа|час) с половиной /isu', $cmd1, $m)){ 
    $half = 0.5;
    $cmd1 = str_replace('с половиной','',$cmd1);
    $cmd1 = preg_replace('/\s\s+/', ' ', $cmd1); //уберём лишние пробелы
  }
  if(preg_match('/с половиной (часов|часа|час)/isu',$cmd1,$m)){ 
    $half = 0.5;
    $cmd1 = str_replace('с половиной','',$cmd1);
    $cmd1 = preg_replace('/\s\s+/', ' ', $cmd1); //уберём лишние пробелы
  }
   //echo('<br>');
   //echo('half-'.$half); 
  if(preg_match('/через (.+) (часов|часа|час|минуты|минуту|минут|день|дня|дней|сутки|суток)/isu', $cmd1, $m)){
  //print_r($m);
  $cmd1 = str_replace($m[0],'',$cmd1);

  foreach($chislo as $key => $value) {$m[1] = str_replace($key,$value,$m[1]);} //'один'=> '1'
  foreach($tim1 as $key => $value)   {$m[2] = str_replace($key,$value,$m[2]);} //'минуту'=>'m','минуты'=>'m'...
                   
 
 //вычислим новое время 
 $delta = (float)$m[1];
  if($delta<=0){
   echo('wrong interval '.$delta);
   say('Непонятно! Попробуйте задать время по другому',2);
   return;
  }
  switch ($m[2]){
   case 'm':
    $newtime = time() + $delta*60;//minutes
    break;
   case 'H':
    $newtime = time() + $delta*60*60 + $half*60*60;//hours
    break;
   case 'D':
    $newtime = time() + $delta*60*60*24;//days ToDo - add to calendar?
    break;   
   default:
    say('Непонятно! Попробуйте переформулировать задание',2);
    return;
  }
  AddScheduledJob($cmd1,"playSound('r2d2',1); say('Вы просили напомнить ".$cmd1."',5);",$newtime, 60);
  $nmes=date( "n" , $newtime)-1;
  $nmonth=$MonthNames[$nmes];
  //echo("Задание напомнить ".$cmd1." установлено на ".date('G:i',$newtime)." ".date('d',$newtime)." ".$nmonth);
  say("Задание напомнить ".$cmd1." установлено на ".date('G:i',$newtime)." ".date('d',$newtime)." ".$nmonth,2);

  return;
 }  
}
////////////////////////////////////////////////////////////////////
 $newtime = time();
 if(preg_match('/(сегодня|завтра|послезавтра)/isu', $cmd1, $m)){
  switch($m[0]){
   case 'завтра':
    $newtime = strtotime("+1 day");
    break;
   case 'послезавтра':
    $newtime = strtotime("+2 days");
    break;
   case 'сегодня':
    $newtime = date();
  } 
  $cmd1 = str_replace($m[0],'',$cmd1); 
 }
 if(preg_match('/в (следующий|следующую|следующее|следующие) /isu', $cmd1, $m)){
   $cmd1 = str_replace($m[1],'',$cmd1);
 }
 if(preg_match('/в (этот|эту|это|эти) /isu', $cmd1, $m)){
   $cmd1 = str_replace($m[1],'',$cmd1);
 }
 
 $cmd1 = preg_replace('/\s\s+/', ' ', $cmd1); //уберём лишние пробелы
 
 if(preg_match('/(в|во) (понедельник|вторник|среду|четверг|пятницу|субботу|воскресенье|выходные) /isu', $cmd1, $m)){ 
   switch($m[2]){ 
        case 'понедельник':   
         $newtime = strtotime("next Monday"); 
         break; 
        case 'вторник':   
         $newtime = strtotime("next Tuesday"); 
         break; 
        case 'среду':   
         $newtime = strtotime("next Wednesday"); 
         break; 
        case 'четверг':   
         $newtime = strtotime("next Thursday"); 
         break; 
        case 'пятницу':   
         $newtime = strtotime("next Friday"); 
         break; 
        case 'субботу':   
         $newtime = strtotime("next Saturday"); 
         break; 
        case 'воскресенье':   
         $newtime = strtotime("next Sunday"); 
         break; 
        case 'выходные':   
         $newtime = strtotime("next Saturday"); 
         break; 
   } 
   $cmd1 = str_replace($m[0],'',$cmd1); 
 } 
//проверим время

if(preg_match('/в (полдень|полночь)/isu', $cmd1)){
   $cmd1 = str_replace('в полдень','в 12:00',$cmd1); 
   $cmd1 = str_replace('в полночь','в 23:59',$cmd1); 
}
$cmd1 = preg_replace('/\s\s+/', ' ', $cmd1); //уберём лишние пробелы 
if(preg_match('/(утром|вечером|днём|днем|ночью)/isu', $cmd1, $m)){ //напомни утром
   $cmd2 = $m[0]; //для удаления
   if(!preg_match('/в (\d+):(\d+)/isu', $cmd1)){ //
   switch($cmd2){ 
        case 'утром':   
         $newtimes = 'в 8:00'; 
         break; 
        case 'вечером':   
         $newtimes = 'в 20:00'; 
         break; 
        case 'днём':   
         $newtimes = 'в 13:00'; 
         break; 
        case 'днем':   
         $newtimes = 'в 13:00'; 
         break;
        case 'ночью':   
         $newtimes = 'в 23:00'; 
         break; 
   }
  }
 $cmd1 = str_replace($cmd2,$newtimes,$cmd1);
}
if(preg_match('/в (\d+):(\d+)/isu', $cmd1, $m)){
 $hour = $m[1];
 $minute = $m[2];
 $cmd2 =  $m[0]; //для удаления

 if(preg_match('/в (\d+):(\d+) (ночи|дня|утра|вечера)/isu', $cmd1, $m)){
   switch ($m[3]){
    case 'дня':
     if((int)$hour<12){$hour = $hour +12;} // в 3 часа дня = в 15:00
     break;
    case 'вечера':
     if((int)$hour<12){$hour = $hour +12;} // в 6 часов вечера = в 18:00
     break;    
   }
   $cmd1 = str_replace($m[0],'',$cmd1); 
 }
   $cmd1 = str_replace($cmd2,'',$cmd1);
   $newtime = mktime( (int)$hour,(int)$minute,0,date("n",$newtime),date("j",$newtime), date("Y",$newtime));
   if($newtime<time()){$newtime = strtotime(date('Y-m-d H:i',$newtime)."+ 1 days");}  
}
  AddScheduledJob($cmd1,"playSound('r2d2',1);sleep(2); say('Вы просили напомнить - ".$cmd1."',5);",$newtime, 60);
  $nmes = date( "n" , $newtime)-1;
  $nmonth = $MonthNames[$nmes];
  say("Задание напомнить ".$cmd1." установлено на ".date('G:i',$newtime)." ".date('d',$newtime)." ".$nmonth,2);
  //return;



ps/ чтобы напоминания устанавливались, надо, конечно. раскомментировать строки вида // AddScheduledJob...

pps/ поправил скрипт, у себя в шаблоне напомни я вызываю его под именем setMemo
Последний раз редактировалось xor Чт ноя 29, 2018 1:24 am, всего редактировалось 1 раз.
За это сообщение автора xor поблагодарили (всего 3):
fandaymon (Вт апр 24, 2018 9:01 am) • lostar-igor (Ср июл 11, 2018 3:30 pm) • u885 (Вс апр 12, 2020 6:20 pm)
Рейтинг: 3.49%
Yashalta
Сообщения: 315
Зарегистрирован: Вс май 20, 2018 9:27 am
Благодарил (а): 160 раз
Поблагодарили: 29 раз

Re: Реализация голосовых напоминаний

Сообщение Yashalta » Ср ноя 28, 2018 2:19 pm

xor писал(а):
Вт апр 24, 2018 2:07 am
А вот ещё
Для шаблона напомни вызываем скрипт, куда передаем $original(ну, или хвост от шаблона без напомни)
Понимает такие фразы и устанавливает напоминания:
'в 7:30 вечера в следующий вторник проверить кое-что';
'проверить кое-что через четверть часа';
'вечером в выходные проверить кое-что';
'проверить в полдень послезавтра кое-что';
скриптПоказать

Код: Выделить всё

 //$cmd = mb_strtolower($original);
 //$cmd = str_replace('напомни','',$cmd); //уберём напомни
 //$cmd = str_replace('напомнить','',$cmd);
// для проверки   
$cmd = 'в 7:30 вечера в следующий вторник проверить кое-что';
$cmd = 'проверить кое-что через четверть часа';
$cmd = 'вечером в выходные проверить кое-что';
$cmd = 'проверить  в полдень послезавтра кое-что';
$cmd = mb_strtolower($cmd);
$newtime = 0;
$newdate = 0;
$cmd1 = preg_replace('/\s\s+/', ' ', $cmd); //уберём лишние пробелы
  echo('->'.$cmd1);
  echo('<br>');

$chislo = array('один'=> '1','одну'=> '1','одни'=> '1','полтора' => '1.5','полторы' =>'1.5','два'=> '2','две'=> '2','двое'=> '2','три'=> '3','трое'=> '3','четыре'=> '4','четверо'=> '4','пять'=> '5','шесть'=> '6','семь'=> '7','восемь'=> '8','девять'=> '9');
$tim1 = array('минуту'=>'m','минуты'=>'m','минут'=>'m','часов'=>'H','часа'=>'H','час'=>'H','день'=>'D','дня'=>'D','дней'=>'D','сутки'=>'D','суток'=>'D');
$MonthNames = array("января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря");

//через?
 if(preg_match('/через /isu', $cmd1)){
 if(preg_match('/через полчаса/isu', $cmd1, $m)){
   $cmd1 = str_replace('через полчаса','через 30 минут',$cmd1); //через полчаса -> через 30 минут
   //echo($cmd1);
   //echo('<br>');
 }
 if(preg_match('/через четверть часа/isu', $cmd1, $m)){
   $cmd1 = str_replace('через четверть часа','через 15 минут',$cmd1); //через полчаса -> через 30 минут
   //echo($cmd1);
   //echo('<br>');
 } 
 if(preg_match('/через (час|минуту|день|сутки)/isu', $cmd1, $m)){

    $s = $m[0];
    $cmd1 = str_replace('через','через 1',$cmd1); //через час -> через 1 час
    
    echo($cmd1);
    echo('<br>');   
 }   
 if(preg_match('/через (.+) (часов|часа|час|минуты|минуту|минут|день|дня|дней|сутки|суток)/isu', $cmd1, $m)){
  //print_r($m);
  $cmd1 = str_replace($m[0],'',$cmd1);
  echo('<br>cmd '.$cmd1.'<br>');
  foreach($chislo as $key => $value) {$m[1] = str_replace($key,$value,$m[1]);} //'один'=> '1'
  foreach($tim1 as $key => $value)   {$m[2] = str_replace($key,$value,$m[2]);} //'минуту'=>'m','минуты'=>'m'...
  
 //вычислим новое время 
 $delta = (float)$m[1];
  if($delta<=0){
   echo('wrong interval '.$delta);
   say('Непонятно! Попробуйте задать время по другому',2);
   return;
  }
  switch ($m[2]){
   case 'm':
    $newtime = time() + $delta*60;//minutes
    break;
   case 'H':
    $newtime = time() + $delta*60*60;//hours
    break;
   case 'D':
    $newtime = time() + $delta*60*60*24;//days -- to calendar?
    break;   
   default:
    //echo 'wrong interval ';
    say('Непонятно! Попробуйте переформулировать задание',2);
    return;
  }
 // AddScheduledJob($cmd1,"playSound('r2d2'); say('Вы просили напомнить ".$cmd1."',5);",$newtime, 60);
  $nmes=date( "n" , $newtime)-1;
  $nmonth=$MonthNames[$nmes];
  say("Задание напомнить ".$cmd1." установлено на ".date('G:i',$newtime)." ".date('d',$newtime)." ".$nmonth,2);

  return;
 }  
}
////////////////////////////////////////////////////////////////////
 $newtime = time();
 if(preg_match('/(сегодня|завтра|послезавтра)/isu', $cmd1, $m)){
  switch($m[0]){
   case 'завтра':
    $newtime = strtotime("+1 day");
    break;
   case 'послезавтра':
    $newtime = strtotime("+2 day");
    break;
   case 'сегодня':
    $newtime = date();
  } 
  $cmd1 = str_replace($m[0],'',$cmd1); 
   echo('0.'.$cmd1);
   echo('<br>');
  echo('new date '.date('Y-m-d',$newtime));
  echo('<br>');
  
 }
 if(preg_match('/в (следующий|следующую|следующее) /isu', $cmd1, $m)){
   $cmd1 = str_replace($m[1],'',$cmd1);
   echo('1.'.$cmd1);
   echo('<br>');
 }
 $cmd1 = preg_replace('/\s\s+/', ' ', $cmd1); //уберём лишние пробелы
 
 if(preg_match('/(в|во) (понедельник|вторник|среду|четверг|пятницу|субботу|воскресенье|выходные) /isu', $cmd1, $m)){ 
   echo($m[2]); // weekday 
   echo('<br>'); 
   switch($m[2]){ 
        case 'понедельник':   
         $newtime = strtotime("next Monday"); 
         break; 
        case 'вторник':   
         $newtime = strtotime("next Tuesday"); 
         break; 
        case 'среду':   
         $newtime = strtotime("next Wednesday"); 
         break; 
        case 'четверг':   
         $newtime = strtotime("next Thursday"); 
         break; 
        case 'пятницу':   
         $newtime = strtotime("next Friday"); 
         break; 
        case 'субботу':   
         $newtime = strtotime("next Saturday"); 
         break; 
        case 'воскресенье':   
         $newtime = strtotime("next Sunday"); 
         break; 
        case 'выходные':   
         $newtime = strtotime("next Saturday"); 
         break; 
   } 
   $cmd1 = str_replace($m[0],'',$cmd1); 
   echo('2.'.$cmd1); 
   echo('<br>'); 
   echo('new time '.date('Y-m-d H:i:s',$newtime)); 
   echo('<br>'); 
 } 
//проверим время

if(preg_match('/в (полдень|полночь)/isu', $cmd1)){
   $cmd1 = str_replace('в полдень','в 12:00',$cmd1); 
   $cmd1 = str_replace('в полночь','в 23:59',$cmd1); 
}
$cmd1 = preg_replace('/\s\s+/', ' ', $cmd1); //уберём лишние пробелы 
if(preg_match('/(утром|вечером|днём|днем|ночью)/isu', $cmd1, $m)){ //напомни утром
   $cmd2 = $m[0]; //для удаления
   if(!preg_match('/в (\d+):(\d+)/isu', $cmd1)){ //
   switch($cmd2){ 
        case 'утром':   
         $newtimes = 'в 8:00'; 
         break; 
        case 'вечером':   
         $newtimes = 'в 20:00'; 
         break; 
        case 'днём':   
         $newtimes = 'в 13:00'; 
         break; 
        case 'днем':   
         $newtimes = 'в 13:00'; 
         break;
        case 'ночью':   
         $newtimes = 'в 23:00'; 
         break; 
   }
  }
 $cmd1 = str_replace($cmd2,$newtimes,$cmd1);
}
if(preg_match('/в (\d+):(\d+)/isu', $cmd1, $m)){
 $hour = $m[1];
 $minute = $m[2];
 $cmd2 =  $m[0]; //для удаления

 if(preg_match('/в (\d+):(\d+) (ночи|дня|утра|вечера)/isu', $cmd1, $m)){
   switch ($m[3]){
    case 'дня':
     if((int)$hour<12){$hour = $hour +12;} // в 3 часа дня = в 15:00
     break;
    case 'вечера':
     if((int)$hour<12){$hour = $hour +12;} // в 6 часов вечера = в 18:00
     break;    
   }
   $cmd1 = str_replace($m[0],'',$cmd1); 
 }
   $cmd1 = str_replace($cmd2,'',$cmd1);
   $newtime = mktime( (int)$hour,(int)$minute,0,date("n",$newtime),date("j",$newtime), date("Y",$newtime));
   if(date('Y-m-d H:i',$newtime)<date('Y-m-d H:i',time())){$newtime = strtotime("+1 day",$newtime);}  
}
 // AddScheduledJob($cmd1,"playSound('r2d2'); say('Вы просили напомнить ".$cmd1."',5);",$newtime, 60);
  $nmes=date( "n" , $newtime)-1;
  $nmonth=$MonthNames[$nmes];
  echo("Задание напомнить ".$cmd1." установлено на ".date('G:i',$newtime)." ".date('d',$newtime)." ".$nmonth);
  return;

ps/ чтобы напоминания устанавливались, надо, конечно. раскомментировать строки вида // AddScheduledJob...
Подскажите пожалуйста какой шаблон вы используете?
я использую такой

Код: Выделить всё

(Н|н)апомни ((через \d+ (часа|час|минут|минуту|минуты|секунд|секунды|секунду))|в \d+:\d+|(завтра|послезавтра|сегодня|на завтра|на послезавтра|на после завтра) в \d+:\d+) (.+)
Спрашиваю т.к. у меня не сработало ни одно напоминание! :(
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

Re: Реализация голосовых напоминаний

Сообщение xor » Чт ноя 29, 2018 1:21 am

Yashalta писал(а):
Ср ноя 28, 2018 2:19 pm

Подскажите пожалуйста какой шаблон вы используете?
я использую такой
а я - такой:
СпойлерПоказать
2018-11-29_01-17-21.png
2018-11-29_01-17-21.png (14.21 КБ) 3174 просмотра
скрипт setMemo см. в предыдущем посте
За это сообщение автора xor поблагодарили (всего 3):
Yashalta (Чт ноя 29, 2018 12:43 pm) • iTango (Пн янв 14, 2019 8:58 pm) • Samir77 (Ср фев 19, 2020 4:49 pm)
Рейтинг: 3.49%
Garik908
Сообщения: 56
Зарегистрирован: Пт ноя 01, 2019 9:58 am
Благодарил (а): 44 раза
Поблагодарили: 2 раза

Re: Реализация голосовых напоминаний

Сообщение Garik908 » Вс июн 14, 2020 7:57 pm

(что запомнила|из файла|что помнишь|напомни)

Код: Выделить всё

$arr=file('./texts/memory.txt');
 for($i=0; $i<count($arr); $i++) {
  sayReply($arr[$i],2);
}

Есть решение как очистить файл? Прошу поделитесь.
Logrus
Сообщения: 2079
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

Re: Реализация голосовых напоминаний

Сообщение Logrus » Вс июн 14, 2020 10:58 pm

Garik908 писал(а):
Вс июн 14, 2020 7:57 pm
(что запомнила|из файла|что помнишь|напомни)

Код: Выделить всё

$arr=file('./texts/memory.txt');
 for($i=0; $i<count($arr); $i++) {
  sayReply($arr[$i],2);
}

Есть решение как очистить файл? Прошу поделитесь.
весь или часть строк?
За это сообщение автора Logrus поблагодарил:
Chainik (Вс июн 14, 2020 11:05 pm)
Рейтинг: 1.16%
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Garik908
Сообщения: 56
Зарегистрирован: Пт ноя 01, 2019 9:58 am
Благодарил (а): 44 раза
Поблагодарили: 2 раза

Re: Реализация голосовых напоминаний

Сообщение Garik908 » Пн июн 15, 2020 3:45 pm

Есть решение как очистить файл? Прошу поделитесь.
[/quote]
весь или часть строк?
[/quote]

Весь.
Или записи старые, например последние десять оставить другие удалить.
Logrus
Сообщения: 2079
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

Re: Реализация голосовых напоминаний

Сообщение Logrus » Пн июн 15, 2020 4:06 pm

после цикла записать файл_пут_контент с пустым вторым аргументом, это если не удалять файл

посчитать сколько всего строк отнять 10
в цикле после сай условие
если инкремент меньше посчитанного то юнсет
За это сообщение автора Logrus поблагодарил:
Garik908 (Пн июн 15, 2020 4:24 pm)
Рейтинг: 1.16%
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Ответить