From 9591b3000c59b23a25ad70f71350c431f2579216 Mon Sep 17 00:00:00 2001 From: Natsumi Date: Tue, 10 Oct 2023 20:19:17 +1300 Subject: [PATCH] VRCX overlay icon --- AppApi.cs | 51 +++++++++++++++++++++------------------------------ VRCX.csproj | 3 +++ VRCX.png | Bin 0 -> 13140 bytes VRCXVR.cs | 16 ++++++++++++++-- 4 files changed, 38 insertions(+), 32 deletions(-) create mode 100644 VRCX.png diff --git a/AppApi.cs b/AppApi.cs index d1d75a5b..4bdd74cd 100644 --- a/AppApi.cs +++ b/AppApi.cs @@ -437,40 +437,31 @@ namespace VRCX /// /// Displays an XSOverlay notification with the specified title, content, and optional image. /// - /// The title of the notification. - /// The content of the notification. - /// The duration of the notification in milliseconds. - /// The optional image to display in the notification. - public void XSNotification(string Title, string Content, int Timeout, string Image = "") + /// The title of the notification. + /// The content of the notification. + /// The duration of the notification in milliseconds. + /// The optional image to display in the notification. + public void XSNotification(string title, string content, int timeout, string image = "") { - bool UseBase64Icon; - string Icon; - if (string.IsNullOrEmpty(Image)) - { - UseBase64Icon = true; - Icon = - "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAHaGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIxLTA0LTA4VDE0OjU3OjAxKzEyOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0wNC0wOFQxNjozMzoxMCsxMjowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMS0wNC0wOFQxNjozMzoxMCsxMjowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2YTY5MmQzYi03ZTJkLTNiNGUtYTMzZC1hN2MwOTNlOGU0OTkiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo1NTE2MWIyMi1hYzgxLTY3NDYtODAyYi1kODIzYWFmN2RjYjciIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3ZjJjNTA2ZS02YTVhLWRhNGEtOTg5Mi02NDZiMzQ0MGQxZTgiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90b3Nob3A6NmJmOGE5MTgtY2QzZS03OTRjLTk3NzktMzM0YjYwZWJiNTYyPC9yZGY6bGk+IDwvcmRmOkJhZz4gPC9waG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6N2YyYzUwNmUtNmE1YS1kYTRhLTk4OTItNjQ2YjM0NDBkMWU4IiBzdEV2dDp3aGVuPSIyMDIxLTA0LTA4VDE0OjU3OjAxKzEyOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmJhM2ZjODI3LTM0ZjQtYjU0OC05ZGFiLTZhMTZlZmQzZjAxMSIgc3RFdnQ6d2hlbj0iMjAyMS0wNC0wOFQxNTowMTozMSsxMjowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo2YTY5MmQzYi03ZTJkLTNiNGUtYTMzZC1hN2MwOTNlOGU0OTkiIHN0RXZ0OndoZW49IjIwMjEtMDQtMDhUMTY6MzM6MTArMTI6MDAiIHN0RXZ0OnNv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"; - } - else - { - UseBase64Icon = false; - Icon = Image; - } + var icon = image; + if (string.IsNullOrEmpty(image)) + icon = Path.Combine(Program.BaseDirectory, "VRCX.png"); - var broadcastIP = IPAddress.Loopback; var broadcastSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - var endPoint = new IPEndPoint(broadcastIP, 42069); + var endPoint = new IPEndPoint(IPAddress.Loopback, 42069); - var msg = new XSOMessage(); - msg.messageType = 1; - msg.title = Title; - msg.content = Content; - msg.height = 110f; - msg.sourceApp = "VRCX"; - msg.timeout = Timeout; - msg.audioPath = string.Empty; - msg.useBase64Icon = UseBase64Icon; - msg.icon = Icon; + var msg = new XSOMessage + { + messageType = 1, + title = title, + content = content, + height = 110f, + sourceApp = "VRCX", + timeout = timeout, + audioPath = string.Empty, + useBase64Icon = false, + icon = icon + }; var byteBuffer = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(msg); broadcastSocket.SendTo(byteBuffer, endPoint); diff --git a/VRCX.csproj b/VRCX.csproj index 58f4583f..5e323f95 100644 --- a/VRCX.csproj +++ b/VRCX.csproj @@ -174,6 +174,9 @@ PreserveNewest + + PreserveNewest + diff --git a/VRCX.png b/VRCX.png new file mode 100644 index 0000000000000000000000000000000000000000..28253a1cb02c0009cdd617fa22c6484578c678cc GIT binary patch literal 13140 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