Open KarelWintersky opened 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'
];
Ох, не спрашивайте, сколько времени я потратил на этот е..ый п..ц. 8 часов :(
Сделано, но не развернуто на площадке.