diff --git a/DiscordBee.cs b/DiscordBee.cs index 9da9812..4bd319b 100644 --- a/DiscordBee.cs +++ b/DiscordBee.cs @@ -4,6 +4,7 @@ namespace MusicBeePlugin using MusicBeePlugin.DiscordTools; using MusicBeePlugin.DiscordTools.Assets; using MusicBeePlugin.DiscordTools.Assets.Uploader; + using MusicBeePlugin.S3Client; using MusicBeePlugin.UI; using System; using System.Collections.Generic; @@ -31,6 +32,7 @@ public partial class Plugin private readonly Timer _updateTimer = new Timer(300); private string _imgurAssetCachePath; private string _imgurAlbum; + private string _s3AssetCachePath; public Plugin() { @@ -80,13 +82,32 @@ public PluginInfo Initialise(IntPtr apiInterfacePtr) var settingsFilePath = $"{workingDir}\\{_about.Name}.settings"; _imgurAssetCachePath = $"{workingDir}\\{_about.Name}-Imgur.cache"; _imgurAlbum = $"{workingDir}\\{_about.Name}-Imgur.album"; + _s3AssetCachePath = $"{workingDir}\\{_about.Name}-S3.cache"; _settings = Settings.GetInstance(settingsFilePath); _settings.SettingChanged += SettingChangedCallback; _discordClient.ArtworkUploadEnabled = _settings.UploadArtwork; _discordClient.DiscordId = _settings.DiscordAppId; - UpdateAssetManager(_imgurAssetCachePath, new ImgurUploader(_imgurAlbum, _settings.ImgurClientId)); + + switch (_settings.ArtworkUploader) + { + case "Imgur": + UpdateAssetManager(_imgurAssetCachePath, new ImgurUploader(_imgurAlbum, _settings.ImgurClientId)); + break; + case "Amazon S3": + UpdateAssetManager(_s3AssetCachePath, new S3Uploader(new S3Config + { + AccessKeyId = _settings.S3AccessKeyId, + SecretAccessKey = _settings.S3SecretAccessKey, + Endpoint = _settings.S3Endpoint, + BucketName = _settings.S3BucketName, + Prefix = _settings.S3Prefix, + CustomDomain = _settings.S3CustomDomain + })); + break; + } + ToolStripMenuItem mainMenuItem = (ToolStripMenuItem)_mbApiInterface.MB_AddMenuItem($"mnuTools/{_about.Name}", null, null); mainMenuItem.DropDown.Items.Add("Uploader Health", null, ShowUploaderHealth); @@ -138,10 +159,30 @@ private void SettingChangedCallback(object sender, Settings.SettingChangedEventA { _discordClient.ArtworkUploadEnabled = _settings.UploadArtwork; } - if (e.SettingProperty.Equals("ImgurClientId")) + if (_settings.ArtworkUploader.Equals("Imgur") && e.SettingProperty.Equals("ImgurClientId")) { UpdateAssetManager(_imgurAssetCachePath, new ImgurUploader(_imgurAlbum, _settings.ImgurClientId)); } + if (_settings.ArtworkUploader.Equals("Amazon S3")) + { + if (e.SettingProperty.Equals("S3AccessKeyId") || + e.SettingProperty.Equals("S3SecretAccessKey") || + e.SettingProperty.Equals("S3Endpoint") || + e.SettingProperty.Equals("S3BucketName") || + e.SettingProperty.Equals("S3Prefix") || + e.SettingProperty.Equals("S3CustomDomain")) + { + UpdateAssetManager(_s3AssetCachePath, new S3Uploader(new S3Config + { + AccessKeyId = _settings.S3AccessKeyId, + SecretAccessKey = _settings.S3SecretAccessKey, + Endpoint = _settings.S3Endpoint, + BucketName = _settings.S3BucketName, + Prefix = _settings.S3Prefix, + CustomDomain = _settings.S3CustomDomain + })); + } + } } public string GetVersionString() diff --git a/DiscordBee.csproj b/DiscordBee.csproj index 544aaa5..455cf7d 100644 --- a/DiscordBee.csproj +++ b/DiscordBee.csproj @@ -96,6 +96,7 @@ + @@ -106,6 +107,9 @@ + + + @@ -118,6 +122,12 @@ + + Form + + + S3SettingsWindow.cs + Form @@ -163,6 +173,9 @@ PlaceholderTableWindow.cs + + S3SettingsWindow.cs + SettingsWindow.cs @@ -171,6 +184,9 @@ + + 3.7.305.22 + 1.1.3.18 diff --git a/DiscordTools/Assets/Uploader/S3Uploader.cs b/DiscordTools/Assets/Uploader/S3Uploader.cs new file mode 100644 index 0000000..f9de8f1 --- /dev/null +++ b/DiscordTools/Assets/Uploader/S3Uploader.cs @@ -0,0 +1,87 @@ +namespace MusicBeePlugin.DiscordTools.Assets.Uploader +{ + using MusicBeePlugin.S3Client; + using System; + using System.Collections.Generic; + using System.Diagnostics; + using System.IO; + using System.Threading; + using System.Threading.Tasks; + + public class S3Uploader : IAssetUploader + { + private readonly S3Client _client; + private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); + + public S3Uploader(S3Config config) + { + _client = new S3Client(config); + } + + public Task DeleteAsset(AlbumCoverData assetData) + { + throw new NotImplementedException(); + } + + public void Dispose() + { + _client.Dispose(); + } + + public async Task> GetAssets() + { + var ret = new Dictionary(); + var images = await _client.GetAlbumImages(); + + foreach (var image in images) + { + var hash = Path.GetFileName(image.Key); + if (string.IsNullOrEmpty(hash)) + { + continue; + } + ret[hash] = image.Link; + } + + return ret; + } + + public async Task Init() + { + Debug.WriteLine(" ---> Waiting for semaphore"); + await _semaphore.WaitAsync(); + Debug.WriteLine(" <--- Waiting for semaphore"); + try + { + // Nothing to do. + } + finally + { + Debug.WriteLine(" ---> Releasing semaphore"); + _semaphore.Release(); + } + return true; + } + + public bool IsAssetCached(AlbumCoverData assetData) + { + return false; + } + + public UploaderHealthInfo GetHealth() + { + // The S3 API does not have rate limit headers, so we assume it's always healthy + var health = new UploaderHealthInfo + { + IsHealthy = true + }; + return health; + } + + public async Task UploadAsset(AlbumCoverData assetData) + { + var uploaded = await _client.UploadImage(assetData.Hash, assetData.ImageB64); + return new UploadResult { Hash = assetData.Hash, Link = uploaded.Link }; + } + } +} diff --git a/S3Client/S3Client.cs b/S3Client/S3Client.cs new file mode 100644 index 0000000..02f3a42 --- /dev/null +++ b/S3Client/S3Client.cs @@ -0,0 +1,135 @@ +namespace MusicBeePlugin.S3Client +{ + using Amazon.S3; + using Amazon.S3.Model; + using MusicBeePlugin.S3Client.Types; + using System; + using System.Drawing; + using System.Drawing.Imaging; + using System.Linq; + using System.Threading.Tasks; + + public class S3Client : IDisposable + { + private readonly S3Config _config; + private readonly AmazonS3Client _client; + private readonly string _baseUrl; + + public S3Client(S3Config config) + { + _config = config; + var clientConfig = new AmazonS3Config + { + ServiceURL = config.Endpoint, + }; + _client = new AmazonS3Client(config.AccessKeyId, config.SecretAccessKey, clientConfig); + _baseUrl = GetBaseUrl(); + } + + public async Task GetAlbumImages() + { + var listRequest = new ListObjectsV2Request + { + BucketName = _config.BucketName, + Prefix = _config.Prefix, + }; + + var response = await _client.ListObjectsV2Async(listRequest); + return response.S3Objects.Select(obj => new S3Image + { + Key = obj.Key, + Link = $"{_baseUrl}{obj.Key}", + }).ToArray(); + } + + public async Task UploadImage(string hash, string dataB64) + { + var key = $"{_config.Prefix}/{hash}"; + var imageStream = new System.IO.MemoryStream(Convert.FromBase64String(dataB64)); + + // Get content type of image for S3 + string contentType = "image/unknown"; + using (var image = Image.FromStream(imageStream)) + { + Guid guid = image.RawFormat.Guid; + foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageDecoders()) + { + if (codec.FormatID == guid) + { + contentType = codec.MimeType; + break; + } + } + } + + var putRequest = new PutObjectRequest + { + BucketName = _config.BucketName, + Key = $"{_config.Prefix}/{hash}", + ContentType = contentType, + InputStream = imageStream, + CannedACL = S3CannedACL.PublicRead, + }; + + var response = await _client.PutObjectAsync(putRequest); + if (response.HttpStatusCode == System.Net.HttpStatusCode.OK) + { + return new S3Image + { + Key = key, + Link = $"{_baseUrl}{key}", + }; + } else + { + return null; + } + } + + public async Task TestConnection() + { + // Check if an S3 request can be successfully made + try + { + var listRequest = new ListObjectsV2Request + { + BucketName = _config.BucketName, + Prefix = _config.Prefix, + }; + + var response = await _client.ListObjectsV2Async(listRequest); + return response.HttpStatusCode == System.Net.HttpStatusCode.OK; + } + catch + { + return false; + } + } + + public void Dispose() + { + _client?.Dispose(); + GC.SuppressFinalize(this); + } + + private string GetBaseUrl() + { + if (!string.IsNullOrEmpty(_config.CustomDomain)) + { + return _config.CustomDomain; + } + + // Fetch the bucket region + var regionResponse = _client.GetBucketLocationAsync(new GetBucketLocationRequest + { + BucketName = _config.BucketName + }).GetAwaiter().GetResult(); + + var region = regionResponse.Location?.Value ?? "us-east-1"; // Default to us-east-1 if region is null + + // Prefix the bucket name to the endpoint's host + var endpoint = new UriBuilder(_config.Endpoint); + endpoint.Host = $"{_config.BucketName}.{endpoint.Host}"; + return endpoint.Uri.ToString(); + } + } +} diff --git a/S3Client/S3Config.cs b/S3Client/S3Config.cs new file mode 100644 index 0000000..2f4b5dc --- /dev/null +++ b/S3Client/S3Config.cs @@ -0,0 +1,50 @@ +namespace MusicBeePlugin.S3Client +{ + using System; + using System.Reflection; + + public class S3Config + { + public string AccessKeyId { get; set; } + public string SecretAccessKey { get; set; } + + private readonly string _endpoint; + public string Endpoint + { + get => _endpoint; + set => PrefixSchemeIfNecessary("_endpoint", value); + } + + public string BucketName { get; set; } + public string Prefix { get; set; } + + private readonly string _customDomain; + public string CustomDomain { + get => _customDomain; + set => PrefixSchemeIfNecessary("_customDomain", value); + } + + private void PrefixSchemeIfNecessary(string fieldName, string value) + { + FieldInfo target = GetType().GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance); + if (target == null) + { + return; + } + + if (string.IsNullOrEmpty(value)) + { + target.SetValue(this, value); + return; + } + + if (value.StartsWith($"{Uri.UriSchemeHttp}://") || value.StartsWith($"{Uri.UriSchemeHttps}://")) + { + target.SetValue(this, value); + return; + } + + target.SetValue(this, $"{Uri.UriSchemeHttps}://{value}"); + } + } +} diff --git a/S3Client/Types/S3Image.cs b/S3Client/Types/S3Image.cs new file mode 100644 index 0000000..897c84c --- /dev/null +++ b/S3Client/Types/S3Image.cs @@ -0,0 +1,8 @@ +namespace MusicBeePlugin.S3Client.Types +{ + public class S3Image + { + public string Key { get; set; } + public string Link { get; set; } + } +} diff --git a/Settings.cs b/Settings.cs index 82bc38f..580653a 100644 --- a/Settings.cs +++ b/Settings.cs @@ -27,6 +27,13 @@ public class Settings {"DiscordAppId", "409394531948298250"}, // prod //{"DiscordAppId", "408977077799354379"}, // dev {"ImgurClientId", "09bef4c058080cd"}, + {"ArtworkUploader", "Imgur"}, + {"S3AccessKeyId", ""}, + {"S3SecretAccessKey", ""}, + {"S3Endpoint", "s3.us-east-1.com"}, + {"S3BucketName", ""}, + {"S3Prefix", "DiscordBee"}, + {"S3CustomDomain", ""}, }; public event EventHandler SettingChanged; @@ -123,6 +130,54 @@ public string ImgurClientId } } + [DataMember] private string _s3AccessKeyId; + + public string S3AccessKeyId + { + get => _s3AccessKeyId ?? defaults["S3AccessKeyId"]; + set => SetIfChanged("_s3AccessKeyId", value); + } + + [DataMember] private string _s3SecretAccessKey; + + public string S3SecretAccessKey + { + get => _s3SecretAccessKey ?? defaults["S3SecretAccessKey"]; + set => SetIfChanged("_s3SecretAccessKey", value); + } + + [DataMember] private string _s3Endpoint; + + public string S3Endpoint + { + get => _s3Endpoint ?? defaults["S3Endpoint"]; + set => SetIfChanged("_s3Endpoint", value); + } + + [DataMember] private string _s3BucketName; + + public string S3BucketName + { + get => _s3BucketName ?? defaults["S3BucketName"]; + set => SetIfChanged("_s3BucketName", value); + } + + [DataMember] private string _s3Prefix; + + public string S3Prefix + { + get => _s3Prefix ?? defaults["S3Prefix"]; + set => SetIfChanged("_s3Prefix", value); + } + + [DataMember] private string _s3CustomDomain; + + public string S3CustomDomain + { + get => _s3CustomDomain ?? defaults["S3CustomDomain"]; + set => SetIfChanged("_s3CustomDomain", value); + } + [DataMember] private bool? _updatePresenceWhenStopped; public bool UpdatePresenceWhenStopped @@ -179,6 +234,22 @@ public bool UploadArtwork set => SetIfChanged("_uploadArtwork", value); } + [DataMember] private string _artworkUploader; + + public string ArtworkUploader + { + get => _artworkUploader ?? defaults["ArtworkUploader"]; + set + { + if (value?.Equals(defaults["ArtworkUploader"]) == true) + { + _artworkUploader = null; + return; + } + SetIfChanged("_artworkUploader", value); + } + } + [DataMember] private string _buttonLabel; public string ButtonLabel diff --git a/UI/S3SettingsWindow.Designer.cs b/UI/S3SettingsWindow.Designer.cs new file mode 100644 index 0000000..f15eb00 --- /dev/null +++ b/UI/S3SettingsWindow.Designer.cs @@ -0,0 +1,330 @@ +namespace MusicBeePlugin.UI +{ + partial class S3SettingsWindow + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.panel2 = new System.Windows.Forms.Panel(); + this.labelS3AccessKeyId = new System.Windows.Forms.Label(); + this.textBoxS3AccessKeyId = new System.Windows.Forms.TextBox(); + this.panel3 = new System.Windows.Forms.Panel(); + this.buttonSaveClose = new System.Windows.Forms.Button(); + this.textBoxS3SecretAccessKey = new System.Windows.Forms.TextBox(); + this.labelS3SecretAccessKey = new System.Windows.Forms.Label(); + this.textBoxS3Endpoint = new System.Windows.Forms.TextBox(); + this.labelS3Endpoint = new System.Windows.Forms.Label(); + this.textBoxS3BucketName = new System.Windows.Forms.TextBox(); + this.labelS3BucketName = new System.Windows.Forms.Label(); + this.textBoxS3Prefix = new System.Windows.Forms.TextBox(); + this.labelS3Prefix = new System.Windows.Forms.Label(); + this.textBoxS3CustomDomain = new System.Windows.Forms.TextBox(); + this.labelS3CustomDomain = new System.Windows.Forms.Label(); + this.labelUrlPreview = new System.Windows.Forms.Label(); + this.textBoxUrlPreview = new System.Windows.Forms.TextBox(); + this.buttonTest = new System.Windows.Forms.Button(); + this.panel2.SuspendLayout(); + this.panel3.SuspendLayout(); + this.SuspendLayout(); + // + // panel2 + // + this.panel2.AutoSize = true; + this.panel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.panel2.BackColor = System.Drawing.Color.Transparent; + this.panel2.Controls.Add(this.labelUrlPreview); + this.panel2.Controls.Add(this.labelS3CustomDomain); + this.panel2.Controls.Add(this.labelS3Prefix); + this.panel2.Controls.Add(this.textBoxUrlPreview); + this.panel2.Controls.Add(this.textBoxS3CustomDomain); + this.panel2.Controls.Add(this.textBoxS3Prefix); + this.panel2.Controls.Add(this.labelS3BucketName); + this.panel2.Controls.Add(this.textBoxS3BucketName); + this.panel2.Controls.Add(this.labelS3Endpoint); + this.panel2.Controls.Add(this.textBoxS3Endpoint); + this.panel2.Controls.Add(this.labelS3SecretAccessKey); + this.panel2.Controls.Add(this.textBoxS3SecretAccessKey); + this.panel2.Controls.Add(this.labelS3AccessKeyId); + this.panel2.Controls.Add(this.textBoxS3AccessKeyId); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(0, 0); + this.panel2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel2.MinimumSize = new System.Drawing.Size(0, 154); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(786, 329); + this.panel2.TabIndex = 3; + // + // labelS3AccessKeyId + // + this.labelS3AccessKeyId.AutoSize = true; + this.labelS3AccessKeyId.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelS3AccessKeyId.ForeColor = System.Drawing.Color.Black; + this.labelS3AccessKeyId.Location = new System.Drawing.Point(13, 22); + this.labelS3AccessKeyId.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelS3AccessKeyId.Name = "labelS3AccessKeyId"; + this.labelS3AccessKeyId.Size = new System.Drawing.Size(131, 22); + this.labelS3AccessKeyId.TabIndex = 19; + this.labelS3AccessKeyId.Text = "Access Key ID:"; + // + // textBoxS3AccessKeyId + // + this.textBoxS3AccessKeyId.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxS3AccessKeyId.Location = new System.Drawing.Point(182, 17); + this.textBoxS3AccessKeyId.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBoxS3AccessKeyId.Name = "textBoxS3AccessKeyId"; + this.textBoxS3AccessKeyId.Size = new System.Drawing.Size(576, 33); + this.textBoxS3AccessKeyId.TabIndex = 0; + this.textBoxS3AccessKeyId.TextChanged += new System.EventHandler(this.textBoxS3AccessKeyId_TextChanged); + // + // panel3 + // + this.panel3.AutoScroll = true; + this.panel3.AutoSize = true; + this.panel3.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.panel3.BackColor = System.Drawing.Color.Transparent; + this.panel3.Controls.Add(this.buttonTest); + this.panel3.Controls.Add(this.buttonSaveClose); + this.panel3.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel3.Location = new System.Drawing.Point(0, 329); + this.panel3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel3.MinimumSize = new System.Drawing.Size(0, 46); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(786, 46); + this.panel3.TabIndex = 4; + // + // buttonSaveClose + // + this.buttonSaveClose.AutoSize = true; + this.buttonSaveClose.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.buttonSaveClose.Dock = System.Windows.Forms.DockStyle.Right; + this.buttonSaveClose.Location = new System.Drawing.Point(640, 0); + this.buttonSaveClose.Margin = new System.Windows.Forms.Padding(15); + this.buttonSaveClose.Name = "buttonSaveClose"; + this.buttonSaveClose.Padding = new System.Windows.Forms.Padding(8); + this.buttonSaveClose.Size = new System.Drawing.Size(146, 46); + this.buttonSaveClose.TabIndex = 8; + this.buttonSaveClose.Text = "Save and Close"; + this.buttonSaveClose.UseVisualStyleBackColor = true; + this.buttonSaveClose.Click += new System.EventHandler(this.buttonSaveClose_Click); + // + // textBoxS3SecretAccessKey + // + this.textBoxS3SecretAccessKey.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxS3SecretAccessKey.Location = new System.Drawing.Point(182, 60); + this.textBoxS3SecretAccessKey.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBoxS3SecretAccessKey.Name = "textBoxS3SecretAccessKey"; + this.textBoxS3SecretAccessKey.PasswordChar = '*'; + this.textBoxS3SecretAccessKey.Size = new System.Drawing.Size(576, 33); + this.textBoxS3SecretAccessKey.TabIndex = 1; + this.textBoxS3SecretAccessKey.TextChanged += new System.EventHandler(this.textBoxS3SecretAccessKey_TextChanged); + // + // labelS3SecretAccessKey + // + this.labelS3SecretAccessKey.AutoSize = true; + this.labelS3SecretAccessKey.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelS3SecretAccessKey.ForeColor = System.Drawing.Color.Black; + this.labelS3SecretAccessKey.Location = new System.Drawing.Point(13, 64); + this.labelS3SecretAccessKey.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelS3SecretAccessKey.Name = "labelS3SecretAccessKey"; + this.labelS3SecretAccessKey.Size = new System.Drawing.Size(166, 22); + this.labelS3SecretAccessKey.TabIndex = 19; + this.labelS3SecretAccessKey.Text = "Secret Access Key:"; + // + // textBoxS3Endpoint + // + this.textBoxS3Endpoint.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxS3Endpoint.Location = new System.Drawing.Point(182, 103); + this.textBoxS3Endpoint.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBoxS3Endpoint.Name = "textBoxS3Endpoint"; + this.textBoxS3Endpoint.Size = new System.Drawing.Size(576, 33); + this.textBoxS3Endpoint.TabIndex = 2; + this.textBoxS3Endpoint.TextChanged += new System.EventHandler(this.textBoxS3Endpoint_TextChanged); + // + // labelS3Endpoint + // + this.labelS3Endpoint.AutoSize = true; + this.labelS3Endpoint.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelS3Endpoint.ForeColor = System.Drawing.Color.Black; + this.labelS3Endpoint.Location = new System.Drawing.Point(13, 108); + this.labelS3Endpoint.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelS3Endpoint.Name = "labelS3Endpoint"; + this.labelS3Endpoint.Size = new System.Drawing.Size(86, 22); + this.labelS3Endpoint.TabIndex = 19; + this.labelS3Endpoint.Text = "Endpoint:"; + // + // textBoxS3BucketName + // + this.textBoxS3BucketName.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxS3BucketName.Location = new System.Drawing.Point(182, 146); + this.textBoxS3BucketName.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBoxS3BucketName.Name = "textBoxS3BucketName"; + this.textBoxS3BucketName.Size = new System.Drawing.Size(576, 33); + this.textBoxS3BucketName.TabIndex = 3; + this.textBoxS3BucketName.TextChanged += new System.EventHandler(this.textBoxS3BucketName_TextChanged); + // + // labelS3BucketName + // + this.labelS3BucketName.AutoSize = true; + this.labelS3BucketName.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelS3BucketName.ForeColor = System.Drawing.Color.Black; + this.labelS3BucketName.Location = new System.Drawing.Point(13, 152); + this.labelS3BucketName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelS3BucketName.Name = "labelS3BucketName"; + this.labelS3BucketName.Size = new System.Drawing.Size(122, 22); + this.labelS3BucketName.TabIndex = 19; + this.labelS3BucketName.Text = "Bucket Name:"; + // + // textBoxS3Prefix + // + this.textBoxS3Prefix.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxS3Prefix.Location = new System.Drawing.Point(182, 189); + this.textBoxS3Prefix.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBoxS3Prefix.Name = "textBoxS3Prefix"; + this.textBoxS3Prefix.Size = new System.Drawing.Size(576, 33); + this.textBoxS3Prefix.TabIndex = 4; + this.textBoxS3Prefix.TextChanged += new System.EventHandler(this.textBoxS3Prefix_TextChanged); + // + // labelS3Prefix + // + this.labelS3Prefix.AutoSize = true; + this.labelS3Prefix.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelS3Prefix.ForeColor = System.Drawing.Color.Black; + this.labelS3Prefix.Location = new System.Drawing.Point(13, 195); + this.labelS3Prefix.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelS3Prefix.Name = "labelS3Prefix"; + this.labelS3Prefix.Size = new System.Drawing.Size(61, 22); + this.labelS3Prefix.TabIndex = 19; + this.labelS3Prefix.Text = "Prefix:"; + // + // textBoxS3CustomDomain + // + this.textBoxS3CustomDomain.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxS3CustomDomain.Location = new System.Drawing.Point(182, 232); + this.textBoxS3CustomDomain.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBoxS3CustomDomain.Name = "textBoxS3CustomDomain"; + this.textBoxS3CustomDomain.Size = new System.Drawing.Size(576, 33); + this.textBoxS3CustomDomain.TabIndex = 5; + this.textBoxS3CustomDomain.TextChanged += new System.EventHandler(this.textBoxS3CustomDomain_TextChanged); + // + // labelS3CustomDomain + // + this.labelS3CustomDomain.AutoSize = true; + this.labelS3CustomDomain.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelS3CustomDomain.ForeColor = System.Drawing.Color.Black; + this.labelS3CustomDomain.Location = new System.Drawing.Point(13, 238); + this.labelS3CustomDomain.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelS3CustomDomain.Name = "labelS3CustomDomain"; + this.labelS3CustomDomain.Size = new System.Drawing.Size(142, 22); + this.labelS3CustomDomain.TabIndex = 19; + this.labelS3CustomDomain.Text = "Custom Domain:"; + // + // labelUrlPreview + // + this.labelUrlPreview.AutoSize = true; + this.labelUrlPreview.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelUrlPreview.ForeColor = System.Drawing.Color.Black; + this.labelUrlPreview.Location = new System.Drawing.Point(13, 279); + this.labelUrlPreview.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelUrlPreview.Name = "labelUrlPreview"; + this.labelUrlPreview.Size = new System.Drawing.Size(120, 22); + this.labelUrlPreview.TabIndex = 19; + this.labelUrlPreview.Text = "URL Preview:"; + // + // textBoxUrlPreview + // + this.textBoxUrlPreview.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxUrlPreview.Location = new System.Drawing.Point(182, 273); + this.textBoxUrlPreview.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBoxUrlPreview.Name = "textBoxUrlPreview"; + this.textBoxUrlPreview.ReadOnly = true; + this.textBoxUrlPreview.Size = new System.Drawing.Size(576, 33); + this.textBoxUrlPreview.TabIndex = 6; + // + // buttonTest + // + this.buttonTest.AutoSize = true; + this.buttonTest.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.buttonTest.Dock = System.Windows.Forms.DockStyle.Left; + this.buttonTest.Location = new System.Drawing.Point(0, 0); + this.buttonTest.Margin = new System.Windows.Forms.Padding(15); + this.buttonTest.Name = "buttonTest"; + this.buttonTest.Padding = new System.Windows.Forms.Padding(8); + this.buttonTest.Size = new System.Drawing.Size(151, 46); + this.buttonTest.TabIndex = 7; + this.buttonTest.Text = "Test Connection"; + this.buttonTest.UseVisualStyleBackColor = true; + this.buttonTest.Click += new System.EventHandler(this.buttonTest_Click); + // + // S3SettingsWindow + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoSize = true; + this.BackColor = System.Drawing.Color.White; + this.ClientSize = new System.Drawing.Size(786, 375); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel3); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(774, 391); + this.Name = "S3SettingsWindow"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Amazon S3 Settings"; + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Label labelS3AccessKeyId; + private System.Windows.Forms.TextBox textBoxS3AccessKeyId; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Button buttonSaveClose; + private System.Windows.Forms.Label labelS3Prefix; + private System.Windows.Forms.TextBox textBoxS3Prefix; + private System.Windows.Forms.Label labelS3BucketName; + private System.Windows.Forms.TextBox textBoxS3BucketName; + private System.Windows.Forms.Label labelS3Endpoint; + private System.Windows.Forms.TextBox textBoxS3Endpoint; + private System.Windows.Forms.Label labelS3SecretAccessKey; + private System.Windows.Forms.TextBox textBoxS3SecretAccessKey; + private System.Windows.Forms.Label labelS3CustomDomain; + private System.Windows.Forms.TextBox textBoxS3CustomDomain; + private System.Windows.Forms.Label labelUrlPreview; + private System.Windows.Forms.TextBox textBoxUrlPreview; + private System.Windows.Forms.Button buttonTest; + } +} diff --git a/UI/S3SettingsWindow.cs b/UI/S3SettingsWindow.cs new file mode 100644 index 0000000..e698036 --- /dev/null +++ b/UI/S3SettingsWindow.cs @@ -0,0 +1,279 @@ +namespace MusicBeePlugin.UI +{ + using MusicBeePlugin.S3Client; + using System; + using System.Drawing; + using System.Windows.Forms; + + public partial class S3SettingsWindow : Form + { + private readonly Settings _settings; + + public S3SettingsWindow(Settings settings) + { + _settings = settings; + InitializeComponent(); + UpdateValues(_settings); + + Shown += OnShown; + VisibleChanged += OnVisibleChanged; + } + + private void OnVisibleChanged(object sender, EventArgs eventArgs) + { + if (Visible) + { + UpdateValues(_settings); + } + } + + private void OnShown(object sender, EventArgs eventArgs) + { + UpdateValues(_settings); + } + + private void UpdateValues(Settings settings) + { + textBoxS3AccessKeyId.Text = settings.S3AccessKeyId; + textBoxS3SecretAccessKey.Text = settings.S3SecretAccessKey; + textBoxS3Endpoint.Text = settings.S3Endpoint; + textBoxS3BucketName.Text = settings.S3BucketName; + textBoxS3Prefix.Text = settings.S3Prefix; + textBoxS3CustomDomain.Text = settings.S3CustomDomain; + + ValidateInputs(); + } + + private void UpdateUrlPreview() + { + if (string.IsNullOrWhiteSpace(textBoxS3BucketName.Text)) + { + textBoxUrlPreview.Text = ""; + return; + } + + var endpoint = textBoxS3Endpoint.Text; + var customDomain = textBoxS3CustomDomain.Text; + + // Detect insecure scheme and default to secure HTTPS if not present + var insecure = customDomain.StartsWith($"{Uri.UriSchemeHttp}://") || + string.IsNullOrWhiteSpace(customDomain) && endpoint.StartsWith($"{Uri.UriSchemeHttp}://"); + + // Strip schemes from endpoint and custom domain + endpoint = endpoint.Replace($"{Uri.UriSchemeHttp}://", "").Replace($"{Uri.UriSchemeHttps}://", ""); + customDomain = customDomain.Replace($"{Uri.UriSchemeHttp}://", "").Replace($"{Uri.UriSchemeHttps}://", ""); + + var scheme = $"{(insecure ? Uri.UriSchemeHttp : Uri.UriSchemeHttps)}://"; + var baseUrl = string.IsNullOrWhiteSpace(textBoxS3CustomDomain.Text) ? $"{textBoxS3BucketName.Text}.{endpoint}" : customDomain; + var prefix = string.IsNullOrWhiteSpace(textBoxS3Prefix.Text) ? "" : $"{textBoxS3Prefix.Text}/"; + textBoxUrlPreview.Text = $"{scheme}{baseUrl}/{prefix}example"; + } + + private bool ValidateInputs() + { + // Validate the entire form for all errors. Does not enforce any type of format as they differ between various S3 implementations. + int errors = 0; + + bool validateAccessKeyId() + { + if (string.IsNullOrWhiteSpace(textBoxS3AccessKeyId.Text)) + { + textBoxS3AccessKeyId.BackColor = Color.PaleVioletRed; + return false; + } + + textBoxS3AccessKeyId.BackColor = Color.White; + return true; + } + + if (!validateAccessKeyId()) + { + errors++; + } + + bool validateSecretAccessKey() + { + if (string.IsNullOrWhiteSpace(textBoxS3SecretAccessKey.Text)) + { + textBoxS3SecretAccessKey.BackColor = Color.PaleVioletRed; + return false; + } + + textBoxS3SecretAccessKey.BackColor = Color.White; + return true; + } + + if (!validateSecretAccessKey()) + { + errors++; + } + + bool validateEndpoint() + { + if (string.IsNullOrWhiteSpace(textBoxS3Endpoint.Text)) + { + textBoxS3Endpoint.BackColor = Color.PaleVioletRed; + return false; + } + + var endpoint = textBoxS3Endpoint.Text; + if (!endpoint.StartsWith($"{Uri.UriSchemeHttp}://") && !endpoint.StartsWith($"{Uri.UriSchemeHttps}://")) + { + endpoint = $"{Uri.UriSchemeHttps}://{endpoint}"; + } + + if (!ValidationHelpers.ValidateUri(endpoint)) + { + textBoxS3Endpoint.BackColor = Color.PaleVioletRed; + return false; + } + + textBoxS3Endpoint.BackColor = Color.White; + return true; + } + + if (!validateEndpoint()) + { + errors++; + } + + bool validateBucketName() + { + if (string.IsNullOrWhiteSpace(textBoxS3BucketName.Text)) + { + textBoxS3BucketName.BackColor = Color.PaleVioletRed; + return false; + } + + textBoxS3BucketName.BackColor = Color.White; + return true; + } + + if (!validateBucketName()) + { + errors++; + } + + bool validateCustomDomain() + { + var customDomain = textBoxS3CustomDomain.Text; + if (!customDomain.StartsWith($"{Uri.UriSchemeHttp}://") && !customDomain.StartsWith($"{Uri.UriSchemeHttps}://")) + { + customDomain = $"{Uri.UriSchemeHttps}://{customDomain}"; + } + + if (!ValidationHelpers.ValidateUri(customDomain)) + { + textBoxS3CustomDomain.BackColor = Color.PaleVioletRed; + return false; + } + + textBoxS3CustomDomain.BackColor = Color.White; + return true; + } + + if (textBoxS3CustomDomain.Text.Length > 0 && !validateCustomDomain()) + { + errors++; + } + + if (errors > 0) + { + return false; + } + + ResetErrorIndications(); + + return true; + } + + private void ResetErrorIndications() + { + textBoxS3AccessKeyId.BackColor = SystemColors.Window; + textBoxS3SecretAccessKey.BackColor = SystemColors.Window; + textBoxS3Endpoint.BackColor = SystemColors.Window; + textBoxS3BucketName.BackColor = SystemColors.Window; + textBoxS3Prefix.BackColor = SystemColors.Window; + textBoxS3CustomDomain.BackColor = SystemColors.Window; + } + + private void textBoxS3AccessKeyId_TextChanged(object sender, EventArgs e) + { + ValidateInputs(); + } + + private void textBoxS3SecretAccessKey_TextChanged(object sender, EventArgs e) + { + ValidateInputs(); + } + + private void textBoxS3Endpoint_TextChanged(object sender, EventArgs e) + { + UpdateUrlPreview(); + ValidateInputs(); + } + + private void textBoxS3BucketName_TextChanged(object sender, EventArgs e) + { + UpdateUrlPreview(); + ValidateInputs(); + } + + private void textBoxS3Prefix_TextChanged(object sender, EventArgs e) + { + UpdateUrlPreview(); + ValidateInputs(); + } + + private void textBoxS3CustomDomain_TextChanged(object sender, EventArgs e) + { + UpdateUrlPreview(); + ValidateInputs(); + } + + private async void buttonTest_Click(object sender, EventArgs e) + { + buttonTest.Enabled = false; + buttonTest.Text = "Testing..."; + + var s3Client = new S3Client(new S3Config + { + AccessKeyId = textBoxS3AccessKeyId.Text, + SecretAccessKey = textBoxS3SecretAccessKey.Text, + Endpoint = textBoxS3Endpoint.Text, + BucketName = textBoxS3BucketName.Text, + Prefix = textBoxS3Prefix.Text, + CustomDomain = textBoxS3CustomDomain.Text + }); + + if (await s3Client.TestConnection()) + { + MessageBox.Show("Connection successfully established to S3 bucket.", "Test Connection Result", MessageBoxButtons.OK, MessageBoxIcon.Information); + } else + { + MessageBox.Show("A connection could not be successfully made to the S3 bucket. Please check your credentials and configuration and try again.", "Test Connection Result", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + buttonTest.Enabled = true; + buttonTest.Text = "Test Connection"; + } + + private void buttonSaveClose_Click(object sender, EventArgs e) + { + if (!ValidateInputs()) + { + return; + } + + _settings.S3AccessKeyId = textBoxS3AccessKeyId.Text; + _settings.S3SecretAccessKey = textBoxS3SecretAccessKey.Text; + _settings.S3Endpoint = textBoxS3Endpoint.Text; + _settings.S3BucketName = textBoxS3BucketName.Text; + _settings.S3Prefix = textBoxS3Prefix.Text; + _settings.S3CustomDomain = textBoxS3CustomDomain.Text; + + ((SettingsWindow)Owner).ValidateInputs(); + Close(); + } + } +} diff --git a/UI/S3SettingsWindow.resx b/UI/S3SettingsWindow.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/UI/S3SettingsWindow.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/UI/SettingsWindow.Designer.cs b/UI/SettingsWindow.Designer.cs index af52651..5c23c14 100644 --- a/UI/SettingsWindow.Designer.cs +++ b/UI/SettingsWindow.Designer.cs @@ -28,514 +28,584 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.textBoxSmallImage = new System.Windows.Forms.TextBox(); - this.label4 = new System.Windows.Forms.Label(); - this.textBoxTrackCnt = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.textBoxTrackNo = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); - this.textBoxState = new System.Windows.Forms.TextBox(); - this.textBoxDetails = new System.Windows.Forms.TextBox(); - this.label1 = new System.Windows.Forms.Label(); - this.textBoxLargeImage = new System.Windows.Forms.TextBox(); - this.checkBoxTextOnly = new System.Windows.Forms.CheckBox(); - this.checkBoxShowRemainingTime = new System.Windows.Forms.CheckBox(); - this.checkBoxPresenceUpdate = new System.Windows.Forms.CheckBox(); - this.textBoxSeparator = new System.Windows.Forms.TextBox(); - this.label5 = new System.Windows.Forms.Label(); - this.buttonRestoreDefaults = new System.Windows.Forms.Button(); - this.buttonSaveClose = new System.Windows.Forms.Button(); - this.buttonPlaceholders = new System.Windows.Forms.Button(); - this.panel2 = new System.Windows.Forms.Panel(); - this.labelImgurClientId = new System.Windows.Forms.Label(); - this.textBoxImgurClientId = new System.Windows.Forms.TextBox(); - this.customButtonToggle = new System.Windows.Forms.CheckBox(); - this.checkBoxShowOnlyNonPlayingState = new System.Windows.Forms.CheckBox(); - this.checkBoxShowPlayState = new System.Windows.Forms.CheckBox(); - this.checkBoxShowTime = new System.Windows.Forms.CheckBox(); - this.checkBoxArtworkUpload = new System.Windows.Forms.CheckBox(); - this.labelDiscordAppId = new System.Windows.Forms.Label(); - this.textBoxDiscordAppId = new System.Windows.Forms.TextBox(); - this.panel3 = new System.Windows.Forms.Panel(); - this.panel4 = new System.Windows.Forms.Panel(); - this.label9 = new System.Windows.Forms.Label(); - this.customButtonUrl = new System.Windows.Forms.TextBox(); - this.label8 = new System.Windows.Forms.Label(); - this.customButtonLabel = new System.Windows.Forms.TextBox(); - this.panel2.SuspendLayout(); - this.panel3.SuspendLayout(); - this.panel4.SuspendLayout(); - this.SuspendLayout(); - // - // textBoxSmallImage - // - this.textBoxSmallImage.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); - this.textBoxSmallImage.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.textBoxSmallImage.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); - this.textBoxSmallImage.Location = new System.Drawing.Point(12, 71); - this.textBoxSmallImage.Name = "textBoxSmallImage"; - this.textBoxSmallImage.Size = new System.Drawing.Size(90, 25); - this.textBoxSmallImage.TabIndex = 9; - this.textBoxSmallImage.Text = "Small Image Text"; - // - // label4 - // - this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label4.AutoSize = true; - this.label4.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); - this.label4.Location = new System.Drawing.Point(492, 66); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(13, 17); - this.label4.TabIndex = 8; - this.label4.Text = ")"; - // - // textBoxTrackCnt - // - this.textBoxTrackCnt.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxTrackCnt.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); - this.textBoxTrackCnt.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.textBoxTrackCnt.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); - this.textBoxTrackCnt.Location = new System.Drawing.Point(414, 63); - this.textBoxTrackCnt.Name = "textBoxTrackCnt"; - this.textBoxTrackCnt.Size = new System.Drawing.Size(74, 25); - this.textBoxTrackCnt.TabIndex = 7; - this.textBoxTrackCnt.Text = "PartyMax"; - // - // label3 - // - this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label3.AutoSize = true; - this.label3.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); - this.label3.Location = new System.Drawing.Point(388, 66); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(20, 17); - this.label3.TabIndex = 6; - this.label3.Text = "of"; - // - // textBoxTrackNo - // - this.textBoxTrackNo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxTrackNo.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); - this.textBoxTrackNo.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.textBoxTrackNo.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); - this.textBoxTrackNo.Location = new System.Drawing.Point(310, 63); - this.textBoxTrackNo.Name = "textBoxTrackNo"; - this.textBoxTrackNo.Size = new System.Drawing.Size(74, 25); - this.textBoxTrackNo.TabIndex = 5; - this.textBoxTrackNo.Text = "PartyNo"; - // - // label2 - // - this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label2.AutoSize = true; - this.label2.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); - this.label2.Location = new System.Drawing.Point(291, 66); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(13, 17); - this.label2.TabIndex = 4; - this.label2.Text = "("; - // - // textBoxState - // - this.textBoxState.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.textBoxSmallImage = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.textBoxTrackCnt = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.textBoxTrackNo = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.textBoxState = new System.Windows.Forms.TextBox(); + this.textBoxDetails = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.textBoxLargeImage = new System.Windows.Forms.TextBox(); + this.checkBoxTextOnly = new System.Windows.Forms.CheckBox(); + this.checkBoxShowRemainingTime = new System.Windows.Forms.CheckBox(); + this.checkBoxPresenceUpdate = new System.Windows.Forms.CheckBox(); + this.textBoxSeparator = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.buttonRestoreDefaults = new System.Windows.Forms.Button(); + this.buttonSaveClose = new System.Windows.Forms.Button(); + this.buttonPlaceholders = new System.Windows.Forms.Button(); + this.panel2 = new System.Windows.Forms.Panel(); + this.labelArtworkUploader = new System.Windows.Forms.Label(); + this.comboBoxArtworkUploader = new System.Windows.Forms.ComboBox(); + this.labelImgurClientId = new System.Windows.Forms.Label(); + this.textBoxImgurClientId = new System.Windows.Forms.TextBox(); + this.customButtonToggle = new System.Windows.Forms.CheckBox(); + this.checkBoxShowOnlyNonPlayingState = new System.Windows.Forms.CheckBox(); + this.checkBoxShowPlayState = new System.Windows.Forms.CheckBox(); + this.checkBoxShowTime = new System.Windows.Forms.CheckBox(); + this.checkBoxArtworkUpload = new System.Windows.Forms.CheckBox(); + this.labelDiscordAppId = new System.Windows.Forms.Label(); + this.textBoxDiscordAppId = new System.Windows.Forms.TextBox(); + this.buttonS3Settings = new System.Windows.Forms.Button(); + this.panel3 = new System.Windows.Forms.Panel(); + this.panel4 = new System.Windows.Forms.Panel(); + this.label9 = new System.Windows.Forms.Label(); + this.customButtonUrl = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.customButtonLabel = new System.Windows.Forms.TextBox(); + this.panel2.SuspendLayout(); + this.panel3.SuspendLayout(); + this.panel4.SuspendLayout(); + this.SuspendLayout(); + // + // textBoxSmallImage + // + this.textBoxSmallImage.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); + this.textBoxSmallImage.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxSmallImage.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); + this.textBoxSmallImage.Location = new System.Drawing.Point(18, 109); + this.textBoxSmallImage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBoxSmallImage.Name = "textBoxSmallImage"; + this.textBoxSmallImage.Size = new System.Drawing.Size(133, 33); + this.textBoxSmallImage.TabIndex = 9; + this.textBoxSmallImage.Text = "Small Image Text"; + // + // label4 + // + this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); + this.label4.Location = new System.Drawing.Point(738, 102); + this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(20, 26); + this.label4.TabIndex = 8; + this.label4.Text = ")"; + // + // textBoxTrackCnt + // + this.textBoxTrackCnt.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxTrackCnt.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); + this.textBoxTrackCnt.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxTrackCnt.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); + this.textBoxTrackCnt.Location = new System.Drawing.Point(621, 97); + this.textBoxTrackCnt.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBoxTrackCnt.Name = "textBoxTrackCnt"; + this.textBoxTrackCnt.Size = new System.Drawing.Size(109, 33); + this.textBoxTrackCnt.TabIndex = 7; + this.textBoxTrackCnt.Text = "PartyMax"; + // + // label3 + // + this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); + this.label3.Location = new System.Drawing.Point(582, 102); + this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(32, 26); + this.label3.TabIndex = 6; + this.label3.Text = "of"; + // + // textBoxTrackNo + // + this.textBoxTrackNo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxTrackNo.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); + this.textBoxTrackNo.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxTrackNo.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); + this.textBoxTrackNo.Location = new System.Drawing.Point(465, 97); + this.textBoxTrackNo.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBoxTrackNo.Name = "textBoxTrackNo"; + this.textBoxTrackNo.Size = new System.Drawing.Size(109, 33); + this.textBoxTrackNo.TabIndex = 5; + this.textBoxTrackNo.Text = "PartyNo"; + // + // label2 + // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); + this.label2.Location = new System.Drawing.Point(436, 102); + this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(20, 26); + this.label2.TabIndex = 4; + this.label2.Text = "("; + // + // textBoxState + // + this.textBoxState.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxState.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); - this.textBoxState.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.textBoxState.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); - this.textBoxState.Location = new System.Drawing.Point(108, 63); - this.textBoxState.Name = "textBoxState"; - this.textBoxState.Size = new System.Drawing.Size(177, 25); - this.textBoxState.TabIndex = 3; - this.textBoxState.Text = "Presence state"; - // - // textBoxDetails - // - this.textBoxDetails.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.textBoxState.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); + this.textBoxState.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxState.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); + this.textBoxState.Location = new System.Drawing.Point(162, 97); + this.textBoxState.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBoxState.Name = "textBoxState"; + this.textBoxState.Size = new System.Drawing.Size(264, 33); + this.textBoxState.TabIndex = 3; + this.textBoxState.Text = "Presence state"; + // + // textBoxDetails + // + this.textBoxDetails.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxDetails.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); - this.textBoxDetails.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.textBoxDetails.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); - this.textBoxDetails.Location = new System.Drawing.Point(108, 32); - this.textBoxDetails.Name = "textBoxDetails"; - this.textBoxDetails.Size = new System.Drawing.Size(276, 25); - this.textBoxDetails.TabIndex = 2; - this.textBoxDetails.Text = "Presence details"; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); - this.label1.Location = new System.Drawing.Point(108, 10); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(84, 19); - this.label1.TabIndex = 1; - this.label1.Text = "MusicBee"; - // - // textBoxLargeImage - // - this.textBoxLargeImage.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); - this.textBoxLargeImage.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.textBoxLargeImage.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); - this.textBoxLargeImage.Location = new System.Drawing.Point(12, 9); - this.textBoxLargeImage.Multiline = true; - this.textBoxLargeImage.Name = "textBoxLargeImage"; - this.textBoxLargeImage.Size = new System.Drawing.Size(90, 60); - this.textBoxLargeImage.TabIndex = 0; - this.textBoxLargeImage.Text = "Large Image Text"; - // - // checkBoxTextOnly - // - this.checkBoxTextOnly.AutoSize = true; - this.checkBoxTextOnly.ForeColor = System.Drawing.Color.Black; - this.checkBoxTextOnly.Location = new System.Drawing.Point(266, 91); - this.checkBoxTextOnly.Margin = new System.Windows.Forms.Padding(4); - this.checkBoxTextOnly.Name = "checkBoxTextOnly"; - this.checkBoxTextOnly.Padding = new System.Windows.Forms.Padding(2); - this.checkBoxTextOnly.Size = new System.Drawing.Size(176, 21); - this.checkBoxTextOnly.TabIndex = 7; - this.checkBoxTextOnly.Text = "Remove images from presence"; - this.checkBoxTextOnly.UseVisualStyleBackColor = true; - // - // checkBoxShowRemainingTime - // - this.checkBoxShowRemainingTime.AutoSize = true; - this.checkBoxShowRemainingTime.ForeColor = System.Drawing.Color.Black; - this.checkBoxShowRemainingTime.Location = new System.Drawing.Point(266, 64); - this.checkBoxShowRemainingTime.Margin = new System.Windows.Forms.Padding(4); - this.checkBoxShowRemainingTime.Name = "checkBoxShowRemainingTime"; - this.checkBoxShowRemainingTime.Padding = new System.Windows.Forms.Padding(2); - this.checkBoxShowRemainingTime.Size = new System.Drawing.Size(216, 21); - this.checkBoxShowRemainingTime.TabIndex = 6; - this.checkBoxShowRemainingTime.Text = "Show remaining instead of elapsed time"; - this.checkBoxShowRemainingTime.UseVisualStyleBackColor = true; - // - // checkBoxPresenceUpdate - // - this.checkBoxPresenceUpdate.AutoSize = true; - this.checkBoxPresenceUpdate.ForeColor = System.Drawing.Color.Black; - this.checkBoxPresenceUpdate.Location = new System.Drawing.Point(266, 6); - this.checkBoxPresenceUpdate.Margin = new System.Windows.Forms.Padding(4); - this.checkBoxPresenceUpdate.Name = "checkBoxPresenceUpdate"; - this.checkBoxPresenceUpdate.Padding = new System.Windows.Forms.Padding(2); - this.checkBoxPresenceUpdate.Size = new System.Drawing.Size(224, 21); - this.checkBoxPresenceUpdate.TabIndex = 5; - this.checkBoxPresenceUpdate.Text = "Show presence when no music is playing"; - this.checkBoxPresenceUpdate.UseVisualStyleBackColor = true; - // - // textBoxSeparator - // - this.textBoxSeparator.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.textBoxSeparator.Location = new System.Drawing.Point(87, 3); - this.textBoxSeparator.Name = "textBoxSeparator"; - this.textBoxSeparator.Size = new System.Drawing.Size(87, 25); - this.textBoxSeparator.TabIndex = 4; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label5.ForeColor = System.Drawing.Color.Black; - this.label5.Location = new System.Drawing.Point(14, 7); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(70, 15); - this.label5.TabIndex = 0; - this.label5.Text = "Separators:"; - // - // buttonRestoreDefaults - // - this.buttonRestoreDefaults.AutoSize = true; - this.buttonRestoreDefaults.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.buttonRestoreDefaults.Dock = System.Windows.Forms.DockStyle.Right; - this.buttonRestoreDefaults.Location = new System.Drawing.Point(316, 0); - this.buttonRestoreDefaults.Margin = new System.Windows.Forms.Padding(10); - this.buttonRestoreDefaults.Name = "buttonRestoreDefaults"; - this.buttonRestoreDefaults.Padding = new System.Windows.Forms.Padding(5); - this.buttonRestoreDefaults.Size = new System.Drawing.Size(106, 30); - this.buttonRestoreDefaults.TabIndex = 2; - this.buttonRestoreDefaults.Text = "Restore Defaults"; - this.buttonRestoreDefaults.UseVisualStyleBackColor = true; - this.buttonRestoreDefaults.Click += new System.EventHandler(this.buttonRestoreDefaults_Click); - // - // buttonSaveClose - // - this.buttonSaveClose.AutoSize = true; - this.buttonSaveClose.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.buttonSaveClose.Dock = System.Windows.Forms.DockStyle.Right; - this.buttonSaveClose.Location = new System.Drawing.Point(422, 0); - this.buttonSaveClose.Margin = new System.Windows.Forms.Padding(10); - this.buttonSaveClose.Name = "buttonSaveClose"; - this.buttonSaveClose.Padding = new System.Windows.Forms.Padding(5); - this.buttonSaveClose.Size = new System.Drawing.Size(102, 30); - this.buttonSaveClose.TabIndex = 0; - this.buttonSaveClose.Text = "Save and Close"; - this.buttonSaveClose.UseVisualStyleBackColor = true; - this.buttonSaveClose.Click += new System.EventHandler(this.buttonSaveClose_Click); - // - // buttonPlaceholders - // - this.buttonPlaceholders.AutoSize = true; - this.buttonPlaceholders.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.buttonPlaceholders.Dock = System.Windows.Forms.DockStyle.Left; - this.buttonPlaceholders.Location = new System.Drawing.Point(0, 0); - this.buttonPlaceholders.Margin = new System.Windows.Forms.Padding(10); - this.buttonPlaceholders.Name = "buttonPlaceholders"; - this.buttonPlaceholders.Padding = new System.Windows.Forms.Padding(5); - this.buttonPlaceholders.Size = new System.Drawing.Size(88, 30); - this.buttonPlaceholders.TabIndex = 1; - this.buttonPlaceholders.Text = "Placeholders"; - this.buttonPlaceholders.UseVisualStyleBackColor = true; - this.buttonPlaceholders.Click += new System.EventHandler(this.buttonPlaceholders_Click); - // - // panel2 - // - this.panel2.AutoSize = true; - this.panel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.panel2.BackColor = System.Drawing.Color.Transparent; - this.panel2.Controls.Add(this.labelImgurClientId); - this.panel2.Controls.Add(this.textBoxImgurClientId); - this.panel2.Controls.Add(this.customButtonToggle); - this.panel2.Controls.Add(this.checkBoxShowOnlyNonPlayingState); - this.panel2.Controls.Add(this.checkBoxShowPlayState); - this.panel2.Controls.Add(this.checkBoxShowTime); - this.panel2.Controls.Add(this.checkBoxArtworkUpload); - this.panel2.Controls.Add(this.labelDiscordAppId); - this.panel2.Controls.Add(this.textBoxDiscordAppId); - this.panel2.Controls.Add(this.label5); - this.panel2.Controls.Add(this.textBoxSeparator); - this.panel2.Controls.Add(this.checkBoxShowRemainingTime); - this.panel2.Controls.Add(this.checkBoxTextOnly); - this.panel2.Controls.Add(this.checkBoxPresenceUpdate); - this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; - this.panel2.Location = new System.Drawing.Point(0, 157); - this.panel2.MinimumSize = new System.Drawing.Size(0, 100); - this.panel2.Name = "panel2"; - this.panel2.Size = new System.Drawing.Size(524, 204); - this.panel2.TabIndex = 1; - // - // labelImgurClientId - // - this.labelImgurClientId.AutoSize = true; - this.labelImgurClientId.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelImgurClientId.ForeColor = System.Drawing.Color.Black; - this.labelImgurClientId.Location = new System.Drawing.Point(14, 65); - this.labelImgurClientId.Name = "labelImgurClientId"; - this.labelImgurClientId.Size = new System.Drawing.Size(88, 15); - this.labelImgurClientId.TabIndex = 19; - this.labelImgurClientId.Text = "Imgur Client ID"; - // - // textBoxImgurClientId - // - this.textBoxImgurClientId.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.textBoxImgurClientId.Location = new System.Drawing.Point(108, 62); - this.textBoxImgurClientId.Name = "textBoxImgurClientId"; - this.textBoxImgurClientId.Size = new System.Drawing.Size(151, 25); - this.textBoxImgurClientId.TabIndex = 20; - this.textBoxImgurClientId.TextChanged += new System.EventHandler(this.textBoxImgurClientId_TextChanged); - // - // customButtonToggle - // - this.customButtonToggle.AutoSize = true; - this.customButtonToggle.ForeColor = System.Drawing.Color.Black; - this.customButtonToggle.Location = new System.Drawing.Point(266, 118); - this.customButtonToggle.Margin = new System.Windows.Forms.Padding(4); - this.customButtonToggle.Name = "customButtonToggle"; - this.customButtonToggle.Padding = new System.Windows.Forms.Padding(2); - this.customButtonToggle.Size = new System.Drawing.Size(135, 21); - this.customButtonToggle.TabIndex = 18; - this.customButtonToggle.Text = "Enable Custom Button"; - this.customButtonToggle.UseVisualStyleBackColor = true; - // - // checkBoxShowOnlyNonPlayingState - // - this.checkBoxShowOnlyNonPlayingState.AutoSize = true; - this.checkBoxShowOnlyNonPlayingState.Checked = true; - this.checkBoxShowOnlyNonPlayingState.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxShowOnlyNonPlayingState.ForeColor = System.Drawing.Color.Black; - this.checkBoxShowOnlyNonPlayingState.Location = new System.Drawing.Point(17, 145); - this.checkBoxShowOnlyNonPlayingState.Margin = new System.Windows.Forms.Padding(4); - this.checkBoxShowOnlyNonPlayingState.Name = "checkBoxShowOnlyNonPlayingState"; - this.checkBoxShowOnlyNonPlayingState.Padding = new System.Windows.Forms.Padding(2); - this.checkBoxShowOnlyNonPlayingState.Size = new System.Drawing.Size(210, 21); - this.checkBoxShowOnlyNonPlayingState.TabIndex = 13; - this.checkBoxShowOnlyNonPlayingState.Text = "Don\'t show playing state when playing"; - this.checkBoxShowOnlyNonPlayingState.UseVisualStyleBackColor = true; - // - // checkBoxShowPlayState - // - this.checkBoxShowPlayState.AutoSize = true; - this.checkBoxShowPlayState.Checked = true; - this.checkBoxShowPlayState.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxShowPlayState.ForeColor = System.Drawing.Color.Black; - this.checkBoxShowPlayState.Location = new System.Drawing.Point(17, 118); - this.checkBoxShowPlayState.Margin = new System.Windows.Forms.Padding(4); - this.checkBoxShowPlayState.Name = "checkBoxShowPlayState"; - this.checkBoxShowPlayState.Padding = new System.Windows.Forms.Padding(2); - this.checkBoxShowPlayState.Size = new System.Drawing.Size(195, 21); - this.checkBoxShowPlayState.TabIndex = 12; - this.checkBoxShowPlayState.Text = "Show playing state on album cover"; - this.checkBoxShowPlayState.UseVisualStyleBackColor = true; - // - // checkBoxShowTime - // - this.checkBoxShowTime.AutoSize = true; - this.checkBoxShowTime.Checked = true; - this.checkBoxShowTime.CheckState = System.Windows.Forms.CheckState.Checked; - this.checkBoxShowTime.ForeColor = System.Drawing.Color.Black; - this.checkBoxShowTime.Location = new System.Drawing.Point(266, 34); - this.checkBoxShowTime.Margin = new System.Windows.Forms.Padding(4); - this.checkBoxShowTime.Name = "checkBoxShowTime"; - this.checkBoxShowTime.Padding = new System.Windows.Forms.Padding(2); - this.checkBoxShowTime.Size = new System.Drawing.Size(79, 21); - this.checkBoxShowTime.TabIndex = 11; - this.checkBoxShowTime.Text = "Show time"; - this.checkBoxShowTime.UseVisualStyleBackColor = true; - // - // checkBoxArtworkUpload - // - this.checkBoxArtworkUpload.AutoSize = true; - this.checkBoxArtworkUpload.BackColor = System.Drawing.Color.Transparent; - this.checkBoxArtworkUpload.ForeColor = System.Drawing.Color.Black; - this.checkBoxArtworkUpload.Location = new System.Drawing.Point(17, 91); - this.checkBoxArtworkUpload.Margin = new System.Windows.Forms.Padding(4); - this.checkBoxArtworkUpload.Name = "checkBoxArtworkUpload"; - this.checkBoxArtworkUpload.Padding = new System.Windows.Forms.Padding(2); - this.checkBoxArtworkUpload.Size = new System.Drawing.Size(130, 21); - this.checkBoxArtworkUpload.TabIndex = 10; - this.checkBoxArtworkUpload.Text = "Upload album covers"; - this.checkBoxArtworkUpload.UseVisualStyleBackColor = false; - this.checkBoxArtworkUpload.CheckedChanged += new System.EventHandler(this.checkBoxArtworkUpload_CheckedChanged); - // - // labelDiscordAppId - // - this.labelDiscordAppId.AutoSize = true; - this.labelDiscordAppId.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelDiscordAppId.ForeColor = System.Drawing.Color.Black; - this.labelDiscordAppId.Location = new System.Drawing.Point(14, 35); - this.labelDiscordAppId.Name = "labelDiscordAppId"; - this.labelDiscordAppId.Size = new System.Drawing.Size(91, 15); - this.labelDiscordAppId.TabIndex = 8; - this.labelDiscordAppId.Text = "Discord App ID:"; - // - // textBoxDiscordAppId - // - this.textBoxDiscordAppId.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.textBoxDiscordAppId.Location = new System.Drawing.Point(108, 32); - this.textBoxDiscordAppId.Name = "textBoxDiscordAppId"; - this.textBoxDiscordAppId.Size = new System.Drawing.Size(151, 25); - this.textBoxDiscordAppId.TabIndex = 9; - this.textBoxDiscordAppId.TextChanged += new System.EventHandler(this.textBoxDiscordAppId_TextChanged); - // - // panel3 - // - this.panel3.AutoScroll = true; - this.panel3.AutoSize = true; - this.panel3.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.panel3.BackColor = System.Drawing.Color.Transparent; - this.panel3.Controls.Add(this.buttonRestoreDefaults); - this.panel3.Controls.Add(this.buttonPlaceholders); - this.panel3.Controls.Add(this.buttonSaveClose); - this.panel3.Dock = System.Windows.Forms.DockStyle.Bottom; - this.panel3.Location = new System.Drawing.Point(0, 361); - this.panel3.MinimumSize = new System.Drawing.Size(0, 30); - this.panel3.Name = "panel3"; - this.panel3.Size = new System.Drawing.Size(524, 30); - this.panel3.TabIndex = 2; - // - // panel4 - // - this.panel4.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.panel4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); - this.panel4.Controls.Add(this.label9); - this.panel4.Controls.Add(this.customButtonUrl); - this.panel4.Controls.Add(this.label8); - this.panel4.Controls.Add(this.customButtonLabel); - this.panel4.Controls.Add(this.textBoxSmallImage); - this.panel4.Controls.Add(this.textBoxLargeImage); - this.panel4.Controls.Add(this.label4); - this.panel4.Controls.Add(this.label1); - this.panel4.Controls.Add(this.textBoxTrackCnt); - this.panel4.Controls.Add(this.textBoxDetails); - this.panel4.Controls.Add(this.label3); - this.panel4.Controls.Add(this.textBoxState); - this.panel4.Controls.Add(this.textBoxTrackNo); - this.panel4.Controls.Add(this.label2); - this.panel4.Dock = System.Windows.Forms.DockStyle.Top; - this.panel4.Location = new System.Drawing.Point(0, 0); - this.panel4.Name = "panel4"; - this.panel4.Size = new System.Drawing.Size(524, 157); - this.panel4.TabIndex = 1; - // - // label9 - // - this.label9.AutoSize = true; - this.label9.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label9.ForeColor = System.Drawing.Color.White; - this.label9.Location = new System.Drawing.Point(198, 99); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(241, 15); - this.label9.TabIndex = 19; - this.label9.Text = "Custom Button Url (Supports Placeholders)"; - // - // customButtonUrl - // - this.customButtonUrl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.textBoxDetails.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); + this.textBoxDetails.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxDetails.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); + this.textBoxDetails.Location = new System.Drawing.Point(162, 49); + this.textBoxDetails.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBoxDetails.Name = "textBoxDetails"; + this.textBoxDetails.Size = new System.Drawing.Size(412, 33); + this.textBoxDetails.TabIndex = 2; + this.textBoxDetails.Text = "Presence details"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); + this.label1.Location = new System.Drawing.Point(162, 15); + this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(125, 29); + this.label1.TabIndex = 1; + this.label1.Text = "MusicBee"; + // + // textBoxLargeImage + // + this.textBoxLargeImage.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); + this.textBoxLargeImage.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxLargeImage.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); + this.textBoxLargeImage.Location = new System.Drawing.Point(18, 14); + this.textBoxLargeImage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBoxLargeImage.Multiline = true; + this.textBoxLargeImage.Name = "textBoxLargeImage"; + this.textBoxLargeImage.Size = new System.Drawing.Size(133, 90); + this.textBoxLargeImage.TabIndex = 0; + this.textBoxLargeImage.Text = "Large Image Text"; + // + // checkBoxTextOnly + // + this.checkBoxTextOnly.AutoSize = true; + this.checkBoxTextOnly.ForeColor = System.Drawing.Color.Black; + this.checkBoxTextOnly.Location = new System.Drawing.Point(399, 140); + this.checkBoxTextOnly.Margin = new System.Windows.Forms.Padding(6); + this.checkBoxTextOnly.Name = "checkBoxTextOnly"; + this.checkBoxTextOnly.Padding = new System.Windows.Forms.Padding(3); + this.checkBoxTextOnly.Size = new System.Drawing.Size(261, 30); + this.checkBoxTextOnly.TabIndex = 7; + this.checkBoxTextOnly.Text = "Remove images from presence"; + this.checkBoxTextOnly.UseVisualStyleBackColor = true; + // + // checkBoxShowRemainingTime + // + this.checkBoxShowRemainingTime.AutoSize = true; + this.checkBoxShowRemainingTime.ForeColor = System.Drawing.Color.Black; + this.checkBoxShowRemainingTime.Location = new System.Drawing.Point(399, 98); + this.checkBoxShowRemainingTime.Margin = new System.Windows.Forms.Padding(6); + this.checkBoxShowRemainingTime.Name = "checkBoxShowRemainingTime"; + this.checkBoxShowRemainingTime.Padding = new System.Windows.Forms.Padding(3); + this.checkBoxShowRemainingTime.Size = new System.Drawing.Size(322, 30); + this.checkBoxShowRemainingTime.TabIndex = 6; + this.checkBoxShowRemainingTime.Text = "Show remaining instead of elapsed time"; + this.checkBoxShowRemainingTime.UseVisualStyleBackColor = true; + // + // checkBoxPresenceUpdate + // + this.checkBoxPresenceUpdate.AutoSize = true; + this.checkBoxPresenceUpdate.ForeColor = System.Drawing.Color.Black; + this.checkBoxPresenceUpdate.Location = new System.Drawing.Point(399, 9); + this.checkBoxPresenceUpdate.Margin = new System.Windows.Forms.Padding(6); + this.checkBoxPresenceUpdate.Name = "checkBoxPresenceUpdate"; + this.checkBoxPresenceUpdate.Padding = new System.Windows.Forms.Padding(3); + this.checkBoxPresenceUpdate.Size = new System.Drawing.Size(328, 30); + this.checkBoxPresenceUpdate.TabIndex = 5; + this.checkBoxPresenceUpdate.Text = "Show presence when no music is playing"; + this.checkBoxPresenceUpdate.UseVisualStyleBackColor = true; + // + // textBoxSeparator + // + this.textBoxSeparator.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxSeparator.Location = new System.Drawing.Point(130, 5); + this.textBoxSeparator.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBoxSeparator.Name = "textBoxSeparator"; + this.textBoxSeparator.Size = new System.Drawing.Size(128, 33); + this.textBoxSeparator.TabIndex = 4; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label5.ForeColor = System.Drawing.Color.Black; + this.label5.Location = new System.Drawing.Point(21, 11); + this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(103, 22); + this.label5.TabIndex = 0; + this.label5.Text = "Separators:"; + // + // buttonRestoreDefaults + // + this.buttonRestoreDefaults.AutoSize = true; + this.buttonRestoreDefaults.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.buttonRestoreDefaults.Dock = System.Windows.Forms.DockStyle.Right; + this.buttonRestoreDefaults.Location = new System.Drawing.Point(484, 0); + this.buttonRestoreDefaults.Margin = new System.Windows.Forms.Padding(15); + this.buttonRestoreDefaults.Name = "buttonRestoreDefaults"; + this.buttonRestoreDefaults.Padding = new System.Windows.Forms.Padding(8); + this.buttonRestoreDefaults.Size = new System.Drawing.Size(156, 46); + this.buttonRestoreDefaults.TabIndex = 2; + this.buttonRestoreDefaults.Text = "Restore Defaults"; + this.buttonRestoreDefaults.UseVisualStyleBackColor = true; + this.buttonRestoreDefaults.Click += new System.EventHandler(this.buttonRestoreDefaults_Click); + // + // buttonSaveClose + // + this.buttonSaveClose.AutoSize = true; + this.buttonSaveClose.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.buttonSaveClose.Dock = System.Windows.Forms.DockStyle.Right; + this.buttonSaveClose.Location = new System.Drawing.Point(640, 0); + this.buttonSaveClose.Margin = new System.Windows.Forms.Padding(15); + this.buttonSaveClose.Name = "buttonSaveClose"; + this.buttonSaveClose.Padding = new System.Windows.Forms.Padding(8); + this.buttonSaveClose.Size = new System.Drawing.Size(146, 46); + this.buttonSaveClose.TabIndex = 0; + this.buttonSaveClose.Text = "Save and Close"; + this.buttonSaveClose.UseVisualStyleBackColor = true; + this.buttonSaveClose.Click += new System.EventHandler(this.buttonSaveClose_Click); + // + // buttonPlaceholders + // + this.buttonPlaceholders.AutoSize = true; + this.buttonPlaceholders.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.buttonPlaceholders.Dock = System.Windows.Forms.DockStyle.Left; + this.buttonPlaceholders.Location = new System.Drawing.Point(0, 0); + this.buttonPlaceholders.Margin = new System.Windows.Forms.Padding(15); + this.buttonPlaceholders.Name = "buttonPlaceholders"; + this.buttonPlaceholders.Padding = new System.Windows.Forms.Padding(8); + this.buttonPlaceholders.Size = new System.Drawing.Size(126, 46); + this.buttonPlaceholders.TabIndex = 1; + this.buttonPlaceholders.Text = "Placeholders"; + this.buttonPlaceholders.UseVisualStyleBackColor = true; + this.buttonPlaceholders.Click += new System.EventHandler(this.buttonPlaceholders_Click); + // + // panel2 + // + this.panel2.AutoSize = true; + this.panel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.panel2.BackColor = System.Drawing.Color.Transparent; + this.panel2.Controls.Add(this.labelArtworkUploader); + this.panel2.Controls.Add(this.comboBoxArtworkUploader); + this.panel2.Controls.Add(this.labelImgurClientId); + this.panel2.Controls.Add(this.textBoxImgurClientId); + this.panel2.Controls.Add(this.customButtonToggle); + this.panel2.Controls.Add(this.checkBoxShowOnlyNonPlayingState); + this.panel2.Controls.Add(this.checkBoxShowPlayState); + this.panel2.Controls.Add(this.checkBoxShowTime); + this.panel2.Controls.Add(this.checkBoxArtworkUpload); + this.panel2.Controls.Add(this.labelDiscordAppId); + this.panel2.Controls.Add(this.textBoxDiscordAppId); + this.panel2.Controls.Add(this.label5); + this.panel2.Controls.Add(this.textBoxSeparator); + this.panel2.Controls.Add(this.checkBoxShowRemainingTime); + this.panel2.Controls.Add(this.checkBoxTextOnly); + this.panel2.Controls.Add(this.checkBoxPresenceUpdate); + this.panel2.Controls.Add(this.buttonS3Settings); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(0, 242); + this.panel2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel2.MinimumSize = new System.Drawing.Size(0, 154); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(786, 314); + this.panel2.TabIndex = 1; + // + // labelArtworkUploader + // + this.labelArtworkUploader.AutoSize = true; + this.labelArtworkUploader.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelArtworkUploader.ForeColor = System.Drawing.Color.Black; + this.labelArtworkUploader.Location = new System.Drawing.Point(21, 136); + this.labelArtworkUploader.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelArtworkUploader.Name = "labelArtworkUploader"; + this.labelArtworkUploader.Size = new System.Drawing.Size(154, 22); + this.labelArtworkUploader.TabIndex = 22; + this.labelArtworkUploader.Text = "Artwork Uploader:"; + // + // comboBoxArtworkUploader + // + this.comboBoxArtworkUploader.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxArtworkUploader.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.comboBoxArtworkUploader.FormattingEnabled = true; + this.comboBoxArtworkUploader.Items.AddRange(new object[] { + "Imgur", + "Amazon S3"}); + this.comboBoxArtworkUploader.Location = new System.Drawing.Point(182, 130); + this.comboBoxArtworkUploader.Name = "comboBoxArtworkUploader"; + this.comboBoxArtworkUploader.Size = new System.Drawing.Size(204, 34); + this.comboBoxArtworkUploader.TabIndex = 21; + this.comboBoxArtworkUploader.SelectedIndexChanged += new System.EventHandler(this.comboBoxArtworkUploader_SelectedIndexChanged); + // + // labelImgurClientId + // + this.labelImgurClientId.AutoSize = true; + this.labelImgurClientId.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelImgurClientId.ForeColor = System.Drawing.Color.Black; + this.labelImgurClientId.Location = new System.Drawing.Point(21, 182); + this.labelImgurClientId.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelImgurClientId.Name = "labelImgurClientId"; + this.labelImgurClientId.Size = new System.Drawing.Size(132, 22); + this.labelImgurClientId.TabIndex = 19; + this.labelImgurClientId.Text = "Imgur Client ID:"; + // + // textBoxImgurClientId + // + this.textBoxImgurClientId.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxImgurClientId.Location = new System.Drawing.Point(162, 177); + this.textBoxImgurClientId.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBoxImgurClientId.Name = "textBoxImgurClientId"; + this.textBoxImgurClientId.Size = new System.Drawing.Size(224, 33); + this.textBoxImgurClientId.TabIndex = 20; + this.textBoxImgurClientId.TextChanged += new System.EventHandler(this.textBoxImgurClientId_TextChanged); + // + // customButtonToggle + // + this.customButtonToggle.AutoSize = true; + this.customButtonToggle.ForeColor = System.Drawing.Color.Black; + this.customButtonToggle.Location = new System.Drawing.Point(399, 182); + this.customButtonToggle.Margin = new System.Windows.Forms.Padding(6); + this.customButtonToggle.Name = "customButtonToggle"; + this.customButtonToggle.Padding = new System.Windows.Forms.Padding(3); + this.customButtonToggle.Size = new System.Drawing.Size(202, 30); + this.customButtonToggle.TabIndex = 18; + this.customButtonToggle.Text = "Enable Custom Button"; + this.customButtonToggle.UseVisualStyleBackColor = true; + // + // checkBoxShowOnlyNonPlayingState + // + this.checkBoxShowOnlyNonPlayingState.AutoSize = true; + this.checkBoxShowOnlyNonPlayingState.Checked = true; + this.checkBoxShowOnlyNonPlayingState.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxShowOnlyNonPlayingState.ForeColor = System.Drawing.Color.Black; + this.checkBoxShowOnlyNonPlayingState.Location = new System.Drawing.Point(26, 267); + this.checkBoxShowOnlyNonPlayingState.Margin = new System.Windows.Forms.Padding(6); + this.checkBoxShowOnlyNonPlayingState.Name = "checkBoxShowOnlyNonPlayingState"; + this.checkBoxShowOnlyNonPlayingState.Padding = new System.Windows.Forms.Padding(3); + this.checkBoxShowOnlyNonPlayingState.Size = new System.Drawing.Size(308, 30); + this.checkBoxShowOnlyNonPlayingState.TabIndex = 13; + this.checkBoxShowOnlyNonPlayingState.Text = "Don\'t show playing state when playing"; + this.checkBoxShowOnlyNonPlayingState.UseVisualStyleBackColor = true; + // + // checkBoxShowPlayState + // + this.checkBoxShowPlayState.AutoSize = true; + this.checkBoxShowPlayState.Checked = true; + this.checkBoxShowPlayState.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxShowPlayState.ForeColor = System.Drawing.Color.Black; + this.checkBoxShowPlayState.Location = new System.Drawing.Point(26, 226); + this.checkBoxShowPlayState.Margin = new System.Windows.Forms.Padding(6); + this.checkBoxShowPlayState.Name = "checkBoxShowPlayState"; + this.checkBoxShowPlayState.Padding = new System.Windows.Forms.Padding(3); + this.checkBoxShowPlayState.Size = new System.Drawing.Size(285, 30); + this.checkBoxShowPlayState.TabIndex = 12; + this.checkBoxShowPlayState.Text = "Show playing state on album cover"; + this.checkBoxShowPlayState.UseVisualStyleBackColor = true; + // + // checkBoxShowTime + // + this.checkBoxShowTime.AutoSize = true; + this.checkBoxShowTime.Checked = true; + this.checkBoxShowTime.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBoxShowTime.ForeColor = System.Drawing.Color.Black; + this.checkBoxShowTime.Location = new System.Drawing.Point(399, 52); + this.checkBoxShowTime.Margin = new System.Windows.Forms.Padding(6); + this.checkBoxShowTime.Name = "checkBoxShowTime"; + this.checkBoxShowTime.Padding = new System.Windows.Forms.Padding(3); + this.checkBoxShowTime.Size = new System.Drawing.Size(115, 30); + this.checkBoxShowTime.TabIndex = 11; + this.checkBoxShowTime.Text = "Show time"; + this.checkBoxShowTime.UseVisualStyleBackColor = true; + // + // checkBoxArtworkUpload + // + this.checkBoxArtworkUpload.AutoSize = true; + this.checkBoxArtworkUpload.BackColor = System.Drawing.Color.Transparent; + this.checkBoxArtworkUpload.ForeColor = System.Drawing.Color.Black; + this.checkBoxArtworkUpload.Location = new System.Drawing.Point(26, 95); + this.checkBoxArtworkUpload.Margin = new System.Windows.Forms.Padding(6); + this.checkBoxArtworkUpload.Name = "checkBoxArtworkUpload"; + this.checkBoxArtworkUpload.Padding = new System.Windows.Forms.Padding(3); + this.checkBoxArtworkUpload.Size = new System.Drawing.Size(189, 30); + this.checkBoxArtworkUpload.TabIndex = 10; + this.checkBoxArtworkUpload.Text = "Upload album covers"; + this.checkBoxArtworkUpload.UseVisualStyleBackColor = false; + this.checkBoxArtworkUpload.CheckedChanged += new System.EventHandler(this.checkBoxArtworkUpload_CheckedChanged); + // + // labelDiscordAppId + // + this.labelDiscordAppId.AutoSize = true; + this.labelDiscordAppId.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelDiscordAppId.ForeColor = System.Drawing.Color.Black; + this.labelDiscordAppId.Location = new System.Drawing.Point(21, 54); + this.labelDiscordAppId.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.labelDiscordAppId.Name = "labelDiscordAppId"; + this.labelDiscordAppId.Size = new System.Drawing.Size(135, 22); + this.labelDiscordAppId.TabIndex = 8; + this.labelDiscordAppId.Text = "Discord App ID:"; + // + // textBoxDiscordAppId + // + this.textBoxDiscordAppId.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBoxDiscordAppId.Location = new System.Drawing.Point(162, 49); + this.textBoxDiscordAppId.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.textBoxDiscordAppId.Name = "textBoxDiscordAppId"; + this.textBoxDiscordAppId.Size = new System.Drawing.Size(224, 33); + this.textBoxDiscordAppId.TabIndex = 9; + this.textBoxDiscordAppId.TextChanged += new System.EventHandler(this.textBoxDiscordAppId_TextChanged); + // + // buttonS3Settings + // + this.buttonS3Settings.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.buttonS3Settings.Location = new System.Drawing.Point(24, 176); + this.buttonS3Settings.Margin = new System.Windows.Forms.Padding(15); + this.buttonS3Settings.Name = "buttonS3Settings"; + this.buttonS3Settings.Padding = new System.Windows.Forms.Padding(4); + this.buttonS3Settings.Size = new System.Drawing.Size(362, 38); + this.buttonS3Settings.TabIndex = 23; + this.buttonS3Settings.Text = "Configure S3 Settings"; + this.buttonS3Settings.UseVisualStyleBackColor = true; + this.buttonS3Settings.Visible = false; + this.buttonS3Settings.Click += new System.EventHandler(this.buttonS3Settings_Click); + // + // panel3 + // + this.panel3.AutoScroll = true; + this.panel3.AutoSize = true; + this.panel3.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.panel3.BackColor = System.Drawing.Color.Transparent; + this.panel3.Controls.Add(this.buttonRestoreDefaults); + this.panel3.Controls.Add(this.buttonPlaceholders); + this.panel3.Controls.Add(this.buttonSaveClose); + this.panel3.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel3.Location = new System.Drawing.Point(0, 556); + this.panel3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel3.MinimumSize = new System.Drawing.Size(0, 46); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(786, 46); + this.panel3.TabIndex = 2; + // + // panel4 + // + this.panel4.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.panel4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); + this.panel4.Controls.Add(this.label9); + this.panel4.Controls.Add(this.customButtonUrl); + this.panel4.Controls.Add(this.label8); + this.panel4.Controls.Add(this.customButtonLabel); + this.panel4.Controls.Add(this.textBoxSmallImage); + this.panel4.Controls.Add(this.textBoxLargeImage); + this.panel4.Controls.Add(this.label4); + this.panel4.Controls.Add(this.label1); + this.panel4.Controls.Add(this.textBoxTrackCnt); + this.panel4.Controls.Add(this.textBoxDetails); + this.panel4.Controls.Add(this.label3); + this.panel4.Controls.Add(this.textBoxState); + this.panel4.Controls.Add(this.textBoxTrackNo); + this.panel4.Controls.Add(this.label2); + this.panel4.Dock = System.Windows.Forms.DockStyle.Top; + this.panel4.Location = new System.Drawing.Point(0, 0); + this.panel4.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.panel4.Name = "panel4"; + this.panel4.Size = new System.Drawing.Size(786, 242); + this.panel4.TabIndex = 1; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label9.ForeColor = System.Drawing.Color.White; + this.label9.Location = new System.Drawing.Point(297, 152); + this.label9.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(354, 22); + this.label9.TabIndex = 19; + this.label9.Text = "Custom Button Url (Supports Placeholders)"; + // + // customButtonUrl + // + this.customButtonUrl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.customButtonUrl.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); - this.customButtonUrl.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.customButtonUrl.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); - this.customButtonUrl.Location = new System.Drawing.Point(198, 117); - this.customButtonUrl.Name = "customButtonUrl"; - this.customButtonUrl.Size = new System.Drawing.Size(290, 25); - this.customButtonUrl.TabIndex = 20; - this.customButtonUrl.TextChanged += new System.EventHandler(this.customButtonUrl_TextChanged); - // - // label8 - // - this.label8.AutoSize = true; - this.label8.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label8.ForeColor = System.Drawing.Color.White; - this.label8.Location = new System.Drawing.Point(9, 99); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(124, 15); - this.label8.TabIndex = 19; - this.label8.Text = "Custom Button Label:"; - // - // customButtonLabel - // - this.customButtonLabel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); - this.customButtonLabel.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.customButtonLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); - this.customButtonLabel.Location = new System.Drawing.Point(12, 117); - this.customButtonLabel.Name = "customButtonLabel"; - this.customButtonLabel.Size = new System.Drawing.Size(177, 25); - this.customButtonLabel.TabIndex = 10; - // - // SettingsWindow - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.AutoSize = true; - this.BackColor = System.Drawing.Color.White; - this.ClientSize = new System.Drawing.Size(524, 391); - this.Controls.Add(this.panel2); - this.Controls.Add(this.panel3); - this.Controls.Add(this.panel4); - this.MinimumSize = new System.Drawing.Size(523, 274); - this.Name = "SettingsWindow"; - this.ShowIcon = false; - this.Text = "DiscordBee Settings"; - this.panel2.ResumeLayout(false); - this.panel2.PerformLayout(); - this.panel3.ResumeLayout(false); - this.panel3.PerformLayout(); - this.panel4.ResumeLayout(false); - this.panel4.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); + this.customButtonUrl.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); + this.customButtonUrl.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.customButtonUrl.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); + this.customButtonUrl.Location = new System.Drawing.Point(297, 180); + this.customButtonUrl.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.customButtonUrl.Name = "customButtonUrl"; + this.customButtonUrl.Size = new System.Drawing.Size(433, 33); + this.customButtonUrl.TabIndex = 20; + this.customButtonUrl.TextChanged += new System.EventHandler(this.customButtonUrl_TextChanged); + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label8.ForeColor = System.Drawing.Color.White; + this.label8.Location = new System.Drawing.Point(14, 152); + this.label8.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(182, 22); + this.label8.TabIndex = 19; + this.label8.Text = "Custom Button Label:"; + // + // customButtonLabel + // + this.customButtonLabel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(114)))), ((int)(((byte)(137)))), ((int)(((byte)(218))))); + this.customButtonLabel.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.customButtonLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(226)))), ((int)(((byte)(230)))), ((int)(((byte)(246))))); + this.customButtonLabel.Location = new System.Drawing.Point(18, 180); + this.customButtonLabel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.customButtonLabel.Name = "customButtonLabel"; + this.customButtonLabel.Size = new System.Drawing.Size(264, 33); + this.customButtonLabel.TabIndex = 10; + // + // SettingsWindow + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoSize = true; + this.BackColor = System.Drawing.Color.White; + this.ClientSize = new System.Drawing.Size(786, 602); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel3); + this.Controls.Add(this.panel4); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.MinimumSize = new System.Drawing.Size(774, 391); + this.Name = "SettingsWindow"; + this.ShowIcon = false; + this.Text = "DiscordBee Settings"; + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + this.panel4.ResumeLayout(false); + this.panel4.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); } @@ -575,5 +645,8 @@ private void InitializeComponent() private System.Windows.Forms.CheckBox checkBoxShowOnlyNonPlayingState; private System.Windows.Forms.Label labelImgurClientId; private System.Windows.Forms.TextBox textBoxImgurClientId; - } + private System.Windows.Forms.Label labelArtworkUploader; + private System.Windows.Forms.ComboBox comboBoxArtworkUploader; + private System.Windows.Forms.Button buttonS3Settings; + } } diff --git a/UI/SettingsWindow.cs b/UI/SettingsWindow.cs index 2784dc4..2ed1131 100644 --- a/UI/SettingsWindow.cs +++ b/UI/SettingsWindow.cs @@ -66,6 +66,7 @@ private void UpdateValues(Settings settings) checkBoxShowPlayState.Checked = settings.ShowPlayState; checkBoxShowOnlyNonPlayingState.Checked = settings.ShowOnlyNonPlayingState; checkBoxArtworkUpload.Checked = settings.UploadArtwork; + comboBoxArtworkUploader.SelectedIndex = comboBoxArtworkUploader.FindString(settings.ArtworkUploader); customButtonLabel.Text = settings.ButtonLabel; customButtonUrl.Text = settings.ButtonUrl; customButtonToggle.Checked = settings.ShowButton; @@ -110,6 +111,7 @@ private void buttonSaveClose_Click(object sender, EventArgs e) _settings.ShowPlayState = checkBoxShowPlayState.Checked; _settings.ShowOnlyNonPlayingState = checkBoxShowOnlyNonPlayingState.Checked; _settings.UploadArtwork = checkBoxArtworkUpload.Checked; + _settings.ArtworkUploader = comboBoxArtworkUploader.SelectedItem.ToString(); _settings.ButtonUrl = customButtonUrl.Text; _settings.ButtonLabel = customButtonLabel.Text; _settings.ShowButton = customButtonToggle.Checked; @@ -124,7 +126,7 @@ private void buttonSaveClose_Click(object sender, EventArgs e) Hide(); } - private bool ValidateInputs() + internal bool ValidateInputs() { bool ContainsDigitsOnly(string s) { @@ -168,9 +170,42 @@ bool validateImgurClientId() return true; } - if (checkBoxArtworkUpload.Checked && textBoxImgurClientId.Text.Length > 0 && !validateImgurClientId()) + bool validateS3() { - return false; + if (string.IsNullOrWhiteSpace(_settings.S3AccessKeyId) || + string.IsNullOrWhiteSpace(_settings.S3SecretAccessKey) || + string.IsNullOrWhiteSpace(_settings.S3BucketName) || + string.IsNullOrWhiteSpace(_settings.S3Endpoint)) + { + buttonS3Settings.BackColor = Color.PaleVioletRed; + return false; + } + buttonS3Settings.BackColor = Color.White; + return true; + } + + if (checkBoxArtworkUpload.Checked && comboBoxArtworkUploader.SelectedItem != null) + { + comboBoxArtworkUploader.BackColor = Color.White; + + switch (comboBoxArtworkUploader.SelectedItem.ToString()) + { + case "Imgur": + if (textBoxImgurClientId.Text.Length > 0 && !validateImgurClientId()) + { + return false; + } + break; + case "Amazon S3": + if (!validateS3()) + { + return false; + } + break; + default: + comboBoxArtworkUploader.BackColor = Color.PaleVioletRed; + return false; + } } bool validateUri() @@ -199,6 +234,7 @@ private void ResetErrorIndications() { textBoxDiscordAppId.BackColor = SystemColors.Window; textBoxImgurClientId.BackColor = SystemColors.Window; + buttonS3Settings.BackColor = SystemColors.Window; customButtonUrl.BackColor = Color.FromArgb(114, 137, 218); } @@ -221,5 +257,29 @@ private void textBoxImgurClientId_TextChanged(object sender, EventArgs e) { ValidateInputs(); } + + private void comboBoxArtworkUploader_SelectedIndexChanged(object sender, EventArgs e) + { + ValidateInputs(); + + if (comboBoxArtworkUploader.SelectedIndex == comboBoxArtworkUploader.FindString("Imgur")) + { + labelImgurClientId.Visible = true; + textBoxImgurClientId.Visible = true; + buttonS3Settings.Visible = false; + } + else if (comboBoxArtworkUploader.SelectedIndex == comboBoxArtworkUploader.FindString("Amazon S3")) + { + labelImgurClientId.Visible = false; + textBoxImgurClientId.Visible = false; + buttonS3Settings.Visible = true; + } + } + + private void buttonS3Settings_Click(object sender, EventArgs e) + { + var s3SettingsWindow = new S3SettingsWindow(_settings); + s3SettingsWindow.ShowDialog(this); + } } }