1+ import type { BusinessCallbackQueryContext , CallbackQueryContext , InlineCallbackQueryContext } from "@mtcute/dispatcher"
12import type { InputMediaLike , Peer } from "@mtcute/node"
23
34import { randomUUID } from "node:crypto"
4- import { Dispatcher , filters } from "@mtcute/dispatcher"
5+ import { Dispatcher } from "@mtcute/dispatcher"
56import { BotInline , BotKeyboard } from "@mtcute/node"
67
78import type { MediaRequest } from "@/core/data/request"
89import { createRequest , getRequest } from "@/core/data/request"
10+ import type { Settings } from "@/core/data/settings"
911import { incrementDownloadCount } from "@/core/data/stats"
1012import {
1113 getOutputSelectionMessage ,
@@ -18,8 +20,8 @@ import { evaluatorsFor } from "@/telegram/helpers/text"
1820
1921export const downloadDp = Dispatcher . child ( )
2022
21- downloadDp . onNewMessage ( filters . chat ( "user" ) , async ( msg ) => {
22- const { e, t } = await evaluatorsFor ( msg . sender )
23+ downloadDp . onNewMessage ( async ( msg ) => {
24+ const { e, t } = await evaluatorsFor ( msg . chat )
2325
2426 if ( msg . text === "meow" ) {
2527 await msg . replyText ( "meow :з" )
@@ -31,7 +33,8 @@ downloadDp.onNewMessage(filters.chat("user"), async (msg) => {
3133 const req = await createRequest ( extractedUrl || msg . text , msg . sender . id )
3234
3335 if ( ! req . success ) {
34- await msg . replyText ( t ( "error" , { message : e ( req . error ) } ) )
36+ if ( msg . chat . type === "user" )
37+ await msg . replyText ( t ( "error" , { message : e ( req . error ) } ) )
3538 return
3639 }
3740
@@ -45,16 +48,16 @@ downloadDp.onNewMessage(filters.chat("user"), async (msg) => {
4548 ] ) ,
4649 } )
4750
48- const settings = await getPeerSettings ( msg . sender )
51+ const settings = await getPeerSettings ( msg . chat )
4952 if ( settings . preferredOutput ) {
5053 await onOutputSelected (
5154 settings . preferredOutput ,
5255 req . result ,
5356 args => msg . client . editMessage ( { ...args , message : reply } ) ,
5457 { e, t } ,
55- msg . sender ,
56- ! ! settings . preferredAttribution ,
58+ settings ,
5759 ( { medias } ) => msg . replyMediaGroup ( medias ) ,
60+ msg . sender ,
5861 )
5962 }
6063} )
@@ -102,8 +105,13 @@ downloadDp.onInlineQuery(async (ctx) => {
102105} )
103106
104107downloadDp . onAnyCallbackQuery ( OutputButton . filter ( ) , async ( upd ) => {
105- const settings = await getPeerSettings ( upd . user )
106- const { t, e } = await evaluatorsFor ( upd . user )
108+ // When passing a filter to onAnyCallbackQuery it applies a modification to the update object, which makes it lose its enum-like properties.
109+ // To access the original update object, we need to cast it to the original type.
110+ const rawUpd = upd as unknown as ( CallbackQueryContext | InlineCallbackQueryContext | BusinessCallbackQueryContext )
111+
112+ const peer = rawUpd . _name === "callback_query" ? rawUpd . chat : upd . user
113+ const settings = await getPeerSettings ( peer )
114+ const { t, e } = await evaluatorsFor ( peer )
107115 const { output : outputType , request : requestId } = upd . match
108116
109117 const request = await getRequest ( requestId )
@@ -118,9 +126,9 @@ downloadDp.onAnyCallbackQuery(OutputButton.filter(), async (upd) => {
118126 request ,
119127 args => upd . editMessage ( args ) ,
120128 { t, e } ,
129+ settings ,
130+ ( { medias } ) => upd . client . sendMediaGroup ( peer . id , medias ) ,
121131 upd . user ,
122- ! ! settings . preferredAttribution ,
123- ( { medias } ) => upd . client . sendMediaGroup ( upd . user . id , medias ) ,
124132 )
125133} )
126134
@@ -136,9 +144,9 @@ downloadDp.onChosenInlineResult(async (upd) => {
136144 request ,
137145 args => upd . editMessage ( { ...args , messageId } ) ,
138146 await evaluatorsFor ( upd . user ) ,
139- upd . user ,
140- ! ! settings . preferredAttribution ,
147+ settings ,
141148 ( { medias } ) => upd . client . sendMediaGroup ( upd . user . id , medias ) ,
149+ upd . user ,
142150 )
143151 }
144152} )
@@ -148,12 +156,12 @@ async function onOutputSelected(
148156 request : MediaRequest | undefined ,
149157 editMessage : ( edit : { text ?: string , media ?: InputMediaLike } ) => Promise < unknown > ,
150158 { t, e } : Evaluators ,
151- peer : Peer ,
152- leaveSourceLink : boolean ,
159+ settings : Settings ,
153160 sendGroup : ( send : { medias : InputMediaLike [ ] } ) => Promise < unknown > ,
161+ sender : Peer ,
154162) {
155163 await editMessage ( { text : t ( "downloading-title" ) } )
156- const res = await handleMediaDownload ( outputType , request , peer )
164+ const res = await handleMediaDownload ( outputType , request , settings )
157165 if ( ! res . success ) {
158166 await editMessage ( { text : t ( "error" , { message : e ( res . error ) } ) } )
159167 return
@@ -168,10 +176,9 @@ async function onOutputSelected(
168176 await sendGroup ( { medias : chunk } )
169177 }
170178 } else {
171- await editMessage ( { media : res . result [ 0 ] } )
172- await editMessage ( { text : ( leaveSourceLink && request ?. url ) || "" } )
179+ await editMessage ( { media : res . result [ 0 ] , text : ( ! ! settings . preferredAttribution && request ?. url ) || "" } )
173180 }
174181
175- incrementDownloadCount ( peer . id )
182+ incrementDownloadCount ( sender . id )
176183 . catch ( ( ) => { /* noop */ } )
177184}
0 commit comments