mirror of
https://github.com/openvk/openvk
synced 2024-11-11 01:19:53 +03:00
Merge branch 'master' of github.com:openvk/openvk
This commit is contained in:
commit
990bda4618
10 changed files with 235 additions and 16 deletions
|
@ -214,6 +214,11 @@ class User extends RowModel
|
|||
{
|
||||
return $this->getRecord()->block_reason;
|
||||
}
|
||||
|
||||
function getBanInSupportReason(): ?string
|
||||
{
|
||||
return $this->getRecord()->block_in_support_reason;
|
||||
}
|
||||
|
||||
function getType(): int
|
||||
{
|
||||
|
@ -673,6 +678,11 @@ class User extends RowModel
|
|||
{
|
||||
return !is_null($this->getBanReason());
|
||||
}
|
||||
|
||||
function isBannedInSupport(): bool
|
||||
{
|
||||
return !is_null($this->getBanInSupportReason());
|
||||
}
|
||||
|
||||
function isOnline(): bool
|
||||
{
|
||||
|
|
|
@ -346,7 +346,20 @@ final class AdminPresenter extends OpenVKPresenter
|
|||
exit(json_encode([ "error" => "User does not exist" ]));
|
||||
|
||||
$user->ban($this->queryParam("reason"));
|
||||
exit(json_encode([ "reason" => $this->queryParam("reason") ]));
|
||||
exit(json_encode([ "success" => true, "reason" => $this->queryParam("reason") ]));
|
||||
}
|
||||
|
||||
function renderQuickUnban(int $id): void
|
||||
{
|
||||
$this->assertNoCSRF();
|
||||
|
||||
$user = $this->users->get($id);
|
||||
if(!$user)
|
||||
exit(json_encode([ "error" => "User does not exist" ]));
|
||||
|
||||
$user->setBlock_Reason(null);
|
||||
$user->save();
|
||||
exit(json_encode([ "success" => true ]));
|
||||
}
|
||||
|
||||
function renderQuickWarn(int $id): void
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php declare(strict_types=1);
|
||||
namespace openvk\Web\Presenters;
|
||||
use openvk\Web\Models\Entities\Ticket;
|
||||
use openvk\Web\Models\Repositories\Tickets;
|
||||
use openvk\Web\Models\Repositories\{Tickets, Users};
|
||||
use openvk\Web\Models\Entities\TicketComment;
|
||||
use openvk\Web\Models\Repositories\TicketComments;
|
||||
use openvk\Web\Util\Telegram;
|
||||
|
@ -34,7 +34,13 @@ final class SupportPresenter extends OpenVKPresenter
|
|||
$this->template->tickets = $this->tickets->getTicketsByUserId($this->user->id, $this->template->page);
|
||||
}
|
||||
|
||||
if($this->template->mode === "new")
|
||||
$this->template->banReason = $this->user->identity->getBanInSupportReason();
|
||||
|
||||
if($_SERVER["REQUEST_METHOD"] === "POST") {
|
||||
if($this->user->identity->isBannedInSupport())
|
||||
$this->flashFail("err", tr("not_enough_permissions"), tr("not_enough_permissions_comment"));
|
||||
|
||||
if(!empty($this->postParam("name")) && !empty($this->postParam("text"))) {
|
||||
$this->willExecuteWriteAction();
|
||||
|
||||
|
@ -268,4 +274,32 @@ final class SupportPresenter extends OpenVKPresenter
|
|||
|
||||
exit(header("HTTP/1.1 200 OK"));
|
||||
}
|
||||
}
|
||||
|
||||
function renderQuickBanInSupport(int $id): void
|
||||
{
|
||||
$this->assertPermission("openvk\Web\Models\Entities\TicketReply", "write", 0);
|
||||
$this->assertNoCSRF();
|
||||
|
||||
$user = (new Users)->get($id);
|
||||
if(!$user)
|
||||
exit(json_encode([ "error" => "User does not exist" ]));
|
||||
|
||||
$user->setBlock_In_Support_Reason($this->queryParam("reason"));
|
||||
$user->save();
|
||||
$this->returnJson([ "success" => true, "reason" => $this->queryParam("reason") ]);
|
||||
}
|
||||
|
||||
function renderQuickUnbanInSupport(int $id): void
|
||||
{
|
||||
$this->assertPermission("openvk\Web\Models\Entities\TicketReply", "write", 0);
|
||||
$this->assertNoCSRF();
|
||||
|
||||
$user = (new Users)->get($id);
|
||||
if(!$user)
|
||||
exit(json_encode([ "error" => "User does not exist" ]));
|
||||
|
||||
$user->setBlock_In_Support_Reason(null);
|
||||
$user->save();
|
||||
$this->returnJson([ "success" => true ]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,16 +26,26 @@
|
|||
<br />
|
||||
|
||||
{if $isNew}
|
||||
<div class="new">
|
||||
<form action="/support" method="post" style="margin:0;">
|
||||
<center>
|
||||
<input name="name" style="width: 80%; resize: vertical;" placeholder="{_support_new_title}" /><br /><br />
|
||||
<textarea name="text" style="width: 80%; resize: vertical;" placeholder="{_support_new_content}"></textarea><br /><br />
|
||||
<input type="hidden" name="hash" value="{$csrfToken}" />
|
||||
<input type="submit" value="{_write}" class="button" style="margin-left: 70%;" /><br /><br />
|
||||
</center>
|
||||
</form>
|
||||
</div>
|
||||
{if !is_null($banReason)}
|
||||
<center>
|
||||
<img src="/assets/packages/static/openvk/img/oof.apng" alt="{_'banned_alt'}" style="width: 20%;" />
|
||||
</center>
|
||||
<p>
|
||||
{tr("banned_in_support_1", htmlentities($thisUser->getCanonicalName()))|noescape}<br/>
|
||||
{tr("banned_in_support_2", htmlentities($banReason))|noescape}
|
||||
</p>
|
||||
{else}
|
||||
<div class="new">
|
||||
<form action="/support" method="post" style="margin:0;">
|
||||
<center>
|
||||
<input name="name" style="width: 80%; resize: vertical;" placeholder="{_support_new_title}" /><br /><br />
|
||||
<textarea name="text" style="width: 80%; resize: vertical;" placeholder="{_support_new_content}"></textarea><br /><br />
|
||||
<input type="hidden" name="hash" value="{$csrfToken}" />
|
||||
<input type="submit" value="{_write}" class="button" style="margin-left: 70%;" /><br /><br />
|
||||
</center>
|
||||
</form>
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@
|
|||
<div id="profile_link" style="width: 194px;">
|
||||
<a href="/edit" class="link">{_"edit_page"}</a>
|
||||
</div>
|
||||
<div n:if="OPENVK_ROOT_CONF['openvk']['preferences']['commerce']" id="profile_link" style="width: 194px;">
|
||||
<div n:if="OPENVK_ROOT_CONF['openvk']['preferences']['commerce'] && !$thisUser->prefersNotToSeeRating()" id="profile_link" style="width: 194px;">
|
||||
<a onClick="showIncreaseRatingDialog({$thisUser->getCoins()}, {ltrim($thisUser->getUrl(), '/')}, {$csrfToken})" class="link">{_increase_rating}</a>
|
||||
</div>
|
||||
{else}
|
||||
|
@ -93,6 +93,16 @@
|
|||
{_warn_user_action}
|
||||
</a>
|
||||
{/if}
|
||||
|
||||
{if $thisUser->getChandlerUser()->can('write')->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)}
|
||||
<a href="javascript:toggleBanInSupport()" class="profile_link">
|
||||
{if $user->isBannedInSupport()}
|
||||
{_unban_in_support_user_action}
|
||||
{else}
|
||||
{_ban_in_support_user_action}
|
||||
{/if}
|
||||
</a>
|
||||
{/if}
|
||||
|
||||
<a n:if="OPENVK_ROOT_CONF['openvk']['preferences']['commerce'] && $user->getGiftCount() == 0" href="/gifts?act=pick&user={$user->getId()}" class="profile_link">{_send_gift}</a>
|
||||
<a n:if="$user->getPrivacyPermission('messages.write', $thisUser)" href="/im?sel={$user->getId()}" class="profile_link">{_"send_message"}</a>
|
||||
|
@ -512,7 +522,7 @@
|
|||
xhr = new XMLHttpRequest();
|
||||
xhr.open("GET", "/admin/ban/" + {$user->getId()} + "?reason=" + res + "&hash=" + {rawurlencode($csrfToken)}, true);
|
||||
xhr.onload = (function() {
|
||||
if(xhr.responseText.indexOf("reason") === -1)
|
||||
if(xhr.responseText.indexOf("success") === -1)
|
||||
MessageBox("Ошибка", "Не удалось забанить пользователя...", ["OK"], [Function.noop]);
|
||||
else
|
||||
MessageBox("Операция успешна", "Пользователь заблокирован", ["OK"], [Function.noop]);
|
||||
|
@ -526,7 +536,7 @@
|
|||
function warnUser() {
|
||||
uBanMsgTxt = "Вы собираетесь предупредить пользователя " + {$user->getCanonicalName()} + ".";
|
||||
uBanMsgTxt += "<br/>Мы отправим уведомление пользователю в личные сообщения от имени аккаунта администратора.";
|
||||
uBanMsgTxt += "<br/><br/><b>Текст предупреждения</b>: <input type='text' id='uWarnMsgInput' placeholder='придумайте что-нибудь крутое' />"
|
||||
uBanMsgTxt += "<br/><br/><b>Текст предупреждения</b>: <input type='text' id='uWarnMsgInput' placeholder='придумайте что-нибудь крутое' />";
|
||||
|
||||
MessageBox("Выдать предупреждение " + {$user->getFirstName()}, uBanMsgTxt, ["Подтвердить", "Отмена"], [
|
||||
(function() {
|
||||
|
@ -546,6 +556,51 @@
|
|||
}
|
||||
</script>
|
||||
|
||||
<script n:if="isset($thisUser) && $thisUser->getChandlerUser()->can('write')->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)">
|
||||
{if $user->isBannedInSupport()}
|
||||
function toggleBanInSupport() {
|
||||
uBanMsgTxt = "Вы собираетесь разблокировать в поддержке пользователя " + {$user->getCanonicalName()} + ".";
|
||||
uBanMsgTxt += "<br/>Сейчас он заблокирован по причине <strong>" + {$user->getBanInSupportReason()} + "</strong>.";
|
||||
|
||||
MessageBox("Разблокировать в поддержке " + {$user->getFirstName()}, uBanMsgTxt, ["Подтвердить", "Отмена"], [
|
||||
(function() {
|
||||
xhr = new XMLHttpRequest();
|
||||
xhr.open("GET", "/admin/support/unban/" + {$user->getId()} + "?hash=" + {rawurlencode($csrfToken)}, true);
|
||||
xhr.onload = (function() {
|
||||
if(xhr.responseText.indexOf("success") === -1)
|
||||
MessageBox("Ошибка", "Не удалось разблокировать пользователя в поддержке...", ["OK"], [Function.noop]);
|
||||
else
|
||||
MessageBox("Операция успешна", "Пользователь разблокирован в поддержке", ["OK"], [Function.noop]);
|
||||
});
|
||||
xhr.send(null);
|
||||
}),
|
||||
Function.noop
|
||||
]);
|
||||
}
|
||||
{else}
|
||||
function toggleBanInSupport() {
|
||||
uBanMsgTxt = "Вы собираетесь заблокировать в поддержке пользователя " + {$user->getCanonicalName()} + ".";
|
||||
uBanMsgTxt += "<br/><br/><b>Причина бана</b>: <input type='text' id='uBanMsgInput' placeholder='придумайте что-нибудь крутое' />";
|
||||
|
||||
MessageBox("Заблокировать в поддержке " + {$user->getFirstName()}, uBanMsgTxt, ["Подтвердить", "Отмена"], [
|
||||
(function() {
|
||||
res = document.querySelector("#uBanMsgInput").value;
|
||||
xhr = new XMLHttpRequest();
|
||||
xhr.open("GET", "/admin/support/ban/" + {$user->getId()} + "?reason=" + res + "&hash=" + {rawurlencode($csrfToken)}, true);
|
||||
xhr.onload = (function() {
|
||||
if(xhr.responseText.indexOf("success") === -1)
|
||||
MessageBox("Ошибка", "Не удалось заблокировать пользователя в поддержке...", ["OK"], [Function.noop]);
|
||||
else
|
||||
MessageBox("Операция успешна", "Пользователь заблокирован в поддержке", ["OK"], [Function.noop]);
|
||||
});
|
||||
xhr.send(null);
|
||||
}),
|
||||
Function.noop
|
||||
]);
|
||||
}
|
||||
{/if}
|
||||
</script>
|
||||
|
||||
<script n:if="isset($thisUser) && $user->getId() == $thisUser->getId()" n:syntax="off">
|
||||
function setStatusEditorShown(shown) {
|
||||
document.getElementById("status_editor").style.display = shown ? "block" : "none";
|
||||
|
|
|
@ -4,4 +4,82 @@
|
|||
{tr("user_banned", htmlentities($user->getFirstName()))|noescape}<br/>
|
||||
{_"user_banned_comment"} <b>{$user->getBanReason()}</b>.
|
||||
</p>
|
||||
<p n:if="isset($thisUser) && $thisUser->getChandlerUser()->can('access')->model('admin')->whichBelongsTo(NULL) || $thisUser->getChandlerUser()->can('write')->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)">
|
||||
<br />
|
||||
<a n:if="$thisUser->getChandlerUser()->can('access')->model('admin')->whichBelongsTo(NULL)" href="javascript:unbanUser()" class="button">{_unban_user_action}</a>
|
||||
<a n:if="$thisUser->getChandlerUser()->can('write')->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)" href="javascript:toggleBanInSupport()" class="button">
|
||||
{if $user->isBannedInSupport()}
|
||||
{_unban_in_support_user_action}
|
||||
{else}
|
||||
{_ban_in_support_user_action}
|
||||
{/if}
|
||||
</a>
|
||||
</p>
|
||||
</center>
|
||||
|
||||
<script n:if="isset($thisUser) && $thisUser->getChandlerUser()->can('access')->model('admin')->whichBelongsTo(NULL)">
|
||||
function unbanUser() {
|
||||
uUnbanMsgTxt = "Вы собираетесь разбанить пользователя " + {$user->getCanonicalName()} + ".";
|
||||
uUnbanMsgTxt += "<br/>Сейчас он заблокирован по причине: <strong>" + {$user->getBanReason()} + "</strong>.";
|
||||
|
||||
MessageBox("Разбанить " + {$user->getFirstName()}, uUnbanMsgTxt, ["Подтвердить", "Отмена"], [
|
||||
(function() {
|
||||
xhr = new XMLHttpRequest();
|
||||
xhr.open("GET", "/admin/unban/" + {$user->getId()} + "?hash=" + {rawurlencode($csrfToken)}, true);
|
||||
xhr.onload = (function() {
|
||||
if(xhr.responseText.indexOf("success") === -1)
|
||||
MessageBox("Ошибка", "Не удалось разблокировать пользователя...", ["OK"], [Function.noop]);
|
||||
else
|
||||
MessageBox("Операция успешна", "Пользователь разблокирован", ["OK"], [Function.noop]);
|
||||
});
|
||||
xhr.send(null);
|
||||
}),
|
||||
Function.noop
|
||||
]);
|
||||
}
|
||||
</script>
|
||||
|
||||
<script n:if="isset($thisUser) && $thisUser->getChandlerUser()->can('write')->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)">
|
||||
{if $user->isBannedInSupport()}
|
||||
function toggleBanInSupport() {
|
||||
uBanMsgTxt = "Вы собираетесь разблокировать в поддержке пользователя " + {$user->getCanonicalName()} + ".";
|
||||
uBanMsgTxt += "<br/>Сейчас он заблокирован по причине <strong>" + {$user->getBanInSupportReason()} + "</strong>.";
|
||||
|
||||
MessageBox("Разблокировать в поддержке " + {$user->getFirstName()}, uBanMsgTxt, ["Подтвердить", "Отмена"], [
|
||||
(function() {
|
||||
xhr = new XMLHttpRequest();
|
||||
xhr.open("GET", "/admin/support/unban/" + {$user->getId()} + "?hash=" + {rawurlencode($csrfToken)}, true);
|
||||
xhr.onload = (function() {
|
||||
if(xhr.responseText.indexOf("success") === -1)
|
||||
MessageBox("Ошибка", "Не удалось разблокировать пользователя в поддержке...", ["OK"], [Function.noop]);
|
||||
else
|
||||
MessageBox("Операция успешна", "Пользователь разблокирован в поддержке", ["OK"], [Function.noop]);
|
||||
});
|
||||
xhr.send(null);
|
||||
}),
|
||||
Function.noop
|
||||
]);
|
||||
}
|
||||
{else}
|
||||
function toggleBanInSupport() {
|
||||
uBanMsgTxt = "Вы собираетесь заблокировать в поддержке пользователя " + {$user->getCanonicalName()} + ".";
|
||||
uBanMsgTxt += "<br/><br/><b>Причина бана</b>: <input type='text' id='uBanMsgInput' placeholder='придумайте что-нибудь крутое' />";
|
||||
|
||||
MessageBox("Заблокировать в поддержке " + {$user->getFirstName()}, uBanMsgTxt, ["Подтвердить", "Отмена"], [
|
||||
(function() {
|
||||
res = document.querySelector("#uBanMsgInput").value;
|
||||
xhr = new XMLHttpRequest();
|
||||
xhr.open("GET", "/admin/support/ban/" + {$user->getId()} + "?reason=" + res + "&hash=" + {rawurlencode($csrfToken)}, true);
|
||||
xhr.onload = (function() {
|
||||
if(xhr.responseText.indexOf("success") === -1)
|
||||
MessageBox("Ошибка", "Не удалось заблокировать пользователя в поддержке...", ["OK"], [Function.noop]);
|
||||
else
|
||||
MessageBox("Операция успешна", "Пользователь заблокирован в поддержке", ["OK"], [Function.noop]);
|
||||
});
|
||||
xhr.send(null);
|
||||
}),
|
||||
Function.noop
|
||||
]);
|
||||
}
|
||||
{/if}
|
||||
</script>
|
||||
|
|
|
@ -271,8 +271,14 @@ routes:
|
|||
handler: "Admin->gifts"
|
||||
- url: "/admin/ban/{num}"
|
||||
handler: "Admin->quickBan"
|
||||
- url: "/admin/unban/{num}"
|
||||
handler: "Admin->quickUnban"
|
||||
- url: "/admin/warn/{num}"
|
||||
handler: "Admin->quickWarn"
|
||||
- url: "/admin/support/ban/{num}"
|
||||
handler: "Support->quickBanInSupport"
|
||||
- url: "/admin/support/unban/{num}"
|
||||
handler: "Support->quickUnbanInSupport"
|
||||
- url: "/method/{text}.{text}"
|
||||
handler: "VKAPI->route"
|
||||
- url: "/token"
|
||||
|
|
1
install/sqls/00019-block-in-support.sql
Normal file
1
install/sqls/00019-block-in-support.sql
Normal file
|
@ -0,0 +1 @@
|
|||
ALTER TABLE `profiles` ADD COLUMN `block_in_support_reason` text COLLATE utf8mb4_unicode_520_ci DEFAULT NULL AFTER `block_reason`;
|
|
@ -688,6 +688,9 @@
|
|||
"ticket_changed" = "Ticket changed";
|
||||
"ticket_changed_comment" = "The changes will take effect in a few seconds.";
|
||||
|
||||
"banned_in_support_1" = "Sorry, <b>$1</b>, but now you can't create tickets.";
|
||||
"banned_in_support_2" = "And the reason for this is simple: <b>$1</b>. Unfortunately, this time we had to take away this opportunity from you forever.";
|
||||
|
||||
/* Invite */
|
||||
|
||||
"invite" = "Invite";
|
||||
|
@ -831,7 +834,10 @@
|
|||
"manage_user_action" = "Manage user";
|
||||
"manage_group_action" = "Manage group";
|
||||
"ban_user_action" = "Ban user";
|
||||
"unban_user_action" = "Unban user";
|
||||
"warn_user_action" = "Warn user";
|
||||
"ban_in_support_user_action" = "Ban in support";
|
||||
"unban_in_support_user_action" = "Unban in support";
|
||||
|
||||
/* Paginator (deprecated) */
|
||||
|
||||
|
|
|
@ -725,6 +725,9 @@
|
|||
"ticket_changed" = "Тикет изменён";
|
||||
"ticket_changed_comment" = "Изменения вступят силу через несколько секунд.";
|
||||
|
||||
"banned_in_support_1" = "Извините, <b>$1</b>, но теперь вам нельзя создавать обращения.";
|
||||
"banned_in_support_2" = "А причина этому проста: <b>$1</b>. К сожалению, на этот раз нам пришлось отобрать у вас эту возможность навсегда.";
|
||||
|
||||
/* Invite */
|
||||
|
||||
"invite" = "Пригласить";
|
||||
|
@ -874,7 +877,10 @@
|
|||
"manage_user_action" = "Управление пользователем";
|
||||
"manage_group_action" = "Управление группой";
|
||||
"ban_user_action" = "Заблокировать пользователя";
|
||||
"unban_user_action" = "Разблокировать пользователя";
|
||||
"warn_user_action" = "Предупредить пользователя";
|
||||
"ban_in_support_user_action" = "Заблокировать в поддержке";
|
||||
"unban_in_support_user_action" = "Разблокировать в поддержке";
|
||||
|
||||
/* Paginator (deprecated) */
|
||||
|
||||
|
|
Loading…
Reference in a new issue