HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/exnova-telegram-bot-v2/app/Jobs/InitTradingSession.php
<?php

namespace App\Jobs;

use App\Models\Settings;
use App\Telegram\Messages\BlocksHandler;
use App\Telegram\Messages\MessageDeleter;
use App\Telegram\Messages\Postman;
use App\Twill\Capsules\TradingSessions\Models\TradingSession;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class InitTradingSession implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $session;

    protected $step;
    /**
     * Create a new job instance.
     */
    public function __construct($session, $step = 1)
    {
        $this->session = $session;
        $this->step = $step;
    }

    /**
     * Execute the job.
     */
    public function handle(): void
    {
        /** @var TradingSession $session */
        $session =  $this->session;
        if ($session) {


            $bot = $session->bot()->first();
            $user = $session->user()->first();
            $postman = new Postman($user, []);
            $telegramMessageId = $session->telegram_message_id;
            $lastMessageSent = $telegramMessageId;
            $user = $session->user;

            $texts = Settings::getTranslated('trading.auto', 'autotrading_texts', $user->locale);
            $texts = explode('</p><p>', $texts);
            $resultTexts = [];
            foreach ($texts as $key => $text) {
                $text = strip_tags($text);
                if (!$text) {
                    continue;
                }
                $resultTexts[$key] = $text;
            }

            if ($this->step <= count($resultTexts)) {
                if ($this->step != 1) {
                    $messageDeleter = new MessageDeleter(['message' => ['message_id' => $lastMessageSent, 'chat' => ['id' => $user->telegram_id]]]);
                    $messageDeleter->delete();
                }
                $lastMessageSent = $postman->sendMessage($resultTexts[$this->step - 1]);
                if (!empty($lastMessageSent['result'])) {
                    $lastMessageSent = $lastMessageSent['result']['message_id'];
                    $session->telegram_message_id = $lastMessageSent;
                    $session->save();
                } else {
                    if (!empty($lastMessageSent) && !substr_count(json_encode($lastMessageSent), 'chat not found')) {
                        $user->sendMessageToChannel('Autotrading error. Telegram response. ' . json_encode($lastMessageSent));
                    }
                }
                InitTradingSession::dispatch($session, $this->step + 1)->delay(now()->addSeconds(3));
            }

            if ($this->step > count($resultTexts)) {
                $apiKey = Settings::get('signals.api', 'taapi_key');
                $rsiResponse = shell_exec("curl -X GET 'https://api.taapi.io/rsi?symbol=BTC/USDT&interval=1h&exchange=binance&secret=$apiKey'");
                $rsiResponse = json_decode($rsiResponse, true);

                $rsi = 51; // DEFAULT RSI for case if API FAILS
                if (!empty($rsiResponse['value'])) {
                    $rsi = $rsiResponse['value'];
                }

                if ($rsi > 50) {
                    $signalMessageId = 'bearish-signal';
                } else {
                    $signalMessageId = 'bullish-signal';
                }

                try {
                    $messageDeleter = new MessageDeleter(['message' => ['message_id' => $lastMessageSent, 'chat' => ['id' => $user->telegram_id]]]);
                    $messageDeleter->delete();
                } catch (\Exception $e) {}

                $setState = $session::STATE_SELECT_DIRECTION;
                $blocks = $bot->getBlocks($signalMessageId, $user);

                $post = ['message' => ['chat' => ['id' => $user->telegram_id]]];
                $blocksHandler = new BlocksHandler($user, $post);
                if (!empty($blocks)) {
                    $lastMessageSent = $blocksHandler->handle($blocks);
                    if (!empty($lastMessageSent['result'])) {
                        $lastMessageSent = $lastMessageSent['result']['message_id'];
                        $session->telegram_message_id = $lastMessageSent;
                    }
                }
                if ($setState && $session->state == TradingSession::STATE_JUST_STARTED) {
                    $session->state = $setState;
                }
                $session->save();
            }
        }
    }
}