1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
CreateSiteChatBot.php
См. документацию.
1<?php
2declare(strict_types=1);
3
4namespace Bitrix\Landing\Copilot\Connector\Chat;
5
6use Bitrix\AI\Chatbot\Dto\MessageDto;
7use Bitrix\AI\Chatbot\Enum\MessageType;
8use Bitrix\AI\Chatbot\Message\CreateSiteGreetingMessage;
9use Bitrix\AI\Chatbot\Message\DefaultMessage;
10use Bitrix\AI\Chatbot\Message\Message;
11use Bitrix\AI\Chatbot\Message\SystemMessage;
12use Bitrix\Landing\Copilot\Data\Wishes;
13use Bitrix\Landing\Copilot\Generation;
14use Bitrix\Landing\Copilot\Data;
15use Bitrix\Main\LoaderException;
16use Bitrix\Main\Localization\Loc;
17use Bitrix\Main\SystemException;
18
20{
21 protected const MODULE_ID = 'landing';
22 protected const BOT_CODE = 'site_with_ai';
23
24 private const WELCOME_STAGE = 'welcome';
25 private const CREATE_SITE_STAGE = 'createSite';
26 private const RESTART_SITE_STAGE = 'restartSite';
27 private const START_OVER_STAGE = 'startOver';
28
29 public function onChatStart(int $chatId, array $parameters = []): void
30 {
31 $message = new CreateSiteGreetingMessage('');
32 $message->addButton(
33 '',
34 Loc::getMessage('LANDING_CHATBOT_SITE_CREATE_SITE'),
35 ChatBotCommands::startGeneration->value,
36 );
37 $this->sendAnswer($chatId, $message);
38 }
39
47 public function onMessageAdd(MessageDto $message, ?array $command = null): void
48 {
49 $this->startWriting($message->chatId);
50
51 $chatId = $message->chatId;
52 if ($chatId <= 0)
53 {
54 return;
55 }
56
57 $commandParams = is_array($command[1]) ? $command[1] : [];
58 $currentStage = $this->getCurrentScenarioStage($chatId, $message);
59
60 switch ($currentStage)
61 {
62 case self::CREATE_SITE_STAGE:
63 {
64 $this->handleCreateSiteStage($chatId);
65
66 break;
67 }
68 case self::RESTART_SITE_STAGE:
69 {
70 $this->handleRestartSiteStage($chatId, $commandParams);
71
72 break;
73 }
74 case self::START_OVER_STAGE:
75 {
76 $this->handleStartOver($chatId, $commandParams);
77
78 break;
79 }
80 }
81 }
82
84 {
85 $chatId = $message->chatId;
86 if ($chatId <= 0)
87 {
88 return;
89 }
90
91 $this->sendAnswer($chatId, $this->getFinishGenerationMessage());
92 $this->stopWriting($chatId);
93 }
94
101 private function getCurrentScenarioStage(int $chatId, MessageDto $userMessage): string
102 {
103 if ($userMessage->type === MessageType::ButtonClicked)
104 {
105 $userMessageCommand = $userMessage->params['command'][0] ?? '';
106
107 if ($userMessageCommand === ChatBotCommands::startGeneration->value)
108 {
109 return self::CREATE_SITE_STAGE;
110 }
111
112 if ($userMessageCommand === ChatBotCommands::restartGeneration->value)
113 {
114 return self::RESTART_SITE_STAGE;
115 }
116
117 if ($userMessageCommand === ChatBotCommands::startOver->value)
118 {
119 return self::START_OVER_STAGE;
120 }
121 }
122
123 $messages = $this->getMessages($chatId, 0);
124 $messagesCount = count($messages);
125
126 if ($messagesCount === 2)
127 {
128 return self::CREATE_SITE_STAGE;
129 }
130
131 return self::WELCOME_STAGE;
132 }
133
140 private function handleStartOver(int $chatId, array $params = []): void
141 {
142 $this->sendAnswer(
143 $chatId,
144 new DefaultMessage(Loc::getMessage('LANDING_CHATBOT_SITE_START_OVER_SITE_MESSAGE'))
145 );
146 $this->stopWriting($chatId, false);
147
149 }
150
156 private function handleCreateSiteStage(int $chatId): void
157 {
158 $wishes = $this->getWishesForSiteGenerating($chatId);
159 $generator = new Generation();
160 if (
161 $generator
162 ->setScenario(new Generation\Scenario\CreateSite())
163 ->setChatId($chatId)
164 ->setWishes($wishes)
165 ->execute()
166 )
167 {
168 $this->sendFrontendEvent(ChatBotCommands::startGeneration, [
169 'generationId' => $generator->getId(),
170 ]);
171 }
172 }
173
179 private function getWishesForSiteGenerating(int $chatId): Data\Wishes
180 {
181 $messages = $this->getMessages($chatId);
182 $wishes = new Data\Wishes();
183
184 // wishes
185 if (isset($messages[1]) && count($messages) === 2)
186 {
187 $buttonId = $messages[1]->params['buttonId'] ?? null;
188 if ($buttonId === null)
189 {
190 $wishes->addWish($messages[1]->content);
191 }
192 }
193
194 if (empty($wishes->getWishes()))
195 {
196 $wishes->setDemoWishes();
197 }
198
199 return $wishes;
200 }
201
209 private function handleRestartSiteStage(int $chatId, array $params = []): void
210 {
211 if ($chatId <= 0)
212 {
213 return;
214 }
215
216 $generationId = $params['generationId'] ?? 0;
217 if ($generationId <= 0)
218 {
219 return;
220 }
221
222 $generation = new Generation();
223 if ($generation->initById($generationId))
224 {
225 $this->sendFrontendEvent(ChatBotCommands::restartGeneration, $params);
226
227 $generation->clearErrors()->execute();
228 }
229 // todo: else - error?
230
231 $this->stopWriting($chatId, false);
232
233 }
234
239 {
240 $errorText = $message->params['errorText'] ?? '';
241 $answer = new SystemMessage($errorText);
242
243 $answer->addButton(
244 Loc::getMessage('LANDING_CHATBOT_SITE_RETRY_CREATE_SITE_BUTTON'),
245 Loc::getMessage('LANDING_CHATBOT_SITE_CREATE_SITE'),
246 ChatBotCommands::restartGeneration->value,
247 [
248 'generationId' => $message->generationId ?? null,
249 ],
250 );
251
252 return $answer;
253 }
254
259 {
260 $answer = new SystemMessage(Loc::getMessage('LANDING_CHATBOT_SITE_ERROR_RESTRICTED_REQUEST'));
261 $answer->addButton(
262 Loc::getMessage('LANDING_CHATBOT_SITE_START_OVER_SITE_BUTTON'),
263 Loc::getMessage('LANDING_CHATBOT_SITE_START_OVER_SITE_BUTTON'),
265 [
266 'generationId' => $message->generationId ?? null,
267 ],
268 );
269
270 return $answer;
271 }
272
277 {
278 $answer = new SystemMessage(Loc::getMessage('LANDING_CHATBOT_SITE_ERROR_VENDOR'));
279 $answer->addButton(
280 Loc::getMessage('LANDING_CHATBOT_SITE_RETRY_CREATE_SITE_BUTTON'),
281 Loc::getMessage('LANDING_CHATBOT_SITE_RETRY_CREATE_SITE_BUTTON'),
282 ChatBotCommands::restartGeneration->value,
283 [
284 'generationId' => $message->generationId ?? null,
285 ],
286 );
287
288 return $answer;
289 }
290
295 {
296 $answer = new SystemMessage(Loc::getMessage('LANDING_CHATBOT_SITE_ERROR_B24'));
297 $answer->addButton(
298 Loc::getMessage('LANDING_CHATBOT_SITE_RETRY_CREATE_SITE_BUTTON'),
299 Loc::getMessage('LANDING_CHATBOT_SITE_RETRY_CREATE_SITE_BUTTON'),
300 ChatBotCommands::restartGeneration->value,
301 [
302 'generationId' => $message->generationId ?? null,
303 ],
304 );
305
306 return $answer;
307 }
308
312 protected function getStartGenerationMessage(): Message
313 {
314 return new DefaultMessage(Loc::getMessage('LANDING_CHATBOT_SITE_START_SITE_GENERATING'));
315 }
316
321 {
322 return new DefaultMessage(Loc::getMessage('LANDING_CHATBOT_SITE_FINISH_SITE_GENERATING'));
323 }
324}
sendFrontendEvent(ChatBotCommands $command, array $params=[])
Определения CopilotChatBot.php:112
onMessageAdd(MessageDto $message, ?array $command=null)
Определения CreateSiteChatBot.php:47
onChatStart(int $chatId, array $parameters=[])
Определения CreateSiteChatBot.php:29
sendGenerationEndMessage(ChatBotMessageDto $message)
Определения CreateSiteChatBot.php:83
getB24ErrorMessage(ChatBotMessageDto $message)
Определения CreateSiteChatBot.php:294
getQuotaExceededMessage(ChatBotMessageDto $message)
Определения CreateSiteChatBot.php:238
getVendorErrorMessage(ChatBotMessageDto $message)
Определения CreateSiteChatBot.php:276
getRestrictedRequestMessage(ChatBotMessageDto $message)
Определения CreateSiteChatBot.php:258
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
setChatId(int $chatId)
Определения Param.php:89
$message
Определения payment.php:8
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$messages
Определения template.php:8
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799