2020-08-12 14:36:18 +03:00
< ? php declare ( strict_types = 1 );
namespace openvk\VKAPI\Handlers ;
use openvk\Web\Models\Entities\User ;
2023-11-16 19:44:12 +03:00
use openvk\Web\Models\Entities\Notifications\ { PostAcceptedNotification , WallPostNotification , NewSuggestedPostsNotification , RepostNotification , CommentNotification };
2020-08-12 14:36:18 +03:00
use openvk\Web\Models\Repositories\Users as UsersRepo ;
2020-11-01 01:36:35 +03:00
use openvk\Web\Models\Entities\Club ;
use openvk\Web\Models\Repositories\Clubs as ClubsRepo ;
2020-08-12 14:36:18 +03:00
use openvk\Web\Models\Entities\Post ;
use openvk\Web\Models\Repositories\Posts as PostsRepo ;
2022-07-23 15:50:00 +03:00
use openvk\Web\Models\Entities\Comment ;
use openvk\Web\Models\Repositories\Comments as CommentsRepo ;
VKAPI: методы для подарков, заметок, статусов, обсуждений и немного для фоток и групп (#876)
* API methods for gifts, notes, statuses
* Some fixes
Строки локализации у gifts.send теперь не костыльные и можно прикрепить до 10 аттачей к посту
* Small imp
Пофиксил пагинацию у заметков и подарок
Перенёс структуру заметок
Добавил аттачи к комментариям
Добавил проверку на удалённость аттача
Ну и пофиксил сортировку заметок
* VKAPI: Some methods for topics and photos
Добавлены методы для обсуждений (addTopic, closeTopic(), createComment(), deleteComment(), deleteTopic(), editTopic(), fixTopic(), getComments(), getTopics(), openTopic(), unfixTopic())
и для фотографий (createAlbum(), editAlbum(), getAlbums(), getAlbumsCount(), getById(), get(), deleteAlbum(), edit(), delete(), deleteComment(), createComment(), getAll(), getComments())
* fixsex
2023-06-13 21:03:43 +03:00
use openvk\Web\Models\Entities\Photo ;
use openvk\Web\Models\Repositories\Photos as PhotosRepo ;
use openvk\Web\Models\Entities\Video ;
use openvk\Web\Models\Repositories\Videos as VideosRepo ;
2023-07-05 14:54:58 +03:00
use openvk\Web\Models\Entities\Note ;
use openvk\Web\Models\Repositories\Notes as NotesRepo ;
2023-11-14 22:44:39 +03:00
use openvk\Web\Models\Repositories\Polls as PollsRepo ;
Music, finally! (#512)
* Add audio upload feature
* Add audio embed thing
* Move bullet.gif to ovk
* Draft some music API methods
* Add support for base64 ids to Audios.getById
* Disallow having more than 65k audios in playlist
* Add playlist model
* Draft some playlist-related API methods
* Fix behabiour of album-related methods
Generators f***** me in le a**
* Add IDv3 autofill
* Add sql dumps
i forgor to upload it xdddd
* Add playlists sql
* Fix audio upload not working on Windows 11 because Windows is the worst operating system which doesn't work properly under any circumstances
* Fix cocksex in audio.get
yes
* Интерфейсы
* Interface updade
* Update en.strings
* Add audio queue
* Make repeat button work
* Some improvements to audio queue
* Фгвшщ йгугу шьзкщмуьутеы
* Make shuffle and "наушники" buttons work, add f...
avicons when playing audio, save some values (like volume and last played track) to localstorage, add ability to toggle time type in player, fix uploading audios with cover (maybe) and add dragndrop to upload page
* Add funny tip with time when hover track div
* Add something
* Add audios picker & move track in smal player вниз
* Summary (required)
Description
* [WIP] Add calls, stories and clips.
Изменены фавиконки (поменьше стали)
У миниплеера ползунок теперь в стиле bsdn и большого плеера, добавлен ползунок громкости
Добавлена кнопка добавления аудио в группу (у миниплеера)
Если вы смотрите аудио группы, которой можете управлять, появляется кнопка "удалить аудио из группы"
Снизу плейлиста в списке теперь показывается автор.
При прикреплении аудиозаписей к посту теперь есть поиск "по композиции" и "по исполнителю"
Добавил explicit.svg, который я забыл добавить в предыдущем коммите.
Вкладочки немного переделаны
При наведении на кнопки "трек вперёд" или "трек назад" показывается название предыдущего или следующего трека соответственно
* 1 new commit to master: [WIP]: Add audios
- Теперь группа может разрешать загружать всем треки в неё
- Теперь треки загружаются на сервер ajax'ом, и так можно очень много аудио загружать
- Вёрстка списка плейлистов изменена, теперь она на гридах
- Немного изменено апи, теперь метод editAlbum сохраняет новую информацию ee объект плейлистов теперь возвращают реальное время
- Удалены лишние пути из routes.yml
- При переключении страниц теперь если на текущей странице есть играющий трек, он нормально подсвечивается
- Из init-db.sql удалены таблицы аудиозаписей
- В Groups.getSettings и groups.edit теперь есть информация о аудиозаписях
* (смешное название коммита)
- Теперь на странице пользователя/группы показываются три случайные песни, а не первые три как раньше
- Теперь пробел на странице аудио не перемещает вас в низ страницы
- Оптимизирован мини-плеер, теперь он инициализируется при любом нажатии на него, а не при наведении
- Теперь при завершении проигрывания трека в мини-плеере он ищет другой трек рядом, и если находит то воспроизводит. Будет удобно для постов с подборками треков
- Поиск теперь показывает 14 результатов
- Теперь при возникновении ошибки загрузки аудио она нормально отображается
- Вместе с плеером на странице с аудиозаписями теперь двигаются и вкладки
- Добавление аудио в группу по идее должно нормально работать
* Implement playlists listens
- У плейлистов теперь есть прослушивания в общем.
- Прослушивания у большого плеера теперь засчитываются, если трек был дослушан до конца
- В объекте плейлистов теперь возвращается listens и cover_url
- Получение плееров через /audios/context переписано, повторяющийся код удалён, правда сильно количество строк сократить не получилось
- Теперь цвета плеера темнее, а иконка проигрывания изменена
- Теперь, если очередь из треков кончилась, то плеер перенаправляет вас в начало очереди.
* php 8.2 fixxxxxxxxxxxxxxxxxxxxxxx
* Implement audiostatuses
Добавлены аудиостатусы (у пользователей), блок с друзьями, слушающих музыку на странице аудиозаписей, объект status_audio в users.get, улучшены настройки приватности и ещё что-то
* ?
- Переделан метод в классе user для получения друзей с проигрываемыми песнями. Теперь среди них могут появляться и группы (хз стоит ли оставлять это или нет). Так же больше не показываются удалённые пользователи
- Трек у плеера теперь двигается немного плавнее. Ещё теперь нету смешных багов с подсказкой времени, когда можно было увести её за экран или промотать дальше трека. Переключить повторение трека теперь можно нажатием кнопки R.
- Длинное название трека больше не сносит время
- Наверное, теперь аудиозаписи нормально отображаются в темах midnight и modern
- Аудиозаписи больше не крашаются, если пользователь неавторизован.
- Немного переделан миниплеер.
- В миниплеере теперь громкость берётся из локалсторейджа.
- Улучшено редактирование аудиозаписей. Теперь данные в дата атрибуты нормально сохраняются, а так же слова песни и метка "explicit" меняются
- Удалён css, оставшийся ещё от public technical preview 1, а так же путь /audios{num}
- При наведении на трек теперь пропадает время, и на его месте появляются кнопки
- Стандартная аватарка в midnight теперь инвертируется
- В админке в редактировании аудио теперь показывается дата редактирования, дата создания, длина и оригинальный файл аудио. Так же на странице редактирования больше нет вылетов, если вы задали несуществующий аккаунт
* !
- Добавлены строки для мобильной темы
- Добавлено предупреждение перед полным удалением плейлиста
- Нажатие кнопки M = нажатие кнопки наушников
- В классе апи Audio поставлены willExecuteWriteAction, ещё теперь нельзя получить число аудиозаписей у пользователей, которые их закрыли. Ещё теперь нельзя получать uploaded_only аудиозаписи у тех ну вы поняли короче.
- При наведении на длинное название песни оно теперь показывается полностью
- Надо ещё что-то сюда написать, так что: При редактировании аудиозаписи название окна теперь не "Редактировать", а "Редактировать аудиозапись", а вместо кнопки OK кнопка "Сохранить"
* .
- Добавлен тур по аудиозаписям, но пока без скриншотов.
- "Мои Аудиозаписи" в меню теперь располагаются под Моими Видеозаписями для канона
- В настройках приватности "кто может видеть мои аудиозаписи" теперь располагаются под "кто может видеть мои видеозаписи"
- В настройках внешнего вида мои аудиозаписи тоже под видео
- Изменён <title> на странице аудиозаписей. Теперь показывается "Аудиозаписи" + имя пользователя в родительном падеже. А если это группа, то "Аудиозаписи группы". То же самое с плейлистами
- Исправлены ссылка в ссылке на странице с плейлистами
- При наведении на название песни больше не сносится иконка explicit
- Добавлена максимальная длина названия и описания плейлиста при редактировании.
* М
- Долокализована админка (точно помню, что уже делал это, но ладно)
- Удалён лишний пункт "audios" в getLeftMenuItemStatus (реально)
- Если. У плеера есть параметр "hideButtons", то при наведении на него не пропадает время.
- На странице редактирования/создания плейлиста если у песни длинное название, то оно да похуй короче. Ну в общем лучше стало
- Там где нужно, добавлена строка в конце файла
- Возвращена строка "photo" в английской локали (я её случайно удалил :+1: )
* у
- У изъятых аудиозаписей больше не показывается кнопка "добавить в группу". Так же при нажатии на кнопку удаления из коллекции окно не всплывает.
- "Удаление аудио из группы" тоже лучше работать стало с изъятыми аудио.
* з
- В пикере аудиозаписей "more..." заменено на "показать больше аудиозаписей"
- Если включен режим показа оставшегося времени, то при окончании песни больше не показывается "--1:--1"
- В пикере аудиозаписей, если у вас нет аудиозаписей и вы ничего не искали, показывается "Вы ещё не добавляли аудиозаписей"
- <hr>'ы стали серыми
- Добавлены title'ы у кнопок в большом плеере
- Проставлены alt'ы у плейлистов
* Musique: linux saport)
назар хуйню релизнул кста, плейерс клаб два не слушайте не рекомендую
* Update and rename gamma-00000-disco.sql to 00041-music.sql
* Update 00041-music.sql
---------
Co-authored-by: Ilya Prokopenko <dsrev@protonmail.com>
Co-authored-by: n1rwana <aydashkin@vk.com>
Co-authored-by: lalka2018 <99399973+lalka2016@users.noreply.github.com>
Co-authored-by: veselcraft <veselcraft@icloud.com>
Co-authored-by: DeathPleiad <43928323+Parad1seF0x@users.noreply.github.com>
2023-11-12 00:41:07 +03:00
use openvk\Web\Models\Repositories\Audios as AudiosRepo ;
2020-08-12 14:36:18 +03:00
final class Wall extends VKAPIRequestHandler
{
2024-11-19 16:31:17 +03:00
function get ( int $owner_id , string $domain = " " , int $offset = 0 , int $count = 30 , int $extended = 0 , string $filter = " all " , int $rss = 0 ) : object
2020-08-12 14:36:18 +03:00
{
2022-12-22 01:05:49 +03:00
$this -> requireUser ();
2023-04-29 19:33:58 +03:00
2022-07-21 22:13:09 +03:00
$posts = new PostsRepo ;
2020-08-12 14:36:18 +03:00
2022-07-21 22:13:09 +03:00
$items = [];
2021-11-24 22:24:44 +03:00
$profiles = [];
2022-07-21 22:13:09 +03:00
$groups = [];
2023-11-16 19:44:12 +03:00
$cnt = 0 ;
2020-08-12 14:36:18 +03:00
2022-10-11 03:25:20 +03:00
if ( $owner_id > 0 )
$wallOnwer = ( new UsersRepo ) -> get ( $owner_id );
else
$wallOnwer = ( new ClubsRepo ) -> get ( $owner_id * - 1 );
2022-07-31 13:25:00 +03:00
2022-10-11 03:25:20 +03:00
if ( $owner_id > 0 )
if ( ! $wallOnwer || $wallOnwer -> isDeleted ())
$this -> fail ( 18 , " User was deleted or banned " );
2023-12-02 20:21:16 +03:00
if ( ! $wallOnwer -> canBeViewedBy ( $this -> getUser ()))
$this -> fail ( 15 , " Access denied " );
2022-10-11 03:25:20 +03:00
else
if ( ! $wallOnwer )
$this -> fail ( 15 , " Access denied: wall is disabled " ); // Don't search for logic here pls
2022-07-31 13:25:00 +03:00
2023-11-16 19:44:12 +03:00
$iteratorv ;
switch ( $filter ) {
case " all " :
$iteratorv = $posts -> getPostsFromUsersWall ( $owner_id , 1 , $count , $offset );
$cnt = $posts -> getPostCountOnUserWall ( $owner_id );
break ;
case " owner " :
$iteratorv = $posts -> getOwnersPostsFromWall ( $owner_id , 1 , $count , $offset );
$cnt = $posts -> getOwnersCountOnUserWall ( $owner_id );
break ;
case " others " :
$iteratorv = $posts -> getOthersPostsFromWall ( $owner_id , 1 , $count , $offset );
$cnt = $posts -> getOthersCountOnUserWall ( $owner_id );
break ;
case " postponed " :
$this -> fail ( 42 , " Postponed posts are not implemented. " );
break ;
case " suggests " :
if ( $owner_id < 0 ) {
if ( $wallOnwer -> getWallType () != 2 )
$this -> fail ( 125 , " Group's wall type is open or closed " );
if ( $wallOnwer -> canBeModifiedBy ( $this -> getUser ())) {
$iteratorv = $posts -> getSuggestedPosts ( $owner_id * - 1 , 1 , $count , $offset );
$cnt = $posts -> getSuggestedPostsCount ( $owner_id * - 1 );
} else {
$iteratorv = $posts -> getSuggestedPostsByUser ( $owner_id * - 1 , $this -> getUser () -> getId (), 1 , $count , $offset );
$cnt = $posts -> getSuggestedPostsCountByUser ( $owner_id * - 1 , $this -> getUser () -> getId ());
}
} else {
$this -> fail ( 528 , " Suggested posts avaiable only at groups " );
}
break ;
default :
$this -> fail ( 254 , " Invalid filter " );
break ;
}
2024-11-19 16:31:17 +03:00
$iteratorv = iterator_to_array ( $iteratorv );
2023-11-16 19:44:12 +03:00
foreach ( $iteratorv as $post ) {
2021-11-24 22:24:44 +03:00
$from_id = get_class ( $post -> getOwner ()) == " openvk \ Web \ Models \ Entities \ Club " ? $post -> getOwner () -> getId () * ( - 1 ) : $post -> getOwner () -> getId ();
2022-03-25 14:05:44 +03:00
2022-05-01 17:04:59 +03:00
$attachments = [];
2022-07-23 03:25:17 +03:00
$repost = [];
2022-05-01 17:04:59 +03:00
foreach ( $post -> getChildren () as $attachment ) {
if ( $attachment instanceof \openvk\Web\Models\Entities\Photo ) {
if ( $attachment -> isDeleted ())
continue ;
2023-04-29 19:33:58 +03:00
2022-07-23 03:25:17 +03:00
$attachments [] = $this -> getApiPhoto ( $attachment );
2022-10-12 01:00:52 +03:00
} else if ( $attachment instanceof \openvk\Web\Models\Entities\Poll ) {
2022-10-12 12:23:57 +03:00
$attachments [] = $this -> getApiPoll ( $attachment , $this -> getUser ());
2023-01-31 14:23:34 +03:00
} else if ( $attachment instanceof \openvk\Web\Models\Entities\Video ) {
2023-11-15 11:41:18 +03:00
$attachments [] = $attachment -> getApiStructure ( $this -> getUser ());
2023-07-05 14:54:58 +03:00
} else if ( $attachment instanceof \openvk\Web\Models\Entities\Note ) {
2024-11-01 14:46:41 +03:00
if ( VKAPI_DECL_VER === '4.100' ) {
$attachments [] = $attachment -> toVkApiStruct ();
} else {
$attachments [] = [
'type' => 'note' ,
'note' => $attachment -> toVkApiStruct ()
];
}
Music, finally! (#512)
* Add audio upload feature
* Add audio embed thing
* Move bullet.gif to ovk
* Draft some music API methods
* Add support for base64 ids to Audios.getById
* Disallow having more than 65k audios in playlist
* Add playlist model
* Draft some playlist-related API methods
* Fix behabiour of album-related methods
Generators f***** me in le a**
* Add IDv3 autofill
* Add sql dumps
i forgor to upload it xdddd
* Add playlists sql
* Fix audio upload not working on Windows 11 because Windows is the worst operating system which doesn't work properly under any circumstances
* Fix cocksex in audio.get
yes
* Интерфейсы
* Interface updade
* Update en.strings
* Add audio queue
* Make repeat button work
* Some improvements to audio queue
* Фгвшщ йгугу шьзкщмуьутеы
* Make shuffle and "наушники" buttons work, add f...
avicons when playing audio, save some values (like volume and last played track) to localstorage, add ability to toggle time type in player, fix uploading audios with cover (maybe) and add dragndrop to upload page
* Add funny tip with time when hover track div
* Add something
* Add audios picker & move track in smal player вниз
* Summary (required)
Description
* [WIP] Add calls, stories and clips.
Изменены фавиконки (поменьше стали)
У миниплеера ползунок теперь в стиле bsdn и большого плеера, добавлен ползунок громкости
Добавлена кнопка добавления аудио в группу (у миниплеера)
Если вы смотрите аудио группы, которой можете управлять, появляется кнопка "удалить аудио из группы"
Снизу плейлиста в списке теперь показывается автор.
При прикреплении аудиозаписей к посту теперь есть поиск "по композиции" и "по исполнителю"
Добавил explicit.svg, который я забыл добавить в предыдущем коммите.
Вкладочки немного переделаны
При наведении на кнопки "трек вперёд" или "трек назад" показывается название предыдущего или следующего трека соответственно
* 1 new commit to master: [WIP]: Add audios
- Теперь группа может разрешать загружать всем треки в неё
- Теперь треки загружаются на сервер ajax'ом, и так можно очень много аудио загружать
- Вёрстка списка плейлистов изменена, теперь она на гридах
- Немного изменено апи, теперь метод editAlbum сохраняет новую информацию ee объект плейлистов теперь возвращают реальное время
- Удалены лишние пути из routes.yml
- При переключении страниц теперь если на текущей странице есть играющий трек, он нормально подсвечивается
- Из init-db.sql удалены таблицы аудиозаписей
- В Groups.getSettings и groups.edit теперь есть информация о аудиозаписях
* (смешное название коммита)
- Теперь на странице пользователя/группы показываются три случайные песни, а не первые три как раньше
- Теперь пробел на странице аудио не перемещает вас в низ страницы
- Оптимизирован мини-плеер, теперь он инициализируется при любом нажатии на него, а не при наведении
- Теперь при завершении проигрывания трека в мини-плеере он ищет другой трек рядом, и если находит то воспроизводит. Будет удобно для постов с подборками треков
- Поиск теперь показывает 14 результатов
- Теперь при возникновении ошибки загрузки аудио она нормально отображается
- Вместе с плеером на странице с аудиозаписями теперь двигаются и вкладки
- Добавление аудио в группу по идее должно нормально работать
* Implement playlists listens
- У плейлистов теперь есть прослушивания в общем.
- Прослушивания у большого плеера теперь засчитываются, если трек был дослушан до конца
- В объекте плейлистов теперь возвращается listens и cover_url
- Получение плееров через /audios/context переписано, повторяющийся код удалён, правда сильно количество строк сократить не получилось
- Теперь цвета плеера темнее, а иконка проигрывания изменена
- Теперь, если очередь из треков кончилась, то плеер перенаправляет вас в начало очереди.
* php 8.2 fixxxxxxxxxxxxxxxxxxxxxxx
* Implement audiostatuses
Добавлены аудиостатусы (у пользователей), блок с друзьями, слушающих музыку на странице аудиозаписей, объект status_audio в users.get, улучшены настройки приватности и ещё что-то
* ?
- Переделан метод в классе user для получения друзей с проигрываемыми песнями. Теперь среди них могут появляться и группы (хз стоит ли оставлять это или нет). Так же больше не показываются удалённые пользователи
- Трек у плеера теперь двигается немного плавнее. Ещё теперь нету смешных багов с подсказкой времени, когда можно было увести её за экран или промотать дальше трека. Переключить повторение трека теперь можно нажатием кнопки R.
- Длинное название трека больше не сносит время
- Наверное, теперь аудиозаписи нормально отображаются в темах midnight и modern
- Аудиозаписи больше не крашаются, если пользователь неавторизован.
- Немного переделан миниплеер.
- В миниплеере теперь громкость берётся из локалсторейджа.
- Улучшено редактирование аудиозаписей. Теперь данные в дата атрибуты нормально сохраняются, а так же слова песни и метка "explicit" меняются
- Удалён css, оставшийся ещё от public technical preview 1, а так же путь /audios{num}
- При наведении на трек теперь пропадает время, и на его месте появляются кнопки
- Стандартная аватарка в midnight теперь инвертируется
- В админке в редактировании аудио теперь показывается дата редактирования, дата создания, длина и оригинальный файл аудио. Так же на странице редактирования больше нет вылетов, если вы задали несуществующий аккаунт
* !
- Добавлены строки для мобильной темы
- Добавлено предупреждение перед полным удалением плейлиста
- Нажатие кнопки M = нажатие кнопки наушников
- В классе апи Audio поставлены willExecuteWriteAction, ещё теперь нельзя получить число аудиозаписей у пользователей, которые их закрыли. Ещё теперь нельзя получать uploaded_only аудиозаписи у тех ну вы поняли короче.
- При наведении на длинное название песни оно теперь показывается полностью
- Надо ещё что-то сюда написать, так что: При редактировании аудиозаписи название окна теперь не "Редактировать", а "Редактировать аудиозапись", а вместо кнопки OK кнопка "Сохранить"
* .
- Добавлен тур по аудиозаписям, но пока без скриншотов.
- "Мои Аудиозаписи" в меню теперь располагаются под Моими Видеозаписями для канона
- В настройках приватности "кто может видеть мои аудиозаписи" теперь располагаются под "кто может видеть мои видеозаписи"
- В настройках внешнего вида мои аудиозаписи тоже под видео
- Изменён <title> на странице аудиозаписей. Теперь показывается "Аудиозаписи" + имя пользователя в родительном падеже. А если это группа, то "Аудиозаписи группы". То же самое с плейлистами
- Исправлены ссылка в ссылке на странице с плейлистами
- При наведении на название песни больше не сносится иконка explicit
- Добавлена максимальная длина названия и описания плейлиста при редактировании.
* М
- Долокализована админка (точно помню, что уже делал это, но ладно)
- Удалён лишний пункт "audios" в getLeftMenuItemStatus (реально)
- Если. У плеера есть параметр "hideButtons", то при наведении на него не пропадает время.
- На странице редактирования/создания плейлиста если у песни длинное название, то оно да похуй короче. Ну в общем лучше стало
- Там где нужно, добавлена строка в конце файла
- Возвращена строка "photo" в английской локали (я её случайно удалил :+1: )
* у
- У изъятых аудиозаписей больше не показывается кнопка "добавить в группу". Так же при нажатии на кнопку удаления из коллекции окно не всплывает.
- "Удаление аудио из группы" тоже лучше работать стало с изъятыми аудио.
* з
- В пикере аудиозаписей "more..." заменено на "показать больше аудиозаписей"
- Если включен режим показа оставшегося времени, то при окончании песни больше не показывается "--1:--1"
- В пикере аудиозаписей, если у вас нет аудиозаписей и вы ничего не искали, показывается "Вы ещё не добавляли аудиозаписей"
- <hr>'ы стали серыми
- Добавлены title'ы у кнопок в большом плеере
- Проставлены alt'ы у плейлистов
* Musique: linux saport)
назар хуйню релизнул кста, плейерс клаб два не слушайте не рекомендую
* Update and rename gamma-00000-disco.sql to 00041-music.sql
* Update 00041-music.sql
---------
Co-authored-by: Ilya Prokopenko <dsrev@protonmail.com>
Co-authored-by: n1rwana <aydashkin@vk.com>
Co-authored-by: lalka2018 <99399973+lalka2016@users.noreply.github.com>
Co-authored-by: veselcraft <veselcraft@icloud.com>
Co-authored-by: DeathPleiad <43928323+Parad1seF0x@users.noreply.github.com>
2023-11-12 00:41:07 +03:00
} else if ( $attachment instanceof \openvk\Web\Models\Entities\Audio ) {
2023-11-13 15:08:18 +03:00
$attachments [] = [
" type " => " audio " ,
" audio " => $attachment -> toVkApiStruct ( $this -> getUser ()),
];
2022-07-23 03:25:17 +03:00
} else if ( $attachment instanceof \openvk\Web\Models\Entities\Post ) {
$repostAttachments = [];
foreach ( $attachment -> getChildren () as $repostAttachment ) {
if ( $repostAttachment instanceof \openvk\Web\Models\Entities\Photo ) {
2022-10-09 17:39:22 +03:00
if ( $repostAttachment -> isDeleted ())
2022-07-23 03:25:17 +03:00
continue ;
2023-04-29 19:33:58 +03:00
2022-07-23 03:25:17 +03:00
$repostAttachments [] = $this -> getApiPhoto ( $repostAttachment );
/* Рекурсии, сука! Заказывали? */
}
}
2022-10-25 13:18:02 +03:00
if ( $attachment -> isPostedOnBehalfOfGroup ())
$groups [] = $attachment -> getOwner () -> getId ();
else
$profiles [] = $attachment -> getOwner () -> getId ();
2022-10-17 23:24:10 +03:00
2022-07-23 03:25:17 +03:00
$repost [] = [
" id " => $attachment -> getVirtualId (),
2022-07-23 03:39:05 +03:00
" owner_id " => $attachment -> isPostedOnBehalfOfGroup () ? $attachment -> getOwner () -> getId () * - 1 : $attachment -> getOwner () -> getId (),
" from_id " => $attachment -> isPostedOnBehalfOfGroup () ? $attachment -> getOwner () -> getId () * - 1 : $attachment -> getOwner () -> getId (),
2022-07-23 03:25:17 +03:00
" date " => $attachment -> getPublicationTime () -> timestamp (),
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
" post_type " => $attachment -> getVkApiType (),
2022-07-23 03:25:17 +03:00
" text " => $attachment -> getText ( false ),
" attachments " => $repostAttachments ,
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
" post_source " => $attachment -> getPostSourceInfo (),
2022-03-25 14:05:44 +03:00
];
2023-11-18 08:01:33 +03:00
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
if ( $attachment -> getTargetWall () > 0 )
$profiles [] = $attachment -> getTargetWall ();
2023-11-18 08:01:33 +03:00
else
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
$groups [] = abs ( $attachment -> getTargetWall ());
2023-11-18 08:01:33 +03:00
if ( $post -> isSigned ())
$profiles [] = $attachment -> getOwner () -> getId ();
2022-03-25 14:05:44 +03:00
}
}
2023-11-16 19:44:12 +03:00
$signerId = NULL ;
if ( $post -> isSigned ()) {
$actualAuthor = $post -> getOwner ( false );
$signerId = $actualAuthor -> getId ();
}
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
# TODO "can_pin", "copy_history" и прочее не должны возвращаться, если равны null или false
# Н у и ещё всё надо перенести в toVkApiStruct, а то слишком много дублированного кода
$post_temp_obj = ( object )[
2022-07-21 22:13:09 +03:00
" id " => $post -> getVirtualId (),
" from_id " => $from_id ,
" owner_id " => $post -> getTargetWall (),
" date " => $post -> getPublicationTime () -> timestamp (),
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
" post_type " => $post -> getVkApiType (),
2022-07-21 22:13:09 +03:00
" text " => $post -> getText ( false ),
2022-07-23 03:25:17 +03:00
" copy_history " => $repost ,
2023-11-14 22:44:39 +03:00
" can_edit " => $post -> canBeEditedBy ( $this -> getUser ()),
2022-07-21 22:13:09 +03:00
" can_delete " => $post -> canBeDeletedBy ( $this -> getUser ()),
" can_pin " => $post -> canBePinnedBy ( $this -> getUser ()),
" can_archive " => false , # TODO MAYBE
" is_archived " => false ,
" is_pinned " => $post -> isPinned (),
2023-07-12 18:38:01 +03:00
" is_explicit " => $post -> isExplicit (),
2022-07-21 22:13:09 +03:00
" attachments " => $attachments ,
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
" post_source " => $post -> getPostSourceInfo (),
2022-07-21 22:13:09 +03:00
" comments " => ( object )[
" count " => $post -> getCommentsCount (),
2020-08-12 14:36:18 +03:00
" can_post " => 1
],
" likes " => ( object )[
2022-07-21 22:13:09 +03:00
" count " => $post -> getLikesCount (),
" user_likes " => ( int ) $post -> hasLikeFrom ( $this -> getUser ()),
" can_like " => 1 ,
2020-08-12 14:36:18 +03:00
" can_publish " => 1 ,
],
" reposts " => ( object )[
2022-07-21 22:13:09 +03:00
" count " => $post -> getRepostCount (),
2020-08-12 14:36:18 +03:00
" user_reposted " => 0
]
];
2023-04-29 19:33:58 +03:00
2024-11-01 14:46:41 +03:00
if ( $post -> hasSource ())
$post_temp_obj -> copyright = $post -> getVkApiCopyright ();
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
if ( $signerId )
$post_temp_obj -> signer_id = $signerId ;
if ( $post -> isDeactivationMessage ())
$post_temp_obj -> final_post = 1 ;
2024-12-13 17:53:36 +03:00
if ( $post -> getGeo ())
$post_temp_obj -> geo = $post -> getVkApiGeo ();
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
$items [] = $post_temp_obj ;
2021-11-24 22:24:44 +03:00
if ( $from_id > 0 )
$profiles [] = $from_id ;
else
2022-07-21 22:13:09 +03:00
$groups [] = $from_id * - 1 ;
2022-03-25 22:29:29 +03:00
2023-11-16 19:44:12 +03:00
if ( $post -> isSigned ())
$profiles [] = $post -> getOwner ( false ) -> getId ();
2022-05-08 13:06:26 +03:00
$attachments = NULL ; # free attachments so it will not clone everythingg
2020-08-12 14:36:18 +03:00
}
2024-11-19 16:31:17 +03:00
if ( $rss == 1 ) {
$channel = new \Bhaktaraz\RSSGenerator\Channel ();
$channel -> title ( $wallOnwer -> getCanonicalName () . " — " . OPENVK_ROOT_CONF [ 'openvk' ][ 'appearance' ][ 'name' ])
-> description ( 'Wall of ' . $wallOnwer -> getCanonicalName ())
-> url ( ovk_scheme ( true ) . $_SERVER [ " HTTP_HOST " ] . " /wall " . $wallOnwer -> getRealId ());
foreach ( $iteratorv as $item ) {
$output = $item -> toRss ();
$output -> appendTo ( $channel );
}
return $channel ;
}
2022-07-21 22:13:09 +03:00
if ( $extended == 1 ) {
2021-11-24 22:24:44 +03:00
$profiles = array_unique ( $profiles );
2022-07-21 22:13:09 +03:00
$groups = array_unique ( $groups );
2021-11-24 22:24:44 +03:00
$profilesFormatted = [];
2022-07-21 22:13:09 +03:00
$groupsFormatted = [];
2020-08-12 14:36:18 +03:00
2022-07-21 22:13:09 +03:00
foreach ( $profiles as $prof ) {
$user = ( new UsersRepo ) -> get ( $prof );
2021-11-24 22:24:44 +03:00
$profilesFormatted [] = ( object )[
2022-07-21 22:13:09 +03:00
" first_name " => $user -> getFirstName (),
" id " => $user -> getId (),
" last_name " => $user -> getLastName (),
2023-12-02 20:21:16 +03:00
" can_access_closed " => ( bool ) $user -> canBeViewedBy ( $this -> getUser ()),
" is_closed " => $user -> isClosed (),
2023-11-30 17:39:55 +03:00
" sex " => $user -> isFemale () ? 1 : ( $user -> isNeutral () ? 0 : 2 ),
2022-07-21 22:13:09 +03:00
" screen_name " => $user -> getShortCode (),
" photo_50 " => $user -> getAvatarUrl (),
" photo_100 " => $user -> getAvatarUrl (),
2023-04-29 19:33:58 +03:00
" online " => $user -> isOnline (),
" verified " => $user -> isVerified ()
2021-11-24 22:24:44 +03:00
];
}
2020-08-12 14:36:18 +03:00
2021-11-24 22:24:44 +03:00
foreach ( $groups as $g ) {
2022-07-21 22:13:09 +03:00
$group = ( new ClubsRepo ) -> get ( $g );
2021-11-24 22:24:44 +03:00
$groupsFormatted [] = ( object )[
2022-07-21 22:13:09 +03:00
" id " => $group -> getId (),
" name " => $group -> getName (),
2021-11-24 22:24:44 +03:00
" screen_name " => $group -> getShortCode (),
2022-07-21 22:13:09 +03:00
" is_closed " => 0 ,
" type " => " group " ,
" photo_50 " => $group -> getAvatarUrl (),
" photo_100 " => $group -> getAvatarUrl (),
" photo_200 " => $group -> getAvatarUrl (),
2023-04-29 19:33:58 +03:00
" verified " => $group -> isVerified ()
2021-11-24 22:24:44 +03:00
];
}
2022-07-21 22:13:09 +03:00
return ( object ) [
2022-08-21 00:30:56 +03:00
" count " => $cnt ,
" items " => $items ,
" profiles " => $profilesFormatted ,
" groups " => $groupsFormatted
2021-11-24 22:24:44 +03:00
];
2022-07-21 22:13:09 +03:00
} else
return ( object ) [
2022-08-21 00:30:56 +03:00
" count " => $cnt ,
" items " => $items
2021-11-24 22:24:44 +03:00
];
2020-08-12 14:36:18 +03:00
}
2020-11-01 01:36:35 +03:00
2022-05-08 13:06:26 +03:00
function getById ( string $posts , int $extended = 0 , string $fields = " " , User $user = NULL )
2022-03-19 03:31:27 +03:00
{
2022-07-24 00:42:28 +03:00
if ( $user == NULL ) {
$this -> requireUser ();
2022-07-21 22:13:09 +03:00
$user = $this -> getUser (); # костыли костыли крылышки
2022-07-24 00:42:28 +03:00
}
2022-03-19 03:31:27 +03:00
2022-07-21 22:13:09 +03:00
$items = [];
2022-03-19 03:31:27 +03:00
$profiles = [];
2022-07-21 22:13:09 +03:00
$groups = [];
2022-03-19 03:31:27 +03:00
2022-07-21 22:13:09 +03:00
$psts = explode ( ',' , $posts );
2022-03-19 03:31:27 +03:00
2022-07-21 22:13:09 +03:00
foreach ( $psts as $pst ) {
$id = explode ( " _ " , $pst );
2024-11-17 13:03:49 +03:00
$post = ( new PostsRepo ) -> getPostById ( intval ( $id [ 0 ]), intval ( $id [ 1 ]), true );
2023-12-02 20:21:16 +03:00
2023-06-29 18:36:01 +03:00
if ( $post && ! $post -> isDeleted ()) {
2023-12-02 20:21:16 +03:00
if ( ! $post -> canBeViewedBy ( $this -> getUser ()))
continue ;
2024-11-17 13:03:49 +03:00
if ( $post -> getSuggestionType () != 0 && ! $post -> canBeEditedBy ( $this -> getUser ())) {
continue ;
}
2022-03-19 03:31:27 +03:00
$from_id = get_class ( $post -> getOwner ()) == " openvk \ Web \ Models \ Entities \ Club " ? $post -> getOwner () -> getId () * ( - 1 ) : $post -> getOwner () -> getId ();
2022-07-23 03:25:17 +03:00
$attachments = [];
$repost = []; // чел высрал семь сигарет 😳 помянем 🕯
2022-07-21 22:13:09 +03:00
foreach ( $post -> getChildren () as $attachment ) {
if ( $attachment instanceof \openvk\Web\Models\Entities\Photo ) {
2022-07-23 03:25:17 +03:00
$attachments [] = $this -> getApiPhoto ( $attachment );
2022-10-12 01:00:52 +03:00
} else if ( $attachment instanceof \openvk\Web\Models\Entities\Poll ) {
2022-10-12 12:23:57 +03:00
$attachments [] = $this -> getApiPoll ( $attachment , $user );
2023-01-31 14:23:34 +03:00
} else if ( $attachment instanceof \openvk\Web\Models\Entities\Video ) {
2023-11-15 11:41:18 +03:00
$attachments [] = $attachment -> getApiStructure ( $this -> getUser ());
2023-07-05 14:54:58 +03:00
} else if ( $attachment instanceof \openvk\Web\Models\Entities\Note ) {
2024-12-13 17:53:36 +03:00
$attachments [] = [
'type' => 'note' ,
'note' => $attachment -> toVkApiStruct ()
];
Music, finally! (#512)
* Add audio upload feature
* Add audio embed thing
* Move bullet.gif to ovk
* Draft some music API methods
* Add support for base64 ids to Audios.getById
* Disallow having more than 65k audios in playlist
* Add playlist model
* Draft some playlist-related API methods
* Fix behabiour of album-related methods
Generators f***** me in le a**
* Add IDv3 autofill
* Add sql dumps
i forgor to upload it xdddd
* Add playlists sql
* Fix audio upload not working on Windows 11 because Windows is the worst operating system which doesn't work properly under any circumstances
* Fix cocksex in audio.get
yes
* Интерфейсы
* Interface updade
* Update en.strings
* Add audio queue
* Make repeat button work
* Some improvements to audio queue
* Фгвшщ йгугу шьзкщмуьутеы
* Make shuffle and "наушники" buttons work, add f...
avicons when playing audio, save some values (like volume and last played track) to localstorage, add ability to toggle time type in player, fix uploading audios with cover (maybe) and add dragndrop to upload page
* Add funny tip with time when hover track div
* Add something
* Add audios picker & move track in smal player вниз
* Summary (required)
Description
* [WIP] Add calls, stories and clips.
Изменены фавиконки (поменьше стали)
У миниплеера ползунок теперь в стиле bsdn и большого плеера, добавлен ползунок громкости
Добавлена кнопка добавления аудио в группу (у миниплеера)
Если вы смотрите аудио группы, которой можете управлять, появляется кнопка "удалить аудио из группы"
Снизу плейлиста в списке теперь показывается автор.
При прикреплении аудиозаписей к посту теперь есть поиск "по композиции" и "по исполнителю"
Добавил explicit.svg, который я забыл добавить в предыдущем коммите.
Вкладочки немного переделаны
При наведении на кнопки "трек вперёд" или "трек назад" показывается название предыдущего или следующего трека соответственно
* 1 new commit to master: [WIP]: Add audios
- Теперь группа может разрешать загружать всем треки в неё
- Теперь треки загружаются на сервер ajax'ом, и так можно очень много аудио загружать
- Вёрстка списка плейлистов изменена, теперь она на гридах
- Немного изменено апи, теперь метод editAlbum сохраняет новую информацию ee объект плейлистов теперь возвращают реальное время
- Удалены лишние пути из routes.yml
- При переключении страниц теперь если на текущей странице есть играющий трек, он нормально подсвечивается
- Из init-db.sql удалены таблицы аудиозаписей
- В Groups.getSettings и groups.edit теперь есть информация о аудиозаписях
* (смешное название коммита)
- Теперь на странице пользователя/группы показываются три случайные песни, а не первые три как раньше
- Теперь пробел на странице аудио не перемещает вас в низ страницы
- Оптимизирован мини-плеер, теперь он инициализируется при любом нажатии на него, а не при наведении
- Теперь при завершении проигрывания трека в мини-плеере он ищет другой трек рядом, и если находит то воспроизводит. Будет удобно для постов с подборками треков
- Поиск теперь показывает 14 результатов
- Теперь при возникновении ошибки загрузки аудио она нормально отображается
- Вместе с плеером на странице с аудиозаписями теперь двигаются и вкладки
- Добавление аудио в группу по идее должно нормально работать
* Implement playlists listens
- У плейлистов теперь есть прослушивания в общем.
- Прослушивания у большого плеера теперь засчитываются, если трек был дослушан до конца
- В объекте плейлистов теперь возвращается listens и cover_url
- Получение плееров через /audios/context переписано, повторяющийся код удалён, правда сильно количество строк сократить не получилось
- Теперь цвета плеера темнее, а иконка проигрывания изменена
- Теперь, если очередь из треков кончилась, то плеер перенаправляет вас в начало очереди.
* php 8.2 fixxxxxxxxxxxxxxxxxxxxxxx
* Implement audiostatuses
Добавлены аудиостатусы (у пользователей), блок с друзьями, слушающих музыку на странице аудиозаписей, объект status_audio в users.get, улучшены настройки приватности и ещё что-то
* ?
- Переделан метод в классе user для получения друзей с проигрываемыми песнями. Теперь среди них могут появляться и группы (хз стоит ли оставлять это или нет). Так же больше не показываются удалённые пользователи
- Трек у плеера теперь двигается немного плавнее. Ещё теперь нету смешных багов с подсказкой времени, когда можно было увести её за экран или промотать дальше трека. Переключить повторение трека теперь можно нажатием кнопки R.
- Длинное название трека больше не сносит время
- Наверное, теперь аудиозаписи нормально отображаются в темах midnight и modern
- Аудиозаписи больше не крашаются, если пользователь неавторизован.
- Немного переделан миниплеер.
- В миниплеере теперь громкость берётся из локалсторейджа.
- Улучшено редактирование аудиозаписей. Теперь данные в дата атрибуты нормально сохраняются, а так же слова песни и метка "explicit" меняются
- Удалён css, оставшийся ещё от public technical preview 1, а так же путь /audios{num}
- При наведении на трек теперь пропадает время, и на его месте появляются кнопки
- Стандартная аватарка в midnight теперь инвертируется
- В админке в редактировании аудио теперь показывается дата редактирования, дата создания, длина и оригинальный файл аудио. Так же на странице редактирования больше нет вылетов, если вы задали несуществующий аккаунт
* !
- Добавлены строки для мобильной темы
- Добавлено предупреждение перед полным удалением плейлиста
- Нажатие кнопки M = нажатие кнопки наушников
- В классе апи Audio поставлены willExecuteWriteAction, ещё теперь нельзя получить число аудиозаписей у пользователей, которые их закрыли. Ещё теперь нельзя получать uploaded_only аудиозаписи у тех ну вы поняли короче.
- При наведении на длинное название песни оно теперь показывается полностью
- Надо ещё что-то сюда написать, так что: При редактировании аудиозаписи название окна теперь не "Редактировать", а "Редактировать аудиозапись", а вместо кнопки OK кнопка "Сохранить"
* .
- Добавлен тур по аудиозаписям, но пока без скриншотов.
- "Мои Аудиозаписи" в меню теперь располагаются под Моими Видеозаписями для канона
- В настройках приватности "кто может видеть мои аудиозаписи" теперь располагаются под "кто может видеть мои видеозаписи"
- В настройках внешнего вида мои аудиозаписи тоже под видео
- Изменён <title> на странице аудиозаписей. Теперь показывается "Аудиозаписи" + имя пользователя в родительном падеже. А если это группа, то "Аудиозаписи группы". То же самое с плейлистами
- Исправлены ссылка в ссылке на странице с плейлистами
- При наведении на название песни больше не сносится иконка explicit
- Добавлена максимальная длина названия и описания плейлиста при редактировании.
* М
- Долокализована админка (точно помню, что уже делал это, но ладно)
- Удалён лишний пункт "audios" в getLeftMenuItemStatus (реально)
- Если. У плеера есть параметр "hideButtons", то при наведении на него не пропадает время.
- На странице редактирования/создания плейлиста если у песни длинное название, то оно да похуй короче. Ну в общем лучше стало
- Там где нужно, добавлена строка в конце файла
- Возвращена строка "photo" в английской локали (я её случайно удалил :+1: )
* у
- У изъятых аудиозаписей больше не показывается кнопка "добавить в группу". Так же при нажатии на кнопку удаления из коллекции окно не всплывает.
- "Удаление аудио из группы" тоже лучше работать стало с изъятыми аудио.
* з
- В пикере аудиозаписей "more..." заменено на "показать больше аудиозаписей"
- Если включен режим показа оставшегося времени, то при окончании песни больше не показывается "--1:--1"
- В пикере аудиозаписей, если у вас нет аудиозаписей и вы ничего не искали, показывается "Вы ещё не добавляли аудиозаписей"
- <hr>'ы стали серыми
- Добавлены title'ы у кнопок в большом плеере
- Проставлены alt'ы у плейлистов
* Musique: linux saport)
назар хуйню релизнул кста, плейерс клаб два не слушайте не рекомендую
* Update and rename gamma-00000-disco.sql to 00041-music.sql
* Update 00041-music.sql
---------
Co-authored-by: Ilya Prokopenko <dsrev@protonmail.com>
Co-authored-by: n1rwana <aydashkin@vk.com>
Co-authored-by: lalka2018 <99399973+lalka2016@users.noreply.github.com>
Co-authored-by: veselcraft <veselcraft@icloud.com>
Co-authored-by: DeathPleiad <43928323+Parad1seF0x@users.noreply.github.com>
2023-11-12 00:41:07 +03:00
} else if ( $attachment instanceof \openvk\Web\Models\Entities\Audio ) {
2023-11-13 15:08:18 +03:00
$attachments [] = [
" type " => " audio " ,
" audio " => $attachment -> toVkApiStruct ( $this -> getUser ())
];
2022-07-23 03:25:17 +03:00
} else if ( $attachment instanceof \openvk\Web\Models\Entities\Post ) {
$repostAttachments = [];
foreach ( $attachment -> getChildren () as $repostAttachment ) {
if ( $repostAttachment instanceof \openvk\Web\Models\Entities\Photo ) {
if ( $attachment -> isDeleted ())
continue ;
2023-04-29 19:33:58 +03:00
2022-07-23 03:25:17 +03:00
$repostAttachments [] = $this -> getApiPhoto ( $repostAttachment );
/* Рекурсии, сука! Заказывали? */
}
2023-04-29 19:33:58 +03:00
}
2022-10-24 19:05:41 +03:00
if ( $attachment -> isPostedOnBehalfOfGroup ())
$groups [] = $attachment -> getOwner () -> getId ();
else
$profiles [] = $attachment -> getOwner () -> getId ();
2022-07-23 03:25:17 +03:00
$repost [] = [
" id " => $attachment -> getVirtualId (),
2022-07-23 03:39:05 +03:00
" owner_id " => $attachment -> isPostedOnBehalfOfGroup () ? $attachment -> getOwner () -> getId () * - 1 : $attachment -> getOwner () -> getId (),
" from_id " => $attachment -> isPostedOnBehalfOfGroup () ? $attachment -> getOwner () -> getId () * - 1 : $attachment -> getOwner () -> getId (),
2022-07-23 03:25:17 +03:00
" date " => $attachment -> getPublicationTime () -> timestamp (),
" post_type " => " post " ,
" text " => $attachment -> getText ( false ),
" attachments " => $repostAttachments ,
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
" post_source " => $attachment -> getPostSourceInfo (),
2022-03-25 14:05:44 +03:00
];
2023-11-18 08:01:33 +03:00
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
if ( $attachment -> getTargetWall () > 0 )
$profiles [] = $attachment -> getTargetWall ();
2023-11-18 08:01:33 +03:00
else
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
$groups [] = abs ( $attachment -> getTargetWall ());
2023-11-18 08:01:33 +03:00
if ( $post -> isSigned ())
$profiles [] = $attachment -> getOwner () -> getId ();
2022-03-25 14:05:44 +03:00
}
}
2023-11-16 19:44:12 +03:00
if ( $post -> isSigned ()) {
$actualAuthor = $post -> getOwner ( false );
$signerId = $actualAuthor -> getId ();
}
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
$post_temp_obj = ( object )[
2022-07-21 22:13:09 +03:00
" id " => $post -> getVirtualId (),
" from_id " => $from_id ,
" owner_id " => $post -> getTargetWall (),
" date " => $post -> getPublicationTime () -> timestamp (),
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
" post_type " => $post -> getVkApiType (),
2022-07-21 22:13:09 +03:00
" text " => $post -> getText ( false ),
2022-07-23 03:25:17 +03:00
" copy_history " => $repost ,
2023-11-14 22:44:39 +03:00
" can_edit " => $post -> canBeEditedBy ( $this -> getUser ()),
2022-07-21 22:13:09 +03:00
" can_delete " => $post -> canBeDeletedBy ( $user ),
" can_pin " => $post -> canBePinnedBy ( $user ),
" can_archive " => false , # TODO MAYBE
" is_archived " => false ,
" is_pinned " => $post -> isPinned (),
2023-07-12 18:38:01 +03:00
" is_explicit " => $post -> isExplicit (),
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
" post_source " => $post -> getPostSourceInfo (),
2022-07-21 22:13:09 +03:00
" attachments " => $attachments ,
" comments " => ( object )[
" count " => $post -> getCommentsCount (),
2022-03-19 03:31:27 +03:00
" can_post " => 1
],
" likes " => ( object )[
2022-07-21 22:13:09 +03:00
" count " => $post -> getLikesCount (),
" user_likes " => ( int ) $post -> hasLikeFrom ( $user ),
" can_like " => 1 ,
2022-03-19 03:31:27 +03:00
" can_publish " => 1 ,
],
" reposts " => ( object )[
2022-07-21 22:13:09 +03:00
" count " => $post -> getRepostCount (),
2022-03-19 03:31:27 +03:00
" user_reposted " => 0
]
];
2023-04-29 19:33:58 +03:00
2024-11-01 14:46:41 +03:00
if ( $post -> hasSource ())
$post_temp_obj -> copyright = $post -> getVkApiCopyright ();
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
if ( $signerId )
$post_temp_obj -> signer_id = $signerId ;
if ( $post -> isDeactivationMessage ())
$post_temp_obj -> final_post = 1 ;
2024-12-13 17:53:36 +03:00
if ( $post -> getGeo ())
$post_temp_obj -> geo = $post -> getVkApiGeo ();
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
$items [] = $post_temp_obj ;
2022-03-19 03:31:27 +03:00
if ( $from_id > 0 )
$profiles [] = $from_id ;
else
2022-07-21 22:13:09 +03:00
$groups [] = $from_id * - 1 ;
2022-03-25 22:29:29 +03:00
2023-11-16 19:44:12 +03:00
if ( $post -> isSigned ())
$profiles [] = $post -> getOwner ( false ) -> getId ();
2022-07-23 03:25:17 +03:00
$attachments = NULL ; # free attachments so it will not clone everything
$repost = NULL ; # same
2022-03-19 03:31:27 +03:00
}
}
2022-07-21 22:13:09 +03:00
if ( $extended == 1 ) {
2022-03-19 03:31:27 +03:00
$profiles = array_unique ( $profiles );
2022-07-21 22:13:09 +03:00
$groups = array_unique ( $groups );
2022-03-19 03:31:27 +03:00
$profilesFormatted = [];
2022-07-21 22:13:09 +03:00
$groupsFormatted = [];
2022-03-19 03:31:27 +03:00
2022-07-21 22:13:09 +03:00
foreach ( $profiles as $prof ) {
$user = ( new UsersRepo ) -> get ( $prof );
2023-12-01 15:10:13 +03:00
if ( $user ) {
$profilesFormatted [] = ( object )[
" first_name " => $user -> getFirstName (),
" id " => $user -> getId (),
" last_name " => $user -> getLastName (),
2023-12-02 20:21:16 +03:00
" can_access_closed " => ( bool ) $user -> canBeViewedBy ( $this -> getUser ()),
" is_closed " => $user -> isClosed (),
2023-12-01 15:10:13 +03:00
" sex " => $user -> isFemale () ? 1 : 2 ,
" screen_name " => $user -> getShortCode (),
" photo_50 " => $user -> getAvatarUrl (),
" photo_100 " => $user -> getAvatarUrl (),
" online " => $user -> isOnline (),
" verified " => $user -> isVerified ()
];
} else {
$profilesFormatted [] = ( object )[
" id " => ( int ) $prof ,
" first_name " => " DELETED " ,
" last_name " => " " ,
" deactivated " => " deleted "
];
}
2022-03-19 03:31:27 +03:00
}
foreach ( $groups as $g ) {
2022-07-21 22:13:09 +03:00
$group = ( new ClubsRepo ) -> get ( $g );
2022-03-19 03:31:27 +03:00
$groupsFormatted [] = ( object )[
2022-07-21 22:13:09 +03:00
" id " => $group -> getId (),
" name " => $group -> getName (),
" screen_name " => $group -> getShortCode (),
" is_closed " => 0 ,
" type " => " group " ,
" photo_50 " => $group -> getAvatarUrl (),
" photo_100 " => $group -> getAvatarUrl (),
" photo_200 " => $group -> getAvatarUrl (),
2023-04-29 19:33:58 +03:00
" verified " => $group -> isVerified ()
2022-03-19 03:31:27 +03:00
];
}
2022-07-21 22:13:09 +03:00
return ( object ) [
" items " => ( array ) $items ,
2022-03-19 03:31:27 +03:00
" profiles " => ( array ) $profilesFormatted ,
2022-07-21 22:13:09 +03:00
" groups " => ( array ) $groupsFormatted
2022-03-19 03:31:27 +03:00
];
2022-07-21 22:13:09 +03:00
} else
return ( object ) [
2022-03-19 03:31:27 +03:00
" items " => ( array ) $items
];
}
2024-12-13 17:53:36 +03:00
function post ( string $owner_id , string $message = " " , string $copyright = " " , int $from_group = 0 , int $signed = 0 , string $attachments = " " , int $post_id = 0 ,
float $lat = NULL ,
float $long = NULL ,
string $place_name = ''
) : object
2020-11-01 01:36:35 +03:00
{
$this -> requireUser ();
2023-02-08 14:20:50 +03:00
$this -> willExecuteWriteAction ();
2020-11-01 01:36:35 +03:00
2022-07-21 22:13:09 +03:00
$owner_id = intval ( $owner_id );
2023-04-29 19:33:58 +03:00
2020-11-01 01:36:35 +03:00
$wallOwner = ( $owner_id > 0 ? ( new UsersRepo ) -> get ( $owner_id ) : ( new ClubsRepo ) -> get ( $owner_id * - 1 ))
? ? $this -> fail ( 18 , " User was deleted or banned " );
if ( $owner_id > 0 )
2023-12-02 20:21:16 +03:00
$canPost = $wallOwner -> getPrivacyPermission ( " wall.write " , $this -> getUser ()) && $wallOwner -> canBeViewedBy ( $this -> getUser ());
2020-11-01 01:36:35 +03:00
else if ( $owner_id < 0 )
if ( $wallOwner -> canBeModifiedBy ( $this -> getUser ()))
$canPost = true ;
else
$canPost = $wallOwner -> canPost ();
else
2023-04-29 19:33:58 +03:00
$canPost = false ;
2020-11-01 01:36:35 +03:00
if ( $canPost == false ) $this -> fail ( 15 , " Access denied " );
2023-11-16 19:44:12 +03:00
if ( $post_id > 0 ) {
if ( $owner_id > 0 )
$this -> fail ( 62 , " Suggested posts available only at groups " );
$post = ( new PostsRepo ) -> getPostById ( $owner_id , $post_id , true );
if ( ! $post || $post -> isDeleted ())
$this -> fail ( 32 , " Invald post " );
if ( $post -> getSuggestionType () == 0 )
$this -> fail ( 20 , " Post is not suggested " );
if ( $post -> getSuggestionType () == 2 )
$this -> fail ( 16 , " Post is declined " );
if ( ! $post -> canBePinnedBy ( $this -> getUser ()))
$this -> fail ( 51 , " Access denied " );
$author = $post -> getOwner ();
$flags = 0 ;
$flags |= 0 b10000000 ;
if ( $signed == 1 )
$flags |= 0 b01000000 ;
$post -> setSuggested ( 0 );
$post -> setCreated ( time ());
$post -> setFlags ( $flags );
if ( ! empty ( $message ) && iconv_strlen ( $message ) > 0 )
$post -> setContent ( $message );
$post -> save ();
if ( $author -> getId () != $this -> getUser () -> getId ())
( new PostAcceptedNotification ( $author , $post , $post -> getWallOwner ())) -> emit ();
return ( object )[ " post_id " => $post -> getVirtualId ()];
}
2022-01-15 18:15:37 +03:00
$anon = OPENVK_ROOT_CONF [ " openvk " ][ " preferences " ][ " wall " ][ " anonymousPosting " ][ " enable " ];
if ( $wallOwner instanceof Club && $from_group == 1 && $signed != 1 && $anon ) {
$manager = $wallOwner -> getManager ( $this -> getUser ());
if ( $manager )
$anon = $manager -> isHidden ();
elseif ( $this -> getUser () -> getId () === $wallOwner -> getOwner () -> getId ())
$anon = $wallOwner -> isOwnerHidden ();
} else {
$anon = false ;
}
2020-11-01 01:36:35 +03:00
$flags = 0 ;
2022-01-15 18:51:04 +03:00
if ( $from_group == 1 && $wallOwner instanceof Club && $wallOwner -> canBeModifiedBy ( $this -> getUser ()))
2020-11-01 01:36:35 +03:00
$flags |= 0 b10000000 ;
2021-11-15 11:43:15 +03:00
if ( $signed == 1 )
$flags |= 0 b01000000 ;
2020-11-01 01:36:35 +03:00
2024-11-17 13:03:49 +03:00
$parsed_attachments = parseAttachments ( $attachments , [ 'photo' , 'video' , 'note' , 'poll' , 'audio' ]);
$final_attachments = [];
$should_be_suggested = $owner_id < 0 && ! $wallOwner -> canBeModifiedBy ( $this -> getUser ()) && $wallOwner -> getWallType () == 2 ;
foreach ( $parsed_attachments as $attachment ) {
if ( $attachment && ! $attachment -> isDeleted () && $attachment -> canBeViewedBy ( $this -> getUser ()) &&
! ( method_exists ( $attachment , 'getVoters' ) && $attachment -> getOwner () -> getId () != $this -> getUser () -> getId ())) {
$final_attachments [] = $attachment ;
}
}
if (( empty ( $message ) && ( empty ( $attachments ) || sizeof ( $final_attachments ) < 1 )))
2022-01-15 19:50:03 +03:00
$this -> fail ( 100 , " Required parameter 'message' missing. " );
2020-11-01 01:36:35 +03:00
try {
$post = new Post ;
$post -> setOwner ( $this -> getUser () -> getId ());
$post -> setWall ( $owner_id );
$post -> setCreated ( time ());
$post -> setContent ( $message );
$post -> setFlags ( $flags );
2022-12-17 02:03:02 +03:00
$post -> setApi_Source_Name ( $this -> getPlatform ());
2023-11-16 19:44:12 +03:00
2024-11-01 14:46:41 +03:00
if ( ! is_null ( $copyright ) && ! empty ( $copyright )) {
try {
$post -> setSource ( $copyright );
} catch ( \Throwable ) {}
}
2024-12-13 17:53:36 +03:00
/* $info = file_get_contents ( " https://nominatim.openstreetmap.org/reverse?lat= ${ latitude}&lon=${longitude } &format=jsonv2 " , false , stream_context_create ([
'http' => [
'method' => 'GET' ,
'header' => implode ( " \r \n " , [
'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2' ,
" Referer: https:// $_SERVER[SERVER_NAME] / "
])
]
]));
if ( $info ) {
$info = json_decode ( $info , true , JSON_UNESCAPED_UNICODE );
if ( key_exists ( " place_id " , $info )) {
$geo [ " name " ] = $info [ " name " ] ? ? $info [ " display_name " ];
}
} */
if ( $lat && $long ) {
if (( $lat > 90 || $lat < - 90 ) || ( $long > 180 || $long < - 180 )) {
$this -> fail ( - 785 , 'Invalid geo info' );
}
$latitude = number_format (( float ) $lat , 8 , " . " , '' );
$longitude = number_format (( float ) $long , 8 , " . " , '' );
$res = [
'lat' => $latitude ,
'lng' => $longitude
];
if ( $place_name && mb_strlen ( $place_name ) > 0 ) {
$res [ 'name' ] = $place_name ;
} else {
$res [ 'name' ] = 'Geopoint' ;
}
$post -> setGeo ( json_encode ( $res ));
$post -> setGeo_Lat ( $latitude );
$post -> setGeo_Lon ( $longitude );
}
2024-11-17 13:03:49 +03:00
if ( $should_be_suggested )
2023-11-16 19:44:12 +03:00
$post -> setSuggested ( 1 );
2020-11-01 01:36:35 +03:00
$post -> save ();
} catch ( \LogicException $ex ) {
$this -> fail ( 100 , " One of the parameters specified was missing or invalid " );
}
2024-11-17 13:03:49 +03:00
foreach ( $final_attachments as $attachment ) {
$post -> attach ( $attachment );
VKAPI: методы для подарков, заметок, статусов, обсуждений и немного для фоток и групп (#876)
* API methods for gifts, notes, statuses
* Some fixes
Строки локализации у gifts.send теперь не костыльные и можно прикрепить до 10 аттачей к посту
* Small imp
Пофиксил пагинацию у заметков и подарок
Перенёс структуру заметок
Добавил аттачи к комментариям
Добавил проверку на удалённость аттача
Ну и пофиксил сортировку заметок
* VKAPI: Some methods for topics and photos
Добавлены методы для обсуждений (addTopic, closeTopic(), createComment(), deleteComment(), deleteTopic(), editTopic(), fixTopic(), getComments(), getTopics(), openTopic(), unfixTopic())
и для фотографий (createAlbum(), editAlbum(), getAlbums(), getAlbumsCount(), getById(), get(), deleteAlbum(), edit(), delete(), deleteComment(), createComment(), getAll(), getComments())
* fixsex
2023-06-13 21:03:43 +03:00
}
2022-01-15 18:15:37 +03:00
2020-11-01 01:36:35 +03:00
if ( $wall > 0 && $wall !== $this -> user -> identity -> getId ())
( new WallPostNotification ( $wallOwner , $post , $this -> user -> identity )) -> emit ();
return ( object )[ " post_id " => $post -> getVirtualId ()];
}
2022-07-23 02:24:34 +03:00
2024-11-17 13:03:49 +03:00
function repost ( string $object , string $message = " " , string $attachments = " " , int $group_id = 0 , int $as_group = 0 , int $signed = 0 ) {
2022-07-23 02:24:34 +03:00
$this -> requireUser ();
2023-02-08 14:20:50 +03:00
$this -> willExecuteWriteAction ();
2022-07-23 02:24:34 +03:00
$postArray ;
2024-11-17 13:03:49 +03:00
if ( preg_match ( '/(wall|video|photo)((?:-?)[0-9]+)_([0-9]+)/' , $object , $postArray ) == 0 )
2022-07-23 02:24:34 +03:00
$this -> fail ( 100 , " One of the parameters specified was missing or invalid: object is incorrect " );
2024-11-17 13:03:49 +03:00
$parsed_attachments = parseAttachments ( $attachments , [ 'photo' , 'video' , 'note' , 'audio' ]);
$final_attachments = [];
foreach ( $parsed_attachments as $attachment ) {
if ( $attachment && ! $attachment -> isDeleted () && $attachment -> canBeViewedBy ( $this -> getUser ()) &&
! ( method_exists ( $attachment , 'getVoters' ) && $attachment -> getOwner () -> getId () != $this -> getUser () -> getId ())) {
$final_attachments [] = $attachment ;
}
}
$repost_entity = NULL ;
$repost_type = $postArray [ 1 ];
switch ( $repost_type ) {
default :
case 'wall' :
$repost_entity = ( new PostsRepo ) -> getPostById (( int ) $postArray [ 2 ], ( int ) $postArray [ 3 ]);
break ;
case 'photo' :
$repost_entity = ( new PhotosRepo ) -> getByOwnerAndVID (( int ) $postArray [ 2 ], ( int ) $postArray [ 3 ]);
break ;
case 'video' :
$repost_entity = ( new VideosRepo ) -> getByOwnerAndVID (( int ) $postArray [ 2 ], ( int ) $postArray [ 3 ]);
break ;
}
if ( ! $repost_entity || $repost_entity -> isDeleted () || ! $repost_entity -> canBeViewedBy ( $this -> getUser ())) $this -> fail ( 100 , " One of the parameters specified was missing or invalid " );
2023-12-02 20:21:16 +03:00
2022-07-23 02:24:34 +03:00
$nPost = new Post ;
$nPost -> setOwner ( $this -> user -> getId ());
2023-05-21 18:38:39 +03:00
if ( $group_id > 0 ) {
2024-11-17 13:03:49 +03:00
$club = ( new ClubsRepo ) -> get ( $group_id );
2023-05-21 18:38:39 +03:00
if ( ! $club )
$this -> fail ( 42 , " Invalid group " );
if ( ! $club -> canBeModifiedBy ( $this -> user ))
$this -> fail ( 16 , " Access to group denied " );
2024-11-17 13:03:49 +03:00
$nPost -> setWall ( $club -> getRealId ());
$flags = 0 ;
if ( $as_group === 1 || $signed === 1 )
$flags |= 0 b10000000 ;
if ( $signed === 1 )
$flags |= 0 b01000000 ;
$nPost -> setFlags ( $flags );
2023-05-21 18:38:39 +03:00
} else {
$nPost -> setWall ( $this -> user -> getId ());
}
2022-07-23 02:24:34 +03:00
$nPost -> setContent ( $message );
2022-12-17 02:03:02 +03:00
$nPost -> setApi_Source_Name ( $this -> getPlatform ());
2022-07-23 02:24:34 +03:00
$nPost -> save ();
2024-11-17 13:03:49 +03:00
$nPost -> attach ( $repost_entity );
foreach ( $parsed_attachments as $attachment ) {
$nPost -> attach ( $attachment );
}
if ( $repost_type == 'wall' && $repost_entity -> getOwner ( false ) -> getId () !== $this -> user -> getId () && ! ( $repost_entity -> getOwner () instanceof Club ))
( new RepostNotification ( $repost_entity -> getOwner ( false ), $repost_entity , $this -> user )) -> emit ();
$repost_count = 1 ;
if ( $repost_type == 'wall' ) {
$repost_count = $repost_entity -> getRepostCount ();
}
2022-07-23 02:24:34 +03:00
return ( object ) [
" success " => 1 , // 👍
" post_id " => $nPost -> getVirtualId (),
2024-11-17 13:03:49 +03:00
" pretty_id " => $nPost -> getPrettyId (),
" reposts_count " => $repost_count ,
" likes_count " => $repost_entity -> getLikesCount ()
2022-07-23 02:24:34 +03:00
];
}
2022-07-23 03:25:17 +03:00
2023-05-21 18:38:39 +03:00
2022-07-23 15:50:00 +03:00
function getComments ( int $owner_id , int $post_id , bool $need_likes = true , int $offset = 0 , int $count = 10 , string $fields = " sex,screen_name,photo_50,photo_100,online_info,online " , string $sort = " asc " , bool $extended = false ) {
$this -> requireUser ();
$post = ( new PostsRepo ) -> getPostById ( $owner_id , $post_id );
if ( ! $post || $post -> isDeleted ()) $this -> fail ( 100 , " One of the parameters specified was missing or invalid " );
2023-12-02 20:21:16 +03:00
if ( ! $post -> canBeViewedBy ( $this -> getUser ()))
$this -> fail ( 15 , " Access denied " );
2022-07-23 15:50:00 +03:00
$comments = ( new CommentsRepo ) -> getCommentsByTarget ( $post , $offset + 1 , $count , $sort == " desc " ? " DESC " : " ASC " );
2023-04-29 19:33:58 +03:00
2022-07-23 15:50:00 +03:00
$items = [];
$profiles = [];
foreach ( $comments as $comment ) {
2022-11-28 18:20:27 +03:00
$owner = $comment -> getOwner ();
$oid = $owner -> getId ();
if ( $owner instanceof Club )
$oid *= - 1 ;
2023-01-31 14:49:12 +03:00
$attachments = [];
foreach ( $comment -> getChildren () as $attachment ) {
if ( $attachment instanceof \openvk\Web\Models\Entities\Photo ) {
$attachments [] = $this -> getApiPhoto ( $attachment );
2023-07-05 14:54:58 +03:00
} elseif ( $attachment instanceof \openvk\Web\Models\Entities\Note ) {
$attachments [] = $attachment -> toVkApiStruct ();
Music, finally! (#512)
* Add audio upload feature
* Add audio embed thing
* Move bullet.gif to ovk
* Draft some music API methods
* Add support for base64 ids to Audios.getById
* Disallow having more than 65k audios in playlist
* Add playlist model
* Draft some playlist-related API methods
* Fix behabiour of album-related methods
Generators f***** me in le a**
* Add IDv3 autofill
* Add sql dumps
i forgor to upload it xdddd
* Add playlists sql
* Fix audio upload not working on Windows 11 because Windows is the worst operating system which doesn't work properly under any circumstances
* Fix cocksex in audio.get
yes
* Интерфейсы
* Interface updade
* Update en.strings
* Add audio queue
* Make repeat button work
* Some improvements to audio queue
* Фгвшщ йгугу шьзкщмуьутеы
* Make shuffle and "наушники" buttons work, add f...
avicons when playing audio, save some values (like volume and last played track) to localstorage, add ability to toggle time type in player, fix uploading audios with cover (maybe) and add dragndrop to upload page
* Add funny tip with time when hover track div
* Add something
* Add audios picker & move track in smal player вниз
* Summary (required)
Description
* [WIP] Add calls, stories and clips.
Изменены фавиконки (поменьше стали)
У миниплеера ползунок теперь в стиле bsdn и большого плеера, добавлен ползунок громкости
Добавлена кнопка добавления аудио в группу (у миниплеера)
Если вы смотрите аудио группы, которой можете управлять, появляется кнопка "удалить аудио из группы"
Снизу плейлиста в списке теперь показывается автор.
При прикреплении аудиозаписей к посту теперь есть поиск "по композиции" и "по исполнителю"
Добавил explicit.svg, который я забыл добавить в предыдущем коммите.
Вкладочки немного переделаны
При наведении на кнопки "трек вперёд" или "трек назад" показывается название предыдущего или следующего трека соответственно
* 1 new commit to master: [WIP]: Add audios
- Теперь группа может разрешать загружать всем треки в неё
- Теперь треки загружаются на сервер ajax'ом, и так можно очень много аудио загружать
- Вёрстка списка плейлистов изменена, теперь она на гридах
- Немного изменено апи, теперь метод editAlbum сохраняет новую информацию ee объект плейлистов теперь возвращают реальное время
- Удалены лишние пути из routes.yml
- При переключении страниц теперь если на текущей странице есть играющий трек, он нормально подсвечивается
- Из init-db.sql удалены таблицы аудиозаписей
- В Groups.getSettings и groups.edit теперь есть информация о аудиозаписях
* (смешное название коммита)
- Теперь на странице пользователя/группы показываются три случайные песни, а не первые три как раньше
- Теперь пробел на странице аудио не перемещает вас в низ страницы
- Оптимизирован мини-плеер, теперь он инициализируется при любом нажатии на него, а не при наведении
- Теперь при завершении проигрывания трека в мини-плеере он ищет другой трек рядом, и если находит то воспроизводит. Будет удобно для постов с подборками треков
- Поиск теперь показывает 14 результатов
- Теперь при возникновении ошибки загрузки аудио она нормально отображается
- Вместе с плеером на странице с аудиозаписями теперь двигаются и вкладки
- Добавление аудио в группу по идее должно нормально работать
* Implement playlists listens
- У плейлистов теперь есть прослушивания в общем.
- Прослушивания у большого плеера теперь засчитываются, если трек был дослушан до конца
- В объекте плейлистов теперь возвращается listens и cover_url
- Получение плееров через /audios/context переписано, повторяющийся код удалён, правда сильно количество строк сократить не получилось
- Теперь цвета плеера темнее, а иконка проигрывания изменена
- Теперь, если очередь из треков кончилась, то плеер перенаправляет вас в начало очереди.
* php 8.2 fixxxxxxxxxxxxxxxxxxxxxxx
* Implement audiostatuses
Добавлены аудиостатусы (у пользователей), блок с друзьями, слушающих музыку на странице аудиозаписей, объект status_audio в users.get, улучшены настройки приватности и ещё что-то
* ?
- Переделан метод в классе user для получения друзей с проигрываемыми песнями. Теперь среди них могут появляться и группы (хз стоит ли оставлять это или нет). Так же больше не показываются удалённые пользователи
- Трек у плеера теперь двигается немного плавнее. Ещё теперь нету смешных багов с подсказкой времени, когда можно было увести её за экран или промотать дальше трека. Переключить повторение трека теперь можно нажатием кнопки R.
- Длинное название трека больше не сносит время
- Наверное, теперь аудиозаписи нормально отображаются в темах midnight и modern
- Аудиозаписи больше не крашаются, если пользователь неавторизован.
- Немного переделан миниплеер.
- В миниплеере теперь громкость берётся из локалсторейджа.
- Улучшено редактирование аудиозаписей. Теперь данные в дата атрибуты нормально сохраняются, а так же слова песни и метка "explicit" меняются
- Удалён css, оставшийся ещё от public technical preview 1, а так же путь /audios{num}
- При наведении на трек теперь пропадает время, и на его месте появляются кнопки
- Стандартная аватарка в midnight теперь инвертируется
- В админке в редактировании аудио теперь показывается дата редактирования, дата создания, длина и оригинальный файл аудио. Так же на странице редактирования больше нет вылетов, если вы задали несуществующий аккаунт
* !
- Добавлены строки для мобильной темы
- Добавлено предупреждение перед полным удалением плейлиста
- Нажатие кнопки M = нажатие кнопки наушников
- В классе апи Audio поставлены willExecuteWriteAction, ещё теперь нельзя получить число аудиозаписей у пользователей, которые их закрыли. Ещё теперь нельзя получать uploaded_only аудиозаписи у тех ну вы поняли короче.
- При наведении на длинное название песни оно теперь показывается полностью
- Надо ещё что-то сюда написать, так что: При редактировании аудиозаписи название окна теперь не "Редактировать", а "Редактировать аудиозапись", а вместо кнопки OK кнопка "Сохранить"
* .
- Добавлен тур по аудиозаписям, но пока без скриншотов.
- "Мои Аудиозаписи" в меню теперь располагаются под Моими Видеозаписями для канона
- В настройках приватности "кто может видеть мои аудиозаписи" теперь располагаются под "кто может видеть мои видеозаписи"
- В настройках внешнего вида мои аудиозаписи тоже под видео
- Изменён <title> на странице аудиозаписей. Теперь показывается "Аудиозаписи" + имя пользователя в родительном падеже. А если это группа, то "Аудиозаписи группы". То же самое с плейлистами
- Исправлены ссылка в ссылке на странице с плейлистами
- При наведении на название песни больше не сносится иконка explicit
- Добавлена максимальная длина названия и описания плейлиста при редактировании.
* М
- Долокализована админка (точно помню, что уже делал это, но ладно)
- Удалён лишний пункт "audios" в getLeftMenuItemStatus (реально)
- Если. У плеера есть параметр "hideButtons", то при наведении на него не пропадает время.
- На странице редактирования/создания плейлиста если у песни длинное название, то оно да похуй короче. Ну в общем лучше стало
- Там где нужно, добавлена строка в конце файла
- Возвращена строка "photo" в английской локали (я её случайно удалил :+1: )
* у
- У изъятых аудиозаписей больше не показывается кнопка "добавить в группу". Так же при нажатии на кнопку удаления из коллекции окно не всплывает.
- "Удаление аудио из группы" тоже лучше работать стало с изъятыми аудио.
* з
- В пикере аудиозаписей "more..." заменено на "показать больше аудиозаписей"
- Если включен режим показа оставшегося времени, то при окончании песни больше не показывается "--1:--1"
- В пикере аудиозаписей, если у вас нет аудиозаписей и вы ничего не искали, показывается "Вы ещё не добавляли аудиозаписей"
- <hr>'ы стали серыми
- Добавлены title'ы у кнопок в большом плеере
- Проставлены alt'ы у плейлистов
* Musique: linux saport)
назар хуйню релизнул кста, плейерс клаб два не слушайте не рекомендую
* Update and rename gamma-00000-disco.sql to 00041-music.sql
* Update 00041-music.sql
---------
Co-authored-by: Ilya Prokopenko <dsrev@protonmail.com>
Co-authored-by: n1rwana <aydashkin@vk.com>
Co-authored-by: lalka2018 <99399973+lalka2016@users.noreply.github.com>
Co-authored-by: veselcraft <veselcraft@icloud.com>
Co-authored-by: DeathPleiad <43928323+Parad1seF0x@users.noreply.github.com>
2023-11-12 00:41:07 +03:00
} elseif ( $attachment instanceof \openvk\Web\Models\Entities\Audio ) {
2023-11-13 15:08:18 +03:00
$attachments [] = [
" type " => " audio " ,
" audio " => $attachment -> toVkApiStruct ( $this -> getUser ()),
];
2023-01-31 14:49:12 +03:00
}
}
2023-04-29 19:33:58 +03:00
2022-07-23 15:50:00 +03:00
$item = [
" id " => $comment -> getId (),
2022-11-28 18:20:27 +03:00
" from_id " => $oid ,
2022-07-23 15:50:00 +03:00
" date " => $comment -> getPublicationTime () -> timestamp (),
" text " => $comment -> getText ( false ),
" post_id " => $post -> getVirtualId (),
2024-11-17 13:03:49 +03:00
" owner_id " => method_exists ( $post , 'isPostedOnBehalfOfGroup' ) && $post -> isPostedOnBehalfOfGroup () ? $post -> getOwner () -> getId () * - 1 : $post -> getOwner () -> getId (),
2022-07-23 15:50:00 +03:00
" parents_stack " => [],
2023-01-31 14:49:12 +03:00
" attachments " => $attachments ,
2022-07-23 15:50:00 +03:00
" thread " => [
" count " => 0 ,
" items " => [],
" can_post " => false ,
" show_reply_button " => true ,
" groups_can_post " => false ,
]
];
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
if ( $comment -> isFromPostAuthor ( $post ))
$item [ 'is_from_post_author' ] = true ;
2022-07-23 15:50:00 +03:00
if ( $need_likes == true )
$item [ 'likes' ] = [
" can_like " => 1 ,
" count " => $comment -> getLikesCount (),
" user_likes " => ( int ) $comment -> hasLikeFrom ( $this -> getUser ()),
" can_publish " => 1
];
2023-04-29 19:33:58 +03:00
2022-07-23 15:50:00 +03:00
$items [] = $item ;
if ( $extended == true )
$profiles [] = $comment -> getOwner () -> getId ();
2023-01-31 14:49:12 +03:00
$attachments = null ;
// Reset $attachments to not duplicate prikols
2022-07-23 15:50:00 +03:00
}
$response = [
" count " => ( new CommentsRepo ) -> getCommentsCountByTarget ( $post ),
" items " => $items ,
" current_level_count " => ( new CommentsRepo ) -> getCommentsCountByTarget ( $post ),
" can_post " => true ,
" show_reply_button " => true ,
" groups_can_post " => false
];
if ( $extended == true ) {
$profiles = array_unique ( $profiles );
$response [ 'profiles' ] = ( ! empty ( $profiles ) ? ( new Users ) -> get ( implode ( ',' , $profiles ), $fields ) : []);
}
return ( object ) $response ;
}
function getComment ( int $owner_id , int $comment_id , bool $extended = false , string $fields = " sex,screen_name,photo_50,photo_100,online_info,online " ) {
$this -> requireUser ();
2023-07-05 14:54:58 +03:00
$comment = ( new CommentsRepo ) -> get ( $comment_id ); # один хуй айди всех комментов общий
2023-12-02 20:21:16 +03:00
if ( ! $comment || $comment -> isDeleted ())
2023-11-13 15:08:18 +03:00
$this -> fail ( 100 , " Invalid comment " );
2023-12-02 20:21:16 +03:00
if ( ! $comment -> canBeViewedBy ( $this -> getUser ()))
$this -> fail ( 15 , " Access denied " );
2023-11-13 15:08:18 +03:00
2022-07-23 15:50:00 +03:00
$profiles = [];
2023-01-31 14:49:12 +03:00
$attachments = [];
2023-04-29 19:33:58 +03:00
2023-01-31 14:49:12 +03:00
foreach ( $comment -> getChildren () as $attachment ) {
if ( $attachment instanceof \openvk\Web\Models\Entities\Photo ) {
$attachments [] = $this -> getApiPhoto ( $attachment );
2024-11-17 13:03:49 +03:00
} elseif ( $attachment instanceof \openvk\Web\Models\Entities\Video ) {
$attachments [] = $attachment -> getApiStructure ();
} elseif ( $attachment instanceof \openvk\Web\Models\Entities\Note ) {
$attachments [] = [
'type' => 'note' ,
'note' => $attachment -> toVkApiStruct ()
];
Music, finally! (#512)
* Add audio upload feature
* Add audio embed thing
* Move bullet.gif to ovk
* Draft some music API methods
* Add support for base64 ids to Audios.getById
* Disallow having more than 65k audios in playlist
* Add playlist model
* Draft some playlist-related API methods
* Fix behabiour of album-related methods
Generators f***** me in le a**
* Add IDv3 autofill
* Add sql dumps
i forgor to upload it xdddd
* Add playlists sql
* Fix audio upload not working on Windows 11 because Windows is the worst operating system which doesn't work properly under any circumstances
* Fix cocksex in audio.get
yes
* Интерфейсы
* Interface updade
* Update en.strings
* Add audio queue
* Make repeat button work
* Some improvements to audio queue
* Фгвшщ йгугу шьзкщмуьутеы
* Make shuffle and "наушники" buttons work, add f...
avicons when playing audio, save some values (like volume and last played track) to localstorage, add ability to toggle time type in player, fix uploading audios with cover (maybe) and add dragndrop to upload page
* Add funny tip with time when hover track div
* Add something
* Add audios picker & move track in smal player вниз
* Summary (required)
Description
* [WIP] Add calls, stories and clips.
Изменены фавиконки (поменьше стали)
У миниплеера ползунок теперь в стиле bsdn и большого плеера, добавлен ползунок громкости
Добавлена кнопка добавления аудио в группу (у миниплеера)
Если вы смотрите аудио группы, которой можете управлять, появляется кнопка "удалить аудио из группы"
Снизу плейлиста в списке теперь показывается автор.
При прикреплении аудиозаписей к посту теперь есть поиск "по композиции" и "по исполнителю"
Добавил explicit.svg, который я забыл добавить в предыдущем коммите.
Вкладочки немного переделаны
При наведении на кнопки "трек вперёд" или "трек назад" показывается название предыдущего или следующего трека соответственно
* 1 new commit to master: [WIP]: Add audios
- Теперь группа может разрешать загружать всем треки в неё
- Теперь треки загружаются на сервер ajax'ом, и так можно очень много аудио загружать
- Вёрстка списка плейлистов изменена, теперь она на гридах
- Немного изменено апи, теперь метод editAlbum сохраняет новую информацию ee объект плейлистов теперь возвращают реальное время
- Удалены лишние пути из routes.yml
- При переключении страниц теперь если на текущей странице есть играющий трек, он нормально подсвечивается
- Из init-db.sql удалены таблицы аудиозаписей
- В Groups.getSettings и groups.edit теперь есть информация о аудиозаписях
* (смешное название коммита)
- Теперь на странице пользователя/группы показываются три случайные песни, а не первые три как раньше
- Теперь пробел на странице аудио не перемещает вас в низ страницы
- Оптимизирован мини-плеер, теперь он инициализируется при любом нажатии на него, а не при наведении
- Теперь при завершении проигрывания трека в мини-плеере он ищет другой трек рядом, и если находит то воспроизводит. Будет удобно для постов с подборками треков
- Поиск теперь показывает 14 результатов
- Теперь при возникновении ошибки загрузки аудио она нормально отображается
- Вместе с плеером на странице с аудиозаписями теперь двигаются и вкладки
- Добавление аудио в группу по идее должно нормально работать
* Implement playlists listens
- У плейлистов теперь есть прослушивания в общем.
- Прослушивания у большого плеера теперь засчитываются, если трек был дослушан до конца
- В объекте плейлистов теперь возвращается listens и cover_url
- Получение плееров через /audios/context переписано, повторяющийся код удалён, правда сильно количество строк сократить не получилось
- Теперь цвета плеера темнее, а иконка проигрывания изменена
- Теперь, если очередь из треков кончилась, то плеер перенаправляет вас в начало очереди.
* php 8.2 fixxxxxxxxxxxxxxxxxxxxxxx
* Implement audiostatuses
Добавлены аудиостатусы (у пользователей), блок с друзьями, слушающих музыку на странице аудиозаписей, объект status_audio в users.get, улучшены настройки приватности и ещё что-то
* ?
- Переделан метод в классе user для получения друзей с проигрываемыми песнями. Теперь среди них могут появляться и группы (хз стоит ли оставлять это или нет). Так же больше не показываются удалённые пользователи
- Трек у плеера теперь двигается немного плавнее. Ещё теперь нету смешных багов с подсказкой времени, когда можно было увести её за экран или промотать дальше трека. Переключить повторение трека теперь можно нажатием кнопки R.
- Длинное название трека больше не сносит время
- Наверное, теперь аудиозаписи нормально отображаются в темах midnight и modern
- Аудиозаписи больше не крашаются, если пользователь неавторизован.
- Немного переделан миниплеер.
- В миниплеере теперь громкость берётся из локалсторейджа.
- Улучшено редактирование аудиозаписей. Теперь данные в дата атрибуты нормально сохраняются, а так же слова песни и метка "explicit" меняются
- Удалён css, оставшийся ещё от public technical preview 1, а так же путь /audios{num}
- При наведении на трек теперь пропадает время, и на его месте появляются кнопки
- Стандартная аватарка в midnight теперь инвертируется
- В админке в редактировании аудио теперь показывается дата редактирования, дата создания, длина и оригинальный файл аудио. Так же на странице редактирования больше нет вылетов, если вы задали несуществующий аккаунт
* !
- Добавлены строки для мобильной темы
- Добавлено предупреждение перед полным удалением плейлиста
- Нажатие кнопки M = нажатие кнопки наушников
- В классе апи Audio поставлены willExecuteWriteAction, ещё теперь нельзя получить число аудиозаписей у пользователей, которые их закрыли. Ещё теперь нельзя получать uploaded_only аудиозаписи у тех ну вы поняли короче.
- При наведении на длинное название песни оно теперь показывается полностью
- Надо ещё что-то сюда написать, так что: При редактировании аудиозаписи название окна теперь не "Редактировать", а "Редактировать аудиозапись", а вместо кнопки OK кнопка "Сохранить"
* .
- Добавлен тур по аудиозаписям, но пока без скриншотов.
- "Мои Аудиозаписи" в меню теперь располагаются под Моими Видеозаписями для канона
- В настройках приватности "кто может видеть мои аудиозаписи" теперь располагаются под "кто может видеть мои видеозаписи"
- В настройках внешнего вида мои аудиозаписи тоже под видео
- Изменён <title> на странице аудиозаписей. Теперь показывается "Аудиозаписи" + имя пользователя в родительном падеже. А если это группа, то "Аудиозаписи группы". То же самое с плейлистами
- Исправлены ссылка в ссылке на странице с плейлистами
- При наведении на название песни больше не сносится иконка explicit
- Добавлена максимальная длина названия и описания плейлиста при редактировании.
* М
- Долокализована админка (точно помню, что уже делал это, но ладно)
- Удалён лишний пункт "audios" в getLeftMenuItemStatus (реально)
- Если. У плеера есть параметр "hideButtons", то при наведении на него не пропадает время.
- На странице редактирования/создания плейлиста если у песни длинное название, то оно да похуй короче. Ну в общем лучше стало
- Там где нужно, добавлена строка в конце файла
- Возвращена строка "photo" в английской локали (я её случайно удалил :+1: )
* у
- У изъятых аудиозаписей больше не показывается кнопка "добавить в группу". Так же при нажатии на кнопку удаления из коллекции окно не всплывает.
- "Удаление аудио из группы" тоже лучше работать стало с изъятыми аудио.
* з
- В пикере аудиозаписей "more..." заменено на "показать больше аудиозаписей"
- Если включен режим показа оставшегося времени, то при окончании песни больше не показывается "--1:--1"
- В пикере аудиозаписей, если у вас нет аудиозаписей и вы ничего не искали, показывается "Вы ещё не добавляли аудиозаписей"
- <hr>'ы стали серыми
- Добавлены title'ы у кнопок в большом плеере
- Проставлены alt'ы у плейлистов
* Musique: linux saport)
назар хуйню релизнул кста, плейерс клаб два не слушайте не рекомендую
* Update and rename gamma-00000-disco.sql to 00041-music.sql
* Update 00041-music.sql
---------
Co-authored-by: Ilya Prokopenko <dsrev@protonmail.com>
Co-authored-by: n1rwana <aydashkin@vk.com>
Co-authored-by: lalka2018 <99399973+lalka2016@users.noreply.github.com>
Co-authored-by: veselcraft <veselcraft@icloud.com>
Co-authored-by: DeathPleiad <43928323+Parad1seF0x@users.noreply.github.com>
2023-11-12 00:41:07 +03:00
} elseif ( $attachment instanceof \openvk\Web\Models\Entities\Audio ) {
2023-11-13 15:08:18 +03:00
$attachments [] = [
" type " => " audio " ,
" audio " => $attachment -> toVkApiStruct ( $this -> getUser ()),
];
2023-01-31 14:49:12 +03:00
}
}
2022-07-23 15:50:00 +03:00
$item = [
" id " => $comment -> getId (),
" from_id " => $comment -> getOwner () -> getId (),
" date " => $comment -> getPublicationTime () -> timestamp (),
" text " => $comment -> getText ( false ),
" post_id " => $comment -> getTarget () -> getVirtualId (),
2024-11-17 13:03:49 +03:00
" owner_id " => method_exists ( $comment -> getTarget (), 'isPostedOnBehalfOfGroup' ) && $comment -> getTarget () -> isPostedOnBehalfOfGroup () ? $comment -> getTarget () -> getOwner () -> getId () * - 1 : $comment -> getTarget () -> getOwner () -> getId (),
2022-07-23 15:50:00 +03:00
" parents_stack " => [],
2023-01-31 14:49:12 +03:00
" attachments " => $attachments ,
2022-07-23 15:50:00 +03:00
" likes " => [
" can_like " => 1 ,
" count " => $comment -> getLikesCount (),
" user_likes " => ( int ) $comment -> hasLikeFrom ( $this -> getUser ()),
" can_publish " => 1
],
" thread " => [
" count " => 0 ,
" items " => [],
" can_post " => false ,
" show_reply_button " => true ,
" groups_can_post " => false ,
]
];
2023-04-29 19:33:58 +03:00
api: add some fields and 2 new methods и jsonp
- Изменения коснулись методов account.getProfileInfo, account.getBalance, account.getOvkSettings, gifts.get, gifts.getCategories, groups.get, groups.getById, users.get, wall.get, wall.getById, wall.getComments, wall.getComment.
- Добавлена поддержка JSONP
2024-10-15 20:42:59 +03:00
if ( $comment -> isFromPostAuthor ())
$item [ 'is_from_post_author' ] = true ;
2022-07-23 15:50:00 +03:00
if ( $extended == true )
$profiles [] = $comment -> getOwner () -> getId ();
$response = [
" items " => [ $item ],
" can_post " => true ,
" show_reply_button " => true ,
" groups_can_post " => false
];
if ( $extended == true ) {
$profiles = array_unique ( $profiles );
$response [ 'profiles' ] = ( ! empty ( $profiles ) ? ( new Users ) -> get ( implode ( ',' , $profiles ), $fields ) : []);
}
return $response ;
}
2023-09-17 19:19:25 +03:00
function createComment ( int $owner_id , int $post_id , string $message = " " , int $from_group = 0 , string $attachments = " " ) {
2023-02-08 14:20:50 +03:00
$this -> requireUser ();
$this -> willExecuteWriteAction ();
2023-04-29 19:33:58 +03:00
2022-07-23 15:50:00 +03:00
$post = ( new PostsRepo ) -> getPostById ( $owner_id , $post_id );
VKAPI: методы для подарков, заметок, статусов, обсуждений и немного для фоток и групп (#876)
* API methods for gifts, notes, statuses
* Some fixes
Строки локализации у gifts.send теперь не костыльные и можно прикрепить до 10 аттачей к посту
* Small imp
Пофиксил пагинацию у заметков и подарок
Перенёс структуру заметок
Добавил аттачи к комментариям
Добавил проверку на удалённость аттача
Ну и пофиксил сортировку заметок
* VKAPI: Some methods for topics and photos
Добавлены методы для обсуждений (addTopic, closeTopic(), createComment(), deleteComment(), deleteTopic(), editTopic(), fixTopic(), getComments(), getTopics(), openTopic(), unfixTopic())
и для фотографий (createAlbum(), editAlbum(), getAlbums(), getAlbumsCount(), getById(), get(), deleteAlbum(), edit(), delete(), deleteComment(), createComment(), getAll(), getComments())
* fixsex
2023-06-13 21:03:43 +03:00
if ( ! $post || $post -> isDeleted ()) $this -> fail ( 100 , " Invalid post " );
2022-07-23 15:50:00 +03:00
2023-12-02 20:21:16 +03:00
if ( ! $post -> canBeViewedBy ( $this -> getUser ()))
$this -> fail ( 15 , " Access denied " );
2022-07-23 15:50:00 +03:00
if ( $post -> getTargetWall () < 0 )
$club = ( new ClubsRepo ) -> get ( abs ( $post -> getTargetWall ()));
2023-04-29 19:33:58 +03:00
2024-11-17 13:03:49 +03:00
$parsed_attachments = parseAttachments ( $attachments , [ 'photo' , 'video' , 'note' , 'audio' ]);
$final_attachments = [];
foreach ( $parsed_attachments as $attachment ) {
if ( $attachment && ! $attachment -> isDeleted () && $attachment -> canBeViewedBy ( $this -> getUser ()) &&
! ( method_exists ( $attachment , 'getVoters' ) && $attachment -> getOwner () -> getId () != $this -> getUser () -> getId ())) {
$final_attachments [] = $attachment ;
}
}
if (( empty ( $message ) && ( empty ( $attachments ) || sizeof ( $final_attachments ) < 1 ))) {
VKAPI: методы для подарков, заметок, статусов, обсуждений и немного для фоток и групп (#876)
* API methods for gifts, notes, statuses
* Some fixes
Строки локализации у gifts.send теперь не костыльные и можно прикрепить до 10 аттачей к посту
* Small imp
Пофиксил пагинацию у заметков и подарок
Перенёс структуру заметок
Добавил аттачи к комментариям
Добавил проверку на удалённость аттача
Ну и пофиксил сортировку заметок
* VKAPI: Some methods for topics and photos
Добавлены методы для обсуждений (addTopic, closeTopic(), createComment(), deleteComment(), deleteTopic(), editTopic(), fixTopic(), getComments(), getTopics(), openTopic(), unfixTopic())
и для фотографий (createAlbum(), editAlbum(), getAlbums(), getAlbumsCount(), getById(), get(), deleteAlbum(), edit(), delete(), deleteComment(), createComment(), getAll(), getComments())
* fixsex
2023-06-13 21:03:43 +03:00
$this -> fail ( 100 , " Required parameter 'message' missing. " );
}
2022-07-23 15:50:00 +03:00
$flags = 0 ;
if ( $from_group != 0 && ! is_null ( $club ) && $club -> canBeModifiedBy ( $this -> user ))
$flags |= 0 b10000000 ;
2023-04-29 19:33:58 +03:00
2022-07-23 15:50:00 +03:00
try {
$comment = new Comment ;
$comment -> setOwner ( $this -> user -> getId ());
$comment -> setModel ( get_class ( $post ));
$comment -> setTarget ( $post -> getId ());
$comment -> setContent ( $message );
$comment -> setCreated ( time ());
$comment -> setFlags ( $flags );
$comment -> save ();
} catch ( \LengthException $ex ) {
$this -> fail ( 1 , " ошибка про то что коммент большой слишком " );
}
VKAPI: методы для подарков, заметок, статусов, обсуждений и немного для фоток и групп (#876)
* API methods for gifts, notes, statuses
* Some fixes
Строки локализации у gifts.send теперь не костыльные и можно прикрепить до 10 аттачей к посту
* Small imp
Пофиксил пагинацию у заметков и подарок
Перенёс структуру заметок
Добавил аттачи к комментариям
Добавил проверку на удалённость аттача
Ну и пофиксил сортировку заметок
* VKAPI: Some methods for topics and photos
Добавлены методы для обсуждений (addTopic, closeTopic(), createComment(), deleteComment(), deleteTopic(), editTopic(), fixTopic(), getComments(), getTopics(), openTopic(), unfixTopic())
и для фотографий (createAlbum(), editAlbum(), getAlbums(), getAlbumsCount(), getById(), get(), deleteAlbum(), edit(), delete(), deleteComment(), createComment(), getAll(), getComments())
* fixsex
2023-06-13 21:03:43 +03:00
2024-11-17 13:03:49 +03:00
foreach ( $final_attachments as $attachment ) {
$comment -> attach ( $attachment );
VKAPI: методы для подарков, заметок, статусов, обсуждений и немного для фоток и групп (#876)
* API methods for gifts, notes, statuses
* Some fixes
Строки локализации у gifts.send теперь не костыльные и можно прикрепить до 10 аттачей к посту
* Small imp
Пофиксил пагинацию у заметков и подарок
Перенёс структуру заметок
Добавил аттачи к комментариям
Добавил проверку на удалённость аттача
Ну и пофиксил сортировку заметок
* VKAPI: Some methods for topics and photos
Добавлены методы для обсуждений (addTopic, closeTopic(), createComment(), deleteComment(), deleteTopic(), editTopic(), fixTopic(), getComments(), getTopics(), openTopic(), unfixTopic())
и для фотографий (createAlbum(), editAlbum(), getAlbums(), getAlbumsCount(), getById(), get(), deleteAlbum(), edit(), delete(), deleteComment(), createComment(), getAll(), getComments())
* fixsex
2023-06-13 21:03:43 +03:00
}
2023-04-29 19:33:58 +03:00
2022-07-23 15:50:00 +03:00
if ( $post -> getOwner () -> getId () !== $this -> user -> getId ())
if (( $owner = $post -> getOwner ()) instanceof User )
( new CommentNotification ( $owner , $comment , $post , $this -> user )) -> emit ();
2023-04-29 19:33:58 +03:00
2022-07-23 15:50:00 +03:00
return ( object ) [
" comment_id " => $comment -> getId (),
" parents_stack " => []
];
}
2022-07-29 12:41:43 +03:00
function deleteComment ( int $comment_id ) {
2022-07-23 15:50:00 +03:00
$this -> requireUser ();
2023-02-08 14:20:50 +03:00
$this -> willExecuteWriteAction ();
2022-07-23 15:50:00 +03:00
$comment = ( new CommentsRepo ) -> get ( $comment_id );
if ( ! $comment ) $this -> fail ( 100 , " One of the parameters specified was missing or invalid " );;
if ( ! $comment -> canBeDeletedBy ( $this -> user ))
$this -> fail ( 7 , " Access denied " );
2023-04-29 19:33:58 +03:00
2022-07-23 15:50:00 +03:00
$comment -> delete ();
2023-04-29 19:33:58 +03:00
2022-07-23 15:50:00 +03:00
return 1 ;
}
2023-11-16 19:44:12 +03:00
function delete ( int $owner_id , int $post_id )
{
$this -> requireUser ();
$this -> willExecuteWriteAction ();
$post = ( new PostsRepo ) -> getPostById ( $owner_id , $post_id , true );
if ( ! $post || $post -> isDeleted ())
$this -> fail ( 583 , " Invalid post " );
2023-04-29 19:33:58 +03:00
2023-11-16 19:44:12 +03:00
$wallOwner = $post -> getWallOwner ();
if ( $post -> getTargetWall () < 0 && ! $post -> getWallOwner () -> canBeModifiedBy ( $this -> getUser ()) && $post -> getWallOwner () -> getWallType () != 1 && $post -> getSuggestionType () == 0 )
$this -> fail ( 12 , " Access denied: you can't delete your accepted post. " );
if ( $post -> getOwnerPost () == $this -> getUser () -> getId () || $post -> getTargetWall () == $this -> getUser () -> getId () || $owner_id < 0 && $wallOwner -> canBeModifiedBy ( $this -> getUser ())) {
$post -> unwire ();
$post -> delete ();
return 1 ;
} else {
$this -> fail ( 15 , " Access denied " );
}
}
2024-11-17 13:03:49 +03:00
function edit ( int $owner_id , int $post_id , string $message = " " , string $attachments = " " , string $copyright = NULL , int $explicit = - 1 , int $from_group = 0 , int $signed = 0 ) {
2023-11-14 22:44:39 +03:00
$this -> requireUser ();
$this -> willExecuteWriteAction ();
2024-11-17 13:03:49 +03:00
$parsed_attachments = parseAttachments ( $attachments , [ 'photo' , 'video' , 'note' , 'audio' , 'poll' ]);
$final_attachments = [];
foreach ( $parsed_attachments as $attachment ) {
if ( $attachment && ! $attachment -> isDeleted () && $attachment -> canBeViewedBy ( $this -> getUser ()) &&
! ( method_exists ( $attachment , 'getVoters' ) && $attachment -> getOwner () -> getId () != $this -> getUser () -> getId ())) {
$final_attachments [] = $attachment ;
}
}
if ( empty ( $message ) && sizeof ( $final_attachments ) < 1 ) {
$this -> fail ( - 66 , " Post will be empty, don't saving. " );
}
$post = ( new PostsRepo ) -> getPostById ( $owner_id , $post_id , true );
2023-11-14 22:44:39 +03:00
if ( ! $post || $post -> isDeleted ())
$this -> fail ( 102 , " Invalid post " );
if ( ! $post -> canBeEditedBy ( $this -> getUser ()))
$this -> fail ( 7 , " Access to editing denied " );
2024-11-17 13:03:49 +03:00
if ( ! empty ( $message ) || ( empty ( $message ) && sizeof ( $final_attachments ) > 0 ))
2023-11-14 22:44:39 +03:00
$post -> setContent ( $message );
$post -> setEdited ( time ());
2024-11-01 14:46:41 +03:00
if ( ! is_null ( $copyright ) && ! empty ( $copyright )) {
2024-11-17 13:03:49 +03:00
if ( $copyright == 'remove' ) {
$post -> resetSource ();
} else {
try {
$post -> setSource ( $copyright );
} catch ( \Throwable ) {}
}
2024-11-01 14:46:41 +03:00
}
2024-11-17 13:03:49 +03:00
if ( $explicit != - 1 ) {
$post -> setNsfw ( $explicit == 1 );
}
2023-11-14 22:44:39 +03:00
2024-11-17 13:03:49 +03:00
$wallOwner = ( $owner_id > 0 ? ( new UsersRepo ) -> get ( $owner_id ) : ( new ClubsRepo ) -> get ( $owner_id * - 1 ));
$flags = 0 ;
if ( $from_group == 1 && $wallOwner instanceof Club && $wallOwner -> canBeModifiedBy ( $this -> getUser ()))
$flags |= 0 b10000000 ;
/* if ( $signed == 1 )
$flags |= 0 b01000000 ; */
2023-11-14 22:44:39 +03:00
2024-11-17 13:03:49 +03:00
$post -> setFlags ( $flags );
$post -> save ( true );
2023-11-14 22:44:39 +03:00
2024-11-17 13:03:49 +03:00
if ( $attachments == 'remove' || sizeof ( $final_attachments ) > 0 ) {
foreach ( $post -> getChildren () as $att ) {
if ( ! ( $att instanceof Post )) {
$post -> detach ( $att );
}
}
2023-11-14 22:44:39 +03:00
2024-11-17 13:03:49 +03:00
foreach ( $final_attachments as $attachment ) {
$post -> attach ( $attachment );
2023-11-14 22:44:39 +03:00
}
}
return [ " post_id " => $post -> getVirtualId ()];
}
function editComment ( int $comment_id , int $owner_id = 0 , string $message = " " , string $attachments = " " ) {
$this -> requireUser ();
$this -> willExecuteWriteAction ();
$comment = ( new CommentsRepo ) -> get ( $comment_id );
2024-11-17 13:03:49 +03:00
$parsed_attachments = parseAttachments ( $attachments , [ 'photo' , 'video' , 'note' , 'audio' ]);
$final_attachments = [];
foreach ( $parsed_attachments as $attachment ) {
if ( $attachment && ! $attachment -> isDeleted () && $attachment -> canBeViewedBy ( $this -> getUser ()) &&
! ( method_exists ( $attachment , 'getVoters' ) && $attachment -> getOwner () -> getId () != $this -> getUser () -> getId ())) {
$final_attachments [] = $attachment ;
}
}
2023-11-14 22:44:39 +03:00
2024-11-17 13:03:49 +03:00
if ( empty ( $message ) && sizeof ( $final_attachments ) < 1 )
2023-11-14 22:44:39 +03:00
$this -> fail ( 100 , " Required parameter 'message' missing. " );
if ( ! $comment || $comment -> isDeleted ())
$this -> fail ( 102 , " Invalid comment " );
if ( ! $comment -> canBeEditedBy ( $this -> getUser ()))
$this -> fail ( 15 , " Access to editing comment denied " );
2024-11-17 13:03:49 +03:00
if ( ! empty ( $message ) || ( empty ( $message ) && sizeof ( $final_attachments ) > 0 ))
2023-11-14 22:44:39 +03:00
$comment -> setContent ( $message );
$comment -> setEdited ( time ());
$comment -> save ( true );
2024-11-17 13:03:49 +03:00
if ( sizeof ( $final_attachments ) > 0 ) {
$comment -> unwire ();
foreach ( $final_attachments as $attachment ) {
$comment -> attach ( $attachment );
2023-11-14 22:44:39 +03:00
}
}
return 1 ;
}
2024-11-01 14:46:41 +03:00
function checkCopyrightLink ( string $link ) : int
{
$this -> requireUser ();
try {
$result = check_copyright_link ( $link );
} catch ( \InvalidArgumentException $e ) {
$this -> fail ( 3102 , " Specified link is incorrect (can't find source) " );
} catch ( \LengthException $e ) {
$this -> fail ( 3103 , " Specified link is incorrect (too long) " );
} catch ( \LogicException $e ) {
$this -> fail ( 3104 , " Link is suspicious " );
} catch ( \Throwable $e ) {
$this -> fail ( 3102 , " Specified link is incorrect " );
}
return 1 ;
}
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 ( 100 , " One of the parameters specified was missing or invalid: post_id is undefined " );
if ( ! $post -> canBePinnedBy ( $this -> getUser ()))
return 0 ;
if ( $post -> isPinned ())
return 1 ;
$post -> pin ();
return 1 ;
}
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 ( 100 , " One of the parameters specified was missing or invalid: post_id is undefined " );
if ( ! $post -> canBePinnedBy ( $this -> getUser ()))
return 0 ;
if ( ! $post -> isPinned ())
return 1 ;
$post -> unpin ();
return 1 ;
}
2024-12-13 17:53:36 +03:00
function getNearby ( int $owner_id , int $post_id )
{
$this -> requireUser ();
$post = ( new PostsRepo ) -> getPostById ( $owner_id , $post_id );
if ( ! $post || $post -> isDeleted ())
$this -> fail ( 100 , " One of the parameters specified was missing or invalid: post_id is undefined " );
if ( ! $post -> canBeViewedBy ( $this -> getUser ()))
$this -> fail ( 15 , " Access denied " );
$lat = $post -> getLat ();
$lon = $post -> getLon ();
if ( ! $lat || ! $lon )
$this -> fail ( - 97 , " Post doesn't contains geo " );
$query = file_get_contents ( __DIR__ . " /../../Web/Models/sql/get-nearest-posts.tsql " );
$_posts = \Chandler\Database\DatabaseConnection :: i () -> getContext () -> query ( $query , $lat , $lon , $post -> getId ()) -> fetchAll ();
$posts = [];
foreach ( $_posts as $post ) {
$distance = $post [ " distance " ];
$post = ( new PostsRepo ) -> get ( $post [ " id " ]);
if ( ! $post || $post -> isDeleted () || ! $post -> canBeViewedBy ( $this -> getUser ())) continue ;
$owner = $post -> getOwner ();
$preview = mb_substr ( $post -> getText (), 0 , 50 ) . ( strlen ( $post -> getText ()) > 50 ? " ... " : " " );
$posts [] = [
" message " => strlen ( $preview ) > 0 ? $preview : " (нет текста) " ,
" url " => " /wall " . $post -> getPrettyId (),
" created " => $post -> getPublicationTime () -> html (),
" owner " => [
" domain " => $owner -> getURL (),
" photo_50 " => $owner -> getAvatarURL (),
" name " => $owner -> getCanonicalName (),
" verified " => $owner -> isVerified (),
],
" geo " => $post -> getGeo (),
" distance " => $distance
];
}
return $posts ;
}
2022-07-23 03:25:17 +03:00
private function getApiPhoto ( $attachment ) {
return [
" type " => " photo " ,
" photo " => [
2023-11-13 12:37:15 +03:00
" album_id " => $attachment -> getAlbum () ? $attachment -> getAlbum () -> getId () : 0 ,
2022-07-23 03:25:17 +03:00
" date " => $attachment -> getPublicationTime () -> timestamp (),
" id " => $attachment -> getVirtualId (),
" owner_id " => $attachment -> getOwner () -> getId (),
2023-03-02 12:09:13 +03:00
" sizes " => ! is_null ( $attachment -> getVkApiSizes ()) ? array_values ( $attachment -> getVkApiSizes ()) : NULL ,
2022-07-23 03:25:17 +03:00
" text " => " " ,
" has_tags " => false
]
];
}
2022-10-12 01:00:52 +03:00
2022-10-12 12:23:57 +03:00
private function getApiPoll ( $attachment , $user ) {
2022-10-12 01:00:52 +03:00
$answers = array ();
foreach ( $attachment -> getResults () -> options as $answer ) {
$answers [] = ( object )[
" id " => $answer -> id ,
" rate " => $answer -> pct ,
" text " => $answer -> name ,
" votes " => $answer -> votes
];
}
2023-04-29 19:33:58 +03:00
2022-10-12 01:00:52 +03:00
$userVote = array ();
2022-10-12 12:23:57 +03:00
foreach ( $attachment -> getUserVote ( $user ) as $vote )
2022-10-12 01:00:52 +03:00
$userVote [] = $vote [ 0 ];
return [
" type " => " poll " ,
" poll " => [
2022-10-17 23:24:10 +03:00
" multiple " => $attachment -> isMultipleChoice (),
" end_date " => $attachment -> endsAt () == NULL ? 0 : $attachment -> endsAt () -> timestamp (),
" closed " => $attachment -> hasEnded (),
" is_board " => false ,
" can_edit " => false ,
" can_vote " => $attachment -> canVote ( $user ),
" can_report " => false ,
" can_share " => true ,
" created " => 0 ,
" id " => $attachment -> getId (),
" owner_id " => $attachment -> getOwner () -> getId (),
" question " => $attachment -> getTitle (),
" votes " => $attachment -> getVoterCount (),
2022-10-12 01:00:52 +03:00
" disable_unvote " => $attachment -> isRevotable (),
2022-10-17 23:24:10 +03:00
" anonymous " => $attachment -> isAnonymous (),
" answer_ids " => $userVote ,
" answers " => $answers ,
" author_id " => $attachment -> getOwner () -> getId (),
2022-10-12 01:00:52 +03:00
]
];
}
2020-08-12 14:36:18 +03:00
}