<?php
namespace App\Controller;
use App\Entity\Domain;
use App\Entity\Message;
use App\Entity\User;
use App\Repository\DomainRepository;
use App\Repository\MessageRepository;
use App\Repository\UserRepository;
use App\Service\AppRestCore;
use Bitrix24\SDK\Core\CoreBuilder;
use DateTime;
use DateTimeZone;
use Doctrine\Persistence\ManagerRegistry;
use Manao\Bitrix\Rest\Client\Client;
use Manao\Bitrix\Rest\Client\Strategies\DefaultStrategy;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use GuzzleHttp;
use GuzzleHttp\Exception\ClientException;
use Manao\Bitrix\Rest\Client\RestMethod;
use Manao\Bundle\BitrixRestBundle\Event\UserAuthorized;
use Monolog\Handler\StreamHandler;
use Monolog\Logger;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\Validator\Constraints\Date;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Throwable;
class AppController extends AbstractController
{
private RequestStack $requestStack;
private Request $request;
private ParameterBagInterface $parameterBag;
private AppRestCore $restCore;
public function __construct(RequestStack $requestStack, ParameterBagInterface $parameterBag, AppRestCore $restCore)
{
$this->requestStack = $requestStack;
$this->request = $requestStack->getCurrentRequest();
$this->parameterBag = $parameterBag;
$this->restCore = $restCore;
}
/**
* @Route("/install", name="install")
*/
public function install(): Response
{
$arr = [
'AUTH_ID' => $this->request->get('AUTH_ID'),
'REFRESH_ID' => $this->request->get('REFRESH_ID'),
'AUTH_EXPIRES' => $this->request->get('AUTH_EXPIRES'),
'DOMAIN' => $this->request->get('DOMAIN'),
];
// dd($arr);
dump($arr);
// $authId = 'ec449763005fa298005fa2920000000100000751008ef78a60d8f2c08b1326a44b77fb';
// $refreshId = 'dcc3be63005fa298005fa2920000000100000780e8b8b2985c6e2fc961147f128237e5';
// $authExpires = 3600;
// $domain = 'https://b24-6wunou.bitrix24.by';
$this->restCore->setCredentials($this->request->get('AUTH_ID'), $this->request->get('REFRESH_ID'), $this->request->get('AUTH_EXPIRES'), $this->request->get('DOMAIN'));
// 'app.info',
$resultBot = $this->restCore->call(
'imbot.register',
[
'CODE' => 'delayed.messages', // Строковой идентификатор бота, уникальный в рамках вашего приложения (обяз.)
'TYPE' => 'S', // Тип бота, B - чат-бот, ответы поступают сразу, H - человек, ответы поступают с задержкой от 2-х до 10 секунд, O - чат-бот для Открытых линий, S - чат-бот с повышенными привилегиями (supervisor)
'EVENT_HANDLER' => 'https://delayedmess.dev-bitrix.by/', // Ссылка на обработчик событий поступивших от сервера, см. Обработчики событий ниже (обяз).
'OPENLINE' => 'Y', // Включение режима поддержки Открытых линий, можно не указывать, если TYPE = 'O'
'CLIENT_ID' => '', // строковый идентификатор чат-бота, используется только в режиме Вебхуков
'PROPERTIES' => [ // Личные данные чат-бота (обяз.)
'NAME' => 'DelayedMessage', // Имя чат-бота (обязательное одно из полей NAME или LAST_NAME)
]
]
);
if (isset($resultBot[0])) {
$botId = $resultBot[0];
} else {
// some error message
// return
}
var_dump($botId);
$iconFileB64 = base64_encode(file_get_contents($this->getParameter('kernel.project_dir') . '/public/assets/icon.png'));
// dd($iconFileB64);
// Возможно HASH нужно делать уникальным для каждого портала
$resultApp = $this->restCore->call(
'imbot.app.register',
[
'BOT_ID' => $botId, // идентификатор бота владельца приложения для чата
'CODE' => 'delayed_messages', // код приложения для чата
'IFRAME' => 'https://delayedmess.dev-bitrix.by/frame',
'IFRAME_WIDTH' => '591', // желаемая ширина фрейма. Минимальное значение - 250px
'IFRAME_HEIGHT' => '420', // желаемая высота фрейма. Минимальное значение - 50px
'HASH' => $this->parameterBag->get('iframe_hash_token'), // токен для доступа к вашему фрейму для проверки подписи, 32 символа.
'ICON_FILE' => $iconFileB64, // Иконка вашего приложения - base64
'CONTEXT' => 'ALL', // контекст приложения
'HIDDEN' => 'N', // скрытое приложение или нет
'EXTRANET_SUPPORT' => 'N', // доступна ли команда пользователям экстранет, по умолчанию N
'LIVECHAT_SUPPORT' => 'Y', // поддержка онлайн-чата
'IFRAME_POPUP' => 'N', // iframe будет открыт с возможностью перемещения внутри мессенджера, переход между диалогами не будет закрывать такое окно.
'LANG' => [ // массив переводов, желательно указывать как минимум для RU и EN
['LANGUAGE_ID' => 'ru', 'TITLE' => 'Отложенные сообщения', 'COPYRIGHT' => 'ManaoTeam'],
]
]
);
$resultPlacement = $this->restCore->call(
'placement.bind',
[
'PLACEMENT' => 'REST_APP_URI',
'HANDLER' => 'https://delayedmess.dev-bitrix.by/',
]
);
// dd($resultPlacement);
return $this->render('app/install.html.twig', [
// 'test' => $this->parameterBag->get('client_id'),
]);
}
/**
* @Route("/handler", name="handler")
*/
public function handler(): Response
{
$arr = [
'AUTH_ID' => $this->request->get('AUTH_ID'),
'REFRESH_ID' => $this->request->get('REFRESH_ID'),
'AUTH_EXPIRES' => $this->request->get('AUTH_EXPIRES'),
];
// $arr = $this->request->__toString();
dd($_REQUEST);
// dd($arr);
return $this->render('app/handler.html.twig', [
// 'controller_name' => 'AppController',
'test' => $this->parameterBag->get('client_id'),
]);
}
/**
* @Route("/", name="index")
*/
public function index(): Response
{
var_dump($_REQUEST);
return $this->render('app/index.html.twig', []);
}
/**
* @Route("/frame", name="frame")
*/
public function frame(): Response
{
var_dump($_REQUEST);
return $this->render('app/frame.html.twig', []);
}
/**
* @Route("/test", name="test")
*/
public function test(EventDispatcherInterface $eventDispatcher): Response
{
// user 1
$authId = '84257663005f27a6005edfb200000001000007d01dc93f70fd966e019e3eab4028a733';
$refreshId = '74a49d63005f27a6005edfb200000001000007dea6b6a602c515d00d923d8ccf94e782';
// user 8
$authId = '1f2f7663005f27a6005edfb200000008000007ab8868ea2076a60885ff44225d0d53fa';
$refreshId = '0fae9d63005f27a6005edfb20000000800000714f512e2643e562098844d821a544a09';
$arr = [
// 'AUTH_ID' => $this->request->get('AUTH_ID'),
// 'REFRESH_ID' => $this->request->get('REFRESH_ID'),
];
// // create a log channel
// $result = ['qwe' => 101];
// $log = new Logger('store');
// $log->pushHandler(new StreamHandler(__FILE__ . 'store.log'));
// // add records to the log
// $log->info('$result===>', $result);
// Событие с записью логов
// $event = new UserAuthorized([
// 'access_token' => 'test_1',
// 'refresh_token' => 'test_2',
// ]);
// $eventDispatcher->dispatch($event);
dd($arr);
$strategy = new DefaultStrategy(
$authId,
$refreshId,
$this->parameterBag->get('client_id'),
$this->parameterBag->get('client_secret'),
);
// $arr = [
// $authId,
// $refreshId,
// $this->parameterBag->get('client_id'),
// $this->parameterBag->get('client_secret'),
// ];
$domain = 'b24-1kvq8n.bitrix24.by';
// $domain = $this->request->get('DOMAIN');
$client = new Client(
new GuzzleHttp\Client(),
$strategy,
(new GuzzleHttp\Psr7\Uri('https://' . $domain))
->withPath('/rest')
);
$method = 'placement.list';
$body = [];
$method = 'im.message.add';
$body = [
// 'DIALOG_ID' => 8,
'DIALOG_ID' => 'chat2',
'MESSAGE' => date('Y-m-d H:i:s'),
];
// $method = 'user.get';
// $body = ['ID' => 1];
try {
$result = $client->call(new RestMethod($method, $body));
$result = json_decode($result->getBody()->__toString());
} catch (ClientException $th) {
$response = json_decode($th->getResponse()->getBody()->__toString());
$result = [
'message' => $th->getMessage(),
'error' => $response->error,
'error_description' => $response->error_description
];
}
dd($result);
return $this->render('app/handler.html.twig', [
// 'controller_name' => 'AppController',
'test' => $this->parameterBag->get('client_id'),
]);
}
/**
* @Route("/test1", name="test1")
*/
public function test1(AppRestCore $restCore)
{
$authId = 'ec449763005fa298005fa2920000000100000751008ef78a60d8f2c08b1326a44b77fb';
$refreshId = 'dcc3be63005fa298005fa2920000000100000780e8b8b2985c6e2fc961147f128237e5';
$authExpires = 3600;
$domain = 'https://b24-6wunou.bitrix24.by';
$restCore->setCredentials($authId, $refreshId, $authExpires, $domain);
// 'app.info',
$resultBot = $restCore->call(
'imbot.register',
[
'CODE' => 'delayed.messages', // Строковой идентификатор бота, уникальный в рамках вашего приложения (обяз.)
'TYPE' => 'S', // Тип бота, B - чат-бот, ответы поступают сразу, H - человек, ответы поступают с задержкой от 2-х до 10 секунд, O - чат-бот для Открытых линий, S - чат-бот с повышенными привилегиями (supervisor)
'EVENT_HANDLER' => 'https://delayedmess.dev-bitrix.by/', // Ссылка на обработчик событий поступивших от сервера, см. Обработчики событий ниже (обяз).
'OPENLINE' => 'Y', // Включение режима поддержки Открытых линий, можно не указывать, если TYPE = 'O'
'CLIENT_ID' => '', // строковый идентификатор чат-бота, используется только в режиме Вебхуков
'PROPERTIES' => [ // Личные данные чат-бота (обяз.)
'NAME' => 'DelayedMessage', // Имя чат-бота (обязательное одно из полей NAME или LAST_NAME)
]
]
);
if (isset($resultBot[0])) {
$botId = $resultBot[0];
} else {
// some error message
// return
}
var_dump($botId);
$iconFileB64 = base64_encode(file_get_contents($this->getParameter('kernel.project_dir') . '/public/assets/icon.png'));
// dd($iconFileB64);
// Возможно HASH нужно делать уникальным для каждого портала
$resultApp = $restCore->call(
'imbot.app.register',
[
'BOT_ID' => $botId, // идентификатор бота владельца приложения для чата
'CODE' => 'delayed_messages', // код приложения для чата
'IFRAME' => 'https://delayedmess.dev-bitrix.by/frame',
'IFRAME_WIDTH' => '591', // желаемая ширина фрейма. Минимальное значение - 250px
'IFRAME_HEIGHT' => '420', // желаемая высота фрейма. Минимальное значение - 50px
'HASH' => $this->parameterBag->get('iframe_hash_token'), // токен для доступа к вашему фрейму для проверки подписи, 32 символа.
'ICON_FILE' => $iconFileB64, // Иконка вашего приложения - base64
'CONTEXT' => 'ALL', // контекст приложения
'HIDDEN' => 'N', // скрытое приложение или нет
'EXTRANET_SUPPORT' => 'N', // доступна ли команда пользователям экстранет, по умолчанию N
'LIVECHAT_SUPPORT' => 'Y', // поддержка онлайн-чата
'IFRAME_POPUP' => 'N', // iframe будет открыт с возможностью перемещения внутри мессенджера, переход между диалогами не будет закрывать такое окно.
'LANG' => [ // массив переводов, желательно указывать как минимум для RU и EN
['LANGUAGE_ID' => 'ru', 'TITLE' => 'Отложенные сообщения', 'COPYRIGHT' => 'ManaoTeam'],
]
]
);
$resultPlacement = $restCore->call(
'placement.bind',
[
'PLACEMENT' => 'REST_APP_URI',
'HANDLER' => 'https://delayedmess.dev-bitrix.by/',
]
);
dd($resultPlacement);
}
/**
* @Route("/test2", name="test2")
*/
public function test2(): JsonResponse
{
$result = ['message' => 'ok'];
return new JsonResponse($result);
}
/**
* @Route("/test3", name="test3")
*/
public function test3(): JsonResponse
{
// $arr = [
// // $this->parameterBag->get('client_id'),
// // $this->parameterBag->get('client_secret'),
// ];
// dd($arr);
$log = new Logger('test3_log');
// $log->pushHandler(new StreamHandler('b24-api-client-debug.log', Logger::DEBUG));
$client = HttpClient::create(['http_version' => '2.0']);
$traceableClient = new \Symfony\Component\HttpClient\TraceableHttpClient($client);
$traceableClient->setLogger($log);
$appProfile = new \Bitrix24\SDK\Core\Credentials\ApplicationProfile(
$this->parameterBag->get('client_id'),
$this->parameterBag->get('client_secret'),
new \Bitrix24\SDK\Core\Credentials\Scope(
[
'user',
'im',
'imbot',
'placement',
]
)
);
$authId = 'ec449763005fa298005fa2920000000100000751008ef78a60d8f2c08b1326a44b77fb';
$refreshId = 'dcc3be63005fa298005fa2920000000100000780e8b8b2985c6e2fc961147f128237e5';
$token = new \Bitrix24\SDK\Core\Credentials\AccessToken(
$authId,
$refreshId,
3600
// 1672408508
);
$domain = 'https://b24-6wunou.bitrix24.by';
$credentials = \Bitrix24\SDK\Core\Credentials\Credentials::createFromOAuth($token, $appProfile, $domain);
$apiClient = new \Bitrix24\SDK\Core\ApiClient($credentials, $traceableClient, $log);
$appBuilder = new CoreBuilder();
$app = $appBuilder->withApiClient($apiClient)->withCredentials($credentials)->withEventDispatcher(new EventDispatcher())->withLogger($log)->build();
// $app = $appBuilder->withCredentials($credentials)->build();
$method = 'app.info';
$body = [];
// $method = 'im.message.add';
// $body = [
// // 'DIALOG_ID' => 8,
// 'DIALOG_ID' => 'chat2',
// 'MESSAGE' => date('Y-m-d H:i:s'),
// ];
try {
$res = $app->call($method, $body);
$result = $res->getResponseData()->getResult();
} catch (\Throwable $th) {
$result = [
'error' => true,
'message' => $th->getMessage(),
];
}
$log->debug('================================');
dd($result);
}
/**
* @Route("/orm", name="orm")
*/
public function orm(ManagerRegistry $registry, ValidatorInterface $validator): Response
{
// Тестирую ORM
// Добавить Домен
// $domain = new Domain();
// $domain->setUrl('https://test1.bitrix24.by');
// $domain->setTimeZone('+3');
// $domainRepository = new DomainRepository($registry);
// $domainRepository->add($domain, true);
$domainRepository = new DomainRepository($registry);
$arrDomains = $domainRepository->findBy(['url' => 'https://b24-6wunou.bitrix24.by']);
// $arrDomains = $domainRepository->findAll();
// dd($arrDomains[0]);
// $user = new User();
// $user->setAuthId('333444');
// $user->setRefreshId('444333');
// $user->setAuthExpires(3600);
// $user->setDomain($arrDomains[0]);
// $userRepository = new UserRepository($registry);
// $userRepository->add($user, true);
$userRepository = new UserRepository($registry);
$arrUsers = $userRepository->findAll();
// dump($arrUsers[0]);
// dd($arrUsers[0]->getDomain()->getUrl());
$timeZone = new DateTimeZone('+0000');
$date = new DateTime(date('Y-m-d H:i:00'), $timeZone);
$message = (new Message())->setUser($arrUsers[0])
->setDialogId('chat2')
->setMessage('сообщение 4')
->setDate($date)
->setTime($date);
// $errors = $validator->validate($message);
// dd($errors);
// if (count($errors) > 0) {
// }
// dd($message);
$messageRepository = new MessageRepository($registry);
// $arrMessages = $messageRepository->add($message, true);
$arrMessages = $messageRepository->findAll();
$count = $messageRepository->count([]);
dump($count);
dump($arrMessages);
$arrMessages = $messageRepository->findBy(
[
'time' => (new DateTime('17:36:00')),
'date' => (new DateTime('2023-01-27')),
// 'time' => (new DateTime('17:27:01')),
// 'date' => (new DateTime('2023-01-13')),
],
null,
50
);
foreach ($arrMessages as $mess) {
dump($mess->getTime()->format('H:i:s'));
}
dump($arrMessages);
// dd('ORM test');
// return new Response('ORM test');
return $this->render('app/index.html.twig', []);
}
}