# encoding: ascii
# api: powershell
# title: Start-IRCJabberBridge
# description: Creates a bridge between (any) MUC chatroom and a Jabber user — by default it joins the #PowerShell channel at IRC.FreeNode.net and echos everything said there to you, and everything you say to it … to the chat room. Really quite useless, except as a demonstration.
# version: 0.1
# type: script
# author: halr9000
# license: CC0
# function: Read-HostMasked
# x-poshcode-id: 106
# x-derived-from-id: 178
# x-archived: 2009-02-11T07:49:31
#
#
##########################################################################################
## Depends on the PsXmppHelper.dll from http://CodePlex.com/PowerXmpp
## CONTAINS Read-HostMasked http://powershellcentral.com/scripts/104
## CONTAINS Out-Working http://powershellcentral.com/scripts/105
##########################################################################################
## NOTICE: THERE IS WAY TOO LITTLE ERROR HANDLING HERE!!!!
## IF EVERYTHING does not go very well, you will likely get very little explanation
## MAKE SURE YOU ARE USING a registered jabber id and password
##########################################################################################
## Read-HostMasked
## See: http://powershellcentral.com/scripts/104
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;
}
##########################################################################################
## Out-Working
## See: http://powershellcentral.com/scripts/105
$fore="White"; $back="red";
$work = @( $Host.UI.RawUI.NewBufferCellArray(@("|"),$fore,$back),
$Host.UI.RawUI.NewBufferCellArray(@("/"),$fore,$back),
$Host.UI.RawUI.NewBufferCellArray(@("-"),$fore,$back),
$Host.UI.RawUI.NewBufferCellArray(@("\"),$fore,$back) );
[int]$script:w = 0;
filter out-working($wait=0) {
$cur = $Host.UI.RawUI.Get_CursorPosition();
$cur.X = 0; $cur.Y -=1;
$Host.UI.RawUI.SetBufferContents($cur,$work[$script:w++]);
if($script:w -gt 3) {$script:w = 0 }
Start-Sleep -milli $wait
$_
}
##########################################################################################
## Start-IrcJabberBridge - an Xmpp script
## Depends on the PsXmppHelper.dll from http://CodePlex.com/PowerXmpp
##
function Start-IRCJabberBridge {
param (
$From = $( Read-Host "Your Jabber ID" )
,$Password = $( Read-HostMasked "Password")
,$Message = $( Read-Host "Your Message!" )
,$To = $( Read-Host "Recipient's Jabber ID" )
,$Chat = "PowerShell%irc.FreeNode.net@irc.im.flosoft.biz" # An IRC channel to join!
,$ChatNick = "PowerBot" # Your nickname in IRC
,$ChatPassword = $null
)
# Set path appropriately...
[reflection.assembly]::LoadFrom( "agsXMPP.dll" ) | fl Location, FullName, GlobalAssemblyCache
[reflection.assembly]::LoadFrom( "PsXmppHelper.dll" ) | fl Location, FullName, GlobalAssemblyCache
$jidSender = New-Object agsxmpp.jid $From
$jidChat = New-Object agsxmpp.jid $chat
$jidReceiver = New-Object agsxmpp.jid $To
$xmpp = New-Object agsxmpp.XmppClientConnection( [string]$jidSender.Server )
## 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
# $xmpp.AutoResolveConnectServer = $TRUE
$xmpp.SocketConnectionType = [agsXMPP.net.SocketConnectionType]::HttpPolling;
$xmpp.ConnectServer = "http://im.flosoft.biz:5280/http-poll/";
# 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.
$xmpp.AutoAgents = $false
$xmpp.AutoRoster = $false
# 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
#$xmpp.UseSSL = $false
#$xmpp.UseStartTLS = $false
### SOME CONSTANTS
$MSG = "agsXMPP.protocol.client.Message"
$ChatMessage = [agsXMPP.protocol.client.MessageType]::chat
$GroupMessage = [agsXMPP.protocol.client.MessageType]::groupchat
$queue = New-Object PsXmppClient.MessageQueue $xmpp
$muc = New-Object agsXMPP.protocol.x.muc.MucManager $xmpp
# Connect and wait ...
$xmpp.Open($jidSender.User, $Password)
while ( !$xmpp.Authenticated ) {
Write-Verbose ("{0} - {1}" -f $xmpp.XmppConnectionState, $xmpp.Authenticated )
[Threading.Thread]::Sleep(200)
}
Write-Verbose ("{0} - {1}" -f $xmpp.XmppConnectionState, $xmpp.Authenticated )
# Set our status so we're visible
$xmpp.Show = "chat"
$xmpp.Status = "I'm a PowerShell Bot"
$xmpp.SendMyPresence()
# Join the chat room (the same as "SendMyPresence", except to a MUC)
$muc.JoinRoom($jidChat, $ChatNick, $ChatPassword)
# Send the initial message
$xmpp.Send((New-Object $MSG $jidReceiver, $ChatMessage, $Message))
$counter = 0
" Press any key to continue"
while (!$Host.UI.RawUI.KeyAvailable)
{
foreach ($m in $queue.Messages)
{
" <{0}> {1}" -f $m.From.Resource, $m.Body
if ($m.From.Bare -eq $To)
{
$xmpp.Send((New-Object $MSG $jidChat, $GroupMessage, $M.Body))
}
else
{
## "{0}=={1}" -f $m.From.Bare,$To
$xmpp.Send((New-Object $MSG $jidReceiver, $ChatMessage, ("<{0}> {1}" -f $m.From.Resource, $m.Body)))
}
}
$counter++
# Every so often, re-broadcast our continued presence
# Over http polling, not doing this was causing vanishing problems...
if(($counter % 50) -eq 0 ) {
$xmpp.SendMyPresence()
$muc.JoinRoom($jidChat, $ChatNick)
}
out-working 100
}
$muc.LeaveRoom($jidChat, $ChatNick);
$xmpp.Close();
}