Using dataforms with xmpp4r pubsub

I could not find an example anywhere for using data forms with xmpp4r pubsub feature. Here’s a working example. Note that I included only the publishing site of it since I’m using javascript for the subscribers.

#!/usr/bin/ruby

require 'rubygems'
require 'xmpp4r'
require "xmpp4r/pubsub"
require "xmpp4r/dataforms"
require "xmpp4r/pubsub/helper/servicehelper.rb"
require "xmpp4r/pubsub/helper/nodebrowser.rb"
require "xmpp4r/pubsub/helper/nodehelper.rb"
include Jabber

JID='smpallen99@xmpp'
PASSWD='test123'
SERVICE='pubsub.xmpp'
NODE='xmpp/ahearsion'

Jabber::debug = true

cl = Jabber::Client.new(Jabber::JID.new(JID))
puts "Connecting"
cl.connect
cl.auth(PASSWD)
cl.send(Jabber::Presence.new.set_priority(-1))

pubsub = PubSub::ServiceHelper.new(cl, SERVICE)

def create_node(pubsub)
  pubsub.create_node(NODE)
end

def publish(action, user, pubsub)
  item = Jabber::PubSub::Item.new
  
  fa = Jabber::Dataforms::XDataField.new("action")
  fa.value = action
  fu = Jabber::Dataforms::XDataField.new("user")
  fu.value = user
  
  df = Jabber::Dataforms::XData.new :result
  df.add(fa)
  df.add(fu)
  
  item.add(df)
  pubsub.publish_item_to(NODE, item)
end

cont = true
while cont
  puts "Enter your command (a |d |c|q) "
  input = gets
  tokens = input.split(" ")
  case tokens.first
  when "a"
    user = tokens[1]
    publish("activate", user, pubsub)
    puts "Activated #{user}\n"
  when "d"
    user = tokens[1]
    publish("deactivate", user, pubsub)
    puts "Deactivated #{user}\n"
  when "q"
    cont = false
    puts "quitting...\n"
  when "c"
    puts "Creating node...\n"
    create_node(pubsub)
  else
    puts "Don't understand command #{tokens.first}\n"
  end
  
end
cl.close

Leave a comment