Giter VIP home page Giter VIP logo

bot2's Introduction

Менеджер Уроков

Бот присылает расписание 2 раза в сутки, за 5 часов и за 15 мин. до занятия.

Условия работы в текущей версии

Расписание в формате xlsx. Опрос бота через excel.php с помощью cron каждые 15 мин. или чаще если требуется.

excel.php

  • Шаблон расписания: https://yadi.sk/d/KRD-MTMV3LunxW
  • Имя файла в директории должно быть таким: rasp.xlsx
  • Столбцы/поля должны быть по шаблону, в качестве даты и времени указывается точная дата и время занятия (без смещения)

Пример работы с расписанием:

if (time() >= strtotime('-8 hours -1 minutes', $date) && time() <= strtotime('-7 hours -59 minutes', $date)) {
    $timing[$i]['reminder']['pass'] = $objPHPExcel->getActiveSheet()->getCell('A' . $i)->getValue();
    $timing[$i]['reminder']['text'] = $objPHPExcel->getActiveSheet()->getCell('D' . $i)->getValue();
    }
if (time() >= strtotime('-3 hours -16 minutes', $date) && time() <= strtotime('-3 hours -14 minutes', $date)) {
    $timing[$i]['event']['pass'] = $objPHPExcel->getActiveSheet()->getCell('A' . $i)->getValue();
    $timing[$i]['event']['text'] = $objPHPExcel->getActiveSheet()->getCell('C' . $i)->getValue();
}

Когда время вызова скрипта через cron совпадает с временем в таблице, значения из таблицы попадают в массивы, где:

  • reminder - напоминание о занятии за 5 часов (-3 часа смещение серверного времени по мск и -5 часов само смещение)
  • event - событие (-3 часа смещение серверного времени по мск и -15 мин, чтобы сообщение приходило за 15 мин. до начала)

В файле passlist.json хранится список id пользователй которые указали пароль к группе, присоединившись тем самым к нужному потоку:

$IDandPass = file_get_contents(__DIR__ . '/passlist.json');
$IDandPass = json_decode($IDandPass, true);

if (isset($timing)) {
  foreach ($timing as $time) {
        //...
    }
}

Напоминания в таблице может и не быть (см. шаблон расписания, расписание на неделю) поэтому сначала проверка на наличие данных:

if (isset($time['reminder']['text'])) {
    foreach($IDandPass as $user) {
        if ($time['reminder']['pass'] === array_values($user)[0]) {
            $lessonManager->sendMessage($time['reminder']['text'], array_keys($user)[0]);
        }
    }
}

if (isset($time['event']['text'])) {
    foreach($IDandPass as $user) {
        if ($time['event']['pass'] === array_values($user)[0]) {
            $lessonManager->sendMessage($time['event']['text'], array_keys($user)[0]);
        }
    }
}

Далее происходит проверка: если пароль из passlist.json совпадает с паролем группы в табличке, значит этому пользователю приходит месседж. Все дело в том, что телеграм не предоставляет никаких уникальных данных кроме id чата, поэтому изначально рассматривалось 2 варианта решения:

  • Пользователь через userinfobot сам смотрит свой id и сообщает его администратору для распределения по потокам, что довольно нагрузочно для администратора.
  • Пользователь сам присоединяет себя к потоку в режиме диалога с ботом, через пароль группы который будет выдавать администратор. Возможно идентификация по паролю и не требуется и достаточно будет обойтись кодом группы типа "PHP-n" и др. но тогда пользователь при желании может перебирать идентификаторы групп и подписываться на расписания к следующим потокам, не знаю насколько это критично.

index.php

В классе LessonManager набор методов для работы бота.

arrayData()

Принимает и разбирает update в формате json.

commandController()

Выполняет различные сценарии исходя из данных обработанных arrayData().

saveUserData()

Сохраняет в json данные введенные пользователем. Это может потребоваться для выполения многошаговых сценариев. Данные сохраняются в отдельных файликах, где имя файла = уникальный id чата.

saveUserPass()

Сохраняет в json соответствия id чата/пароль группы.

sendMessage()

Отправляет сообщением любое, что передается.

log()

Для помощи в отладке, сохраняет единоразово в log.txt текущий update.

whatWasSent()

Журнал отправленных сообщений: время отправки, id пользователя, установленные время и дата события, текст сообщения. Сохраняются в whatWasSent.txt.

История изменений

01.09.2017 - Добавлен веб-лист событий

26.08.2017 - Добавлен метод для логирования отправленных сообщений whatWasSent()

22.08.2017 - Старт

bot2's People

Contributors

dddobriak avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.