mirror of
https://github.com/openvk/openvk
synced 2025-07-07 08:19:49 +03:00
Compare commits
5 commits
8da1d2f522
...
6e30edb740
Author | SHA1 | Date | |
---|---|---|---|
|
6e30edb740 | ||
|
c25fd84c11 | ||
|
0a73a40f5f | ||
|
3fec1b57a4 | ||
|
ca8b6a83fb |
6 changed files with 124 additions and 9 deletions
|
@ -187,7 +187,7 @@ class Photo extends Media
|
||||||
foreach ($sizes as $id => $meta) {
|
foreach ($sizes as $id => $meta) {
|
||||||
if (isset($meta[3]) && !$meta[3]) {
|
if (isset($meta[3]) && !$meta[3]) {
|
||||||
$res[$id] = (object) [
|
$res[$id] = (object) [
|
||||||
"url" => ovk_scheme(true) . $_SERVER["HTTP_HOST"] . "/photos/thumbnails/" . $this->getId() . "_$id.jpeg",
|
"url" => ovk_scheme(true) . $_SERVER["HTTP_HOST"] . "/photos/thumbnails/" . $this->getRecord()->hash . "_$id.jpeg",
|
||||||
"width" => null,
|
"width" => null,
|
||||||
"height" => null,
|
"height" => null,
|
||||||
"crop" => null,
|
"crop" => null,
|
||||||
|
|
|
@ -28,6 +28,17 @@ class Photos
|
||||||
return new Photo($photo);
|
return new Photo($photo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getByHash(string $hash): ?Photo
|
||||||
|
{
|
||||||
|
$photo = $this->photos->where("hash", $hash)->fetch();
|
||||||
|
|
||||||
|
if (!$photo) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Photo($photo);
|
||||||
|
}
|
||||||
|
|
||||||
public function getByOwnerAndVID(int $owner, int $vId): ?Photo
|
public function getByOwnerAndVID(int $owner, int $vId): ?Photo
|
||||||
{
|
{
|
||||||
$photo = $this->photos->where([
|
$photo = $this->photos->where([
|
||||||
|
|
|
@ -229,9 +229,9 @@ final class PhotosPresenter extends OpenVKPresenter
|
||||||
$this->renderPhoto($photo->getOwner(true)->getId(), $photo->getVirtualId());
|
$this->renderPhoto($photo->getOwner(true)->getId(), $photo->getVirtualId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function renderThumbnail($id, $size): void
|
public function renderThumbnail($hash, $size): void
|
||||||
{
|
{
|
||||||
$photo = $this->photos->get($id);
|
$photo = $this->photos->getByHash((string) $hash);
|
||||||
if (!$photo || $photo->isDeleted()) {
|
if (!$photo || $photo->isDeleted()) {
|
||||||
$this->notFound();
|
$this->notFound();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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> "{$ticket->getName()}" от <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'>"{$ticket->getName()}"</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'>"{$ticket->getName()}"</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'>"{$ticket->getName()}"</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()}'>"{$ticket->getName()}"</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"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,8 +173,10 @@ routes:
|
||||||
handler: "Photos->photo"
|
handler: "Photos->photo"
|
||||||
- url: "/photo{num}_{num}/like"
|
- url: "/photo{num}_{num}/like"
|
||||||
handler: "Photos->like"
|
handler: "Photos->like"
|
||||||
- url: "/photos/thumbnails/{num}_{text}.jpeg"
|
- url: "/photos/thumbnails/{?hash}_{text}.jpeg"
|
||||||
handler: "Photos->thumbnail"
|
handler: "Photos->thumbnail"
|
||||||
|
placeholders:
|
||||||
|
hash: "[A-z0-9\\-_\\/]{15,}"
|
||||||
- url: "/photos/{text}"
|
- url: "/photos/{text}"
|
||||||
handler: "Photos->absolutePhoto"
|
handler: "Photos->absolutePhoto"
|
||||||
- url: "/photo{num}_{num}/edit"
|
- url: "/photo{num}_{num}/edit"
|
||||||
|
|
|
@ -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 вподобань";
|
||||||
|
|
Loading…
Reference in a new issue