ImaginariaRU / dear-imaginaria

Открытое письмо администратору Имажинарии от юзернеймов
2 stars 0 forks source link

Уведомление о новых постах в телеграм-канал #1

Open KarelWintersky opened 5 years ago

KarelWintersky commented 5 years ago

Сделано, но не развернуто на площадке.

KarelWintersky commented 5 years ago

Через самостоятельный плагин это сделать мне не удалось, так как плагин "Nice URLS" некорректно возвращает управление после обработки топиков.

Пришлось вносить исправления в код самого плагина Nice URLS:

В файл: plugins/niceurl/classes/modules/niceurl/Niceurl.class.php В методе UpdateTopicUrl пишем

$oTopic->setTitleLat($sTitle);
// after `$oTopic->setTitleLat($sTitle);`

// Post message to Telegram
        // =======================================================================================
        $this->shareToTelegram($oTopic, $sTitle);
        // ====================================================================================
        // End posting message to Telegram

// before `$this->PluginNiceurl_Niceurl_UpdateTopic($oNiceurlTopic);`

Добавляем приватный метод

private function shareToTelegram($oTopic, $sTitle)
    {
        $sUrlSource = Config::Get('plugin.niceurl.url') . Config::Get('plugin.niceurl.url_postfix');
        $id_topic = $oTopic->getId();
        $id_blog = $oTopic->getBlogId();

        // connect DB
        $dbname = Config::get('db.params.dbname');
        $dbuser = Config::get('db.params.user');
        $dbpass = Config::get('db.params.pass');
        $dbprefix = Config::get('db.table.prefix');
        $dsl = "mysql:host=localhost;port=3306;dbname={$dbname}";
        $dbh = new \PDO($dsl, $dbuser, $dbpass);
        $dbh->exec("SET NAMES UTF-8;");
        $dbh->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
        $dbh->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_ASSOC);

        // получим тип блога
        $sql = "SELECT blog_type, blog_url FROM {$dbprefix}blog WHERE blog_id = :blog_id";
        $sth = $dbh->prepare($sql);
        $sth->execute([
            'blog_id' => $id_blog
        ]);
        $blog_info = $sth->fetch();
        $sBlogUrl = empty($blog_info['blog_url']) ? '' : $blog_info['blog_url'];

        // массив подстановки данных
        $aPreg = array(
            '%id%' => $id_topic,
            '%title%' => $sTitle,
        );

        if ($blog_info['blog_type'] == 'personal') {
            $sBlogUrl = Config::Get('plugin.niceurl.url_personal_blog');
            $sUrlSource = str_replace('%blog%', Config::Get('plugin.niceurl.url_personal_blog'), $sUrlSource);
        }

        $aPreg['%blog%'] = $sBlogUrl;
        $sUrl = strtr($sUrlSource, $aPreg);

        $message = Config::Get('path.root.web') . $sUrl;

        // инициализируем монолог
        $log_name = str_replace('$', $_SERVER['DOCUMENT_ROOT'], Config::Get('monolog.logfile'));
        $_logger = new Logger(Config::Get('monolog.channel'));
        $_logger->pushHandler(new StreamHandler($log_name, Logger::DEBUG));

        // получим данные для репоста в телеграм
        $api_key  = Config::Get('telegram.api_key');
        $bot_name = Config::Get('telegram.bot_name');
        $chat_id  = Config::Get('telegram.chat_id');

        $telegram = new Telegram($api_key, $bot_name);
        $data = [
            'chat_id' => $chat_id,
            'text'    => $message,
        ];
        $result = Request::sendMessage($data);

        if ($result->isOk()) {
            $_logger->notice("Message sent");
        } else {
            $_logger->error("Error sending");
// этот кусок кода делался для отладки
//            echo 'Sorry message not sent to: ' . $chat_id;
//            echo '<pre>';
//            var_dump($result);
//            die;
        }
    }

Кроме того, в хедере класса надо описать юзы:

use \Longman\TelegramBot\Request;
use \Longman\TelegramBot\Telegram;
use \Monolog\Handler\FilterHandler;
use \Monolog\Logger;
use \Monolog\Handler\StreamHandler;

И из корня движка выполнить

composer require longman/telegram-bot
composer require monolog/monolog

В файл config.local.php прописываем:

// CONFIG for TELEGRAM
$config['telegram'] = [
    'api_key'   =>  'апи-кей',
    'bot_name'  =>  'имя бота',
    'chat_id'   =>  '@имя канала'
];

// Config for Monolog
$config['monolog'] = [
    'channel'   =>  'imaginaria',
    'logfile'   =>  '$/imaginaria.log'
];
KarelWintersky commented 5 years ago

Ох, не спрашивайте, сколько времени я потратил на этот е..ый п..ц. 8 часов :(