File: //proc/1124/cwd/frontend/controllers/__BotController.php
<?php
namespace frontend\controllers;
use aki\telegram\types\InputMedia\InputMediaDocument;
use cheatsheet\Time;
use common\models\Bot;
use common\models\BotCommands;
use common\models\BotContactBooks;
use common\models\BotContacts;
use common\models\BotUserAction;
use common\models\Help;
use Yii;
use yii\filters\PageCache;
use yii\web\BadRequestHttpException;
use yii\web\Controller;
use yii\web\Response;
use aki\telegram\base\Command;
/**
* Bot controller
*/
class BotController extends Controller
{
public $enableCsrfValidation = false;
/**
* @return string
* Вход в приложение
*/
public function actionIndex($id = null)
{
$lang = 'ru-RU';
//$document_id = "qwe";
$document_id = NULL;
$token = NULL;
if ($id) {
$bot_data = Bot::find()->where(['id' => $id])->one();
if ($bot_data) {
$token = $bot_data->token;
$user_id = $bot_data->user_id;
if ($token) {
$mini_path = NULL;
\Yii::$app->setComponents(['telegram' => [
'class' => \aki\telegram\Telegram::class,
'botToken' => $token,
]]);
$telegram = Yii::$app->telegram;
$message_data = $telegram->input->message;
$message_text = $message_data->text;
$chat_id = $message_data->chat->id;
$mss_document = $message_data->document;
$mss_photo = $message_data->photo;
$mss_audio = $message_data->voice;
$mini_path = NULL;
if ($mss_document) {
$document_id = $message_data->document['file_id'];
}
if ($mss_photo) {
if ($message_data->photo[2]['file_id']) {
$document_id = $message_data->photo[2]['file_id'];
}
}
if ($mss_audio) {
if ($message_data->voice['file_id']) {
$document_id = $message_data->voice['file_id'];
}
$file_data = Yii::$app->telegram->getFile([
'file_id' => $document_id
]);
$file_path = $file_data['result']['file_path'];
}
//если есть файл
if ($document_id) {
$file_data = Yii::$app->telegram->getFile([
'file_id' => $document_id
]);
if ($file_data['result']['file_path']) {
$file_path = $file_data['result']['file_path'];
$file_name = str_replace("photos/", '', $file_path);
$file_name = str_replace("documents/", '', $file_name);
$file_name = str_replace("voice/", '', $file_name);
$file_name = trim($file_name);
}
//получаем данные файла через get file
$file_url = Yii::$app->telegram->getFileUrl([
'file_id' => $document_id
]);
if ($file_url && $file_name) {
$res_file_name = uniqid() . '_' . $file_name;
//если есть ссылка на файл - сохраняем в storage
$path = '../../storage/web/source/1/' . $res_file_name;
$mini_path = '1/' . $res_file_name;
file_put_contents($path, file_get_contents($file_url));
// регистрируем действие в базу данных, если пользователь отправил нам аудиозапись
if($mss_audio){
self::actionuserregistration($chat_id, $id, $user_id, $message_text, $mini_path);
}
}
}
// $arr['telegram'] = $telegram;
$arr['id'] = $id;
$arr['user_id'] = $user_id;
// Command::run("/start", function ($telegram, $id, $user_id) {
Command::run("/start", function ($telegram, $arr) {
// $telegram = $arr['telegram'];
$id = $arr['id'];
$user_id = $arr['user_id'];
$message_data = $telegram->input->message;
$message_text = $message_data->text;
$chat_id = $message_data->chat->id;
$mini_path = NULL;
// проверяем наличие данного пользователя в базе
self::actionuserregistration($chat_id, $id, $user_id, 'start', '---');
$arr[] = NULL;
return true;
});
if ($message_text) {
$command_message_data = BotCommands::find()
->where(['command' => $message_text])
->andWhere(['bot_id' => $id])
->andWhere(['user_id' => $user_id])
->one();
if ($command_message_data->message) {
$answear_text = $command_message_data->message;
} else {
if ($message_text == "/start") {
$answear_text = 'Приветствуем Вас';
} else {
if (stristr($message_text, '/') !== FALSE) {
$answear_text = 'Команда не найдена';
}
}
}
if ($message_text && $answear_text) {
$telegram->sendMessage([
'chat_id' => $chat_id,
'text' => $answear_text,
'parse_mode' => "HTML"
]);
return true;
} else {
if ($message_text && $message_text !== "/start" && $message_text !== "start") {
self::actionuserregistration($chat_id, $id, $user_id, $message_text, $mini_path);
return true;
}
}
}
if ($mss_document) {
if (!$message_text) {
$message_text = NULL;
}
self::actionuserregistration($chat_id, $id, $user_id, $message_text, $mini_path);
return true;
}
if ($mss_photo) {
if (!$message_text) {
$message_text = NULL;
}
self::actionuserregistration($chat_id, $id, $user_id, $message_text, $mini_path);
return true;
}
}
}
}
return true;
}
/**
* @param $telegram
* @param $chat_id
* @param $key
*/
public static function actionuserregistration($chat_id = null, $bot_id = null, $user_id = null, $message_text = null, $message_file = null)
{
if ($chat_id && $bot_id && $user_id) {
//проверяем, есть ли такой пользователь в базе
$contact_status = BotContacts::find()->where(['bot_id' => $bot_id])->andWhere(['contact' => $chat_id])->one();
if (!$contact_status) {
//если пользователя нету - проверяем, есть ли дефолтная книга у пользователя
$default_book = BotContactBooks::find()
->where(['bot_id' => $bot_id])
->andWhere(['user_id' => $user_id])
->andWhere(['name' => 'Default'])->one() ?? new BotContactBooks();
$default_book->bot_id = (string)$bot_id;
$default_book->user_id = (string)$user_id;
$default_book->name = (string)'Default';
$default_book->save();
$book_id = $default_book->id;
//если есть дефолтная книга пользователей - добавляем пользователя,
//если нету дефолтной книги для данного бота - создаем и тогда добавляем нашего пользователя
$bt_cntct = new BotContacts();
$bt_cntct->bot_contacts_book_id = (string)$book_id;
$bt_cntct->bot_id = (string)$bot_id;
$bt_cntct->contact = (string)$chat_id;
$bt_cntct->name = (string)'User';
$bt_cntct->other_data = (string)'-';
$bt_cntct->visible = (string)'1';
$bt_cntct->save();
}
//пишем данные
$time_now = date("Y-m-d H:i:s");
if ($message_text || $message_file) {
$bot_action_data = new BotUserAction();
$bot_action_data->user_id = (string)$user_id;
$bot_action_data->message_from = (string)'Пользователь';
$bot_action_data->bot_id = (string)$bot_id;
$bot_action_data->chat_id = (string)$chat_id;
$bot_action_data->message = (string)$message_text;
$bot_action_data->image = NULL;
$bot_action_data->file = (string)$message_file;
$bot_action_data->admin_comment = NULL;
$bot_action_data->created_at = (string)$time_now;
$bot_action_data->save();
}
//отправляем уведомление в чат админу
if ($bot_id) {
//для начала получаем данные по боту - есть ли для бота указан пользователь для получения уведомлений
//если есть - отправляем данные указанному контакту
$bot_data = Bot::find()->where(['id' => $bot_id])->one();
if ($bot_data) {
$admin_chat_id = $bot_data->inform_chat_id;
$admin_chat_bot_token = $bot_data->token;
$admin_chat_bot_name = $bot_data->name;
if ($bot_data->bot_type == 1 && $admin_chat_id && $admin_chat_bot_token) {
//если есть chat_id для уведомлений + есть токен бота = отправляем уведомление о новом событии в боте
\Yii::$app->setComponents(['telegram' => [
'class' => \aki\telegram\Telegram::class,
'botToken' => $admin_chat_bot_token,
]]);
$telegram = Yii::$app->telegram;
if ($admin_chat_bot_name) {
$admin_chat_bot_name = " - " . $admin_chat_bot_name;
} else {
$admin_chat_bot_name = " ";
}
if($admin_chat_bot_name){
$msg_upd = $admin_chat_bot_name;
//добавляем ссылку на наш чат в панели управления
if($bot_action_data->id){
$contact_data = BotContacts::find()
->where(['bot_id' => $bot_id])
->andWhere(['contact' => $chat_id])
->one();
if($contact_data){
$line_id = $contact_data->id;
if($line_id){
$url = env("FRONTEND_HOST_INFO")."/user/botcontactbooks/viewactions?id=".$line_id;
if($url){
$url_tag = "<a href='".$url."'> Перейти в чат </a>";
$admin_chat_bot_name = $admin_chat_bot_name.$url_tag;
}
}
}
}
}
$answear_text = "Новое действие в Вашем боте " . $admin_chat_bot_name." Chat ID - ".$chat_id;
try {
Yii::$app->telegram->sendMessage([
'chat_id' => $admin_chat_id,
'text' => $answear_text,
'parse_mode' => "HTML"
]);
} catch (\Exception $e) {
Yii::error('BOT SENDER ERROR (BotController LN 364) - CDRMN ERR - : ' . $e->getMessage());
return true;
}
return true;
}
return true;
}
}
}
return true;
}
}