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();
}
}
}
}