Skip to content

Commit

Permalink
Ещё одна подсказка для закрытых групп
Browse files Browse the repository at this point in the history
  • Loading branch information
Spliterash committed Nov 9, 2024
1 parent 43c728d commit 0e34776
Show file tree
Hide file tree
Showing 8 changed files with 72 additions and 48 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.spliterash.vkVideoUnlocker.common.exceptions

interface ReUploadRestrictionException : AlwaysNotifyException {
val restrictionName: String
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -15,16 +16,16 @@ 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

@Singleton
class DefaultVideoChain(
@GroupUser private val client: VkApi,
private val utils: MessageUtils,
private val videoSaveService: VideoSaveService,
private val reUploadService: VideoReUploadService,
private val downloadUrlSupplier: DownloadUrlSupplier,
) : MessageHandler {
Expand Down Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,18 @@
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

@Singleton
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",
) {
Expand All @@ -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
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
)
Expand Down
Original file line number Diff line number Diff line change
@@ -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() = "закрытая группа"
}
Original file line number Diff line number Diff line change
@@ -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() = "слишком длинное"
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
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
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.*
Expand All @@ -18,13 +23,41 @@ 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()
.expireAfterWrite(30, TimeUnit.MINUTES)
.build<UUID, VideoSaveEntry>()
.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,
Expand Down Expand Up @@ -56,7 +89,7 @@ class VideoSaveService(
val ownerId = if (groupId == null) userId else -groupId
entry.message.sendOrUpdate(
"Успешно.\n" +
"По какой то непонятной мне причине, видео может быть не прикреплено к сообщению, в таком случае просто имей ввиду, что оно сохранилось туда, куда ты указал",
"Если назначение является закрытой группой или страницей, то видео не будет прикреплено к сообщению, но, оно есть там, куда ты сохранил",
"video${ownerId}_${savedId}"
)
} catch (ex: Exception) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)

0 comments on commit 0e34776

Please sign in to comment.