@@ -4,8 +4,10 @@ import { repository } from '@roll-stack/database'
44import { Bot } from 'grammy'
55import { generateAccessCode } from './common'
66
7+ const S3_TELEGRAM_DIRECTORY = 'telegram/files'
8+
79const logger = useLogger ( 'telegram:wasabi-bot' )
8- const { telegram } = useRuntimeConfig ( )
10+ const { telegram, public : { mediaUrl } } = useRuntimeConfig ( )
911
1012let bot : Bot | null = null
1113
@@ -131,21 +133,36 @@ async function handlePhoto(ctx: Context) {
131133 return
132134 }
133135
136+ const fileId = bestQuality . file_id
137+
134138 const botToken = await getBotToken ( )
135139 if ( ! botToken ) {
136140 return null
137141 }
138142
139- const downloadUrl = await getFileDownloadUrl ( { ctx, fileId : bestQuality . file_id , botToken } )
143+ const downloadUrl = await getFileDownloadUrl ( { ctx, fileId, botToken } )
144+ if ( ! downloadUrl ) {
145+ return
146+ }
147+
148+ const extension = downloadUrl . split ( '.' ) . pop ( )
149+ const buffer = await fetch ( downloadUrl ) . then ( ( res ) => res . arrayBuffer ( ) )
150+
151+ const fileUri = `/${ S3_TELEGRAM_DIRECTORY } /${ fileId } .${ extension } `
152+ const fileUrl = `${ mediaUrl } ${ fileUri } `
153+
154+ const storage = useStorage ( 's3' )
155+ await storage . setItemRaw ( fileUri , buffer )
140156
141157 await repository . ticket . createMessage ( {
142158 ticketId : data . ticket . id ,
143159 userId : data . user . id ,
144- text : JSON . stringify ( { downloadUrl, photo : ctx . message . photo } ) ,
160+ telegramFileId : fileId ,
161+ fileUrl,
162+ text : ctx . message . caption ?? '' ,
145163 } )
146164
147- // Save photo?
148- logger . log ( 'photo' , data . user . id , ctx . message . from . id , ctx . message . text , ctx . message . photo , downloadUrl )
165+ logger . log ( 'photo' , data . user . id , ctx . message . from . id , ctx . message . caption , ctx . message . photo , downloadUrl )
149166 ctx . reply ( 'Фото передано в службу поддержки.' )
150167}
151168
@@ -159,14 +176,21 @@ async function handleVideo(ctx: Context) {
159176 return
160177 }
161178
179+ const botToken = await getBotToken ( )
180+ if ( ! botToken ) {
181+ return null
182+ }
183+
184+ const downloadUrl = await getFileDownloadUrl ( { ctx, fileId : ctx . message . video . file_id , botToken } )
185+
162186 await repository . ticket . createMessage ( {
163187 ticketId : data . ticket . id ,
164188 userId : data . user . id ,
165- text : JSON . stringify ( ctx . message . video ) ,
189+ telegramFileId : ctx . message . video . file_id ,
190+ text : ctx . message . caption ?? '' ,
166191 } )
167192
168- // Save video?
169- logger . log ( 'video' , data . user . id , ctx . message . from . id , ctx . message . text , ctx . message . video )
193+ logger . log ( 'video' , data . user . id , ctx . message . from . id , ctx . message . text , ctx . message . caption , ctx . message . video , downloadUrl )
170194 ctx . reply ( 'Видео передано в службу поддержки.' )
171195}
172196
@@ -180,14 +204,21 @@ async function handleFile(ctx: Context) {
180204 return
181205 }
182206
207+ const botToken = await getBotToken ( )
208+ if ( ! botToken ) {
209+ return null
210+ }
211+
212+ const downloadUrl = await getFileDownloadUrl ( { ctx, fileId : ctx . message . document . file_id , botToken } )
213+
183214 await repository . ticket . createMessage ( {
184215 ticketId : data . ticket . id ,
185216 userId : data . user . id ,
186- text : JSON . stringify ( ctx . message . document ) ,
217+ telegramFileId : ctx . message . document . file_id ,
218+ text : `${ ctx . message . caption ?? '' } ${ ctx . message . document ?. file_name ?? '' } ${ ctx . message . document ?. mime_type ?? '' } ` ,
187219 } )
188220
189- // Save file?
190- logger . log ( 'file' , data . user . id , ctx . message . from . id , ctx . message . text , ctx . message . document )
221+ logger . log ( 'file' , data . user . id , ctx . message . from . id , ctx . message . text , ctx . message . caption , ctx . message . document , downloadUrl )
191222 ctx . reply ( 'Файл передан в службу поддержки.' )
192223}
193224
0 commit comments