Plugin Base

Provide base interface and APIs for developing plugins of the Notification Service.

namespace ABB.Vtrin.NotificationService
{
	public interface INotificationServicePlugin
	{
		void HandleMessage(	string title, 
									string message,
									string configurationstring);

		void HandleMessage(	string title, 
									string message, 
									System.Collections.Generic.List<RecipientData> recipients);
	}
}
namespace ABB.Vtrin.NotificationService
{
	public partial class Utils
	{
		[System.Text.RegularExpressions.GeneratedRegex(	"<.*?>", 
																		System.Text.RegularExpressions.RegexOptions.Compiled |
																		System.Text.RegularExpressions.RegexOptions.IgnoreCase |
																		System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace)]
		private static partial System.Text.RegularExpressions.Regex HtmlTagRemoverRegex();
		
		[System.Text.RegularExpressions.GeneratedRegex(	@"</?(br|div|p)\s*/?>", 
																		System.Text.RegularExpressions.RegexOptions.Compiled | 
																		System.Text.RegularExpressions.RegexOptions.IgnoreCase |
																		System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace)]
		private static partial System.Text.RegularExpressions.Regex HtmlLineBreakRemoverRegex();

		[System.Text.RegularExpressions.GeneratedRegex(	@"<(script|style)\b[^>]*>[\s\S]*?</\1>", 
																		System.Text.RegularExpressions.RegexOptions.IgnoreCase | 
																		System.Text.RegularExpressions.RegexOptions.Compiled |
																		System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace)]
		private static partial System.Text.RegularExpressions.Regex HtmlScriptStyleRemoverRegex();

		[System.Text.RegularExpressions.GeneratedRegex(	@"<(hr)\s*/?>", 
																		System.Text.RegularExpressions.RegexOptions.Compiled | 
																		System.Text.RegularExpressions.RegexOptions.IgnoreCase |
																		System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace)]
		private static partial System.Text.RegularExpressions.Regex HtmlHrRemoverRegex();

		[System.Text.RegularExpressions.GeneratedRegex(	@"(?:(?:\r\n?|\n)[ \t]*){2,}", 
																		System.Text.RegularExpressions.RegexOptions.Compiled |
																		System.Text.RegularExpressions.RegexOptions.IgnoreCase |
																		System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace)]
		private static partial System.Text.RegularExpressions.Regex MultipleLineBreaksRemoverRegex();

		public static bool ParseBool(string s)
		{
			if(string.IsNullOrEmpty(s))
			{
				return false;
			}
			var trimmedstring=s.Trim();

			return	trimmedstring.Equals("Y",    System.StringComparison.InvariantCultureIgnoreCase) 
					|| trimmedstring.Equals("Yes",  System.StringComparison.InvariantCultureIgnoreCase) 
					|| trimmedstring.Equals("True", System.StringComparison.InvariantCultureIgnoreCase) 
					|| trimmedstring.Equals("On",   System.StringComparison.InvariantCultureIgnoreCase) 
					|| trimmedstring.Equals("1");
		}

		public static int ParseInt(string s, int defaultvalue)
		{
			return int.TryParse(s, out int output) ? output : defaultvalue;
		}

		public static bool WaitUntilTrue(System.Func<bool> condition)
		{
			int repeat = 0;
			while (!condition())
			{
				if (repeat++ == 1200)
					return false;
				System.Threading.Thread.Sleep(100);
			}
			return true;
		}

		/// <summary>
		/// Converts simple HTML to plain text by removing tags and converting some entities.
		/// Does not handle complex HTML.
		/// </summary>
		/// <param name="html">html string</param>
		/// <returns>plain text</returns>
		public static string HtmlToPlainText(string html)
		{			
			var s=html;			
			s=HtmlLineBreakRemoverRegex().Replace(s, "\n");
			s=HtmlScriptStyleRemoverRegex().Replace(s, string.Empty);
			s=HtmlHrRemoverRegex().Replace(s, "\n-------------------------------\n");
			s=HtmlTagRemoverRegex().Replace(s, string.Empty);			
			s=System.Net.WebUtility.HtmlDecode(s);
			s=MultipleLineBreaksRemoverRegex().Replace(s, "\n");
			return s;
		}

		public static bool IsHtml(string s)
		{
			if (string.IsNullOrEmpty(s))
				return false;	
			return (s.TrimStart().StartsWith(MessageHeaders.HTML, System.StringComparison.OrdinalIgnoreCase));
		}

		//Used after IsHtml check
		public static string TrimHtmlHeader(string s)
		{			
			var trimmedstring=s.TrimStart();
			int indexofclosingtag=trimmedstring.IndexOf('>');				
			if(indexofclosingtag!=-1)
			{
				return trimmedstring.Substring(indexofclosingtag+1).TrimStart();
			}
			return s;
		}

		public static string InsertHtmlHeader(string s)
		{
			return MessageHeaders.HTML + s;
		}

		public static string[] GetRecipients(string recipients)
		{
			string[] recipientarray = recipients.Split([';'], System.StringSplitOptions.RemoveEmptyEntries | System.StringSplitOptions.TrimEntries);
			return recipientarray;
		}

		public static string[] GetRecipients(System.Collections.Generic.List<RecipientData> recipients, int contacttype)
		{
			var recipientlist = new System.Collections.Generic.List<string>();
			foreach(var recipient in recipients)
			{
				foreach(var contactinfo in recipient.ContactInfoList)
				{
					if(contactinfo.Type==contacttype && !string.IsNullOrEmpty(contactinfo.Value))
					{
						recipientlist.Add(contactinfo.Value);
					}
				}
			}
			return recipientlist.ToArray();
		}
	}
}
namespace ABB.Vtrin.NotificationService
{
	public record RecipientData ( System.Collections.Generic.List<(int Type, string Value)> ContactInfoList );
}