Posts: add source param

This commit is contained in:
lalka2016 2023-07-28 20:52:34 +03:00
parent a2384cc231
commit 4bcd444f87
12 changed files with 143 additions and 3 deletions

View file

@ -132,6 +132,12 @@ final class Wall extends VKAPIRequestHandler
"count" => $post->getCommentsCount(),
"can_post" => 1
],
"copyright" => !is_null($post->getSource(false)) ? (object)[
"id" => 0,
"link" => $post->getSource(false),
"name" => "none",
"type" => "link"
] : NULL,
"likes" => (object)[
"count" => $post->getLikesCount(),
"user_likes" => (int) $post->hasLikeFrom($this->getUser()),
@ -307,6 +313,12 @@ final class Wall extends VKAPIRequestHandler
"count" => $post->getCommentsCount(),
"can_post" => 1
],
"copyright" => !is_null($post->getSource(false)) ? (object)[
"id" => 0,
"link" => $post->getSource(false),
"name" => "none",
"type" => "link"
] : NULL,
"likes" => (object)[
"count" => $post->getLikesCount(),
"user_likes" => (int) $post->hasLikeFrom($user),
@ -379,7 +391,7 @@ final class Wall extends VKAPIRequestHandler
];
}
function post(string $owner_id, string $message = "", int $from_group = 0, int $signed = 0, string $attachments = ""): object
function post(string $owner_id, string $message = "", int $from_group = 0, int $signed = 0, string $attachments = "", string $copyright = NULL): object
{
$this->requireUser();
$this->willExecuteWriteAction();
@ -428,6 +440,11 @@ final class Wall extends VKAPIRequestHandler
$post->setContent($message);
$post->setFlags($flags);
$post->setApi_Source_Name($this->getPlatform());
if(!is_null($copyright) && !empty($copyright) && $copyright != "" && preg_match("/^(http:\/\/|https:\/\/)*[а-яА-ЯёЁa-z0-9\-_]+(\.[а-яА-ЯёЁa-z0-9\-_]+)+(\/\S*)*$/iu", $copyright) && iconv_strlen($copyright) < 50) {
$post->setSource($copyright);
}
$post->save();
} catch(\LogicException $ex) {
$this->fail(100, "One of the parameters specified was missing or invalid");
@ -776,6 +793,54 @@ final class Wall extends VKAPIRequestHandler
return 1;
}
function checkCopyrightLink(string $link) {
$res = (int)(!is_null($link) && !empty($link) && preg_match("/^(http:\/\/|https:\/\/)*[а-яА-ЯёЁa-z0-9\-_]+(\.[а-яА-ЯёЁa-z0-9\-_]+)+(\/\S*)*$/iu", $link) && iconv_strlen($link) < 50);
if($res == 0) {
$this->fail(3102, "Specified link is incorrect");
}
return $res;
}
function pin(int $owner_id, int $post_id) {
$this->requireUser();
$this->willExecuteWriteAction();
$post = (new PostsRepo)->getPostById($owner_id, $post_id);
if(!$post || $post->isDeleted())
$this->fail(361, "Invalid post");
if(!$post->canBePinnedBy($this->getUser()))
$this->fail(14, "Access to pinning post denied");
if(!$post->isPinned()) {
$post->pin();
return 1;
} else {
$this->fail(50, "Post is already pinned");
}
}
function unpin(int $owner_id, int $post_id) {
$this->requireUser();
$this->willExecuteWriteAction();
$post = (new PostsRepo)->getPostById($owner_id, $post_id);
if(!$post || $post->isDeleted())
$this->fail(361, "Invalid post");
if(!$post->canBePinnedBy($this->getUser()))
$this->fail(14, "Access to unpinning post denied");
if($post->isPinned()) {
$post->unpin();
return 1;
} else {
$this->fail(50, "Post is not pinned");
}
}
private function getApiPhoto($attachment) {
return [
"type" => "photo",

View file

@ -78,6 +78,31 @@ class Post extends Postable
{
return (bool) $this->getRecord()->pinned;
}
function getSource(bool $format = false)
{
if(!$format) {
return $this->getRecord()->source;
}
return $this->formatLinks($this->getRecord()->source);
}
function setSource(string $source)
{
$src = $source;
if(iconv_strlen($source) > 50)
throw new \LengthException("Link is too long.");
if(!preg_match("/^(http:\/\/|https:\/\/)*[а-яА-ЯёЁa-z0-9\-_]+(\.[а-яА-ЯёЁa-z0-9\-_]+)+(\/\S*)*$/iu", $source))
throw new \LogicException("Invalid link");
if(!str_contains($source, "https://") && !str_contains($source, "http://"))
$src = "https://" . $source;
$this->stateChanges("source", $src);
}
function isAd(): bool
{

View file

@ -305,6 +305,11 @@ final class WallPresenter extends OpenVKPresenter
$post->setAnonymous($anon);
$post->setFlags($flags);
$post->setNsfw($this->postParam("nsfw") === "on");
if($this->postParam("set_source") === "on" && !is_null($this->postParam("source")) && !empty($this->postParam("source")) && preg_match("/^(http:\/\/|https:\/\/)*[а-яА-ЯёЁa-z0-9\-_]+(\.[а-яА-ЯёЁa-z0-9\-_]+)+(\/\S*)*$/iu", $this->postParam("source")) && iconv_strlen($this->postParam("set_source")) < 50) {
$post->setSource($this->postParam("source"));
}
$post->save();
} catch (\LengthException $ex) {
$this->flashFail("err", tr("failed_to_publish_post"), tr("post_is_too_big"));

View file

@ -16,7 +16,7 @@
</div>
<div n:class="postFeedWrapper, $thisUser->hasMicroblogEnabled() ? postFeedWrapperMicroblog">
{include "../components/textArea.xml", route => "/wall" . $thisUser->getId() . "/makePost", graffiti => true, polls => true, notes => true}
{include "../components/textArea.xml", route => "/wall" . $thisUser->getId() . "/makePost", graffiti => true, polls => true, notes => true, hasSource => true}
</div>
{foreach $posts as $post}

View file

@ -77,6 +77,9 @@
<br/>
&nbsp;! Этот пост был размещён за взятку.
</div>
<div n:if="!is_null($post->getSource())" class="sourceDiv">
<span>{_source}: {$post->getSource(true)|noescape}</span>
</div>
<div n:if="$post->isSigned()" class="post-signature">
{var $actualAuthor = $post->getOwner(false)}
<span>

View file

@ -71,6 +71,9 @@
<br/>
&nbsp;! Этот пост был размещён за взятку.
</div>
<div n:if="!is_null($post->getSource())" class="sourceDiv" style="margin-top:0px;">
<span>{_source}: {$post->getSource(true)|noescape}</span>
</div>
<div n:if="$post->isSigned()" class="post-signature">
{var $actualAuthor = $post->getOwner(false)}
<span>

View file

@ -19,6 +19,29 @@
</div>
<div n:if="$postOpts ?? true" class="post-opts">
{var $anonEnabled = OPENVK_ROOT_CONF['openvk']['preferences']['wall']['anonymousPosting']['enable']}
{if $hasSource}
<label style="user-select:none;">
<input type="checkbox" name="set_source"/> <span style="color: #777777;">{_set_source}</span>
</label>
<div id="sourceSet" style="display:none;">
<input type="text" name="source" placeholder="https://youtu.be/dQw4w9WgXcQ/"/>
</div>
<script>
document.querySelector("input[name='set_source']").checked = false
$(document).on("change", "input[name='set_source']", (e) => {
if(e.currentTarget.checked) {
document.getElementById("sourceSet").style.display = "block"
e.currentTarget.parentNode.querySelector("span").innerHTML = tr("source") + ":"
} else {
document.getElementById("sourceSet").style.display = "none"
e.currentTarget.parentNode.querySelector("span").innerHTML = tr("set_source")
}
})
</script>
{/if}
{if !is_null($thisUser) && !is_null($club ?? NULL) && $owner < 0}
{if $club->canBeModifiedBy($thisUser)}
<script>

View file

@ -8,7 +8,7 @@
</div>
<div>
<div n:if="$canPost" class="content_subtitle">
{include "../components/textArea.xml", route => "/wall$owner/makePost", graffiti => true, polls => true, notes => true}
{include "../components/textArea.xml", route => "/wall$owner/makePost", graffiti => true, polls => true, notes => true, hasSource => true}
</div>
<div class="content">

View file

@ -2695,4 +2695,14 @@ body.article .floating_sidebar, body.article .page_content {
position: absolute;
right: 22px;
font-size: 12px;
}
.sourceDiv {
margin-top: 3px;
margin-left: 4px;
}
.sourceDiv span {
color:grey;
font-size: 11px;
}

View file

@ -0,0 +1,2 @@
ALTER TABLE `posts`
ADD COLUMN `source` TEXT NULL DEFAULT NULL AFTER `api_source_name`;

View file

@ -196,6 +196,8 @@
"attachment" = "Attachment";
"post_as_group" = "Post as group";
"comment_as_group" = "Comment as group";
"set_source" = "Set source";
"source" = "Source";
"add_signature" = "Add signature";
/* ^ can be translated as "author's signature". ^ */
"contains_nsfw" = "Contains NSFW content";

View file

@ -177,6 +177,8 @@
"attachment" = "Вложение";
"post_as_group" = "От имени сообщества";
"comment_as_group" = "От имени сообщества";
"set_source" = "Указать источник";
"source" = "Источник";
"add_signature" = "Подпись автора";
"contains_nsfw" = "Содержит NSFW-контент";
"nsfw_warning" = "Данный пост может содержать 18+ контент";