diff --git a/src/CasaBot/AutoScan/AutoScanApp.cs b/src/CasaBot/AutoScan/AutoScanApp.cs index a02e13d..bcbcab7 100644 --- a/src/CasaBot/AutoScan/AutoScanApp.cs +++ b/src/CasaBot/AutoScan/AutoScanApp.cs @@ -35,8 +35,8 @@ public class AutoScanApp _logger.LogInformation("AutoScanApp is running..."); var at = DateTime.Now.AddSeconds(10); - var cron = $"{at.Second} {at.Minute} {at.Hour} * * ?"; - //var cron = CronFromAt(_options.At); + // var cron = $"{at.Second} {at.Minute} {at.Hour} * * ?"; + var cron = CronFromAt(_options.At); _logger.LogInformation("Waiting for next scan at {At} [{cron}].", at, cron); await _scheduler.Start(cancellationToken); diff --git a/src/CasaBot/AutoScan/Implementations/ShinobiConnector.cs b/src/CasaBot/AutoScan/Implementations/ShinobiConnector.cs index aa41a78..4a6a6e8 100644 --- a/src/CasaBot/AutoScan/Implementations/ShinobiConnector.cs +++ b/src/CasaBot/AutoScan/Implementations/ShinobiConnector.cs @@ -60,13 +60,13 @@ public class ShinobiConnector : IDVRConnector try { _logger.LogDebug("Downloading video..."); - var videoData = await _httpClient.GetByteArrayAsync(endpoint, cancellationToken); - if(runDry) { _logger.LogInformation("RunDry is enabled, skipping video download"); return; } + var videoData = await _httpClient.GetByteArrayAsync(endpoint, cancellationToken); + //Write the video to the file await File.WriteAllBytesAsync(videoPath, videoData, cancellationToken); _logger.LogInformation("Video downloaded successfully!"); diff --git a/src/CasaBot/CasaBotApp/BotHandler.cs b/src/CasaBot/CasaBotApp/BotHandler.cs index 5ebb717..88b4a73 100644 --- a/src/CasaBot/CasaBotApp/BotHandler.cs +++ b/src/CasaBot/CasaBotApp/BotHandler.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using System.Xml.Schema; using Telegram.Bots; using Telegram.Bots.Extensions.Polling; using Telegram.Bots.Requests.Usernames; @@ -92,20 +93,53 @@ public class BotHandler : IUpdateHandler public async Task UpdatePhotos(string[] paths) { - if (_subscribers.Count == 0) { _logger.LogWarning("No subscribers to send message to"); return; } + + //separate into groups of 10 and send them + var groups = paths.Select((x, i) => (x, i)).GroupBy(x => x.i / 10).Select(x => x.Select(y => y.x).ToArray()).ToArray(); + foreach (var group in groups) + { + await UpdatePhotosInt(group); + } + } + private async Task UpdatePhotosInt(string[] paths) + { var streams = paths.Select(File.OpenRead).ToList(); var photos = streams.Select(stream => new PhotoFile(stream)).Cast().ToList(); - foreach (var subscriber in _subscribers) + var s0 = _subscribers.FirstOrDefault()?.Id.ToString(); + if(s0 is null) { - var request = new SendMediaGroup(subscriber.Id.ToString(), photos); - await _bot.HandleAsync(request); + _logger.LogWarning("No subscribers to send message to"); + return; + } + + var request = new SendMediaGroup(s0, photos); + var response = await _bot.HandleAsync(request); + if (!response.Ok) + { + _logger.LogError("Error sending photos."); + } + + if (_subscribers.Count < 1) return; + + var caches = response.Result.Select(x => (x as PhotoMessage).PhotoSet.LastOrDefault()?.Id).ToList(); + var media = caches.Select(x => new CachedPhoto(x)).ToList(); + + //send to the rest of the subscribers + foreach (var subscriber in _subscribers.Skip(1).ToList()) + { + var request2 = new SendMediaGroup(subscriber.Id.ToString(), media); + var response2 = await _bot.HandleAsync(request2); + if (!response2.Ok) + { + _logger.LogError("Error sending photos to {Subscriber}", subscriber.Id); + } } foreach (var stream in streams) diff --git a/src/CasaBot/CasaBotApp/Program.cs b/src/CasaBot/CasaBotApp/Program.cs index 4215698..5e845eb 100644 --- a/src/CasaBot/CasaBotApp/Program.cs +++ b/src/CasaBot/CasaBotApp/Program.cs @@ -64,12 +64,19 @@ botHandler.Start(cts.Token); autoScanApp.OnScanCompleted = async options => { logger.LogInformation("Scan completed at {At}", DateTime.Now); + try + { + //list all the images in the detection folder + if (options.Scanner?.DetectionFolder is null) + return; + var images = Directory.GetFiles(options.Scanner.DetectionFolder , "*.jpg"); + botHandler.Update($"Scan completed, found {images.Length} images"); + botHandler.UpdatePhotos(images); + }catch(Exception ex) + { + logger.LogError(ex, "Error while sending message"); + } - //list all the images in the detection folder - if (options.Scanner?.DetectionFolder is null) - return; - var images = Directory.GetFiles(options.Scanner.DetectionFolder , "*.jpg"); - botHandler.UpdatePhotos(images); }; diff --git a/src/CasaBot/CasaBotApp/appsettings.json b/src/CasaBot/CasaBotApp/appsettings.json index 15baf3b..c667f11 100644 --- a/src/CasaBot/CasaBotApp/appsettings.json +++ b/src/CasaBot/CasaBotApp/appsettings.json @@ -17,16 +17,16 @@ "URL": "http://localhost:8080", "APIKey": "APIKEY", "GroupId": "Group", - "MonitorId": "Monitor", + "MonitorId": "Monitor" }, "AutoScan": { "Enabled": true, "RunDry": true, "At": "07:00", - "FromDayBefore": true, - "From": "23:00", + "FromDayBefore": false, + "From": "00:45", "To": "05:00", - "MaxAmount": 2, + "MaxAmount": 0, "MediaFolder": "./media/originals/", "Scanner": { "Exe": "./dvr-scanner/dvr-scan.exe",