Instant Messaging: A Programmer's Tool? 
by William Wright and Dana Moore 

Example 1:

<message 
  id='JCOM_3' 
  to='dana@localhost' 
  type='chat' 
  from='bill@localhost/work'>
    <thread>1178F4323360E2F9514D13BED89B9F6D</thread>
    <body>Hey, did you see that game last night?</body>
</message>

Example 2:

data = `uptime`.split[7]
if (data.to_f >= value.to_f) 
  reply = Jabber::Protocol::Message.new(nil)
  reply.to = msg.from
  reply.thread = msg.thread
  reply.type = msg.type
  reply.set_body(`uptime`)
  reply.set_subject("Your uptime request")
  session.connection.send(reply)
end

Example 3:

$connection = new Net::Jabber::Client();
$connection->SetCallBacks(message=>\&messageCB,
                          presence=>\&presenceCB);
my $status = $connection->Connect(hostname=>$server);
my @result = $connection->AuthSend(username=>$uname,
                                   password=>$pass,
                                   resource=>$resource);

Example 4:

sub presenceCB {
  my $sid = shift;
  my $presence = shift;
  my $from = $presence->GetFrom();
  my $type = $presence->GetType();
  my $show = $presence->GetShow();
  my $status = $presence->GetStatus();
  print "$from is now $show/$status\n";
}

Example 5:

(a)
def iqCB(con, iq):
query_ns = iq.getQuery()
payload = iq.getQueryPayload()
#print "Payload_>\n", payload
payload = xmlrpclib.loads(str(payload))
#print "Payload.loads()_>\n", payload

(b)
<methodCall>
 <methodName>Rot13</methodName>
 <params>
  <param>
   <value>
    <string>There was a young lady of Nantes</string>
   </value>
  </param>
 </params>
</methodCall>

Example 6:
(a)
if query_ns == jabber.NS_RPC:
resultIq = jabber.Iq(to=iq.getFrom(), type='result')
resultIq.setID(iq.getID())
resultIq.setFrom(iq.getTo())
resultIq.setQuery(iq.getQuery())

(b)
evalString = payload[1]+"('"+payload[0][0]+"')"
returnParams = xmlrpclib.dumps(tuple([eval(evalString)]))
#print "returnParams==>\n", returnParams
resultIq.setQueryPayload(returnParams)
con.send(resultIq)


Listing One
require 'jabber4r/jabber4r'
jid = "uptime@localhost/uptime"
passwd = "uptime"
$status = {}

session = Jabber::Session.bind_digest(jid, passwd)
session.announce_initial_presence
session.add_message_listener { |msg|
  if (msg.body.include? "start")
    value = msg.body.split[1]
    $status[msg.from.to_s] = "running"
    t = Thread.new {
      while $status[msg.from.to_s] == "running"
        data = `uptime`.split[7]
        if (data.to_f >= value.to_f) 
          reply = Jabber::Protocol::Message.new(nil)
          reply.to = msg.from
          reply.thread = msg.thread
          reply.type = msg.type
          reply.set_body(`uptime`)
          reply.set_subject("Your uptime request")
          session.connection.send(reply)
        end
        sleep 5
      end
    }
  elsif (msg.body.include? "stop")
    $status[msg.from.to_s] = "stop"
  end
}
Thread.stop


Listing Two
use strict;
use Net::Jabber 'Client';
my $jid = 'build@localhost/work';
my $pass = 'build';
my $connection;

sub messageCB {
  my $sid = shift;
  my $msg = shift;
  my $src = $msg->GetFrom("jid")->GetUserID();
  my $msgtxt = $msg->GetBody();
  # run ant
  my $buildOutput = `ant -logfile antout.tmp $msgtxt`;
  $buildOutput = `cat antout.tmp`;
  $connection->MessageSend(to=>$msg->GetFrom(), subject=>"Build of $msgtxt",
                           thread=>"$msg->GetThread()",type=>$msg->GetType(),
                           body=>$buildOutput);
  `rm antout.tmp`;
}
sub presenceCB {
  my $sid = shift;
  my $presence = shift;
  my $from = $presence->GetFrom();
  my $type = $presence->GetType();
  my $show = $presence->GetShow();
  my $status = $presence->GetStatus();
  print "$from is now $show/$status\n";
}
sub connectToJabber {
  my $uname;
  my $server;
  my $resource;
  ($uname, $server, $resource) = ($jid =~/([^@]*)@([^\/]*)\/(.*)/);
  $connection = new Net::Jabber::Client();
  $connection->SetCallBacks(message=>\&messageCB, presence=>\&presenceCB);
  my $status = $connection->Connect(hostname=>$server);
  my @result = $connection->AuthSend(username=>$uname, password=>$pass,
                                     resource=>$resource);
  if ($result[0] ne "ok")
  {
    print "ERROR: Authorization failed: $result[0] - $result[1]\n";
    exit(0);
  }
  $connection->PresenceSend();
  while (1) {my $res = $connection->Process();}
}
sub sendMsg {
  my $otherJid = shift;
  my $msgText = shift;
  $connection->MessageSend(to=>$otherJid, subject=>"chat_demo_subject",
                           thread=>"chat_demo_thread",type=>"chat",
                           body=>$msgText);
}
connectToJabber();

Listing Three
<project name="ddj" default="echo">
  <target name="echo" depends="">
    <echo>
      This ant script doesn't do too much.
    </echo>
  </target>
</project>

Listing Four
import jabber
import xmlrpclib
import string
import sys
Server = 'localhost'
Username = 'peer-a'
Password = 'peer-a'
Resource = 'rpc'

Endpoint = 'peer-b@localhost/rpc'
Method = 'Rot13'
text = "There was a young lady of Nantes"

request = xmlrpclib.dumps((text,), methodname=Method)
con = jabber.Client(host=Server)
try:
    con.connect()
except IOError, e:
    print "Unable to connect: %s" % e
    sys.exit(0)
con.auth(Username, Password, Resource)
iq = jabber.Iq(to=Endpoint, type='set')
iq.setQuery('jabber:iq:rpc')
iq.setQueryPayload(request)
result = con.SendAndWaitForResponse(iq)
if result.getType() == 'result':
    response = str(result.getQueryPayload())
    parms, func = xmlrpclib.loads(response)
    print parms[0]
else:
    print "Error"
con.disconnect()


Listing Five
import xmlrpclib, jabber
import sys, re, os, string
Server = 'localhost'
Username = 'peer-b'
Password = 'peer-b'
Resource = 'rpc'
def Rot13(text):
    rot= ""
    for x in range(len(text)):
        byte = ord(text[x])
        cap = (byte & 32)
        byte = (byte & (~cap))
        if (byte >= ord('A')) and (byte <= ord('Z')):
            byte = ((byte - ord('A') + 13) % 26 + ord('A'))
        byte = (byte | cap)
        rot = rot + chr(byte)
    return rot

def iqCB(con, iq):
    myFromID = iq.getTo()
    type = iq.getType()
    payload = xmlrpclib.loads(str(iq.getQueryPayload()))
    if iq.getQuery() ==  jabber.NS_RPC:
      resultIq = jabber.Iq(to=iq.getFrom(), type='result')
      resultIq.setID(iq.getID())
      resultIq.setFrom(iq.getTo())
      resultIq.setQuery(iq.getQuery()) 
      evalString = payload[1]+"('"+payload[0][0]+"')"
      # Actually call the requested method
      returnParams = xmlrpclib.dumps(tuple([eval(evalString)]))
      resultIq.setQueryPayload(returnParams)
      con.send(resultIq)
#--------- "MAIN" -----------------------------
con = jabber.Client(host=Server)
try:
    con.connect()
except IOError, e:
    print "Couldn't connect: %s" % e
    sys.exit(0)
else:
    print "Connected"
con.process(1)
if con.auth(Username, Password, Resource):
    print "Authorised"
else:
    print "problems with handshake: ", con.lastErr, con.lastErrCode
    sys.exit(1)
con.setIqHandler(iqCB)
try:
    while(1):
        con.process(300)
except KeyboardInterrupt:
    con.disconnect()







5



