HEX
Server: Apache
System: Linux server3230.server-vps.com 5.15.0-46-generic #49-Ubuntu SMP Thu Aug 4 18:03:25 UTC 2022 x86_64
User: lzgqnjwu (1002)
PHP: 7.4.33
Disabled: NONE
Upload Files
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;

                        $telegram->sendMessage([
                            'chat_id' => $admin_chat_id,
                            'text' => $answear_text,
                            'parse_mode' => "HTML"
                        ]);
                    }
                    return true;
                }
            }

        }
        return true;
    }
}