1- using Microsoft . AspNetCore . Components ;
1+ using BlazorBootstrap ;
2+ using Microsoft . AspNetCore . Components ;
3+ using System . Collections . Generic ;
4+ using System . Threading . Tasks ;
25using TelegramDownloader . Data . db ;
36using TelegramDownloader . Models ;
47using TelegramDownloader . Services ;
@@ -330,10 +333,7 @@ public async Task<List<ChatMessages>> getAllMessages(long id, Boolean onlyFiles
330333 if ( msgBase is Message msg )
331334 {
332335 ChatMessages cm2 = new ChatMessages ( ) ;
333- cm2 . htmlMessage = client . EntitiesToHtml ( msg . message , msg . entities ) ;
334336 cm2 . message = msg ;
335-
336- cm2 . user = messages . UserOrChat ( msg . From ?? msg . Peer ) ;
337337 cm2 . isDocument = false ;
338338 if ( msg . media is MessageMediaDocument { document : Document document } )
339339 {
@@ -345,6 +345,8 @@ public async Task<List<ChatMessages>> getAllMessages(long id, Boolean onlyFiles
345345 cm . Add ( cm2 ) ;
346346 } else
347347 {
348+ cm2 . htmlMessage = client . EntitiesToHtml ( msg . message , msg . entities ) ;
349+ cm2 . user = messages . UserOrChat ( msg . From ?? msg . Peer ) ;
348350 cm . Add ( cm2 ) ;
349351 }
350352
@@ -356,6 +358,141 @@ public async Task<List<ChatMessages>> getAllMessages(long id, Boolean onlyFiles
356358 return cm ;
357359 }
358360
361+ public async Task < List < ChatMessages > > getAllMediaMessages ( long id , Boolean onlyFiles = false )
362+ {
363+ List < ChatMessages > cm = new List < ChatMessages > ( ) ;
364+ InputPeer peer = chats . chats [ id ] ;
365+ int size = 100 ;
366+ int page = 1 ;
367+
368+ var messages = await client . Messages_GetHistory ( peer , add_offset : page - 1 , limit : size ) ;
369+ if ( messages . Messages . Length == 0 ) return await Task . FromResult ( cm ) ;
370+ foreach ( MessageBase msgBase in messages . Messages )
371+ {
372+ if ( msgBase is Message msg )
373+ {
374+ ChatMessages cm2 = new ChatMessages ( ) ;
375+ cm2 . message = msg ;
376+ cm2 . isDocument = false ;
377+ if ( msg . media is MessageMediaDocument { document : Document document } )
378+ {
379+ cm2 . isDocument = true ;
380+ }
381+ if ( onlyFiles )
382+ {
383+ if ( cm2 . isDocument )
384+ cm . Add ( cm2 ) ;
385+ }
386+ else
387+ {
388+ cm2 . htmlMessage = client . EntitiesToHtml ( msg . message , msg . entities ) ;
389+ cm2 . user = messages . UserOrChat ( msg . From ?? msg . Peer ) ;
390+ cm . Add ( cm2 ) ;
391+ }
392+ }
393+ }
394+
395+ int totalMessages = messages . Count ;
396+ int gettedMessages = messages . Messages . Length ;
397+ int maxParalellTasks = 50 ;
398+ int totalTasks = 0 ;
399+ page ++ ;
400+ List < Task < List < ChatMessages > > > tasks = new List < Task < List < ChatMessages > > > ( ) ;
401+
402+ while ( gettedMessages < totalMessages )
403+ {
404+ int sizeGetted = gettedMessages + size >= totalMessages ? totalMessages - gettedMessages : size ;
405+
406+ tasks . Add ( getPaginatedMessagesAsync ( peer , page , sizeGetted , onlyFiles ) ) ;
407+ page ++ ;
408+ totalTasks ++ ;
409+ gettedMessages += sizeGetted ;
410+
411+ if ( totalTasks == maxParalellTasks || gettedMessages == totalMessages )
412+ {
413+ var results = await Task . WhenAll ( tasks ) ;
414+ totalTasks = 0 ;
415+
416+ foreach ( var result in results )
417+ {
418+ cm . AddRange ( result ) ;
419+ }
420+ }
421+ }
422+
423+ return await Task . FromResult ( cm ) ;
424+ }
425+
426+ private async Task < List < ChatMessages > > getPaginatedMessagesAsync ( InputPeer peer , int page , int size , Boolean onlyFiles = false )
427+ {
428+ List < ChatMessages > cm = new List < ChatMessages > ( ) ;
429+ var messages = await client . Messages_GetHistory ( peer , add_offset : ( page - 1 ) * 100 , limit : size ) ;
430+ if ( messages . Messages . Length == 0 ) return cm ;
431+ foreach ( MessageBase msgBase in messages . Messages )
432+ {
433+ if ( msgBase is Message msg )
434+ {
435+ ChatMessages cm2 = new ChatMessages ( ) ;
436+ cm2 . message = msg ;
437+ cm2 . isDocument = false ;
438+ if ( msg . media is MessageMediaDocument { document : Document document } )
439+ {
440+ cm2 . isDocument = true ;
441+ }
442+ if ( onlyFiles )
443+ {
444+ if ( cm2 . isDocument )
445+ cm . Add ( cm2 ) ;
446+ }
447+ else
448+ {
449+ cm2 . htmlMessage = client . EntitiesToHtml ( msg . message , msg . entities ) ;
450+ cm2 . user = messages . UserOrChat ( msg . From ?? msg . Peer ) ;
451+ cm . Add ( cm2 ) ;
452+ }
453+
454+
455+ }
456+ }
457+ return cm ;
458+ }
459+
460+ public async Task < GridDataProviderResult < ChatMessages > > getPaginatedMessages ( long id , int page , int size , Boolean onlyFiles = false )
461+ {
462+ List < ChatMessages > cm = new List < ChatMessages > ( ) ;
463+ InputPeer peer = chats . chats [ id ] ;
464+
465+ var messages = await client . Messages_GetHistory ( peer , add_offset : ( page - 1 ) * 100 , limit : size ) ;
466+ if ( messages . Messages . Length == 0 ) return await Task . FromResult ( new GridDataProviderResult < ChatMessages > { Data = cm , TotalCount = messages . Count } ) ;
467+ foreach ( MessageBase msgBase in messages . Messages )
468+ {
469+ if ( msgBase is Message msg )
470+ {
471+ ChatMessages cm2 = new ChatMessages ( ) ;
472+ cm2 . message = msg ;
473+ cm2 . isDocument = false ;
474+ if ( msg . media is MessageMediaDocument { document : Document document } )
475+ {
476+ cm2 . isDocument = true ;
477+ }
478+ if ( onlyFiles )
479+ {
480+ if ( cm2 . isDocument )
481+ cm . Add ( cm2 ) ;
482+ }
483+ else
484+ {
485+ cm2 . htmlMessage = client . EntitiesToHtml ( msg . message , msg . entities ) ;
486+ cm2 . user = messages . UserOrChat ( msg . From ?? msg . Peer ) ;
487+ cm . Add ( cm2 ) ;
488+ }
489+
490+
491+ }
492+ }
493+ return await Task . FromResult ( new GridDataProviderResult < ChatMessages > { Data = cm , TotalCount = messages . Count } ) ;
494+ }
495+
359496 public async Task < List < ChatMessages > > getAllFileMessages ( long id )
360497 {
361498 List < ChatMessages > cm = new List < ChatMessages > ( ) ;
0 commit comments