Skip to content

Commit 8bad38f

Browse files
committed
feat: show channel files
1 parent 00c0e91 commit 8bad38f

8 files changed

Lines changed: 197 additions & 34 deletions

File tree

TelegramDownloader/Data/ITelegramService.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using TelegramDownloader.Models;
1+
using BlazorBootstrap;
2+
using TelegramDownloader.Models;
23
using TL;
34
using WTelegram;
45

@@ -23,6 +24,8 @@ public interface ITelegramService
2324
Task<List<ChatViewBase>> getAllChats();
2425
Task<List<ChatViewBase>> getAllSavedChats();
2526
Task<List<ChatMessages>> getAllMessages(long id, Boolean onlyFiles = false);
27+
Task<GridDataProviderResult<ChatMessages>> getPaginatedMessages(long id, int page, int size, Boolean onlyFiles = false);
28+
Task<List<ChatMessages>> getAllMediaMessages(long id, Boolean onlyFiles = false);
2629
Task<List<ChatMessages>> getChatHistory(long id, int limit = 30, int addOffset = 0);
2730
string getChatName(long id);
2831
Task<Message> getMessageFile(string chatId, int idMessage);

TelegramDownloader/Data/TelegramService.cs

Lines changed: 141 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
using Microsoft.AspNetCore.Components;
1+
using BlazorBootstrap;
2+
using Microsoft.AspNetCore.Components;
3+
using System.Collections.Generic;
4+
using System.Threading.Tasks;
25
using TelegramDownloader.Data.db;
36
using TelegramDownloader.Models;
47
using 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>();

TelegramDownloader/Models/GeneralConfig.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public class GeneralConfig
7474
public bool CheckHash { get; set; } = false;
7575
public bool ShouldShowCaptionPath { get; set; } = false;
7676
public bool ShouldShowLogInTerminal { get; set; } = false;
77+
public bool ShouldShowPaginatedFileChannel { get; set; } = false;
7778
public List<long> FavouriteChannels { get; set; } = new List<long>();
7879

7980
}

TelegramDownloader/Pages/Config.razor

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,15 @@
5353
</div>
5454

5555

56+
</div>
57+
58+
<div>
59+
<div class="form-check form-switch">
60+
<InputCheckbox @bind-Value="Model!.ShouldShowPaginatedFileChannel" class="form-check-input" type="checkbox" id="ShouldShowPaginatedFileChannel" />
61+
<label class="form-check-label" for="ShouldShowPaginatedFileChannel">Show File Page channel</label>
62+
</div>
63+
64+
5665
</div>
5766

5867
<div>

TelegramDownloader/Pages/FileGrid.razor

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,48 +19,49 @@
1919
Class="table table-hover table-bordered table-striped"
2020
DataProvider="ChatsDataProvider"
2121
AllowPaging="true"
22-
PageSize="25"
22+
PageSize="@pageSize"
2323
AllowSelection="true"
2424
SelectionMode="GridSelectionMode.Multiple"
2525
@bind-SelectedItems="@SelectedItems"
26-
PageSizeSelectorVisible="true"
26+
PageSizeSelectorVisible="false"
2727
PageSizeSelectorItems="@(new int[] { 25, 50, 100 })"
28+
AllowFiltering="true"
2829
Responsive="true">
2930

