diff --git a/src/main/java/ru/spliterash/vkVideoUnlocker/common/exceptions/ReUploadRestrictionException.kt b/src/main/java/ru/spliterash/vkVideoUnlocker/common/exceptions/ReUploadRestrictionException.kt new file mode 100644 index 0000000..de66ce4 --- /dev/null +++ b/src/main/java/ru/spliterash/vkVideoUnlocker/common/exceptions/ReUploadRestrictionException.kt @@ -0,0 +1,5 @@ +package ru.spliterash.vkVideoUnlocker.common.exceptions + +interface ReUploadRestrictionException : AlwaysNotifyException { + val restrictionName: String +} \ No newline at end of file diff --git a/src/main/java/ru/spliterash/vkVideoUnlocker/messageChain/handlers/DefaultVideoChain.kt b/src/main/java/ru/spliterash/vkVideoUnlocker/messageChain/handlers/DefaultVideoChain.kt index 3818913..c1a1c7a 100644 --- a/src/main/java/ru/spliterash/vkVideoUnlocker/messageChain/handlers/DefaultVideoChain.kt +++ b/src/main/java/ru/spliterash/vkVideoUnlocker/messageChain/handlers/DefaultVideoChain.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import ru.spliterash.vkVideoUnlocker.common.exceptions.AlwaysNotifyException +import ru.spliterash.vkVideoUnlocker.common.exceptions.ReUploadRestrictionException import ru.spliterash.vkVideoUnlocker.common.exceptions.VkUnlockerException import ru.spliterash.vkVideoUnlocker.longpoll.message.RootMessage import ru.spliterash.vkVideoUnlocker.longpoll.message.hasPing @@ -15,9 +16,8 @@ import ru.spliterash.vkVideoUnlocker.message.utils.MessageUtils import ru.spliterash.vkVideoUnlocker.messageChain.MessageHandler import ru.spliterash.vkVideoUnlocker.video.DownloadUrlSupplier import ru.spliterash.vkVideoUnlocker.video.exceptions.NoSenseReuploadUserVideos -import ru.spliterash.vkVideoUnlocker.video.exceptions.PrivateVideoDisabledException -import ru.spliterash.vkVideoUnlocker.video.exceptions.VideoTooLongException import ru.spliterash.vkVideoUnlocker.video.service.VideoReUploadService +import ru.spliterash.vkVideoUnlocker.video.service.VideoSaveService import ru.spliterash.vkVideoUnlocker.vk.actor.GroupUser import ru.spliterash.vkVideoUnlocker.vk.api.VkApi @@ -25,6 +25,7 @@ import ru.spliterash.vkVideoUnlocker.vk.api.VkApi class DefaultVideoChain( @GroupUser private val client: VkApi, private val utils: MessageUtils, + private val videoSaveService: VideoSaveService, private val reUploadService: VideoReUploadService, private val downloadUrlSupplier: DownloadUrlSupplier, ) : MessageHandler { @@ -57,15 +58,20 @@ class DefaultVideoChain( } val unlockedId: String = try { reUploadService.getUnlockedId(video).id - } catch (ex: PrivateVideoDisabledException) { - val url = downloadUrlSupplier.downloadUrl(video.attachmentId) - editableMessage.sendOrUpdate("Перезалив видео из закрытых групп временно отключён, но если очень хочется посмотреть, то вот\n$url") - return@coroutineScope true - } catch (ex: VideoTooLongException) { - val url = downloadUrlSupplier.downloadUrl(video.attachmentId) - editableMessage.sendOrUpdate("Видео длиннее 5 минут, поэтому перезаливать его как отдельное мы не будем. Но вы можете посмотреть его по ссылке:\n$url") - return@coroutineScope true } catch (ex: VkUnlockerException) { + if (ex is ReUploadRestrictionException) { + val url = downloadUrlSupplier.downloadUrl(video.attachmentId) + val full = video.fullVideo() + val pending = videoSaveService.createPendingVideo(full.toAccessor(), message, editableMessage) + editableMessage.sendOrUpdate( + "Видео не попадает под ограничение: ${ex.restrictionName}.\n" + + "Перезаливать от своего имени я его не буду, но ты можешь сделать это от своего, либо посмотреть по ссылке: \n$url", + keyboard = videoSaveService.createKeyboard(pending.id, full) + ) + + return@coroutineScope true + } + handleException(ex, message) return@coroutineScope true } finally { diff --git a/src/main/java/ru/spliterash/vkVideoUnlocker/messageChain/handlers/SaveVideoChain.kt b/src/main/java/ru/spliterash/vkVideoUnlocker/messageChain/handlers/SaveVideoChain.kt index d73e7ec..771e52e 100644 --- a/src/main/java/ru/spliterash/vkVideoUnlocker/messageChain/handlers/SaveVideoChain.kt +++ b/src/main/java/ru/spliterash/vkVideoUnlocker/messageChain/handlers/SaveVideoChain.kt @@ -1,12 +1,9 @@ package ru.spliterash.vkVideoUnlocker.messageChain.handlers -import com.fasterxml.jackson.databind.ObjectMapper -import io.micronaut.context.annotation.Value import jakarta.inject.Singleton import ru.spliterash.vkVideoUnlocker.longpoll.message.RootMessage import ru.spliterash.vkVideoUnlocker.message.editableMessage.EditableMessage import ru.spliterash.vkVideoUnlocker.message.utils.MessageUtils -import ru.spliterash.vkVideoUnlocker.message.vkModels.request.Keyboard import ru.spliterash.vkVideoUnlocker.messageChain.ActivationMessageHandler import ru.spliterash.vkVideoUnlocker.video.service.VideoSaveService @@ -14,10 +11,8 @@ import ru.spliterash.vkVideoUnlocker.video.service.VideoSaveService class SaveVideoChain( private val utils: MessageUtils, private val saveService: VideoSaveService, - @Value("\${vk-unlocker.miniAppId}") - private val appId: String, - private val mapper: ObjectMapper, -) : ActivationMessageHandler( + + ) : ActivationMessageHandler( "сохранить", "save", ) { @@ -33,30 +28,9 @@ class SaveVideoChain( editableMessage.sendOrUpdate( "Для сохранения видео нажми на кнопку ниже", - keyboard = Keyboard( - listOf( - listOf( - Keyboard.Button( - Keyboard.Button.OpenAppAction( - appId, - "Открыть сохранялку", - mapper.writeValueAsString( - Payload( - pending.id.toString(), - Payload.Video( - full.originalAttachmentId, - full.video.title, - full.video.preview().toString() - ) - ) - ) - ) - ) - ) - ) - ) + keyboard = saveService.createKeyboard(pending.id, full) ) - } // Вот это лесенка, прикольна + } return true } diff --git a/src/main/java/ru/spliterash/vkVideoUnlocker/video/api/VideosImpl.kt b/src/main/java/ru/spliterash/vkVideoUnlocker/video/api/VideosImpl.kt index d07ee08..ce51be1 100644 --- a/src/main/java/ru/spliterash/vkVideoUnlocker/video/api/VideosImpl.kt +++ b/src/main/java/ru/spliterash/vkVideoUnlocker/video/api/VideosImpl.kt @@ -58,7 +58,7 @@ class VideosImpl( .url( VkConst.urlBuilder("video.save") .addQueryParameter("name", name) - .addQueryParameter("privacy_view", if (private) "by_link" else "all") + .addQueryParameter("privacy_view", if (private) "3" else "0") .addQueryParameter("group_id", groupId.toString()) .build() ) diff --git a/src/main/java/ru/spliterash/vkVideoUnlocker/video/exceptions/PrivateVideoDisabledException.kt b/src/main/java/ru/spliterash/vkVideoUnlocker/video/exceptions/PrivateVideoDisabledException.kt index 07aa670..f0432e0 100644 --- a/src/main/java/ru/spliterash/vkVideoUnlocker/video/exceptions/PrivateVideoDisabledException.kt +++ b/src/main/java/ru/spliterash/vkVideoUnlocker/video/exceptions/PrivateVideoDisabledException.kt @@ -1,8 +1,11 @@ package ru.spliterash.vkVideoUnlocker.video.exceptions +import ru.spliterash.vkVideoUnlocker.common.exceptions.ReUploadRestrictionException import ru.spliterash.vkVideoUnlocker.common.exceptions.VkUnlockerException import ru.spliterash.vkVideoUnlocker.longpoll.message.RootMessage -class PrivateVideoDisabledException : VkUnlockerException() { +class PrivateVideoDisabledException : VkUnlockerException(), ReUploadRestrictionException { override fun messageForUser(source: RootMessage?) = "Видео из закрытых групп временно отключены" + override val restrictionName: String + get() = "закрытая группа" } \ No newline at end of file diff --git a/src/main/java/ru/spliterash/vkVideoUnlocker/video/exceptions/VideoTooLongException.kt b/src/main/java/ru/spliterash/vkVideoUnlocker/video/exceptions/VideoTooLongException.kt index bfdd83e..8376c26 100644 --- a/src/main/java/ru/spliterash/vkVideoUnlocker/video/exceptions/VideoTooLongException.kt +++ b/src/main/java/ru/spliterash/vkVideoUnlocker/video/exceptions/VideoTooLongException.kt @@ -1,8 +1,11 @@ package ru.spliterash.vkVideoUnlocker.video.exceptions +import ru.spliterash.vkVideoUnlocker.common.exceptions.ReUploadRestrictionException import ru.spliterash.vkVideoUnlocker.common.exceptions.VkUnlockerException import ru.spliterash.vkVideoUnlocker.longpoll.message.RootMessage -class VideoTooLongException : VkUnlockerException() { +class VideoTooLongException : VkUnlockerException(), ReUploadRestrictionException { override fun messageForUser(source: RootMessage?) = "Извини, но я не перезаливаю видео длинее 5 минут" + override val restrictionName: String + get() = "слишком длинное" } diff --git a/src/main/java/ru/spliterash/vkVideoUnlocker/video/service/VideoSaveService.kt b/src/main/java/ru/spliterash/vkVideoUnlocker/video/service/VideoSaveService.kt index 5c650e8..ac4e299 100644 --- a/src/main/java/ru/spliterash/vkVideoUnlocker/video/service/VideoSaveService.kt +++ b/src/main/java/ru/spliterash/vkVideoUnlocker/video/service/VideoSaveService.kt @@ -1,6 +1,8 @@ package ru.spliterash.vkVideoUnlocker.video.service +import com.fasterxml.jackson.databind.ObjectMapper import com.github.benmanes.caffeine.cache.Caffeine +import io.micronaut.context.annotation.Value import jakarta.inject.Singleton import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -8,8 +10,11 @@ import ru.spliterash.vkVideoUnlocker.common.CoroutineHelper.scope import ru.spliterash.vkVideoUnlocker.common.InputStreamSource import ru.spliterash.vkVideoUnlocker.longpoll.message.RootMessage import ru.spliterash.vkVideoUnlocker.message.editableMessage.EditableMessage +import ru.spliterash.vkVideoUnlocker.message.vkModels.request.Keyboard +import ru.spliterash.vkVideoUnlocker.messageChain.handlers.SaveVideoChain.Payload import ru.spliterash.vkVideoUnlocker.video.api.VideosCommons import ru.spliterash.vkVideoUnlocker.video.controller.request.VideoSaveRequest +import ru.spliterash.vkVideoUnlocker.video.dto.FullVideo import ru.spliterash.vkVideoUnlocker.video.exceptions.VideoSaveExpireException import ru.spliterash.vkVideoUnlocker.video.service.dto.VideoSaveEntry import java.util.* @@ -18,6 +23,9 @@ import java.util.concurrent.TimeUnit @Singleton class VideoSaveService( private val commons: VideosCommons, + @Value("\${vk-unlocker.miniAppId}") + private val appId: String, + private val mapper: ObjectMapper, ) { private val pending = Caffeine .newBuilder() @@ -25,6 +33,31 @@ class VideoSaveService( .build() .asMap() + // Вот это лесенка, прикольна + fun createKeyboard(pendingId: UUID, full: FullVideo): Keyboard { + return Keyboard( + listOf( + listOf( + Keyboard.Button( + Keyboard.Button.OpenAppAction( + appId, + "Открыть сохранялку", + mapper.writeValueAsString( + Payload( + pendingId.toString(), + Payload.Video( + full.originalAttachmentId, + full.video.title, + full.video.preview().toString() + ) + ) + ) + ) + ) + ) + ) + ) + } fun createPendingVideo( videoSource: InputStreamSource, @@ -56,7 +89,7 @@ class VideoSaveService( val ownerId = if (groupId == null) userId else -groupId entry.message.sendOrUpdate( "Успешно.\n" + - "По какой то непонятной мне причине, видео может быть не прикреплено к сообщению, в таком случае просто имей ввиду, что оно сохранилось туда, куда ты указал", + "Если назначение является закрытой группой или страницей, то видео не будет прикреплено к сообщению, но, оно есть там, куда ты сохранил", "video${ownerId}_${savedId}" ) } catch (ex: Exception) { diff --git a/src/main/java/ru/spliterash/vkVideoUnlocker/video/service/dto/VideoSaveEntry.kt b/src/main/java/ru/spliterash/vkVideoUnlocker/video/service/dto/VideoSaveEntry.kt index 87ab37f..87f9269 100644 --- a/src/main/java/ru/spliterash/vkVideoUnlocker/video/service/dto/VideoSaveEntry.kt +++ b/src/main/java/ru/spliterash/vkVideoUnlocker/video/service/dto/VideoSaveEntry.kt @@ -2,11 +2,11 @@ package ru.spliterash.vkVideoUnlocker.video.service.dto import ru.spliterash.vkVideoUnlocker.common.InputStreamSource import ru.spliterash.vkVideoUnlocker.message.editableMessage.EditableMessage -import java.util.UUID +import java.util.* data class VideoSaveEntry( - val id:UUID, + val id: UUID, val userId: Long, - val message:EditableMessage, - val accessor: InputStreamSource + val message: EditableMessage, + val accessor: InputStreamSource, ) \ No newline at end of file