diff --git a/Web/Presenters/CommentPresenter.php b/Web/Presenters/CommentPresenter.php
index 4170cdb3..68a386bb 100644
--- a/Web/Presenters/CommentPresenter.php
+++ b/Web/Presenters/CommentPresenter.php
@@ -70,64 +70,24 @@ final class CommentPresenter extends OpenVKPresenter
$this->flashFail("err", tr("error_when_publishing_comment"), tr("error_when_publishing_comment_description"));
}
}
-
- $photos = [];
- if(!empty($this->postParam("photos"))) {
- $un = rtrim($this->postParam("photos"), ",");
- $arr = explode(",", $un);
- if(sizeof($arr) < 11) {
- foreach($arr as $dat) {
- $ids = explode("_", $dat);
- $photo = (new Photos)->getByOwnerAndVID((int)$ids[0], (int)$ids[1]);
-
- if(!$photo || $photo->isDeleted())
- continue;
-
- $photos[] = $photo;
- }
+ $horizontal_attachments = [];
+ $vertical_attachments = [];
+ if(!empty($this->postParam("horizontal_attachments"))) {
+ $horizontal_attachments_array = explode(",", $this->postParam("horizontal_attachments"));
+ if(sizeof($horizontal_attachments_array) <= OPENVK_ROOT_CONF["openvk"]["preferences"]["wall"]["postSizes"]["maxAttachments"]) {
+ $horizontal_attachments = parseAttachments($horizontal_attachments_array, ['photo', 'video']);
}
}
- $videos = [];
-
- if(!empty($this->postParam("videos"))) {
- $un = rtrim($this->postParam("videos"), ",");
- $arr = explode(",", $un);
-
- if(sizeof($arr) < 11) {
- foreach($arr as $dat) {
- $ids = explode("_", $dat);
- $video = (new Videos)->getByOwnerAndVID((int)$ids[0], (int)$ids[1]);
-
- if(!$video || $video->isDeleted())
- continue;
-
- $videos[] = $video;
- }
- }
- }
-
- $audios = [];
-
- if(!empty($this->postParam("audios"))) {
- $un = rtrim($this->postParam("audios"), ",");
- $arr = explode(",", $un);
-
- if(sizeof($arr) < 11) {
- foreach($arr as $dat) {
- $ids = explode("_", $dat);
- $audio = (new Audios)->getByOwnerAndVID((int)$ids[0], (int)$ids[1]);
-
- if(!$audio || $audio->isDeleted())
- continue;
-
- $audios[] = $audio;
- }
+ if(!empty($this->postParam("vertical_attachments"))) {
+ $vertical_attachments_array = explode(",", $this->postParam("vertical_attachments"));
+ if(sizeof($vertical_attachments_array) <= OPENVK_ROOT_CONF["openvk"]["preferences"]["wall"]["postSizes"]["maxAttachments"]) {
+ $vertical_attachments = parseAttachments($vertical_attachments_array, ['audio', 'note']);
}
}
- if(empty($this->postParam("text")) && sizeof($photos) < 1 && sizeof($videos) < 1 && sizeof($audios) < 1)
+ if(empty($this->postParam("text")) && sizeof($horizontal_attachments) < 1 && sizeof($vertical_attachments) < 1)
$this->flashFail("err", tr("error_when_publishing_comment"), tr("error_comment_empty"));
try {
@@ -143,15 +103,21 @@ final class CommentPresenter extends OpenVKPresenter
$this->flashFail("err", tr("error_when_publishing_comment"), tr("error_comment_too_big"));
}
- foreach($photos as $photo)
- $comment->attach($photo);
-
- if(sizeof($videos) > 0)
- foreach($videos as $vid)
- $comment->attach($vid);
+ foreach($horizontal_attachments as $horizontal_attachment) {
+ if(!$horizontal_attachment || $horizontal_attachment->isDeleted() || !$horizontal_attachment->canBeViewedBy($this->user->identity)) {
+ continue;
+ }
- foreach($audios as $audio)
- $comment->attach($audio);
+ $post->attach($horizontal_attachment);
+ }
+
+ foreach($vertical_attachments as $vertical_attachment) {
+ if(!$vertical_attachment || $vertical_attachment->isDeleted() || !$vertical_attachment->canBeViewedBy($this->user->identity)) {
+ continue;
+ }
+
+ $post->attach($vertical_attachment);
+ }
if($entity->getOwner()->getId() !== $this->user->identity->getId())
if(($owner = $entity->getOwner()) instanceof User)
diff --git a/Web/Presenters/WallPresenter.php b/Web/Presenters/WallPresenter.php
index 8cc28efe..a9d08258 100644
--- a/Web/Presenters/WallPresenter.php
+++ b/Web/Presenters/WallPresenter.php
@@ -272,25 +272,22 @@ final class WallPresenter extends OpenVKPresenter
if($this->postParam("force_sign") === "on")
$flags |= 0b01000000;
- $photos = [];
-
- if(!empty($this->postParam("photos"))) {
- $un = rtrim($this->postParam("photos"), ",");
- $arr = explode(",", $un);
-
- if(sizeof($arr) < 11) {
- foreach($arr as $dat) {
- $ids = explode("_", $dat);
- $photo = (new Photos)->getByOwnerAndVID((int)$ids[0], (int)$ids[1]);
-
- if(!$photo || $photo->isDeleted())
- continue;
-
- $photos[] = $photo;
- }
+ $horizontal_attachments = [];
+ $vertical_attachments = [];
+ if(!empty($this->postParam("horizontal_attachments"))) {
+ $horizontal_attachments_array = explode(",", $this->postParam("horizontal_attachments"));
+ if(sizeof($horizontal_attachments_array) <= OPENVK_ROOT_CONF["openvk"]["preferences"]["wall"]["postSizes"]["maxAttachments"]) {
+ $horizontal_attachments = parseAttachments($horizontal_attachments_array, ['photo', 'video']);
}
}
-
+
+ if(!empty($this->postParam("vertical_attachments"))) {
+ $vertical_attachments_array = explode(",", $this->postParam("vertical_attachments"));
+ if(sizeof($vertical_attachments_array) <= OPENVK_ROOT_CONF["openvk"]["preferences"]["wall"]["postSizes"]["maxAttachments"]) {
+ $vertical_attachments = parseAttachments($vertical_attachments_array, ['audio', 'note']);
+ }
+ }
+
try {
$poll = NULL;
$xml = $this->postParam("poll");
@@ -302,61 +299,10 @@ final class WallPresenter extends OpenVKPresenter
$this->flashFail("err", tr("failed_to_publish_post"), "Poll format invalid");
}
- $note = NULL;
-
- if(!is_null($this->postParam("note")) && $this->postParam("note") != "none") {
- $note = (new Notes)->get((int)$this->postParam("note"));
-
- if(!$note || $note->isDeleted() || $note->getOwner()->getId() != $this->user->id) {
- $this->flashFail("err", tr("error"), tr("error_attaching_note"));
- }
-
- if($note->getOwner()->getPrivacySetting("notes.read") < 1) {
- $this->flashFail("err", " ");
- }
- }
-
- $videos = [];
-
- if(!empty($this->postParam("videos"))) {
- $un = rtrim($this->postParam("videos"), ",");
- $arr = explode(",", $un);
-
- if(sizeof($arr) < 11) {
- foreach($arr as $dat) {
- $ids = explode("_", $dat);
- $video = (new Videos)->getByOwnerAndVID((int)$ids[0], (int)$ids[1]);
-
- if(!$video || $video->isDeleted())
- continue;
-
- $videos[] = $video;
- }
- }
- }
-
- $audios = [];
-
- if(!empty($this->postParam("audios"))) {
- $un = rtrim($this->postParam("audios"), ",");
- $arr = explode(",", $un);
-
- if(sizeof($arr) < 11) {
- foreach($arr as $dat) {
- $ids = explode("_", $dat);
- $audio = (new Audios)->getByOwnerAndVID((int)$ids[0], (int)$ids[1]);
-
- if(!$audio || $audio->isDeleted())
- continue;
-
- $audios[] = $audio;
- }
- }
- }
-
- if(empty($this->postParam("text")) && sizeof($photos) < 1 && sizeof($videos) < 1 && sizeof($audios) < 1 && !$poll && !$note)
+ if(empty($this->postParam("text")) && sizeof($horizontal_attachments) < 1 && sizeof($vertical_attachments) < 1 && !$poll)
$this->flashFail("err", tr("failed_to_publish_post"), tr("post_is_empty_or_too_big"));
+ $should_be_suggested = $wall < 0 && !$wallOwner->canBeModifiedBy($this->user->identity) && $wallOwner->getWallType() == 2;
try {
$post = new Post;
$post->setOwner($this->user->id);
@@ -373,7 +319,7 @@ final class WallPresenter extends OpenVKPresenter
} catch(\Throwable) {}
}
- if($wall < 0 && !$wallOwner->canBeModifiedBy($this->user->identity) && $wallOwner->getWallType() == 2)
+ if($should_be_suggested)
$post->setSuggested(1);
$post->save();
@@ -381,21 +327,24 @@ final class WallPresenter extends OpenVKPresenter
$this->flashFail("err", tr("failed_to_publish_post"), tr("post_is_too_big"));
}
- foreach($photos as $photo)
- $post->attach($photo);
-
- if(sizeof($videos) > 0)
- foreach($videos as $vid)
- $post->attach($vid);
+ foreach($horizontal_attachments as $horizontal_attachment) {
+ if(!$horizontal_attachment || $horizontal_attachment->isDeleted() || !$horizontal_attachment->canBeViewedBy($this->user->identity)) {
+ continue;
+ }
+
+ $post->attach($horizontal_attachment);
+ }
+
+ foreach($vertical_attachments as $vertical_attachment) {
+ if(!$vertical_attachment || $vertical_attachment->isDeleted() || !$vertical_attachment->canBeViewedBy($this->user->identity)) {
+ continue;
+ }
+
+ $post->attach($vertical_attachment);
+ }
if(!is_null($poll))
$post->attach($poll);
-
- if(!is_null($note))
- $post->attach($note);
-
- foreach($audios as $audio)
- $post->attach($audio);
if($wall > 0 && $wall !== $this->user->identity->getId())
(new WallPostNotification($wallOwner, $post, $this->user->identity))->emit();
@@ -404,9 +353,7 @@ final class WallPresenter extends OpenVKPresenter
if($wall > 0)
$excludeMentions[] = $wall;
- if($wall < 0 && !$wallOwner->canBeModifiedBy($this->user->identity) && $wallOwner->getWallType() == 2) {
- # Чтобы не было упоминаний из предложки
- } else {
+ if(!$should_be_suggested) {
$mentions = iterator_to_array($post->resolveMentions($excludeMentions));
foreach($mentions as $mentionee)
@@ -414,18 +361,7 @@ final class WallPresenter extends OpenVKPresenter
(new MentionNotification($mentionee, $post, $post->getOwner(), strip_tags($post->getText())))->emit();
}
- if($wall < 0 && !$wallOwner->canBeModifiedBy($this->user->identity) && $wallOwner->getWallType() == 2) {
- $suggsCount = $this->posts->getSuggestedPostsCount($wallOwner->getId());
-
- if($suggsCount % 10 == 0) {
- $managers = $wallOwner->getManagers();
- $owner = $wallOwner->getOwner();
- (new NewSuggestedPostsNotification($owner, $wallOwner))->emit();
-
- foreach($managers as $manager)
- (new NewSuggestedPostsNotification($manager->getUser(), $wallOwner))->emit();
- }
-
+ if($should_be_suggested) {
$this->redirect("/club".$wallOwner->getId()."/suggested");
} else {
$this->redirect($wallOwner->getURL());
diff --git a/Web/Presenters/templates/components/textArea.xml b/Web/Presenters/templates/components/textArea.xml
index a9f0e59c..859865ca 100644
--- a/Web/Presenters/templates/components/textArea.xml
+++ b/Web/Presenters/templates/components/textArea.xml
@@ -62,11 +62,9 @@
{_comment_as_group}
-
-
-
+
+
-
diff --git a/Web/static/js/openvk.cls.js b/Web/static/js/openvk.cls.js
index 64700084..a1b1e584 100644
--- a/Web/static/js/openvk.cls.js
+++ b/Web/static/js/openvk.cls.js
@@ -1,4 +1,7 @@
-
+if(typeof u == 'undefined') {
+ console.error('!!! You forgot to install NPM packages !!!')
+}
+
function expand_wall_textarea(id) {
var el = document.getElementById('post-buttons'+id);
var wi = document.getElementById('wall-post-input'+id);
diff --git a/bootstrap.php b/bootstrap.php
index dad4e32b..7b22115b 100644
--- a/bootstrap.php
+++ b/bootstrap.php
@@ -232,49 +232,47 @@ function ovk_is_ssl(): bool
return $GLOBALS["requestIsSSL"];
}
-function parseAttachments(string $attachments): array
+function parseAttachments($attachments, array $allow_types = ['photo', 'video', 'note', 'audio']): array
{
- $attachmentsArr = explode(",", $attachments);
- $returnArr = [];
+ $exploded_attachments = is_array($attachments) ? $attachments : explode(",", $attachments);
+ $imploded_types = implode('|', $allow_types);
+ $output_attachments = [];
+ $repositories = [
+ 'photo' => [
+ 'repo' => 'openvk\Web\Models\Repositories\Photos',
+ 'method' => 'getByOwnerAndVID',
+ ],
+ 'video' => [
+ 'repo' => 'openvk\Web\Models\Repositories\Videos',
+ 'method' => 'getByOwnerAndVID',
+ ],
+ 'audio' => [
+ 'repo' => 'openvk\Web\Models\Repositories\Audios',
+ 'method' => 'getByOwnerAndVID',
+ ],
+ 'note' => [
+ 'repo' => 'openvk\Web\Models\Repositories\Notes',
+ 'method' => 'getNoteById',
+ ],
+ ];
- foreach($attachmentsArr as $attachment) {
- $attachmentType = NULL;
+ foreach($exploded_attachments as $attachment_string) {
+ if(preg_match("/$imploded_types/", $attachment_string, $matches) == 1) {
+ $attachment_type = $matches[0];
+ if(!$repositories[$attachment_type])
+ continue;
- if(str_contains($attachment, "photo"))
- $attachmentType = "photo";
- elseif(str_contains($attachment, "video"))
- $attachmentType = "video";
- elseif(str_contains($attachment, "note"))
- $attachmentType = "note";
- elseif(str_contains($attachment, "audio"))
- $attachmentType = "audio";
+ $attachment_ids = str_replace($attachment_type, '', $attachment_string);
+ [$attachment_owner, $attachment_id] = array_map('intval', explode('_', $attachment_ids));
- $attachmentIds = str_replace($attachmentType, "", $attachment);
- $attachmentOwner = (int) explode("_", $attachmentIds)[0];
- $gatoExplotano = explode("_", $attachmentIds);
- $attachmentId = (int) end($gatoExplotano);
-
- switch($attachmentType) {
- case "photo":
- $attachmentObj = (new openvk\Web\Models\Repositories\Photos)->getByOwnerAndVID($attachmentOwner, $attachmentId);
- $returnArr[] = $attachmentObj;
- break;
- case "video":
- $attachmentObj = (new openvk\Web\Models\Repositories\Videos)->getByOwnerAndVID($attachmentOwner, $attachmentId);
- $returnArr[] = $attachmentObj;
- break;
- case "note":
- $attachmentObj = (new openvk\Web\Models\Repositories\Notes)->getNoteById($attachmentOwner, $attachmentId);
- $returnArr[] = $attachmentObj;
- break;
- case "audio":
- $attachmentObj = (new openvk\Web\Models\Repositories\Audios)->getByOwnerAndVID($attachmentOwner, $attachmentId);
- $returnArr[] = $attachmentObj;
- break;
+ $repository_class = $repositories[$attachment_type]['repo'];
+ if(!$repository_class) continue;
+ $attachment_model = (new $repository_class)->{$repositories[$attachment_type]['method']}($attachment_owner, $attachment_id);
+ $output_attachments[] = $attachment_model;
}
}
- return $returnArr;
+ return $output_attachments;
}
function ovk_scheme(bool $with_slashes = false): string
diff --git a/openvk-example.yml b/openvk-example.yml
index 25a4119c..52e8519e 100644
--- a/openvk-example.yml
+++ b/openvk-example.yml
@@ -58,6 +58,7 @@ openvk:
enable: false
account: 100
postSizes:
+ maxAttachments: 10
maxSize: 60000
processingLimit: 3000
emojiProcessingLimit: 1000