コード例 #1
0
        public void Awaiting_Item_Changes_Status_To_ReadyToSend_After_Checking_Period()
        {
            //preparing

            var storage = new InMemoryReminderStorage();

            var sender   = new TelegramReminderSender("1467408776:AAGSGszyTCYYCTWTKu4PL_it029uC8X8hbs");
            var receiver = new TelegramReminderReceiver("1467408776:AAGSGszyTCYYCTWTKu4PL_it029uC8X8hbs");

            using var domain = new ReminderDomain(storage, receiver, sender, TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(50));

            var item = new ReminderItem(DateTimeOffset.Now, "Hello World!", "TestContact"); //addReminderModel

            //domain.AddReminder(item); //Model was here

            // run

            domain.Run();

            //Check the result

            System.Threading.Thread.Sleep(50);

            var actualItem = storage.Get(item.Id);

            Assert.IsNotNull(actualItem);
            Assert.AreEqual(ReminderItemStatus.ReadyToSend, actualItem.Status);
        }
コード例 #2
0
        static void Main(string[] args)
        {
            Console.WriteLine("Telegram Bot Application!");

            var storage = new InMemoryReminderStorage();

            string token = "633428988:AAHLW_LaS7A47PDO2I8sbLkIIM9L0joPOSQ";

            IWebProxy proxy = new HttpToSocks5Proxy(
                "proxy.golyakov.net", 1080);

            var receiver = new TelegramReminderReceiver(token, proxy);

            var domain = new ReminderDomain(storage, receiver);
            var sender = new TelegramReminderSender(token, proxy);


            domain.SendReminder = (ReminderItem ri) =>
            {
                sender.Send(ri.ContactId, ri.Message);
            };

            domain.MessageReceived          += Domain_MessageReceived;
            domain.MessageParsingSuccedded  += Domain_MessageParsingSuccedded;
            domain.MessageParsingFailed     += Domain_MessageParsingFailed;
            domain.AddingToStorageSuccedded += Domain_AddingToStorageSuccedded;
            domain.AddingToStorageFailed    += Domain_AddingToStorageFailed;

            domain.Run();

            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
コード例 #3
0
        static void Main(string[] args)
        {
            Console.WriteLine("Telegram Bot Application!");

            var       storage = new InMemoryReminderStorage();
            var       domain  = new ReminderDomain(storage);
            IWebProxy proxy   = new HttpToSocks5Proxy("proxy.golyakov.net", 1080);
            string    token   = "874002335:AAHCWlQVHGvM6if784HJ0rHTfcUg7SbSR5s";

            var sender   = new TelegramReminderSender(token, proxy);
            var receiver = new TelegramReminderReceiver(token, proxy);


            receiver.MessageReceived += (s, e) =>
            {
                Console.WriteLine($"Message from contact '{e.ContactId}' with text '{e.Message}'");
                //add new reminderitem to the storage
                var parsedMessage = MessageParser.Parse(e.Message);
                var item          = new ReminderItem(parsedMessage.Date, parsedMessage.Message, e.ContactId);

                storage.Add(item);
            };

            receiver.Run();

            domain.SendReminder = (ReminderItem ri) =>
            {
                sender.Send(ri.ContactId, ri.Message);
            };

            domain.Run();

            Console.WriteLine("Press any key to continue");
            Console.ReadKey();
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: Direaper/nordic-it-netcore
        static void Main(string[] args)
        {
            const string token = "633428988:AAHLW_LaS7A47PDO2I8sbLkIIM9L0joPOSQ";

            var storage = new InMemoryReminderStorage();
            //var storage = new ReminderStorageWebApiClient("URL");
            var sender   = new TelegramReminderSender(token);
            var receiver = new TelegramReminderReceiver(token);

            using var domain = new ReminderDomain(
                      storage,
                      receiver,
                      sender,
                      TimeSpan.FromSeconds(1),
                      TimeSpan.FromSeconds(1));

            domain.SendingSucceeded += Domain_SendingSucceeded;
            domain.SendingFailed    += DomainOnSendingFailed;
            domain.ParsingFailed    += Domain_ParsingFailed;
            domain.AddingSucceeded  += Domain_AddingSucceeded;
            domain.AddingFailed     += Domain_AddingFailed;

            domain.Run();

            Console.WriteLine("Domain logic running... (press any key to exit)");
            Console.ReadKey();
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: Tsoy-tech/it-nordic-school
        static void Main()
        {
            var    config = new ConfigurationBuilder().AddJsonFile("settings.json").Build();
            string token  = config["TelegramToken"];
            string apiUrl = config["RemindersWebApiUrl"];
            //botID = "1467408776"

            var storage = new ReminderStorageWebApiClient(apiUrl);

            var sender   = new TelegramReminderSender(token);
            var receiver = new TelegramReminderReceiver(token);

            using var domain = new ReminderDomain(storage, receiver, sender, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));

            domain.SendingSucceeded += Domain_SendingSucceeded;
            domain.SendingFailed    += Domain_SendingFailed;
            domain.ParsingFailed    += Domain_ParsingFailed;
            domain.AddingSucceeded  += Domain_AddingSucceeded;
            domain.AddingFailed     += Domain_AddingFailed;

            domain.Run();

            Console.WriteLine("Domain logic running...");
            Console.ReadKey();
        }
コード例 #6
0
        public void GetHelloFromBot_Returns_Not_Empty_String()
        {
            TelegramReminderReceiver reminderReceiver = new TelegramReminderReceiver(_token);

            string description = reminderReceiver.GetHelloFromBot();

            Assert.IsNotNull(description);
        }
コード例 #7
0
        static void Main(string[] args)
        {
            // read configuration

            IConfiguration config = new ConfigurationBuilder()
                                    .AddJsonFile("appsettings.json", true, true)
                                    .Build();

            var storageWebApiUrl         = config["storageWebApiUrl"];
            var telegramBotApiToken      = config["telegramBot.ApiToken"];
            var telegramBotUseProxy      = bool.Parse(config["telegramBot.UseProxy"]);
            var telegramBotProxyHost     = config["telegramBot.Proxy.Host"];
            var telegramBotProxyPort     = int.Parse(config["telegramBot.Proxy.Port"]);
            var telegramBotProxyLogin    = config["telegramBot.Proxy.Login"];
            var telegramBotProxyPassword = config["telegramBot.Proxy.Password"];

            // create objects for DI
            var reminderStorage = new ReminderStorageWebApiClient(storageWebApiUrl);

            IWebProxy telegramProxy = null;

            if (telegramBotUseProxy)
            {
                telegramProxy = new HttpToSocks5Proxy(
                    telegramBotProxyHost,
                    telegramBotProxyPort,
                    telegramBotProxyLogin,
                    telegramBotProxyPassword);
            }

            var reminderReceiver = new TelegramReminderReceiver(telegramBotApiToken, telegramProxy);
            var reminderSender   = new TelegramReminderSender(telegramBotApiToken, telegramProxy);

            // create and setup domain logic object

            var reminderDomain = new ReminderDomain(
                reminderStorage,
                reminderReceiver,
                reminderSender);

            reminderDomain.AddingSuccedded += ReminderDomain_AddingSuccedded;
            reminderDomain.SendingSucceded += ReminderDomain_SendingSucceded;
            reminderDomain.SendingFailed   += ReminderDomain_SendingFailed;

            // run

            reminderDomain.Run();

            string hello = reminderReceiver.GetHelloFromBot();

            Console.WriteLine(
                $"Reminder application is running...\n" +
                $"{hello}\n" +
                "Press [Enter] to shutdown.");

            Console.ReadLine();
        }
コード例 #8
0
        public void GetHelloFromBot_With_Proxy_Returns_Not_Empty_String()
        {
            // use proxy if needed
            IWebProxy proxy =
                new HttpToSocks5Proxy("proxy.golyakov.net", 1080);

            TelegramReminderReceiver reminderReceiver =
                new TelegramReminderReceiver(_token, proxy);

            string description = reminderReceiver.GetHelloFromBot();

            Assert.IsNotNull(description);
        }
コード例 #9
0
        static void Main(string[] args)
        {
            Console.WriteLine("Telegram Bot Application!");

            var storage = new InMemoryReminderStorage();
            var domain  = new ReminderDomain(storage);

            string    token = "633428988:AAHLW_LaS7A47PDO2I8sbLkIIM9L0joPOSQ";
            IWebProxy proxy = new HttpToSocks5Proxy(
                "proxy.golyakov.net", 1080);

            var sender   = new TelegramReminderSender(token, proxy);
            var receiver = new TelegramReminderReceiver(token, proxy);

            receiver.MessageReceived += (s, e) =>
            {
                Console.WriteLine($"Message received from contact ID {e.ContactId} with text '{e.Message}'");

                try
                {
                    var parsedMessage = MessageParser.Parse(e.Message);

                    var item = new ReminderItem(
                        parsedMessage.Date,
                        parsedMessage.Message,
                        e.ContactId);

                    storage.Add(item);
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"The format of the message is wrong!\n{ex.Message}");
                }
            };

            receiver.Run();

            domain.SendReminder = (ReminderItem ri) =>
            {
                sender.Send(ri.ContactId, ri.Message);
            };

            domain.Run();

            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
コード例 #10
0
ファイル: Program.cs プロジェクト: yhwh240/C-sharp
        static void Main(string[] args)
        {
            Console.WriteLine("Telegram Bot Aplication!");

            var storage = new InMemoryReminderStorage();
            var domain  = new ReminderDomain(storage);

            string    token = "961862676:AAGPTkcJqLhOkgX7KOTOaEUe3Y3bjvIWJ24";
            IWebProxy proxy = new HttpToSocks5Proxy(
                "proxy.golyakov.net", 1080);

            var sender   = new TelegramReminderSender(token, proxy);
            var receiver = new TelegramReminderReceiver(token, proxy);

            receiver.MessageReceived += (s, e) =>
            {
                Console.WriteLine($"Message received from contact id '{e.ContactId}' with text '{e.Message}'");

                //add new ReminderItem to the storage
                try
                {
                    var parsedMessage = MessageParser.Parse(e.Message);

                    var item = new ReminderItem(
                        parsedMessage.Date,
                        parsedMessage.Message,
                        e.ContactId);
                    storage.Add(item);
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Полученное не соответствует формату! \n {ex.Message}");
                }
            };

            receiver.Run();

            domain.SendReminder = (ReminderItem ri) =>
            {
                sender.Send(ri.ContactId, ri.Message);
            };

            domain.Run();

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
コード例 #11
0
ファイル: Program.cs プロジェクト: nakklevaar/it-nordic-cs
        static void Main(string[] args)
        {
            const string token = "889472492: AAEbc0JJ3euv6nCSdLrjTZn4E4Z6tXN0JXQ";

            var receiver = new TelegramReminderReceiver(token);
            var sender   = new TelegramReminderSender(token);
            var storage  = new InMemoryReminderStorage();

            var domain = new ReminderDomain(storage, receiver, sender);

            domain.AddingSucceded  += Domain_AddingSucceded;
            domain.SendingSucceded += Domain_SendingSucceded;
            domain.SendingFailed   += Domain_SendingFailed;

            domain.Run();

            Console.ReadKey();
        }
コード例 #12
0
        static void Main(string[] args)
        {
            Console.WriteLine("Telegram BotApp");
            var       storage  = new InMemoryReminderStorage();
            var       domain   = new ReminderDomain(storage);
            string    token    = "697789387:AAFzSKZg8GmR-_aMktYSwcz0kKiL1D7__ww";
            IWebProxy proxy    = new HttpToSocks5Proxy("proxy.golyakov.net", 1080);
            var       sender   = new TelegramReminderSender(token, proxy);
            var       receiver = new TelegramReminderReceiver(token, proxy);

            receiver.MessageReceived += (s, e) =>
            {
                Console.WriteLine($"Message received from contactId {e.ContactId} with text {e.Message}");

                try
                {
                    var parsedMessage = MessageParser.Parse(e.Message);

                    var item = new ReminderItem(
                        parsedMessage.Date,
                        parsedMessage.Message,
                        e.ContactId);
                    storage.Add(item);
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"The Format is Wrong  \n{ex.Message}");
                }
            };

            receiver.Run();

            domain.SendReminder = (ReminderItem ri) =>
            {
                sender.Send(ri.ContactId, ri.Message);
            };


            domain.Run();

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
コード例 #13
0
        static void Main(string[] args)
        {
            const string token = "633428988:AAHLW_LaS7A47PDO2I8sbLkIIM9L0joPOSQ";

            var receiver = new TelegramReminderReceiver(token);
            var sender   = new TelegramReminderSender(token);
            var storage  = new InMemoryReminderStorage();

            var domain = new ReminderDomain(
                storage,
                receiver,
                sender);


            domain.AddingSucceded  += Domain_AddingSucceded;
            domain.SendingSucceded += Domain_SendingSucceded;
            domain.SendingFailed   += Domain_SendingFailed;

            domain.Run();

            Console.ReadLine();
        }
コード例 #14
0
        static void Main(string[] args)
        {
            Console.WriteLine("Telegram Bot Application!");
            var storage = new InMemoryReminderStorage();
            var domain  = new ReminderDomain(storage);

            //мой токен
            string    token    = "697789387:AAFzSKZg8GmR-aMktYSwcz0kKiL1D7_ww";
            IWebProxy proxy    = new HttpToSocks5Proxy("proxy.golyakov.net", 1080);
            var       sender   = new TelegramReminderSender(token, proxy);
            var       receiver = new TelegramReminderReceiver(token, proxy);

            receiver.MessageReceived += (s, e) =>
            {
                //добавляем запись в хранилище
                Console.WriteLine($"Сообщение от {e.ContactId}, текст {e.Message}");

                var parsedMessage = MessageParser.Parse(e.Message);

                var item = new ReminderItem(
                    parsedMessage.Date,
                    parsedMessage.Message,
                    e.ContactId);

                storage.Add(item);
            };

            receiver.Run();

            domain.SendReminder = (ReminderItem ri) =>
            {
                sender.Send(ri.ContactId, ri.Message);
            };

            domain.Run();

            Console.WriteLine("Нажмите любую клавишу для выхода");
            Console.ReadKey();
        }
コード例 #15
0
ファイル: Program.cs プロジェクト: Jodda1991/IT-Nordic-CS
        static void Main(string[] args)
        {
            const string token = "819772297:AAHTe4KKsAWIFznjuJ0-nTD1nzNim0HcZ8w";

            var receiver = new TelegramReminderReceiver(token);
            var sender   = new TelegramReminderSender(token);
            var storage  = new InMemoryReminderStorage();

            var domain = new ReminderDomain(
                storage,
                receiver,
                sender);


            domain.AddingSucceded  += Domain_AddingSucceded;
            domain.SendingSucceded += Domain_SendingSucceded;
            domain.SendingFailed   += Domain_SendingFailed;

            domain.Run();

            Console.ReadLine();
        }
コード例 #16
0
ファイル: Program.cs プロジェクト: Dani630/it-nordic-cs
        static void Main(string[] args)
        {
            const string token = "840137917:AAEZTYl_IyTLqDsRllBg9gMkdoAg07j4T58";

            var receiver = new TelegramReminderReceiver(token);
            var sender   = new TelegramReminderSender(token);
            var storage  = new InMemoryReminderStorage();

            ReminderDomain domain = new ReminderDomain(
                storage,
                receiver,
                sender);


            domain.AddingSucceded  += Domain_AddingSucceded;
            domain.SendingSucceded += Domain_SendingSucceded;
            domain.SendingFailed   += Domain_SendingFailed;

            domain.Run();

            Console.ReadLine();
        }
コード例 #17
0
        static void Main(string[] args)
        {
            Console.WriteLine("Telegram Bot Application!");

            var storage = new ReminderStorageWebApiClient(
                "http://localhost:5000/api/reminders");

            //string token = "633428988:AAHLW_LaS7A47PDO2I8sbLkIIM9L0joPOSQ";
            string token = "697789387:AAFzSKZg8GmR-_aMktYSwcz0kKiL1D7__ww";

            IWebProxy proxy = new HttpToSocks5Proxy(
                "proxy.golyakov.net", 1080);

            //var receiver = new TelegramReminderReceiver(token);
            var receiver = new TelegramReminderReceiver(token, proxy);

            var domain = new ReminderDomain(storage, receiver);

            var sender = new TelegramReminderSender(token, proxy);

            //var sender = new TelegramReminderSender(token);

            domain.SendReminder = (ReminderItem ri) =>
            {
                sender.Send(ri.ContactId, ri.Message);
            };

            domain.MessageReceived          += Domain_MessageReceived;
            domain.MessageParsingSuccedded  += Domain_MessageParsingSuccedded;
            domain.MessageParsingFailed     += Domain_MessageParsingFailed;
            domain.AddingToStorageSuccedded += Domain_AddingToStorageSuccedded;
            domain.AddingToStorageFailed    += Domain_AddingToStorageFailed;
            domain.SendingFailed            += Domain_SendingFailed;

            domain.Run();

            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
コード例 #18
0
ファイル: Program.cs プロジェクト: Direaper/nordic-it-netcore
        static void Main(string[] args)
        {
            //var botClient = new TelegramBotClient("943556973:AAF8Kfc3bUu4nYah6d9t5S1QFHNBIjF6VNY");
            //var me = botClient.GetMeAsync().Result;
            //Console.WriteLine(
            //    $"Hello {me.Id},  my name is {me.FirstName}");

            //return;
            const string token = " ";

            var storage  = new InMemoryReminderStorage();
            var sender   = new TelegramReminderSender(token);
            var receiver = new TelegramReminderReceiver(token);

            using var domain = new ReminderDomain(
                      storage,
                      receiver,
                      sender,
                      TimeSpan.FromSeconds(1),
                      TimeSpan.FromSeconds(1));

            domain.SendingSucceeded += Domain_SendingSucceeded;
            domain.SendingFailed    += DomainOnSendingFailed;
            domain.ParsingFailed    += Domain_ParsingFailed;
            domain.AddingSucceeded  += Domain_AddingSucceeded;
            domain.AddingFailed     += Domain_AddingFailed;

            //var addReminderModel = new AddReminderModel(
            //    DateTimeOffset.Now.AddSeconds(1),
            //    "Hello World",
            //    "943556973");

            //domain.AddReminder(   addReminderModel);
            domain.Run();

            Console.WriteLine("Domain logic running...(press any key to exit)");
            Console.ReadKey();
        }
コード例 #19
0
        static void Main(string[] args)
        {
            const string token = "790352518:AAFWfSGPTPAUVb3IMJMDQx5RdSeH1sIMWyk";


            var receiver = new TelegramReminderReceiver(token);
            var sender   = new TelegramReminderSender(token);
            var storage  = new InMemoryReminderStorage();

            var domain = new ReminderDomain(
                storage,
                receiver,
                sender);

            //Console.Write(receiver.GetHelloFromBot());
            domain.AddingSucceded  += Domain_AddingSucceded;
            domain.SendingSucceded += Domain_SendingSucceded;
            domain.SendingFailed   += Domain_SendingFailed;

            domain.Run();

            Console.ReadLine();
        }
コード例 #20
0
        static void Main(string[] args)
        {
            const string token = "1467408776:AAGSGszyTCYYCTWTKu4PL_it029uC8X8hbs";
            //botID = "1467408776"

            var storage  = new InMemoryReminderStorage();
            var sender   = new TelegramReminderSender(token);
            var receiver = new TelegramReminderReceiver(token);

            using var domain = new ReminderDomain(storage, receiver, sender, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));//Dependency injection

            var addReminderModel = new AddReminderModel(DateTimeOffset.Now.AddSeconds(2), "Hello World!", "1467408776");

            domain.SendingSucceeded += Domain_SendingSucceeded;
            domain.SendingFailed    += Domain_SendingFailed;

            //receiver.MessageReceived += ;

            //domain.AddReminderModel(addReminderModel);
            domain.Run();

            Console.WriteLine("Domain logic running...");
            Console.ReadKey();
        }
コード例 #21
0
        static void Main(string[] args)
        {
            string token    = @"1658241756:AAEGWnqk2BVg6qTOmaaQAby-g00DiqWhFRY";
            var    storage  = new InMemoryReminderStorage();
            var    sender   = new TelegramReminderSender(token);
            var    receiver = new TelegramReminderReceiver(token);

            using var domain = new ReminderDomain(
                      storage,
                      sender,
                      receiver,
                      TimeSpan.FromSeconds(1),
                      TimeSpan.FromSeconds(1));
            domain.AddingSucceeded += (s, e) =>
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write("OK ");
                Console.ResetColor();
                Console.WriteLine(
                    $"Reminder item ID {e.Id} " +
                    $"from {e.ContactId} " +
                    $"with message \"{e.Message}\" " +
                    $"SCHEDULED on {e.Date:G}");
            };

            domain.AddingFailed += (s, e) =>
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write($"Error ");
                Console.ResetColor();
                Console.WriteLine(
                    $"Cannot SCHEDULE reminder item ID {e.Id} " +
                    $"from {e.ContactId} " +
                    $"with message \"{e.Message}\" " +
                    $"to be sent on {e.Date:G}");
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(e.Exception);
                Console.ResetColor();
            };

            domain.SendingSucceeded += (s, e) =>
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write("OK ");
                Console.ResetColor();
                Console.WriteLine(
                    $"Reminder item ID {e.Id} " +
                    $"from {e.ContactId} " +
                    $"with message \"{e.Message}\" " +
                    $"SENT on {e.Date:G}");
            };

            domain.SendingFailed += (s, e) =>
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write($"Error ");
                Console.ResetColor();
                Console.WriteLine(
                    $"Cannot SEND reminder item ID {e.Id} " +
                    $"from {e.ContactId} " +
                    $"with message \"{e.Message}\" " +
                    $"on {e.Date:G}");
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(e.Exception);
                Console.ResetColor();
            };

            domain.Run();

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
コード例 #22
0
        static void Main()
        {
            const string token = "633428988:AAHEOPx2C24pNmcHJz0IBL7FH3a4lGjXqcs";

            var storage  = new ReminderStoageWebApiClient("https://localhost:44348/api/reminders");
            var sender   = new TelegramReminderSender(token);
            var receiver = new TelegramReminderReceiver(token);

            using var domain = new ReminderDomain(
                      storage,
                      sender,
                      receiver,
                      TimeSpan.FromSeconds(1),
                      TimeSpan.FromSeconds(1));

            domain.AddingSucceeded += (s, e) =>
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write("OK ");
                Console.ResetColor();
                Console.WriteLine(
                    $"Reminder item ID {e.Id} " +
                    $"from {e.ContactId} " +
                    $"with message \"{e.Message}\" " +
                    $"SCHEDULED on {e.Date:G}");
            };

            domain.AddingFailed += (s, e) =>
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write($"Error ");
                Console.ResetColor();
                Console.WriteLine(
                    $"Cannot SCHEDULE reminder item ID {e.Id} " +
                    $"from {e.ContactId} " +
                    $"with message \"{e.Message}\" " +
                    $"to be sent on {e.Date:G}");
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(e.Exception);
                Console.ResetColor();
            };

            domain.SendingSucceeded += (s, e) =>
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write("OK ");
                Console.ResetColor();
                Console.WriteLine(
                    $"Reminder item ID {e.Id} " +
                    $"from {e.ContactId} " +
                    $"with message \"{e.Message}\" " +
                    $"SENT on {e.Date:G}");
            };

            domain.SendingFailed += (s, e) =>
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write($"Error ");
                Console.ResetColor();
                Console.WriteLine(
                    $"Cannot SEND reminder item ID {e.Id} " +
                    $"from {e.ContactId} " +
                    $"with message \"{e.Message}\" " +
                    $"on {e.Date:G}");
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(e.Exception);
                Console.ResetColor();
            };

            domain.Run();

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }