########################################################################### ## Copyright (C) Wizardry and Steamworks 2019 - License: GNU GPLv3 ## ## Please see: http://www.gnu.org/licenses/gpl.html for legal details, ## ## rights of fair usage, the disclaimer and warranty conditions. ## ########################################################################### ########################################################################### ## CONFIGURATION ## ########################################################################### # The URL to the Corrade HTTP server. $CURL = 'http://192.168.1.1:8080/' # The configured Corrade group to send the command as. $Group = '[Wizardry and Steamworks]:Support' # The configured Corrade group password. $Password = 'my password' # A list of groups to send the notice to. $Groups = @('[Wizardry and Steamworks]:Support', '[Wizardry and Steamworks]:Corrade') ########################################################################### ## INTERNALS ## ########################################################################### # https://mohitgoyal.co/2017/04/16/read-multi-line-input-from-users-in-powershell/ function Read-MultiLineInputBoxDialog([string]$Message, [string]$WindowTitle, [string]$DefaultText) { Add-Type -AssemblyName System.Drawing Add-Type -AssemblyName System.Windows.Forms # Create the Label. $label = New-Object System.Windows.Forms.Label $label.Location = New-Object System.Drawing.Size(10,10) $label.Size = New-Object System.Drawing.Size(280,20) $label.AutoSize = $true $label.Text = $Message # Create the TextBox used to capture the user's text. $textBox = New-Object System.Windows.Forms.TextBox $textBox.Location = New-Object System.Drawing.Size(10,40) $textBox.Size = New-Object System.Drawing.Size(575,200) $textBox.AcceptsReturn = $true $textBox.AcceptsTab = $false $textBox.Multiline = $true $textBox.ScrollBars = 'Both' $textBox.Text = $DefaultText # Create the OK button. $okButton = New-Object System.Windows.Forms.Button $okButton.Location = New-Object System.Drawing.Size(415,250) $okButton.Size = New-Object System.Drawing.Size(75,25) $okButton.Text = "OK" $okButton.Add_Click({ $form.Tag = $textBox.Text; $form.Close() }) # Create the Cancel button. $cancelButton = New-Object System.Windows.Forms.Button $cancelButton.Location = New-Object System.Drawing.Size(510,250) $cancelButton.Size = New-Object System.Drawing.Size(75,25) $cancelButton.Text = "Cancel" $cancelButton.Add_Click({ $form.Tag = $null; $form.Close() }) # Create the form. $form = New-Object System.Windows.Forms.Form $form.Text = $WindowTitle $form.Size = New-Object System.Drawing.Size(610,320) $form.FormBorderStyle = 'FixedSingle' $form.StartPosition = "CenterScreen" $form.AutoSizeMode = 'GrowAndShrink' $form.Topmost = $True $form.AcceptButton = $okButton $form.CancelButton = $cancelButton $form.ShowInTaskbar = $true # Add all of the controls to the form. $form.Controls.Add($label) $form.Controls.Add($textBox) $form.Controls.Add($okButton) $form.Controls.Add($cancelButton) # Initialize and show the form. $form.Add_Shown({$form.Activate()}) $form.ShowDialog() > $null # Trash the text of the button that was clicked. # Return the text that the user entered. return $form.Tag } Add-Type -AssemblyName System.Web $Subject = Read-MultiLineInputBoxDialog -Message "The notice subject" -WindowTitle "Subject" -DefaultText "Enter some text here..." $Message = Read-MultiLineInputBoxDialog -Message "The notice message" -WindowTitle "Message" -DefaultText "Enter some text here..." $Group = [System.Web.HttpUtility]::UrlEncode($Group) $Password = [System.Web.HttpUtility]::UrlEncode($Password) $Subject = [System.Web.HttpUtility]::UrlEncode($Subject) $Message = [System.Web.HttpUtility]::UrlEncode($Message) if([string]::IsNullOrEmpty($Group) -or [string]::IsNullOrEmpty($Password) -or [string]::IsNullOrEmpty($Subject) -or [string]::IsNullOrEmpty($Message)) { return } foreach($targetGroup in $Groups) { $targetGroup = [System.Web.HttpUtility]::UrlEncode($targetGroup) $Params = ("command=notice&action=send" + "&group=" + $Group + "&password=" + $Password + "&subject=" + $Subject + "&message=" + $Message + "&target=" + $targetGroup) $Body = [byte[]][char[]]$Params $Request = [System.Net.HttpWebRequest]::Create($CURL) $Request.Method = 'POST' $Request.ContentType = 'application/x-www-form-urlencoded' $Request.Accept = "application/x-www-form-urlencoded" $Stream = $Request.GetRequestStream() $Stream.Write($Body, 0, $Body.Length) $Stream.Flush() $Stream.Close() $Response = $Request.GetResponse() $Stream = $Response.GetResponseStream() $StreamReader = [System.IO.StreamReader]($Stream) Switch([int]$Response.StatusCode) { 200 { Write-Host ('Sent notice to group ' + $targetGroup) Break } default { Write-Host ('Failed to send notice to group ' + $targetGroup) } } $Content = $StreamReader.ReadToEnd() $StreamReader.Close() $Response.Close() }