1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
UpdateService.php
См. документацию.
1<?php
2
4
19
21{
22 use ContextCustomer;
23
24 public const EVENT_AFTER_MESSAGE_UPDATE = 'OnAfterMessagesUpdate';
25
26 private Message $message;
27 private Message\Send\SendingConfig $sendingConfig;
28 private ?array $chatLastMessage = null;
29 private bool $byEvent = false;
30 private bool $withCheckAccess = true;
31
32
33 public function __construct(Message $message)
34 {
35 $this->message = $message;
36 $this->sendingConfig = new Message\Send\SendingConfig();
37 }
38
39 public function setMessage(Message $message): self
40 {
41 $this->message = $message;
42
43 return $this;
44 }
45
46 public function setUrlPreview(bool $urlPreview): self
47 {
48 if (!$urlPreview)
49 {
50 $this->sendingConfig->disableUrlPreview();
51 }
52
53 return $this;
54 }
55
56 public function setByEvent(bool $byEvent): self
57 {
58 $this->byEvent = $byEvent;
59
60 return $this;
61 }
62
63 public function withoutCheckAccess(): self
64 {
65 $this->withCheckAccess = false;
66
67 return $this;
68 }
69
70 public function update(array $fieldsToUpdate): Result
71 {
72 if ($this->withCheckAccess && !$this->canUpdate())
73 {
74 return (new Result())->addError(new Message\MessageError(Message\MessageError::ACCESS_DENIED));
75 }
76
77 $previousMessage = clone $this->message;
78
79 $this->message->fill($fieldsToUpdate);
80
81 if ($this->message->isCompletelyEmpty())
82 {
83 return (DeleteService::getInstanceByMessage($this->message))->delete();
84 }
85
86 if ($this->message->isViewedByOthers())
87 {
88 $this->message->getParams()->get(Params::IS_EDITED)->setValue(true);
89 }
90
91 $filesFromText = $this->message->autocompleteParams($this->sendingConfig)->uploadFileFromText();
92 $result = $this->message->save();
93 if (!$result->isSuccess())
94 {
95 return $result;
96 }
97
98 Application::getConnection()->queryExecute("
99 UPDATE b_im_recent
100 SET DATE_UPDATE = NOW()
101 WHERE ITEM_MID = " . $this->message->getId()
102 );
103
104 $this->message->getChat()->sendPushUpdateMessage($this->message);
105 (new Message\Param\PushService())->sendPull($this->message, ['KEYBOARD', 'ATTACH', 'MENU']);
106
107 MessageTable::indexRecord($this->message->getId());
108
109 (new UrlService())->updateUrlsFromMessage($this->message);
110 (new FileService())->saveFilesFromMessage($filesFromText, $this->message);
111
112 $this->fireEventAfterMessageUpdate();
113
114 // update mentions after all events
115 (new Message\Send\MentionService())->updateMentions($previousMessage, $this->message);
116
117 return $result;
118 }
119
120 public function canUpdate(): bool
121 {
122 $isMessageDelete = $this->message->getParams()->get(Params::IS_DELETED)->getValue() === true;
123 $isForward = $this->message->getParams()->isSet(Params::FORWARD_ID);
124
125 if ($isMessageDelete || $isForward)
126 {
127 return false;
128 }
129
130 $user = $this->getContext()->getUser();
131 $chat = $this->message->getChat();
132
133 if ($chat instanceof Chat\OpenLineChat && Loader::includeModule('imopenlines'))
134 {
135 if ($user->isBot())
136 {
137 return true;
138 }
139
140 if ($user->getId() === $this->message->getAuthorId())
141 {
142 return $chat->canUpdateOwnMessage();
143 }
144
145 return false;
146 }
147
148 if ($this->message->getAuthorId() === $user->getId())
149 {
150 return true;
151 }
152
153 return false;
154 }
155
156 private function getBotInChat(): array
157 {
158 $result = [];
159 $users = $this->message->getChat()->getRelations()->getUsers();
160
161 foreach ($users as $user)
162 {
163 if ($user->isBot())
164 {
165 $result[$user->getId()] = $user->getId();
166 }
167 }
168
169 return $result;
170 }
171
172 private function fireEventAfterMessageUpdate(): void
173 {
174 $chat = $this->message->getChat();
176 'ID' => $this->message->getId(),
177 'CHAT_ID' => $this->message->getChatId(),
178 'AUTHOR_ID' => $this->message->getAuthorId(),
179 'MESSAGE' => $this->message->getMessage(),
180 'MESSAGE_OUT' => $this->message->getMessageOut(),
181 'DATE_CREATE' => $this->message->getDateCreate()->getTimestamp(),
182 'EMAIL_TEMPLATE' => $this->message->getEmailTemplate(),
183 'NOTIFY_TYPE' => $this->message->getNotifyType(),
184 'NOTIFY_MODULE' => $this->message->getNotifyModule(),
185 'NOTIFY_EVENT' => $this->message->getNotifyEvent(),
186 'NOTIFY_TAG' => $this->message->getNotifyTag(),
187 'NOTIFY_SUB_TAG' => $this->message->getNotifySubTag(),
188 'NOTIFY_TITLE' => $this->message->getNotifyTitle(),
189 'NOTIFY_BUTTONS' => $this->message->getNotifyButtons(),
190 'NOTIFY_READ' => $this->message->isNotifyRead(),
191 'IMPORT_ID' => $this->message->getImportId(),
192 'MESSAGE_TYPE' => $chat->getType(),
193 'CHAT_AUTHOR_ID' => $chat->getAuthorId(),
194 'CHAT_ENTITY_TYPE' => $chat->getEntityType(),
195 'CHAT_ENTITY_ID' => $chat->getEntityId(),
196 'CHAT_PARENT_ID' => $chat->getParentChatId(),
197 'CHAT_PARENT_MID' => $chat->getParentMessageId(),
198 'CHAT_ENTITY_DATA_1' => $chat->getEntityData1(),
199 'CHAT_ENTITY_DATA_2' => $chat->getEntityData2(),
200 'CHAT_ENTITY_DATA_3' => $chat->getEntityData3(),
201 'PARAMS' => $this->message->getParams()->toRestFormat(),
202 'DATE_MODIFY' => new DateTime()
203 ];
204
205 if ($chat instanceof Chat\PrivateChat)
206 {
207 $messageFields['FROM_USER_ID'] = $this->message->getAuthorId();
208 $messageFields['TO_USER_ID'] = $chat->getCompanion($this->message->getAuthorId())->getId();
209 }
210 else
211 {
212 $messageFields['BOT_IN_CHAT'] = $this->getBotInChat();
213 }
214
215 $updateFlags = [
216 'ID' => $this->message->getId(),
217 'TEXT' => $this->message->getMessage(),
218 'URL_PREVIEW' => $this->urlPreview,
219 'EDIT_FLAG' => $this->message->getParams()->get(Params::IS_EDITED)->getValue(),
220 'USER_ID' => $this->message->getAuthorId(),
221 'BY_EVENT' => $this->byEvent,
222 ];
223
224 foreach(GetModuleEvents('im', self::EVENT_AFTER_MESSAGE_UPDATE, true) as $event)
225 {
226 ExecuteModuleEventEx($event, [$this->message->getId(), $messageFields, $updateFlags]);
227 }
228
229 Bot::onMessageUpdate($this->message->getId(), $messageFields);
230
231 $chat->onAfterMessageUpdate($this->message);
232
233 Sync\Logger::getInstance()->add(
234 new Sync\Event(Sync\Event::ADD_EVENT, Sync\Event::UPDATED_MESSAGE_ENTITY, $this->message->getId()),
235 static fn () => $chat->getRelations()->getUserIds(),
236 $chat
237 );
238 }
239}
$messageFields
Определения callback_ednaru.php:22
const IS_EDITED
Определения Params.php:34
const IS_DELETED
Определения Params.php:31
const FORWARD_ID
Определения Params.php:64
__construct(Message $message)
Определения UpdateService.php:33
setMessage(Message $message)
Определения UpdateService.php:39
setByEvent(bool $byEvent)
Определения UpdateService.php:56
setUrlPreview(bool $urlPreview)
Определения UpdateService.php:46
update(array $fieldsToUpdate)
Определения UpdateService.php:70
Определения result.php:20
Определения loader.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
Определения contextmenu.php:9
Определения Uuid.php:3
trait ContextCustomer
Определения ContextCustomer.php:12
Определения ChatsSync.php:3
$user
Определения mysql_to_pgsql.php:33
$message
Определения payment.php:8
$event
Определения prolog_after.php:141