class Twitter2Jabber::JabberClient

Constants

DEFAULT_FORMAT
DEFAULT_TEMPLATES
JABBER_NS
XHTML_NS

Attributes

config[R]
spec[R]

Public Class Methods

new(gw, config) click to toggle source
   # File lib/twitter2jabber/jabber_client.rb
41 def initialize(gw, config)
42   @gw, @config, @spec = gw, config, config[:username]
43 
44   @format = config.fetch(:format, DEFAULT_FORMAT).to_s
45 
46   if File.readable?(template = File.expand_path(File.join(
47     config[:templates] || DEFAULT_TEMPLATES, "tweet.#{@format}")))
48 
49     @erb = ERB.new(File.read(template))
50   else
51     raise ArgumentError, "format not supported: #{@format}"
52   end
53 end

Public Instance Methods

client() click to toggle source
   # File lib/twitter2jabber/jabber_client.rb
57 def client
58   @client ||= Jabber::Client.new(spec).tap { |client|
59     client.connect
60     client.auth(config[:password])
61   }
62 end
connect() click to toggle source
   # File lib/twitter2jabber/jabber_client.rb
64 def connect
65   deliver(Jabber::Presence.new(nil, 'Available'), nil)
66   log 'connected'
67 rescue Jabber::JabberError, Errno::ETIMEDOUT => err
68   raise "Can't connect to Jabber with JID '#{spec}': #{err}"
69 end
deliver(msg, recipient = config[:recipient]) click to toggle source
   # File lib/twitter2jabber/jabber_client.rb
85 def deliver(msg, recipient = config[:recipient])
86   msg = format(msg) unless msg.is_a?(Jabber::XMPPStanza)
87   msg.to = Jabber::JID.new(recipient).strip if recipient
88 
89   @gw.debug ? log("#{recipient}: #{msg}") : send_msg(msg)
90 rescue => err
91   warn "#{err} (#{err.class})"
92   retry if err.is_a?(Jabber::ServerDisconnected)
93 end
disconnect() click to toggle source
   # File lib/twitter2jabber/jabber_client.rb
71 def disconnect
72   close if @client
73   log 'disconnected'
74 end
format(tweet) click to toggle source
   # File lib/twitter2jabber/jabber_client.rb
76 def format(tweet)
77   user = tweet.user
78   text = @erb.result(binding)
79 
80   msg = Jabber::Message.new.set_type(:chat)
81   msg.add_element(format_element(text))
82   msg
83 end

Private Instance Methods

close() click to toggle source
    # File lib/twitter2jabber/jabber_client.rb
126 def close
127   begin
128     @client.close
129   rescue Errno::EPIPE, IOError
130   end
131 
132   @client = nil
133 end
format_element(text) click to toggle source

cf. <devblog.famundo.com/articles/2006/10/18/ruby-and-xmpp-jabber-part-3-adding-html-to-the-messages>

    # File lib/twitter2jabber/jabber_client.rb
 98 def format_element(text)
 99   twitter = @gw.twitter
100 
101   text, body = twitter.process_message(text), REXML::Element.new('body')
102 
103   if @format == 'html'
104     REXML::Text.new(twitter.process_html(text), false, body, true, nil, /.^/)
105 
106     html = REXML::Element.new('html').add_namespace(JABBER_NS)
107     html.add(body.add_namespace(XHTML_NS))
108     html
109   else
110     REXML::Text.new(twitter.process_text(text), true, body, true, nil, /.^/)
111     body
112   end
113 end
log(msg) click to toggle source
    # File lib/twitter2jabber/jabber_client.rb
135 def log(msg)
136   @gw.log("JABBER #{msg}")
137 end
send_msg(msg, attempts = 0) click to toggle source
    # File lib/twitter2jabber/jabber_client.rb
115 def send_msg(msg, attempts = 0)
116   attempts += 1
117   client.send(msg)
118 rescue Errno::EPIPE, IOError
119   raise if attempts > 3
120 
121   close
122   sleep 1
123   retry
124 end