3031
<GridColumns>
31-
<GridColumn TItem="ChatMessages" HeaderText="Id">
32+
<GridColumn TItem="ChatMessages" PropertyName="message.id" HeaderText="Id">
3233
@context.message.id
3334
</GridColumn>
34-
<GridColumn TItem="ChatMessages" HeaderText="Name">
35+
<GridColumn TItem="ChatMessages" HeaderText="Name" PropertyName="message.message" StringComparison="StringComparison.Ordinal">
3536
@context.message.message
3637
</GridColumn>
37-
<GridColumn TItem="ChatMessages" HeaderText="Created">
38+
<GridColumn TItem="ChatMessages" HeaderText="Created" PropertyName="message.Date" Filterable="false">
3839
@context.message.Date.ToString("dd/MM/yyyy HH:mm:ss")
3940
</GridColumn>
40-
<GridColumn TItem="ChatMessages" HeaderText="Edited">
41+
<GridColumn TItem="ChatMessages" HeaderText="Edited" PropertyName="message.edit_date" Filterable="false">
4142
@(context.message.edit_date.Year > 1900
42-
? context.message.edit_date.ToString("dd/MM/yyyy HH:mm:ss")
43-
: "")
43+
? context.message.edit_date.ToString("dd/MM/yyyy HH:mm:ss")
44+
: "")
4445
</GridColumn>
45-
<GridColumn TItem="ChatMessages" HeaderText="File Name">
46+
<GridColumn TItem="ChatMessages" HeaderText="File Name" PropertyName="message.media.Filename" StringComparison="StringComparison.Ordinal" Filterable="false">
4647
@if (context.message.media is MessageMediaDocument { document: Document document })
4748
{
4849
<span>@document.Filename</span>
4950
}
5051
</GridColumn>
51-
<GridColumn TItem="ChatMessages" HeaderText="Size">
52+
<GridColumn TItem="ChatMessages" HeaderText="Size" PropertyName="message.media.size" Filterable="false">
5253
@if (context.message.media is MessageMediaDocument { document: Document document })
5354
{
5455
<span>@HelperService.SizeSuffix(document.size)</span>
5556
}
5657
</GridColumn>
57-
<GridColumn TItem="ChatMessages" HeaderText="Extension">
58+
<GridColumn TItem="ChatMessages" HeaderText="Extension" PropertyName="message.media.mime_type" Filterable=" false">
5859
@if (context.message.media is MessageMediaDocument { document: Document document })
5960
{
6061
<span>@document.mime_type</span>
6162
}
6263
</GridColumn>
63-
<GridColumn TItem="ChatMessages" HeaderText="Preview">
64+
<GridColumn TItem="ChatMessages" HeaderText="Preview" PropertyName="message.media.videoThumb" Filterable="false">
6465
@context.videoThumb
6566
@if (context.message.media is MessageMediaPhoto { photo: Photo photo })
6667
{
@@ -84,15 +85,17 @@ Responsive="true">
8485
[Parameter]
8586
public string id { get; set; }
8687
public List<ChatMessages> messages = default!;
88+
private int pageSize = 100;
8789

8890
private Modals.DowloadFromTelegram Modal { get; set; }
8991
private HashSet<ChatMessages> SelectedItems { get; set; } = new();
9092

9193
private async Task<GridDataProviderResult<ChatMessages>> ChatsDataProvider(GridDataProviderRequest<ChatMessages> request)
9294
{
93-
if (messages is null) {
95+
if (messages is null)
96+
{
9497
PreloadService.Show(SpinnerColor.Light, "Loading data...");
95-
messages = await ts.getAllMessages(Convert.ToInt64(id), true);
98+
messages = await ts.getAllMediaMessages(Convert.ToInt64(id), true);
9699
PreloadService.Hide();
97100
}
98101

TelegramDownloader/Pages/Modals/DowloadFromTelegram.razor

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
if (isDownloadingChatMessages)
8686
{
8787
chatMessages.ForEach(message => fs.DownloadFileFromChat(message, null, ddtree.selectedNode == null ? null : ddtree.selectedNode.FirstOrDefault(), null));
88+
Close();
8889
return;
8990
}
9091
// ts.

TelegramDownloader/Services/TransactionInfoService.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ public void stopTimer()
8585

8686
private void OnTimedEvent(Object source, ElapsedEventArgs e)
8787
{
88-
_logger.LogInformation("El evento Elapsed se disparó a las {0:HH:mm:ss.fff}", e.SignalTime);
89-
_logger.LogInformation("Upload: {0}, download: {1}", bytesUploaded, bytesDownloaded);
88+
//_logger.LogInformation("El evento Elapsed se disparó a las {0:HH:mm:ss.fff}", e.SignalTime);
89+
//_logger.LogInformation("Upload: {0}, download: {1}", bytesUploaded, bytesDownloaded);
9090
if (bytesDownloaded > 0)
9191
setDownloadSpeed(HelperService.SizeSuffixPerTime(bytesDownloaded));
9292
if (bytesUploaded > 0)
@@ -104,7 +104,6 @@ public async Task addDownloadBytes(long bytes)
104104

105105
public async Task addUploadBytes(long bytes)
106106
{
107-
_logger.LogInformation("Add bytes to upload {0}", bytes);
108107
UploadBytesMutex.WaitOne();
109108
bytesUploaded += bytes;
110109
UploadBytesMutex.ReleaseMutex();
@@ -132,7 +131,7 @@ public void setDownloadSpeed(String speed)
132131

133132
public void setUploadSpeed(String speed)
134133
{
135-
_logger.LogInformation("Set bytes speed upload {0}", speed);
134+
//_logger.LogInformation("Set bytes speed upload {0}", speed);
136135
uploadSpeed = speed;
137136
TaskEventChanged.Invoke(null, EventArgs.Empty);
138137
}

TelegramDownloader/Shared/NavMenu.razor

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
@inject IJSRuntime JS;
1212

1313
<style>
14-
14+
1515
</style>
1616

1717
<div class="top-row ps-3 navbar navbar-dark">
@@ -41,7 +41,7 @@
4141
<button type="button" class="btn btn-outline-primary groupbtnactionclass" @onclick="showPlayer"><i class="bi bi-boombox"></i></button>
4242
<button class="btn groupbtnactionclass" type="button" @onclick="HandleThreeDots"><i class="bi bi-three-dots"></i></button>
4343
</div>
44-
44+
4545

4646
<Tabs EnableFadeEffect="true" @ref="tabs" Id="menutab" OnShowing="@(args => OnTabShowingAsync(args))">
4747
<Tab Active="true" Title="Mine" Name="Mine">
@@ -76,9 +76,12 @@
7676
</div>
7777
</div>
7878
<div class="col-2" style="position: relative; padding-top: 2%; padding-left: 0;">
79-
<button class="btn" type="button" style="padding:0" data-bs-toggle="dropdown" aria-expanded="false" @onclick="@(async () => await goTo($"/filegrid/{cb.chat.ID}"))">
80-
<span style="color:white" class="bi bi-table"></span>
81-
</button>
79+
@if (GeneralConfigStatic.config.ShouldShowPaginatedFileChannel)
80+
{
81+
<button class="btn" type="button" style="padding:0" data-bs-toggle="dropdown" aria-expanded="false" @onclick="@(async () => await goTo($"/filegrid/{cb.chat.ID}"))">
82+
<span style="color:white" class="bi bi-table"></span>
83+
</button>
84+
}
8285
<button class="btn" type="button" style="padding:0" data-bs-toggle="dropdown" aria-expanded="false" @onclick="@(async () => await goTo($"/fm/{cb.chat.ID}"))">
8386
<span style="color:white" class="bi bi-folder"></span>
8487
</button>
@@ -112,9 +115,13 @@
112115
</div>
113116
</div>
114117
<div class="col-2" style="position: relative; padding-top: 2%; padding-left: 0;">
115-
<button class="btn" type="button" style="padding:0" data-bs-toggle="dropdown" aria-expanded="false" @onclick="@(async () => await goTo($"/filegrid/{cb.chat.ID}"))">
116-
<span style="color:white" class="bi bi-table"></span>
117-
</button>
118+
@if(GeneralConfigStatic.config.ShouldShowPaginatedFileChannel)
119+
{
120+
<button class="btn" type="button" style="padding:0" data-bs-toggle="dropdown" aria-expanded="false" @onclick="@(async () => await goTo($"/filegrid/{cb.chat.ID}"))">
121+
<span style="color:white" class="bi bi-table"></span>
122+
</button>
123+
}
124+
118125
<button class="btn" type="button" style="padding:0" data-bs-toggle="dropdown" aria-expanded="false" @onclick="@(async () => await goTo($"/fm/{cb.chat.ID}"))">
119126
<span style="color:white" class="bi bi-folder"></span>
120127
</button>
@@ -197,9 +204,12 @@
197204
</div>
198205
</div>
199206
<div class="col-2" style="position: relative; padding-top: 2%; padding-left: 0;">
200-
<button class="btn" type="button" style="padding:0" data-bs-toggle="dropdown" aria-expanded="false" @onclick="@(async () => await goTo($"/filegrid/{cb.chat.ID}"))">
201-
<span style="color:white" class="bi bi-table"></span>
202-
</button>
207+
@if (GeneralConfigStatic.config.ShouldShowPaginatedFileChannel)
208+
{
209+
<button class="btn" type="button" style="padding:0" data-bs-toggle="dropdown" aria-expanded="false" @onclick="@(async () => await goTo($"/filegrid/{cb.chat.ID}"))">
210+
<span style="color:white" class="bi bi-table"></span>
211+
</button>
212+
}
203213
<button class="btn" type="button" style="padding:0" data-bs-toggle="dropdown" aria-expanded="false" @onclick="@(async () => await goTo($"/fm/{cb.chat.ID}"))">
204214
<span style="color:white" class="bi bi-folder"></span>
205215
</button>

0 commit comments

Comments
 (0)