diff --git a/VKAPI/Handlers/Audio.php b/VKAPI/Handlers/Audio.php index 58bce510..9670a7ff 100644 --- a/VKAPI/Handlers/Audio.php +++ b/VKAPI/Handlers/Audio.php @@ -566,6 +566,14 @@ final class Audio extends VKAPIRequestHandler $owner_id = $owner_id == 0 ? $this->getUser()->getId() : $owner_id; $playlists = []; + + if($owner_id > 0 && $owner_id != $this->getUser()->getId()) { + $user = (new \openvk\Web\Models\Repositories\Users)->get($owner_id); + + if(!$user->getPrivacyPermission("audios.read", $this->getUser())) + $this->fail(50, "Access to playlists denied"); + } + foreach((new Audios)->getPlaylistsByEntityId($owner_id, $offset, $count) as $playlist) { if(!$playlist->canBeViewedBy($this->getUser())) { if($drop_private == 1) diff --git a/VKAPI/Handlers/Status.php b/VKAPI/Handlers/Status.php index 843f42bd..a1b104a2 100644 --- a/VKAPI/Handlers/Status.php +++ b/VKAPI/Handlers/Status.php @@ -8,13 +8,23 @@ final class Status extends VKAPIRequestHandler function get(int $user_id = 0, int $group_id = 0) { $this->requireUser(); - if($user_id == 0 && $group_id == 0) { - return $this->getUser()->getStatus(); - } else { - if($group_id > 0) - $this->fail(501, "Group statuses are not implemented"); - else - return (new UsersRepo)->get($user_id)->getStatus(); + + if($user_id == 0 && $group_id == 0) + $user_id = $this->getUser()->getId(); + + if($group_id > 0) + $this->fail(501, "Group statuses are not implemented"); + else { + $user = (new UsersRepo)->get($user_id); + $audioStatus = $user->getCurrentAudioStatus(); + if($audioStatus) { + return [ + "status" => $user->getStatus(), + "audio" => $audioStatus->toVkApiStruct(), + ]; + } + + return $user->getStatus(); } } diff --git a/VKAPI/Handlers/Users.php b/VKAPI/Handlers/Users.php index a4298787..68bf828f 100644 --- a/VKAPI/Handlers/Users.php +++ b/VKAPI/Handlers/Users.php @@ -95,6 +95,12 @@ final class Users extends VKAPIRequestHandler case "status": if($usr->getStatus() != NULL) $response[$i]->status = $usr->getStatus(); + + $audioStatus = $usr->getCurrentAudioStatus(); + + if($audioStatus) + $response[$i]->status_audio = $audioStatus->toVkApiStruct(); + break; case "screen_name": if($usr->getShortCode() != NULL) diff --git a/Web/Models/Entities/Audio.php b/Web/Models/Entities/Audio.php index 4fab06be..0fe110e3 100644 --- a/Web/Models/Entities/Audio.php +++ b/Web/Models/Entities/Audio.php @@ -313,8 +313,8 @@ class Audio extends Media $lastListen = $listensTable->where([ "entity" => $entityId, "audio" => $this->getId(), - ])->fetch(); - + ])->order("index DESC")->fetch(); + if(!$lastListen || (time() - $lastListen->time >= $this->getLength())) { $listensTable->insert([ "entity" => $entityId, @@ -331,6 +331,9 @@ class Audio extends Media $playlist->incrementListens(); $playlist->save(); } + + $entity->setLast_played_track($this->getId()); + $entity->save(); } return true; diff --git a/Web/Models/Entities/Club.php b/Web/Models/Entities/Club.php index c89f0b47..126c5127 100644 --- a/Web/Models/Entities/Club.php +++ b/Web/Models/Entities/Club.php @@ -421,4 +421,5 @@ class Club extends RowModel use Traits\TBackDrops; use Traits\TSubscribable; + use Traits\TAudioStatuses; } diff --git a/Web/Models/Entities/Traits/TAudioStatuses.php b/Web/Models/Entities/Traits/TAudioStatuses.php new file mode 100644 index 00000000..d49c4b29 --- /dev/null +++ b/Web/Models/Entities/Traits/TAudioStatuses.php @@ -0,0 +1,37 @@ +getRecord()->audio_broadcast_enabled; + } + + function getCurrentAudioStatus() + { + if(!$this->isBroadcastEnabled()) return NULL; + + $audioId = $this->getRecord()->last_played_track; + + if(!$audioId) return NULL; + $audio = (new Audios)->get($audioId); + + if(!$audio || $audio->isDeleted()) + return NULL; + + $listensTable = DatabaseConnection::i()->getContext()->table("audio_listens"); + $lastListen = $listensTable->where([ + "entity" => $this->getRealId(), + "audio" => $audio->getId(), + "time >" => (time() - $audio->getLength()) - 10, + ])->fetch(); + + if($lastListen) + return $audio; + + return NULL; + } +} \ No newline at end of file diff --git a/Web/Models/Entities/User.php b/Web/Models/Entities/User.php index 2114b5ab..ac903404 100644 --- a/Web/Models/Entities/User.php +++ b/Web/Models/Entities/User.php @@ -1249,7 +1249,32 @@ class User extends RowModel return $res; } - + + function getFriendsAudios() + { + $friendsCount = $this->getFriendsCount(); + $friends = $this->getFriends(max(rand(1, (int)ceil($friendsCount / 6)), 1), 6); + + $shuffleSeed = openssl_random_pseudo_bytes(6); + $shuffleSeed = hexdec(bin2hex($shuffleSeed)); + + $friends = knuth_shuffle($friends, $shuffleSeed); + $returnArr = []; + + foreach($friends as $friend) { + $returnArr[] = [ + "id" => $friend->getRealId(), + "name" => $friend->getCanonicalName(), + "avatar" => $friend->getAvatarURL("miniscule"), + "tracksCount" => (new \openvk\Web\Models\Repositories\Audios)->getUserCollectionSize($friend), + "nowListening" => $friend->getCurrentAudioStatus(), + ]; + } + + return $returnArr; + } + use Traits\TBackDrops; use Traits\TSubscribable; + use Traits\TAudioStatuses; } diff --git a/Web/Presenters/AudioPresenter.php b/Web/Presenters/AudioPresenter.php index 2b5786c1..a673e7d1 100644 --- a/Web/Presenters/AudioPresenter.php +++ b/Web/Presenters/AudioPresenter.php @@ -109,6 +109,9 @@ final class AudioPresenter extends OpenVKPresenter $this->template->mode = $mode; $this->template->page = $page; + + if(in_array($mode, ["list", "new", "popular"])) + $this->template->friendsAudios = $this->user->identity->getFriendsAudios(); } function renderEmbed(int $owner, int $id): void diff --git a/Web/Presenters/UserPresenter.php b/Web/Presenters/UserPresenter.php index 8dc65840..56d5685b 100644 --- a/Web/Presenters/UserPresenter.php +++ b/Web/Presenters/UserPresenter.php @@ -47,7 +47,8 @@ final class UserPresenter extends OpenVKPresenter $this->template->notesCount = (new Notes)->getUserNotesCount($user); $this->template->audios = (new Audios)->getRandomThreeAudiosByEntityId($user->getId()); $this->template->audiosCount = (new Audios)->getUserCollectionSize($user); - + $this->template->audioStatus = $user->getCurrentAudioStatus(); + $this->template->user = $user; } } @@ -171,6 +172,7 @@ final class UserPresenter extends OpenVKPresenter if ($this->postParam("gender") <= 1 && $this->postParam("gender") >= 0) $user->setSex($this->postParam("gender")); + $user->setAudio_broadcast_enabled($this->checkbox("broadcast_music")); if(!empty($this->postParam("phone")) && $this->postParam("phone") !== $user->getPhone()) { if(!OPENVK_ROOT_CONF["openvk"]["credentials"]["smsc"]["enable"]) @@ -243,6 +245,7 @@ final class UserPresenter extends OpenVKPresenter } $user->setStatus(empty($this->postParam("status")) ? NULL : $this->postParam("status")); + $user->setAudio_broadcast_enabled($this->postParam("broadcast") == 1); $user->save(); $this->returnJson([ diff --git a/Web/Presenters/templates/Audio/tabs.xml b/Web/Presenters/templates/Audio/tabs.xml index 96db234e..3f58c94f 100644 --- a/Web/Presenters/templates/Audio/tabs.xml +++ b/Web/Presenters/templates/Audio/tabs.xml @@ -20,5 +20,20 @@ {if $ownerId > 0}{_playlists_user}{else}{_playlists_club}{/if} {_new_playlist} {/if} + + {if $friendsAudios} +
+ {/if} \ No newline at end of file diff --git a/Web/Presenters/templates/User/Edit.xml b/Web/Presenters/templates/User/Edit.xml index b8e8398c..0a28b879 100644 --- a/Web/Presenters/templates/User/Edit.xml +++ b/Web/Presenters/templates/User/Edit.xml @@ -160,6 +160,13 @@ +