# encoding: ascii
# api: powershell
# title: Send-XmppMessage
# description: Sends an XMPP (Jabber) instant message.  These parameters are mandatory: From, To, Body.  Password can be supplied on the command line, or if omitted, you will be prompted for it.
# version: 0.1
# type: function
# author: halr9000
# license: CC0
# function: Send-XmppMessage
# x-poshcode-id: 103
# x-archived: 2017-02-21T07:23:35
# x-published: 2008-01-07T13:42:00
#
#
# Download XMPP SDK from http://www.ag-software.de/index.php?page=agsxmpp-sdk
function Send-XmppMessage {
	param (
		$From = $( Throw "You must specify a Jabber ID for the sender." ),
		$Password, # Leave blank to be prompted for password
		$To = $( Throw "You must specify a Jabber ID for the recipient." ),
		$Body = $( Throw "You must specify a body for the message." )
	)
	
	# This function reads a string from the host while masking with *'s.
	function Read-HostMasked( [string]$prompt="Password" ) {
		$password = Read-Host -AsSecureString $prompt; 
		$BSTR = [System.Runtime.InteropServices.marshal]::SecureStringToBSTR($password);
		$password = [System.Runtime.InteropServices.marshal]::PtrToStringAuto($BSTR);
		[System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($BSTR);
		return $password;
	}
	# Set path accordingly.
	$assemblyPath = $(resolve-path $profiledir\Assemblies\agsXMPP.dll)
	[void][reflection.assembly]::LoadFrom( $assemblyPath )
	$jidSender 		= New-Object agsxmpp.jid( $From )
	$jidReceiver 	= New-Object agsxmpp.jid ( $To )
	$xmppClient 	= New-Object agsxmpp.XmppClientConnection( $jidSender.Server )
	$Message 		= New-Object agsXMPP.protocol.client.Message( $jidReceiver, $Body )
	
	# The following switches may assist in troubleshooting connection issues.
	# If SSL and StartTLS are disabled, then you can use a network sniffer to inspect the XML
	#$xmppClient.UseSSL 					= $FALSE
	#$xmppClient.UseStartTLS 				= $FALSE
	
	# Since this function is only used to send a message, we don't care about doing the 
	# normal discovery and requesting a roster.  Leave disabled to quicken the login period.
	$xmppClient.AutoAgents 					= $FALSE
	$xmppClient.AutoRoster 					= $FALSE
	
	# Use SRV lookups to determine correct XMPP server if different from the server
	# portion of your JID.  e.g. user@gmail.com, the server is really talk.google.com
	$xmppClient.AutoResolveConnectServer 	= $TRUE
	if ( !$password ) { $password = Read-HostMasked }
	
	# Open connection, then wait for it to be authenticated
	$xmppClient.Open( $jidSender.User, $Password )
		while ( !$xmppClient.Authenticated ) {
			Write-Verbose $xmppClient.XmppConnectionState
			Start-Sleep 1
		}
	# If server disconnects you, try enabling this
	#$xmppClient.SendMyPresence()
	$xmppClient.Send( $Message )
	# Send is asynchronous, so we must wait a second before closing the connection
	Start-Sleep 1
	$xmppClient.Close()
}
