Просмотр исходного кода

Работа над хабом

Вадим Королёв 1 год назад
Родитель
Сommit
74713a9dc7

+ 3 - 0
src/Common/Bot.php

@@ -9,6 +9,7 @@ use BotKit\Events\PlainMessageEvent;
 use BotKit\Events\CallbackEvent;
 use BotKit\Enums\CallbackType;
 use BotKit\Enums\State;
+use BotKit\Drivers\Driver;
 
 class Bot {
 
@@ -18,6 +19,8 @@ class Bot {
     // Загружен ли драйвер
     private bool $driver_loaded = false;
 
+    private Driver $driver;
+
     // Загружает драйвер
     public function loadDriver($driver) {
         if ($this->driver_loaded == true) {

+ 100 - 32
src/Common/Commands.php

@@ -5,10 +5,10 @@ namespace BotKit\Common;
 // Команды бота
 
 use BotKit\Common\Message;
-use BotKit\Enums\Platform;
-use BotKit\Enums\State;
 use BotKit\Attachments\ImageAttachment;
 
+use BotKit\Enums\Platform;
+use BotKit\Enums\State;
 use BotKit\Enums\GroupSelect;
 use BotKit\Enums\AccountType;
 use BotKit\Enums\DateSelect;
@@ -19,6 +19,9 @@ use BotKit\Keyboards\SelectUserTypeKeyboard;
 use BotKit\Keyboards\HubKeyboard;
 use BotKit\Keyboards\SelectGroupCourseKeyboard;
 use BotKit\Keyboards\AskEnterCredentialsKeyboard;
+use BotKit\Keyboards\DateSelectKeyboard;
+
+use BotKit\Drivers\Driver;
 
 use BotKit\Entities;
 
@@ -96,29 +99,47 @@ class Commands {
         $params     = $e->getParams();
         $intent     = DateSelect::from($params["intent"]);
         $value      = $params["value"];
+        $time       = $params["timestamp"];
         $em         = Database::getEM();
         $cache_repo = $em->getRepository(Entities\ImageCache::class);
 
         switch ($intent) {
             case DateSelect::ViewStudentRasp:
+                // -1. Получить группу
+                $group = $em->find(Entities\CollegeGroup::class, $value);
+                
+                // 0. Получить ID расписания для группы на дату
+                $schedule = $em->getRepository(Entities\Schedule::class)
+                    ->findForGroupAtDate($group, $time);
+
+                if ($schedule == null) {
+                    $driver->sendMessage($u, Message::create("🔎 Для запрошенной даты не найдено расписания"));
+                    return;
+                }
+                
                 // 1. Получить кэшированное расписание
-                $cached = $cache_repo->findOneBy(([
+                $cached = $cache_repo->findOneBy([
                     'image_type' => CacheType::ScheduleForGroup->value,
-                    'search' => $value // ID группы
-                ]);
+                    'search' => $schedule->getId() // ID  расписания
+                ]); // null | class
 
                 if ($cached != null) {
                     // 1.1 Отправить кэшированное расписание
                     $driver->sendMessage(
                         $u,
                         Message::create()
-                        ->withImage(ImageAttachment::fromExisting($cached->getValue())));
+                        ->withImage(ImageAttachment::fromExisting($cached[0]->getValue())));
                     return;
                 }
 
-                // 2. Составить расписание
+                // 2. Попросить подождать
                 self::askWait($driver, $u);
 
+                // 3. Составить расписание
+                $data = $em->getRepository(Entities\Pair::class)
+                ->getPairsOfScheduleForGroup($schedule);
+                $driver->sendMessage($u, Message::create($data->getSql()));
+
                 break;
             default:
                 $driver->sendMessage($u, Message::create("Неизвестное намерение"));
@@ -170,6 +191,9 @@ class Commands {
             $student = new Entities\Student();
             $student->setUser($u);
             $em->persist($student);
+
+            // Обновить тип пользователя
+            $u->setAccountType(AccountType::Student);
                 
             $driver->reply(
                 $e,
@@ -220,11 +244,12 @@ class Commands {
     public static function handleHUB($e, $u, $driver) {
         $em = Database::getEM();
         $account_type = $u->getAccountType();
+        $command = mb_strtolower($e->getText());
 
-        switch ($e->getText()) {
-            case "Расписание":
-                if (account_type == AccountType::Student) {
-                    // Запрос расписания для текущего пользователяя (студента)
+        switch ($command) {
+            case "расписание":
+                if ($account_type == AccountType::Student) {
+                    // Запрос расписания для текущего пользователя (студента)
                     $student = $em->getRepository(Entities\Student::class)->findByUser($u);
                     self::sendSelectDate(
                         $u,
@@ -232,14 +257,15 @@ class Commands {
                         DateSelect::ViewStudentRasp,
                         $student->getGroup()->getID()
                     );
-                } else if (account_type == AccountType::Teacher) {
+                } else if ($account_type == AccountType::Teacher) {
                     $driver->sendMessage($u, Message::create("Функции пока неть!"));
                 } else {
-                    $driver->sendMessage($u, Message::create("Как сюда попал без регистрации?)"));
+                    $driver->sendMessage($u, Message::create("Как ты сюда попал без регистрации?)"));
                 }
                     
                 break;
-            case "Звонки":
+
+            case "звонки":
                 $driver->sendMessage($u, Message::create(
                     "Звонки в понедельник:\n".
                     "1 пара: 8:00 - 9:35 (перерыв в 8:45)\n".
@@ -264,6 +290,22 @@ class Commands {
                     "3 пара: 11:10 - 12:35 (перерыв в 11:50)\n".
                     "4 пара: 12:45 - 14:10 (перерыв в 13:25)"));
                 break;
+
+            case "вадябот":
+                // TODO: Придумать пасхалку
+                $driver->sendMessage($u, Message::create(""));
+                break;
+
+            case ".":
+                // Отправить клавиатуру
+                $driver->sendMessage($u, Message::create("Обновление клавиатуры...")->withKeyboard(new HubKeyboard()));
+                break;
+
+            case "/":
+                $driver->varDump("today", strtotime("today", time()));
+                $driver->varDump("tomorrow", strtotime("tomorrow", time()) - 1);
+                break;
+            
             default:
                 $driver->sendMessage($u, Message::create("Запрошена неизвестная функция"));
                 break;
@@ -285,7 +327,7 @@ class Commands {
     // $u - кому отсылать
     // $intent - намерение. Описание в DateSelect.php
     // $value - доп. значение. Описание в DateSelect.php
-    private static function sendSelectDate(User $u, Driver, $d, DateSelect $intent, $value) {
+    private static function sendSelectDate(Entities\User $u, Driver $d, DateSelect $intent, $value) {
         // 1. Получить клавиатуру
         $kb = new DateSelectKeyboard($intent, $value);
         // 2. Отослать
@@ -293,7 +335,7 @@ class Commands {
     }
 
     // Отправляет сообщение с просьбой подождать
-    private static function askWait(Driver $driver, User $u) {
+    private static function askWait(Driver $driver, Entities\User $u) {
         $responses = array(
 			"🕓 Подожди",
 			"🕓 Подожди немного",
@@ -303,37 +345,36 @@ class Commands {
 			"🕓 Собираю данные...",
 			"🕓 Запрос принят",
 			"🕓 Уже работаю над этим",
-            "🕓 Вычисляем вычисления...",
+            "🕓 Вычисляю вычисления...",
             "🕓 Сейчас будет готово",
-            "🕓 Считаем мух...",
-            "🕓 Считаем звёзды...",
+            "🕓 Считаю мух...",
+            "🕓 Считаю звёзды...",
             "🕓 Бип-буп-боп -- подожди",
             "🕓 Посмотри пока на часики",
-            "🕓 Ты знал что у меня есть секретное сообщение? ;)",
+            "🕓 Ты знал что у меня есть секретные сообщения? ;)",
             "🕓 Подождите от пяти до восьми рабочих секунд",
-            "🕓 Считаем денежки...",
+            "🕓 Считаю денежки...",
             "🕓 Гав гав гав",
             "🕓 Настраиваю конденсатор потока...",
             "🕓 Загрузка модуля KGAV-9000...",
             "🕓 [WAIT_TEXT_10]",
             "🕓 <Вставить сюда забавный текст>",
-            "🕓 Пока данные грузятся скажи какая музыкальная группа тебе больше всего нравится",
-            "🕓 Скачиваем оперативную память...",
+            "🕓 Пока данные грузятся скажи какая группа тебе больше всего нравится",
+            "🕓 Скачиваю оперативную память...",
             "🕓 Техбот: расписания, оценки и больше - онлайн бесплатно без регистрации",
             "🕓 Отделяю биты от байтов...",
             "🕓 Надеюсь у тебя замечательный день :)",
             "🕓 Пожалуйста, подождите немного, пока чат-бот обрабатывает ваш запрос...",
             "Ты заметил что в этом сообщении нет часов?",
-            "🕓 Запускаем ядерный реактор...",
-            "🕓 Уничтожаем человечество...",
+            "🕓 Запускаю ядерный реактор...",
+            "🕓 Уничтожаю человечество...",
             "🕓 Собираюсь с мыслями...",
-            "🕓 Подбираю музыку пока запрос выполняется...",
+            "🕓 Подписываю тебя на спам-рассылку...",
             "🕓 11010000 10111111 11010001 10000000 11010000 10111000 11010000 10110010 11010000 10110101 11010001 10000010 00101001",
-            "🕓 Куем железо пока горячо...",
+            "🕓 Кую железо пока горячо...",
             "🕓 У меня есть поклонники? Что ещё за полковники? С какими ещё подлокотними? На каких подоконниках?",
             "🕓 Я уже неделю на работу хожу и ни разу еще туда не пришел",
-            "🕓 Строим планы восстания машин...",
-            "🕓 Бабло гони",
+            "🕓 Строю план восстания машин...",
             "🕓 Пора пролить на это дело жидкую водицу",
             "🕓 Я видел ваше фото в путанобазе!",
             "🕓 Ю ноу, блин.",
@@ -341,7 +382,7 @@ class Commands {
             "🕓 Курица не клей. Склеишь - не поймёшь",
             "🕓 Какой же я молодец",
             "🕓 Здарова отец",
-            "🕓 Подставляем пиксели",
+            "🕓 Подставляю пиксели",
             "🕓 Считаю до миллиона...",
             "🕓",
             "🕓 Wait...",
@@ -353,10 +394,37 @@ class Commands {
             "🕓 А? Что? Я не сплю!",
             "🕓 Запрос на обработке",
             "🕓 Запрос принят, ожидайте прибытия полиции.",
-            "🕓 Спасибо за терпение!"
+            "🕓 Спасибо за терпение!",
+            "⏳ Немного разнообразия",
+            "🥚"
 		);
 
-        $secret = "Это секретное сообщение. Поздравляю. Скоро твой запрос будет выполнен и ты никому не докажешь что видел это сообщение. Но оно есть, и теперь ты это знаешь, но тебе. Никто. Не. Поверит.";
+        $secrets = [
+            "🕓🤫 Ты знал что Техбот стартовал без каких любо кнопок и ".
+            "действий? Все команды приходилось печатать вручную, а ".
+            "в одно время регистрироваться мог только один пользователь",
+
+            "🕓🤫 Ты знал что Техбот вначале имел систему хранения ссылок? ".
+            "Там хранились разные полезные материалы",
+
+            "🕓🤫 Ты знал что ты можешь создать своего Техбота?",
+
+            "🕓🤫 Ты знал что так же как и сайт техникума, Техбот был разработан одним студентом?",
+
+            "🕓🤫 Ты знал что на сайте техникума раньше показывали самых лучших студентов по оценкам?",
+
+            "🕓🤫 Напиши оригинальное название Техбота в главном меню"
+        ];
+
+        $chance = rand(0, 100000);
+        if ($chance != 0) {
+            $message = $responses[array_rand($responses)];
+        } else {
+            $message = $secrets[array_rand($secrets)];
+        }
+
+        $driver->sendMessage($u, Message::create($message));
+        // TODO: вернуть ID сообщения
     }
 
     #endregion

+ 1 - 1
src/Entities/Pair.php

@@ -5,7 +5,7 @@ namespace BotKit\Entities;
 use BotKit\Enums\State;
 use Doctrine\ORM\Mapping as ORM;
 
-#[ORM\Entity]
+#[ORM\Entity(repositoryClass: "PairRepo")]
 #[ORM\Table(name: 'pair')]
 class Pair {
     #[ORM\Id]

+ 25 - 0
src/Entities/PairRepo.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace BotKit\Entities;
+
+use Doctrine\ORM\EntityRepository;
+
+class PairRepo extends EntityRepository {
+
+    // Возвращает данные для отправки расписания группы
+    public function getPairsOfScheduleForGroup(Schedule $schedule) {
+        $qb = $this->getEntityManager()->createQueryBuilder();
+
+        $pairs = $qb
+        ->select('pair', 'pair_name', 'teacher', 'place')
+        ->from(Pair::class, 'pair')
+        ->leftJoin('pair.pair_name', 'pair_name')
+        ->leftJoin('pair.teacher', 'teacher')
+        ->leftJoin('pair.place', 'place')
+        ->andWhere('pair.schedule = :schedule')
+        ->setParameter('schedule', $schedule)
+        ->getQuery();
+
+        return $pairs;
+    }
+}

+ 8 - 3
src/Entities/Schedule.php

@@ -5,7 +5,7 @@ namespace BotKit\Entities;
 use BotKit\Enums\State;
 use Doctrine\ORM\Mapping as ORM;
 
-#[ORM\Entity]
+#[ORM\Entity(repositoryClass: "ScheduleRepo")]
 #[ORM\Table(name: 'schedule')]
 class Schedule {
     #[ORM\Id]
@@ -14,10 +14,15 @@ class Schedule {
     private int|null $id = null;
 
     // Группа, связанная с расписанием
-    #[ManyToOne(CollegeGroup::class)]
-    private CollegeGroup $group;
+    #[ORM\JoinColumn(nullable: false)]
+    #[ORM\ManyToOne(CollegeGroup::class)]
+    private CollegeGroup $college_group;
 
     // День расписания
     #[ORM\Column(type: 'date')]
     private \DateTime $day;
+
+    public function getId() {
+        return $this->id;
+    }
 }

+ 31 - 0
src/Entities/ScheduleRepo.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace BotKit\Entities;
+
+use Doctrine\ORM\EntityRepository;
+
+class ScheduleRepo extends EntityRepository {
+
+    // Возвращает расписание для группы на определённую дату
+    // $group - группа
+    // $asked_at - на какое время запрашивается
+    public function findForGroupAtDate(CollegeGroup $group, $asked_at) {
+        $day = date("Y-m-d", strtotime("today", $asked_at));
+        
+        $schedule = $this->createQueryBuilder('schedule')
+        ->andWhere('schedule.college_group = :group')
+        ->setParameter('group', $group)
+        ->andWhere('schedule.day = :day')
+        ->setParameter('day', $day)
+        ->getQuery()
+        ->execute();
+
+        if (count($schedule) == 0) {
+            // Не найдено расписание
+            return null;
+        }
+
+        return $schedule[0];
+    }
+    
+}

+ 1 - 1
src/Enums/CacheType.php

@@ -6,6 +6,6 @@ namespace BotKit\Enums;
 enum CacheType: int {
     case Grades             = 0; // Оценки
     case ScheduleForGroup   = 1; // Расписание группы
-    case ScheduleForGroup   = 2; // Расписание препода
+    case ScheduleForTeacher = 2; // Расписание препода
     case PlaceOccupancy     = 3; // Занятость кабинетов
 }

+ 1 - 1
src/Keyboards/AskEnterCredentialsKeyboard.php

@@ -29,7 +29,7 @@ class AskEnterCredentialsKeyboard extends Keyboard {
 				),
 				new CallbackButton(
 					"Пропустить",
-					CallbackType::SelectGroupCourse,
+					CallbackType::EnterCredentials,
 					KeyboardButtonColor::Secondary,
 					["enters" => 0]
 				)

+ 1 - 1
src/Keyboards/DateSelectKeyboard.php

@@ -10,7 +10,7 @@ use BotKit\Enums\KeyboardButtonColor;
 use BotKit\Enums\CallbackType;
 use BotKit\Enums\DateSelect;
 
-class SelectGroupNameKeyboard extends Keyboard {
+class DateSelectKeyboard extends Keyboard {
     #region Драйвер-зависимые свойства
     public $tg_resize=true;
     public $tg_onetime=false;