View file delta_framework-main/core/lib/Core/MQTasks.class.php

File size: 20.06Kb
<?php
    /**
     * Copyright (c) 2022 Roman Grinko <[email protected]>
     * Permission is hereby granted, free of charge, to any person obtaining
     * a copy of this software and associated documentation files (the
     * "Software"), to deal in the Software without restriction, including
     * without limitation the rights to use, copy, modify, merge, publish,
     * distribute, sublicense, and/or sell copies of the Software, and to
     * permit persons to whom the Software is furnished to do so, subject to
     * the following conditions:
     * The above copyright notice and this permission notice shall be included
     * in all copies or substantial portions of the Software.
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
     * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     */

    namespace Core;

    use Core\DataBases\DB;
    use Core\Helpers\Mail;
    use Core\Helpers\SystemFunctions;
    use Core\Helpers\Thumbs;

    class MQTasks
    {
        public static function testSendTelegram()
        {
            SystemFunctions::sendTelegram('test task was completed');
        }

        public static function testSleep(int $sec = 1) {
            sleep($sec);
            return 'sleep ' . $sec . ' sec.';
        }

        /**
         * @throws CoreException
         */
        public static function resizeImage(string $filename, int $width, int $height)
        {
            $saveImage = $_SERVER['DOCUMENT_ROOT'] . '/uploads/images/resized/' . $filename;
            $image     = new Thumbs($_SERVER['DOCUMENT_ROOT'] . '/uploads/images/original/' . $filename);
            $image->thumb($width, $height);
            $image->watermark($_SERVER['DOCUMENT_ROOT'] . '/uploads/images/w.png', 'bottom-right', 70);
            $image->save($saveImage);

            return $saveImage;
        }

        public static function sendBash(...$args): ?string
        {
            /** @var DB $DB */
            $DB = DB::getInstance();

            $file = file_get_contents('http://bashorg.org/random');
            $file = preg_match_all('|<div class="quote">(.+)</div>|U', $file, $frazes);

            $frazes = $frazes[1];
            $frazes = array_map(function ($e) {
                return \iconv('windows-1251//IGNORE', 'UTF-8//IGNORE', $e);
            }, $frazes);

            $i = 0;

            foreach ($frazes as $post) {
                //sendTelegram($post);
                $text = str_replace('<br />', PHP_EOL, $post);
                $text = htmlspecialchars_decode($text);
                $text = str_replace('\'', '\\\'', $text);
                $hash = md5($text);
                $res  = $DB->query('SELECT * FROM bashorg WHERE hash="' . $hash . '"');
                if (!$res) {
                    $i++;
                    $DB->addItem('bashorg', ['hash' => $hash, 'text' => $text]);
                }
            }
            sleep(2);
            return 'Добавлено ' . $i . ' записей из ' . count($frazes);
        }

        public static function bashPage($page)
        {
            /** @var DB $DB */
            $DB = DB::getInstance();

            $file = file_get_contents('http://bashorg.org/page/' . $page . '/');
            $file = preg_match_all('|<div class="quote">(.+)</div>|U', $file, $frazes);

            $frazes = $frazes[1];
            $frazes = array_map(function ($e) {
                return \iconv('windows-1251//IGNORE', 'UTF-8//IGNORE', $e);
            }, $frazes);

            $i = 0;
            foreach ($frazes as $post) {
                $text = str_replace('<br />', PHP_EOL, $post);
                $text = htmlspecialchars_decode($text);
                $text = str_replace('\'', '\\\'', $text);
                $hash = md5($text);
                $res  = $DB->query('SELECT * FROM bashorg WHERE hash="' . $hash . '"');
                if (!$res) {
                    $i++;
                    $itemId = $DB->addItem('bashorg', ['hash' => $hash, 'text' => $text]);
                    sendTelegram('<b>Добавлена цитата ID ' . $itemId . ' (' . $page . ' страница)</b>' . PHP_EOL . $text);
                }
                $text = null;
            }
            $DB = null;
            $hash = null;
            $file = null;
            //sleep(2);
            if ($i < 1) {
                throw new CoreException('Не найдено новых данных для добавления');
            }
            return 'bashPage: Добавлено ' . $i . ' записей из ' . count($frazes);
        }

        public static function bashPageMeta($page)
        {
            /** @var DB $DB */
            $DB = DB::getInstance();

            $file = file_get_contents('http://bashorg.org/page/' . $page . '/');
            $file = \iconv('windows-1251//IGNORE', 'UTF-8//IGNORE', $file);
            preg_match_all('|(?<=<div\ class="q">)[\w\W]*?(?=<hr)|U', $file, $frazes);
            $frazes = $frazes[0][0];
            // тут готовый массив блоков с постами

            preg_match_all('|<div class="quote">(.+)</div>|U', $frazes, $posts);
            $posts = $posts[1];
            if (empty($posts)) {
                throw new CoreException('Ошибка обработки данных');
            }

            preg_match_all('|Цитата #(.+)</a>|U', $frazes, $ids);
            $ids = $ids[1];

            preg_match_all('|</a> \| (.+) \| добавлено|U', $frazes, $dates);
            $dates = $dates[1];

            preg_match_all('|<span id=\'result-(.+)\'>(.+)</span>|U', $frazes, $ratings);
            $ratings = $ratings[2];

            $result = [];
            foreach ($posts as $key => $post) {
                $result[] = [
                    'post'   => $post,
                    'date'   => $dates[$key],
                    'rating' => $ratings[$key],
                    'id'     => $ids[$key],
                ];
            }

            $i = 0;
            $j = 0;
            foreach ($result as $element) {
                $text = str_replace('<br />', PHP_EOL, $element['post']);
                $text = htmlspecialchars_decode($text);
                $text = str_replace('\'', '\\\'', $text);
                $hash = md5($text);
                $res  = $DB->query('SELECT * FROM bashorg WHERE hash="' . $hash . '" AND date is null');
                if ($res) {
                    $j++;
                    $DB->update(
                        'bashorg', ['hash' => $hash], ['ext_id' => (int)$element['id'], 'date' => $element['date'], 'rating' => $element['rating']]
                    );
                }
            }
            //sleep(5);
            return 'bashMeta: Добавлено ' . $i . ', обновлено ' . $j . ' записей из ' . count($result);
        }

        public static function anekdot()
        {
            /** @var DB $DB */
            $DB = DB::getInstance();

            $file    = file_get_contents('https://www.anekdot.ru/rss/randomu.html');
            $file    = explode('JSON.parse(\'', $file)[1];
            $file    = explode('\');', $file)[0];
            $file    = stripcslashes($file);
            $arJokes = json_decode($file);

            if (empty($arJokes)) {
                throw new CoreException('Ошибка получения данных с сайта');
            }
            $i = 0;
            foreach ($arJokes as $joke) {
                $hash = md5($joke);
                $joke = str_replace('<br>', PHP_EOL, $joke);
                $joke = addslashes($joke);
                $res  = $DB->query('SELECT * FROM jokes WHERE hash="' . $hash . '"');
                if (!$res) {
                    $i++;
                    $itemId = $DB->addItem('jokes', ['hash' => $hash, 'text' => $joke]);
                }
            }
            if($i < 1 ) {
                throw new CoreException('Новых данных не найдено');
            }

            return ['method' => __FUNCTION__, 'status' => 'OK', 'message' => 'Добавлено ' . $i . ' шуток из ' . count($arJokes)];
        }

        public static function anekdot2()
        {
            //$result = 'Ничего нового не добавлено';
            $result = null;
                /** @var DB $DB */
            $DB = DB::getInstance();

            /**
             * CType = ?
             * 1 - Анекдот;
             * 2 - Рассказы;
             * 3 - Стишки;
             * 4 - Афоризмы;
             * 5 - Цитаты;
             * 6 - Тосты;
             * 8 - Статусы;
             * 11 - Анекдот (+18);
             * 12 - Рассказы (+18);
             * 13 - Стишки (+18);
             * 14 - Афоризмы (+18);
             * 15 - Цитаты (+18);
             * 16 - Тосты (+18);
             * 18 - Статусы (+18);
             */
            $file = file_get_contents('http://rzhunemogu.ru/RandJSON.aspx?CType=1');
            $file = \iconv('windows-1251//IGNORE', 'UTF-8//IGNORE', $file);
            $file = str_replace('{"content":"', '', $file);
            $file = str_replace('"}', '', $file);

            if (empty($file)) {
                throw new CoreException('Ошибка получения данных с сайта');
            }

            $hash = md5($file);
            $file = addslashes($file);
            $res  = $DB->query('SELECT * FROM jokes WHERE hash="' . $hash . '"');
            if (!$res) {
                $itemId = $DB->addItem('jokes', ['hash' => $hash, 'text' => $file]);
                $result = 'Добавлен новый элемент с ID ' . $itemId;
            }

            if (empty($result)) {
                throw new CoreException('Ничего нового не добавлено');
            }
            return ['method' => __FUNCTION__, 'status' => 'OK', 'message' => $result];
        }


        public static function clearDuplicates()
        {
            /** @var DB $DB */
            $DB = DB::getInstance();
            $DB->query(
                'CREATE TEMPORARY TABLE `t_temp` AS  (SELECT min(id) as id FROM `jokes` GROUP BY hash );
DELETE from `jokes` WHERE `jokes`.id not in (SELECT id FROM t_temp);'
            );
            return 'Дубликаты удалены';
        }


        public static function sendJokeToTelegram()
        {
            if (date('H') > 21 || date('H') < 9) {
                return 'Нерабочее время :(';
            }
            $telegram = new \Core\ExternalServices\TelegramSender(SystemConfig::getValue('TELEGRAM_BOT_TOKEN'));
            $telegram->setChat(' -1001610334197');

            /** @var DB $DB */
            $DB = DB::getInstance();

            $joke = $DB->getItem('jokes', ['sended' => 'N']);
            $joke = $DB->query('select * from jokes where sended="N" order by id desc')[0];
            $telegram->sendMessage('<b>Шутейка #' . $joke['id'] . '</b>' . PHP_EOL . $joke['text']);
            $DB->update('jokes', ['id' => $joke['id']], ['sended' => 'Y']);
            return 'Шутка ' . $joke['id'] . ' отправлена в канал';
        }


        public static function getMySLO()
        {
            $result = 'Нет данных для обновления';
            /** @var DB $DB */
            $DB = DB::getInstance();


            $file  = file_get_contents('https://myslo.ru/news/criminal');
            $file  = preg_match_all('/"item width-100-tiny">(.*?)<div class="clear">/us', $file, $file2);
            $file2 = $file2[1][0];

            preg_match_all('/<h1 class="h3">(.*?)<\/h1>/us', $file2, $title);
            $title = trim(strip_tags($title[1][0]));

            preg_match_all('/src="(.*?)">/us', $file2, $image);
            $image = trim($image[1][0]);

            preg_match_all('/" href="(.*?)">/us', $file2, $link);
            $link = 'https://myslo.ru' . trim($link[1][0]);

            $hash = md5($link);
            $res  = $DB->query('SELECT * FROM myslo WHERE hash="' . $hash . '"');
            if (!$res) {

                $full = file_get_contents($link);

                preg_match_all('/<div class="h3 lid"><p>(.*?)<\/p><\/div>/us', $full, $lidArticle);
                $lidArticle = html_entity_decode($lidArticle[1][0]);

                preg_match_all('/class="myslo_insert"  >(.*?)<a class="media/us', $full, $fullArticle);
                $fullArticle = html_entity_decode($fullArticle[1][0]);

                $fullArticle = str_replace("\r", '', $fullArticle);
                $fullArticle = str_replace("\n\n", '', $fullArticle);
                $fullArticle = trim($fullArticle);
                $fullArticle = preg_replace('/\s+/', ' ', $fullArticle);

                if (empty($fullArticle)) {
                    throw new CoreException('Не удалось получить данные');
                }

                $tmpFile = CACHE_DIR . '/' . basename($image);
                file_put_contents($tmpFile, file_get_contents($image));

                $lidArticlePost  = SystemFunctions::previewText($lidArticle, 100);
                $fullArticlePost = SystemFunctions::previewText($fullArticle, 250);
                $fullArticlePost = strip_tags($fullArticlePost);

                $post = '<b>' . $title . '</b>' . PHP_EOL . $lidArticlePost . PHP_EOL . $fullArticlePost;
                $post .= PHP_EOL . '<a href="' . $link . '">Подробнее</a>';


                $telegram = new \Core\ExternalServices\TelegramSender(SystemConfig::getValue('TELEGRAM_BOT_TOKEN'));
                $telegram->setChat('-1001789206618');
                $res = $telegram->sendPhoto($tmpFile, $post);
                sendTelegram($post);
                @unlink($tmpFile);
                $itemId = $DB->addItem('myslo', ['hash' => $hash, 'title' => $title, 'image' => $image, 'text' => $lidArticle . PHP_EOL . $fullArticle, 'link' => $link]);

                return $res;//'Добавлен новый элемент с ID ' . $itemId;
            } else {
                return 'Обновление не требуется';
            }
        }

        public static function test(string $cmd, array $params = [])
        {
            $res = file_get_contents('https://dev.it-stories.ru/test.php?cmd=' . $cmd . '&' . http_build_query($params));
            return $res;
        }

        public static function getUser()
        {
            //sleep(10);
            $res = file_get_contents('https://randomuser.me/api/');
            $res = json_decode($res, true, 512, JSON_THROW_ON_ERROR);
            $result = [
                'gender' => $res['results'][0]['gender'],
                'name'   => $res['results'][0]['name'],
                'email'  => $res['results'][0]['email'],
                'login'  => $res['results'][0]['login'],
            ];
            //sendTelegram(print_r($res['results'][0]['login'], true));
            return $result;
        }

        public static function getSolImages(?int $sol = null)
        {
            set_time_limit(0);
            $result = [];
            $needGet = true;
            if ($sol === null) {
                $sol = 1;
            }
            $page = 1;

            while ($needGet) {
                $res = file_get_contents(
                    'https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos?sol=' . $sol . '&page=' . $page . '&api_key=3vGS2dOB7zd9Jyyrj3dNU0cTkfU4YRRh4M8SK6jl'
                );//5qRQx4su8if3zVeweadnbegxcs6gxG9pgRtB1Tmu');
                $res = json_decode($res, true);
                if (isset($res['photos']) && !empty($res['photos'])) {
                    foreach ($res['photos'] as $arImage) {
                        $result[] = [
                            'date' => $arImage['earth_date'],
                            'src' => $arImage['img_src'],
                        ];
                    }
                    $page++;
                } else {
                    $needGet = false;
                }
            }
            return $result;
        }

        public static function getStory($from = null)
        {
            $tableName = 'podslyshano';
            $link = 'https://podslyshano.com/api/v3.5/posts';
            if (!empty($from) && $from !== '') {
                $link .= '?from=' . $from;
            }
            $response = file_get_contents($link);
            if (empty($response)) {
                throw new CoreException('Не удалось получить содержимое');
            }

            try {
                $response = json_decode($response, true, 512, JSON_THROW_ON_ERROR);
            } catch(\Throwable $e) {
                throw new CoreException($e->getMessage());
            }

            if (empty($response['posts'])) {
                throw new CoreException('Постов по данной выборке не найдено');
            }

            $result = [];
            $lastId = null;
            /** @var DB $DB */
            $DB = DB::getInstance();
            foreach ($response['posts'] as $post) {
                if ($post['type'] !== 'post') {
                    continue;
                }
                if ($DB->getItem($tableName, ['post_id' => (int)$post['id']])) {
                    continue;
                }
                $DB->query('SET NAMES \'utf8mb4\'');
                $result[] = $DB->addItem(
                    $tableName, [
                                     'type'          => $post['type'],
                                     'post_id'       => (int)$post['id'],
                                     'category_id'   => (int)$post['category_id'],
                                     'category_name' => $post['category_name'],
                                     'category_slug' => $post['category_slug'],
                                     'likes_count'   => (int)$post['likes_count'],
                                     'created_at'    => $post['created_at'],
                                     'image_uri'     => $post['image_uri'],
                                     'note'          => addslashes($post['note']),
                                 ]
                );
                $lastId = (int)$post['id'];
            }

            if ($lastId !== null) {
                exec('(php -f ' . $_SERVER['DOCUMENT_ROOT'] . '/core/runtime/podslyshano.php "' . $lastId . '" & ) >> /dev/null 2>&1');
            }

            return 'Добавлено постов: ' . count($result);
        }

        /**
         * Отправка E-Mail
         *
         * @param string      $fromMail     E-Mail отправителя
         * @param string|null $fromName     Имя отправителя
         * @param string      $toMail       E-Mail получателя
         * @param string|null $toName       Имя получателя
         * @param string      $subject      Тема письма
         * @param string      $body         Тело письма
         * @param string|null $template     Шаблон
         * @param array|null  $templateVars Переменные шаблона
         *
         * @return array
         * @throws CoreException
         */
        public static function sendMail(
            string $fromMail,
            ?string $fromName,
            string $toMail,
            ?string $toName,
            string $subject,
            string $body,
            ?string $template = null,
            ?array $templateVars = null
        ): array {
            $mailObject = new Mail();
            $mailObject->setTo($toMail, $toName)
                       ->setFrom($fromMail, $fromName)
                       ->setSubject($subject)->setBody($body);
            if ($template !== null && $templateVars !== null) {
                $mailObject->setTemplate($template)
                           ->setTemplateVars($templateVars);
            }

            return $mailObject->send();
        }

    }