Compare commits

...

7 commits

Author SHA1 Message Date
Dark-Killer228
b492f0830e
Merge bf65910730 into c25fd84c11 2025-05-12 10:21:47 +02:00
Jillian Österreich
c25fd84c11
feat(support): add more telegram posts (#1282)
Для упрощения слежки над тикетами были добавлены дополнительные посты
при добавлении комментария и изменении статуса тикета, в случае если
существует отдельный чат под это в Телеграме.

---------

Co-authored-by: veselcraft <veselcraft@icloud.com>
2025-05-10 16:55:54 +03:00
malushik
0a73a40f5f
update(locale-uk): up-to-time localisation (#1281) 2025-05-10 16:15:27 +03:00
Dark-Killer228
bf65910730
Update View.xml 2025-03-19 23:48:32 +05:00
Dark-Killer228
425e148ee5
Merge branch 'OpenVK:master' into patch-2 2025-03-11 20:00:46 +05:00
Dark-Killer228
756dcf68e3
Merge branch 'OpenVK:master' into patch-2 2025-03-01 22:12:43 +05:00
Dark-Killer228
153206f9ba
Отключение отбражения возраста, если пользователь умер 2025-02-22 21:42:41 +05:00
3 changed files with 111 additions and 6 deletions

View file

@ -169,6 +169,13 @@ final class SupportPresenter extends OpenVKPresenter
$_redirect = "/support?act=list"; $_redirect = "/support?act=list";
} }
$helpdeskChat = OPENVK_ROOT_CONF["openvk"]["credentials"]["telegram"]["helpdeskChat"];
if ($helpdeskChat) {
$serverUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"];
$telegramText = "❌ <b>Тикет под названием</b> &quot;{$ticket->getName()}&quot; от <a href='$serverUrl{$ticket->getUser()->getURL()}'>{$ticket->getUser()->getCanonicalName()}</a> ({$ticket->getUser()->getRegistrationIP()}) <b>был удалён.</b>\n";
Telegram::send($helpdeskChat, $telegramText);
}
$ticket->delete(); $ticket->delete();
$this->redirect($_redirect); $this->redirect($_redirect);
} }
@ -200,6 +207,16 @@ final class SupportPresenter extends OpenVKPresenter
$comment->setCreated(time()); $comment->setCreated(time());
$comment->save(); $comment->save();
$helpdeskChat = OPENVK_ROOT_CONF["openvk"]["credentials"]["telegram"]["helpdeskChat"];
if ($helpdeskChat) {
$serverUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"];
$commentText = ovk_proc_strtr($this->postParam("text"), 1500);
$telegramText = "💬 <b>Новый комментарий от автора тикета</b> <a href='$serverUrl/support/reply/$id'>&quot;{$ticket->getName()}&quot;</a>\n";
$telegramText .= "$commentText\n\n";
$telegramText .= "Автор: <a href='$serverUrl{$ticket->getUser()->getURL()}'>{$ticket->getUser()->getCanonicalName()}</a> ({$ticket->getUser()->getRegistrationIP()})\n";
Telegram::send($helpdeskChat, $telegramText);
}
$this->redirect("/support/view/" . $id); $this->redirect("/support/view/" . $id);
} else { } else {
$this->flashFail("err", tr("error"), tr("you_have_not_entered_text")); $this->flashFail("err", tr("error"), tr("you_have_not_entered_text"));
@ -227,15 +244,33 @@ final class SupportPresenter extends OpenVKPresenter
{ {
$this->assertPermission('openvk\Web\Models\Entities\TicketReply', 'write', 0); $this->assertPermission('openvk\Web\Models\Entities\TicketReply', 'write', 0);
$support_names = new SupportAgents();
$agent = $support_names->get($this->user->id);
$ticket = $this->tickets->get($id); $ticket = $this->tickets->get($id);
if ($_SERVER["REQUEST_METHOD"] === "POST") { if ($_SERVER["REQUEST_METHOD"] === "POST") {
$this->willExecuteWriteAction(); $this->willExecuteWriteAction();
$helpdeskChat = OPENVK_ROOT_CONF["openvk"]["credentials"]["telegram"]["helpdeskChat"];
if (!empty($this->postParam("text")) && !empty($this->postParam("status"))) { if (!empty($this->postParam("text")) && !empty($this->postParam("status"))) {
$ticket->setType($this->postParam("status")); $status = $this->postParam("status");
$ticket->setType($status);
$ticket->save(); $ticket->save();
switch ($status) {
default:
# NOTICE falling through
case 0:
$state = "Вопрос на рассмотрении";
break;
case 1:
$state = "Есть ответ";
break;
case 2:
$state = "Закрыто";
}
$comment = new TicketComment(); $comment = new TicketComment();
$comment->setUser_id($this->user->id); $comment->setUser_id($this->user->id);
$comment->setUser_type(1); $comment->setUser_type(1);
@ -243,9 +278,42 @@ final class SupportPresenter extends OpenVKPresenter
$comment->setTicket_Id($id); $comment->setTicket_Id($id);
$comment->setCreated(time()); $comment->setCreated(time());
$comment->save(); $comment->save();
if ($helpdeskChat) {
$serverUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"] . "/support/agent" . $this->user->id;
$ticketUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"] . "/support/reply/" . $id;
$commentText = ovk_proc_strtr($this->postParam("text"), 1500);
$telegramText = "💬 <b>Новый комментарий от агента к тикету</b> <a href='$ticketUrl'>&quot;{$ticket->getName()}&quot;</a>\n";
$telegramText .= "Статус: {$state}\n\n";
$telegramText .= "$commentText\n\n";
$telegramText .= "Агент: <a href='$serverUrl'>{$this->user->identity->getFullName()}</a>\n";
Telegram::send($helpdeskChat, $telegramText);
}
} elseif (empty($this->postParam("text"))) { } elseif (empty($this->postParam("text"))) {
$ticket->setType($this->postParam("status")); $status = $this->postParam("status");
$ticket->setType($status);
$ticket->save(); $ticket->save();
switch ($status) {
default:
# NOTICE falling through
case 0:
$state = "Вопрос на рассмотрении";
break;
case 1:
$state = "Есть ответ";
break;
case 2:
$state = "Закрыто";
}
if ($helpdeskChat) {
$serverUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"] . "/support/agent" . $this->user->id;
$ticketUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"] . "/support/reply/" . $id;
$telegramText = "🔔 <b>Изменён статус тикета</b> <a href='$ticketUrl'>&quot;{$ticket->getName()}&quot;</a>: <b>{$state}</b>\n\n";
$telegramText .= "Агент: <a href='$serverUrl'>{$this->user->identity->getFullName()}</a>\n";
Telegram::send($helpdeskChat, $telegramText);
}
} }
$this->flashFail("succ", tr("ticket_changed"), tr("ticket_changed_comment")); $this->flashFail("succ", tr("ticket_changed"), tr("ticket_changed_comment"));
@ -442,6 +510,13 @@ final class SupportPresenter extends OpenVKPresenter
$ticket->setType(2); $ticket->setType(2);
$ticket->save(); $ticket->save();
$helpdeskChat = OPENVK_ROOT_CONF["openvk"]["credentials"]["telegram"]["helpdeskChat"];
if ($helpdeskChat) {
$serverUrl = ovk_scheme(true) . $_SERVER["SERVER_NAME"];
$telegramText = "🔒 <b>Тикет под названием</b> <a href='$serverUrl/support/reply/{$ticket->getId()}'>&quot;{$ticket->getName()}&quot;</a> от <a href='$serverUrl{$ticket->getUser()->getURL()}'>{$ticket->getUser()->getCanonicalName()}</a> ({$ticket->getUser()->getRegistrationIP()}) <b>был закрыт автором.</b>\n";
Telegram::send($helpdeskChat, $telegramText);
}
$this->flashFail("succ", tr("ticket_changed"), tr("ticket_changed_comment")); $this->flashFail("succ", tr("ticket_changed"), tr("ticket_changed_comment"));
} }
} }

View file

@ -458,8 +458,11 @@
</tr> </tr>
<tr n:if="!is_null($user->getBirthday())"> <tr n:if="!is_null($user->getBirthday())">
<td class="label"><span class="nobold">{_birth_date}:</span></td> <td class="label"><span class="nobold">{_birth_date}:</span></td>
<td n:if="$user->getBirthdayPrivacy() == 0" class="data">{$user->getBirthday()->format('%e %B %Y')}, {if $user->onlineStatus() != 2 && $user->getBirthdayPrivacy() == 0}
<td class="data">{$user->getBirthday()->format('%e %B %Y')},
{tr("years", $user->getAge())}</td> {tr("years", $user->getAge())}</td>
{/if}
<td n:if="$user->onlineStatus() == 2" class="data">{$user->getBirthday()->format('%e %B %Y')}</td>
<td n:if="$user->getBirthdayPrivacy() == 1" class="data">{$user->getBirthday()->format('%e %B')}</td> <td n:if="$user->getBirthdayPrivacy() == 1" class="data">{$user->getBirthday()->format('%e %B')}</td>
</tr> </tr>
</tbody> </tbody>

View file

@ -597,6 +597,8 @@
"my_feedback" = "Мої Відповіді"; "my_feedback" = "Мої Відповіді";
"my_apps" = "Застосунки"; "my_apps" = "Застосунки";
"my_settings" = "Мої Налаштування"; "my_settings" = "Мої Налаштування";
"bookmarks" = "Вподобані";
"bookmarks_tab" = "Вподобане";
"bug_tracker" = "Баг-трекер"; "bug_tracker" = "Баг-трекер";
"menu_settings" = "Налаштування"; "menu_settings" = "Налаштування";
@ -647,6 +649,7 @@
"cut" = "Квадратні"; "cut" = "Квадратні";
"round avatars" = "Круглі"; "round avatars" = "Круглі";
"apply_style_for_this_device" = "Застосувати стиль лише для цього пристрою"; "apply_style_for_this_device" = "Застосувати стиль лише для цього пристрою";
"ui_settings_window" = "Додаткові налаштування";
"search_for_groups" = "Пошук спільнот"; "search_for_groups" = "Пошук спільнот";
"search_for_users" = "Пошук користувачів"; "search_for_users" = "Пошук користувачів";
"search_for_posts" = "Пошук дописів"; "search_for_posts" = "Пошук дописів";
@ -853,7 +856,8 @@
"audio_embed_deleted" = "Аудіозапис видалено"; "audio_embed_deleted" = "Аудіозапис видалено";
"audio_embed_withdrawn" = "Аудіозапис було вилучено на вимогу правовласника"; "audio_embed_withdrawn" = "Аудіозапис було вилучено на вимогу правовласника";
"audio_embed_forbidden" = "Налаштування конфіденційності користувача не дозволяють вбудовувати цей аудіозапис"; "audio_embed_forbidden" = "Налаштування конфіденційності користувача не дозволяють вбудовувати цей аудіозапис";
"audio_embed_processing" = "Аудіозапис ще обробляється або було оброблено неправильно."; "audio_embed_processing" = "Аудіозапис ще обробляється або був неправильно оброблений.";
"audio_embed_processing_bait" = "Все одно відтворити";
"audios_count_zero" = "Немає аудіозаписів"; "audios_count_zero" = "Немає аудіозаписів";
"audios_count_one" = "Один аудіозапис"; "audios_count_one" = "Один аудіозапис";
@ -872,6 +876,7 @@
"audio_search" = "Пошук"; "audio_search" = "Пошук";
"my_audios_small" = "Мої аудіозаписи"; "my_audios_small" = "Мої аудіозаписи";
"my_audios_small_uploaded" = "Завантажене";
"my_playlists" = "Мій список відтворення"; "my_playlists" = "Мій список відтворення";
"playlists" = "Списки відтворення"; "playlists" = "Списки відтворення";
"audios_explicit" = "Має нецензурну лексику"; "audios_explicit" = "Має нецензурну лексику";
@ -962,6 +967,12 @@
"audio_ctx_play_next" = "Відтворити наступним"; "audio_ctx_play_next" = "Відтворити наступним";
"audio_ctx_clear_context" = "Очистити список аудіозаписів"; "audio_ctx_clear_context" = "Очистити список аудіозаписів";
"is_x_audio_zero" = "Немає аудіозаписів";
"is_x_audio_one" = "Один аудіозапис.";
"is_x_audio_few" = "Всього $1 аудіозаписа.";
"is_x_audio_many" = "Всього $1 аудіозаписів.";
"is_x_audio_other" = "Всього $1 аудіозаписів.";
/* Notifications */ /* Notifications */
"feedback" = "Відповіді"; "feedback" = "Відповіді";
@ -1977,6 +1988,7 @@
"s_apps" = "Застосунки"; "s_apps" = "Застосунки";
"s_posts" = "Дописи"; "s_posts" = "Дописи";
"s_comments" = "Коментарі"; "s_comments" = "Коментарі";
"s_photos" = "Фотографії";
"s_videos" = "Відео"; "s_videos" = "Відео";
"s_audios" = "Музика"; "s_audios" = "Музика";
"s_audios_playlists" = "Списки відтворення"; "s_audios_playlists" = "Списки відтворення";
@ -2087,7 +2099,8 @@
"mobile_menu" = "Меню"; "mobile_menu" = "Меню";
"mobile_like" = "Подобається"; "mobile_like" = "Подобається";
"mobile_user_info_hide" = "Приховувати"; "mobile_user_info_hide" = "Приховувати";
"mobile_user_info_show_details" = "Показати докладніше"; "mobile_user_info_show_details" = "Відобразити докладніше";
"mobile_attachment_only_for_pc" = "Вкладення недоступне в PDA версії, його перегляд можливий тільки з іншого пристрою";
"my" = "Мої"; "my" = "Мої";
"enter_a_name_or_artist" = "Введіть назву або виконавця..."; "enter_a_name_or_artist" = "Введіть назву або виконавця...";
@ -2237,4 +2250,18 @@
"documents_sort_size" = "За розміром"; "documents_sort_size" = "За розміром";
"select_doc" = "Вибір документа"; "select_doc" = "Вибір документа";
"no_documents" = "Документів немає"; "no_documents" = "Документів немає";
"go_to_my_documents" = "Перейти до моїх документів"; "go_to_my_documents" = "Перейти до Моїх документів";
/* Fave */
"faves" = "Закладки";
"faves_empty_tip" = "Тут відображатиметься вподобаний Вами контент...";
"faves_posts_empty_tip" = "Тут відображатимуться вподобані Вами дописи.";
"faves_comments_empty_tip" = "Тут відображатимуться вподобані Вами коментарі.";
"faves_photos_empty_tip" = "Тут відображатимуться вподобані Вами фотографії.";
"faves_videos_empty_tip" = "Тут відображатимуться вподобані Вами відеозаписи.";
"faves_zero" = "Жодного вподобання";
"faves_one" = "Одна вподобання";
"faves_few" = "$1 вподобання";
"faves_many" = "$1 вподобань";
"faves_other" = "$1 вподобань";