added support for .env file and improved validation
This commit is contained in:
		
							
								
								
									
										47
									
								
								Program.cs
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								Program.cs
									
									
									
									
									
								
							@@ -7,9 +7,11 @@ public class MastodonBot
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    private static Timer _timer;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    private static async Task Main()
 | 
			
		||||
    {
 | 
			
		||||
        DotNetEnv.Env.Load();
 | 
			
		||||
 | 
			
		||||
        // Configure logging
 | 
			
		||||
        using var loggerFactory = LoggerFactory.Create(builder =>
 | 
			
		||||
        {
 | 
			
		||||
@@ -17,8 +19,12 @@ public class MastodonBot
 | 
			
		||||
        });
 | 
			
		||||
        var logger = loggerFactory.CreateLogger<MastodonBot>();
 | 
			
		||||
 | 
			
		||||
        if(!CheckEnv.IsValid()){
 | 
			
		||||
            logger.LogCritical("Error reading envinonment variables, either some values are missing or no .env file was found");
 | 
			
		||||
            throw new Exception("Error reading envinonment variables, either some values are missing or no .env file was found");
 | 
			
		||||
        }
 | 
			
		||||
        // Setup DB
 | 
			
		||||
        var db = await DbInitializer.SetupDb(Environment.GetEnvironmentVariable("DB_NAME"));
 | 
			
		||||
        var db = await DbInitializer.SetupDb(DotNetEnv.Env.GetString("DB_NAME"));
 | 
			
		||||
        if (db == null)
 | 
			
		||||
        {
 | 
			
		||||
            logger.LogCritical("Unable to setup DB");
 | 
			
		||||
@@ -27,26 +33,31 @@ public class MastodonBot
 | 
			
		||||
        logger.LogInformation("DB setup done");
 | 
			
		||||
 | 
			
		||||
        // Setup bot
 | 
			
		||||
        var bot = new TelegramBotClient(Environment.GetEnvironmentVariable("BOT_TOKEN"));
 | 
			
		||||
        var me = await bot.GetMeAsync();
 | 
			
		||||
        await bot.DropPendingUpdatesAsync();
 | 
			
		||||
        logger.LogInformation($"Bot is running as {me.FirstName}.");
 | 
			
		||||
 | 
			
		||||
        bot.OnUpdate += OnUpdate;
 | 
			
		||||
            var bot = new TelegramBotClient(DotNetEnv.Env.GetString("BOT_TOKEN"));
 | 
			
		||||
 | 
			
		||||
        // Handle bot updates
 | 
			
		||||
        async Task OnUpdate(Update update)
 | 
			
		||||
        {
 | 
			
		||||
            switch (update)
 | 
			
		||||
            var me = await bot.GetMeAsync();
 | 
			
		||||
            await bot.DropPendingUpdatesAsync();
 | 
			
		||||
            bot.OnUpdate += OnUpdate;
 | 
			
		||||
 | 
			
		||||
            logger.LogInformation($"Bot is running as {me.FirstName}.");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            // Handle bot updates
 | 
			
		||||
            async Task OnUpdate(Update update)
 | 
			
		||||
            {
 | 
			
		||||
                case { CallbackQuery: { } callbackQuery }: await HandlePostAction.HandleCallbackQuery(callbackQuery,db,bot, logger); break;
 | 
			
		||||
                default: logger.LogInformation($"Received unhandled update {update.Type}"); break;
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
                switch (update)
 | 
			
		||||
                {
 | 
			
		||||
                    case { CallbackQuery: { } callbackQuery }: await HandlePostAction.HandleCallbackQuery(callbackQuery, db, bot, logger); break;
 | 
			
		||||
                    default: logger.LogInformation($"Received unhandled update {update.Type}"); break;
 | 
			
		||||
                };
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        // Set a timer to fetch and process posts every 15 minutes
 | 
			
		||||
        _timer = new Timer(async _ => await RunCheck.runAsync(db, bot, Environment.GetEnvironmentVariable("TAG"),logger,Environment.GetEnvironmentVariable("CUSTOM_INSTANCE")), null, TimeSpan.Zero, TimeSpan.FromMinutes(15));
 | 
			
		||||
        Console.ReadLine();
 | 
			
		||||
            // Set a timer to fetch and process posts every 15 minutes
 | 
			
		||||
            _timer = new Timer(async _ => await RunCheck.runAsync(db, bot, DotNetEnv.Env.GetString("TAG"), logger, DotNetEnv.Env.GetString("CUSTOM_INSTANCE")), null, TimeSpan.Zero, TimeSpan.FromMinutes(15));
 | 
			
		||||
            Console.ReadLine();
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								Services/CheckEnv.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								Services/CheckEnv.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace mstdnCats.Services
 | 
			
		||||
{
 | 
			
		||||
    public class CheckEnv
 | 
			
		||||
    {
 | 
			
		||||
        public static Boolean IsValid(){
 | 
			
		||||
            if (DotNetEnv.Env.GetString("DB_NAME") == null ||
 | 
			
		||||
            DotNetEnv.Env.GetString("BOT_TOKEN") == null ||
 | 
			
		||||
            DotNetEnv.Env.GetString("TAG") == null ||
 | 
			
		||||
            DotNetEnv.Env.GetString("CHANNEL_NUMID") == null ||
 | 
			
		||||
            DotNetEnv.Env.GetString("ADMIN_NUMID") == null ){
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -9,19 +9,22 @@ namespace mstdnCats.Services
 | 
			
		||||
        {
 | 
			
		||||
            // Setup DB
 | 
			
		||||
            IDocumentCollection<Post>? collection = null;
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            if (_dbname != null)
 | 
			
		||||
            {
 | 
			
		||||
                // Initialize DB
 | 
			
		||||
                var store = new DataStore($"{_dbname}.json", minifyJson: false);
 | 
			
		||||
                collection = store.GetCollection<Post>();
 | 
			
		||||
            }
 | 
			
		||||
            catch
 | 
			
		||||
            {
 | 
			
		||||
                return Task.FromResult<IDocumentCollection<Post>>(null);
 | 
			
		||||
            }
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    // Initialize DB
 | 
			
		||||
                    var store = new DataStore($"{_dbname}.json", minifyJson: false);
 | 
			
		||||
                    collection = store.GetCollection<Post>();
 | 
			
		||||
                }
 | 
			
		||||
                catch
 | 
			
		||||
                {
 | 
			
		||||
                    return Task.FromResult<IDocumentCollection<Post>>(null);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            // Return collection
 | 
			
		||||
                // Return collection
 | 
			
		||||
                return Task.FromResult(collection);
 | 
			
		||||
            }
 | 
			
		||||
            return Task.FromResult(collection);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ namespace mstdnCats.Services
 | 
			
		||||
                    if (updated)
 | 
			
		||||
                    {
 | 
			
		||||
                        // Send the media attachment to the channel
 | 
			
		||||
                        await _bot.SendPhotoAsync(Environment.GetEnvironmentVariable("CHANNEL_NUMID"), post.MediaAttachments.First().Url, caption: $"Post from " + $"<a href=\"" + post.Account.Url + "\">" + post.Account.DisplayName + " </a>", parseMode: ParseMode.Html
 | 
			
		||||
                        await _bot.SendPhotoAsync(DotNetEnv.Env.GetString("CHANNEL_NUMID"), post.MediaAttachments.First().Url, caption: $"Post from " + $"<a href=\"" + post.Account.Url + "\">" + post.Account.DisplayName + " </a>", parseMode: ParseMode.Html
 | 
			
		||||
                        , replyMarkup: new InlineKeyboardMarkup(InlineKeyboardButton.WithUrl("View on Mastodon", post.Url)));
 | 
			
		||||
 | 
			
		||||
                        await _bot.AnswerCallbackQueryAsync(callbackQuery.Id, "Media attachment approved and sent to channel.");
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ namespace mstdnCats.Services
 | 
			
		||||
                    // Send approve or reject message to admin
 | 
			
		||||
                    foreach (var media in post.MediaAttachments)
 | 
			
		||||
                    {
 | 
			
		||||
                        await _bot.SendPhotoAsync(Environment.GetEnvironmentVariable("ADMIN_NUMID"), media.PreviewUrl, caption: $"<a href=\"" + post.Url + "\"> Mastodon </a>", parseMode: ParseMode.Html
 | 
			
		||||
                        await _bot.SendPhotoAsync(DotNetEnv.Env.GetString("ADMIN_NUMID"), media.PreviewUrl, caption: $"<a href=\"" + post.Url + "\"> Mastodon </a>", parseMode: ParseMode.Html
 | 
			
		||||
                        , replyMarkup: new InlineKeyboardMarkup().AddButton("Approve", $"approve-{media.MediaId}").AddButton("Reject", $"reject-{media.MediaId}"));
 | 
			
		||||
 | 
			
		||||
                    }
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,7 @@
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="DotNetEnv" Version="3.1.1" />
 | 
			
		||||
    <PackageReference Include="JsonFlatFileDataStore" Version="2.4.2" />
 | 
			
		||||
    <PackageReference Include="Telegram.Bot" Version="21.11.0" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user