Class Jabber::MUC::SimpleMUCClient
In: lib/xmpp4r/muc/helper/simplemucclient.rb
Parent: MUCClient
XMLStanza Message Presence Iq REXML::Element X IqQuery Error StreamHost IqSiFileRange IqSiFile StreamHostUsed IqSi XRosterItem RosterItem IqFeature XMUCUserItem XMUCUserInvite XDataField XDataReported XDataTitle XDataInstructions Feature Identity Item IqVcard Singleton IdGenerator Connection Client Component Comparable JID RuntimeError AuthenticationFailure ErrorException SOCKS5Error Stream SOCKS5Bytestreams SOCKS5BytestreamsTarget SOCKS5BytestreamsInitiator SOCKS5BytestreamsServerStreamHost TCPSocket SOCKS5Socket IBB IBBTarget IBBInitiator IqQuery IqQueryBytestreams IqQueryVersion IqQueryRoster IqQueryDiscoItems IqQueryDiscoInfo Responder SimpleResponder X XRoster XMUCUser XMUC XDelay XData MUCClient SimpleMUCClient Base DigestMD5 Plain FileSource StreamParser SOCKS5BytestreamsPeer SOCKS5BytestreamsServer IBBQueueItem Helper MUCBrowser Helper Helper lib/xmpp4r/authenticationfailure.rb lib/xmpp4r/idgenerator.rb lib/xmpp4r/connection.rb lib/xmpp4r/iq.rb lib/xmpp4r/jid.rb lib/xmpp4r/xmlstanza.rb lib/xmpp4r/errorexception.rb lib/xmpp4r/stream.rb lib/xmpp4r/client.rb lib/xmpp4r/x.rb lib/xmpp4r/streamparser.rb lib/xmpp4r/error.rb lib/xmpp4r/component.rb lib/xmpp4r/query.rb lib/xmpp4r/message.rb lib/xmpp4r/presence.rb lib/xmpp4r/bytestreams/helper/ibb/initiator.rb lib/xmpp4r/bytestreams/iq/si.rb lib/xmpp4r/bytestreams/iq/bytestreams.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb lib/xmpp4r/bytestreams/helper/ibb/base.rb lib/xmpp4r/bytestreams/helper/ibb/target.rb Bytestreams lib/xmpp4r/version/iq/version.rb lib/xmpp4r/version/helper/responder.rb lib/xmpp4r/version/helper/simpleresponder.rb Version lib/xmpp4r/roster/helper/roster.rb lib/xmpp4r/roster/iq/roster.rb lib/xmpp4r/roster/x/roster.rb Roster lib/xmpp4r/feature_negotiation/iq/feature.rb FeatureNegotiation lib/xmpp4r/muc/x/muc.rb lib/xmpp4r/muc/helper/mucclient.rb lib/xmpp4r/muc/x/mucuseritem.rb lib/xmpp4r/muc/helper/mucbrowser.rb lib/xmpp4r/muc/x/mucuserinvite.rb lib/xmpp4r/muc/helper/simplemucclient.rb MUC lib/xmpp4r/sasl.rb SASL lib/xmpp4r/bytestreams/helper/filetransfer.rb TransferSource FileTransfer lib/xmpp4r/delay/x/delay.rb Delay lib/xmpp4r/dataforms/x/data.rb Dataforms lib/xmpp4r/discovery/iq/discoinfo.rb lib/xmpp4r/discovery/iq/discoitems.rb Discovery lib/xmpp4r/vcard/helper/vcard.rb lib/xmpp4r/vcard/iq/vcard.rb Vcard Jabber dot/m_60_0.png

This class attempts to implement a lot of complexity of the Multi-User Chat protocol. If you want to implement JEP0045 yourself, use Jabber::MUC::MUCClient for some minor abstraction.

Minor flexibility penalty: the on_* callbacks are no CallbackLists and may therefore only used once. A second invocation will overwrite the previous set up block.

*Hint:* the parameter time may be nil if the server didn‘t send it.

Example usage:

  my_muc = Jabber::MUC::SimpleMUCClient.new(my_client)
  my_muc.on_message { |time,nick,text|
    puts (time || Time.new).strftime('%I:%M') + " <#{nick}> #{text}"
  }
  my_muc.join(Jabber::JID.new('jdev@conference.jabber.org/XMPP4R-Bot'))

Please take a look at Jabber::MUC::MUCClient for derived methods, such as MUCClient#join, MUCClient#exit, …

Methods

Public Class methods

Initialize a SimpleMUCClient

stream:[Stream] to operate on
jid:[JID] room@component/nick
password:[String] Optional password

[Source]

    # File lib/xmpp4r/muc/helper/simplemucclient.rb, line 35
35:       def initialize(stream)
36:         super
37: 
38:         @room_message_block = nil
39:         @message_block = nil
40:         @private_message_block = nil
41:         @subject_block = nil
42: 
43:         @subject = nil
44: 
45:         @join_block = nil
46:         add_join_callback(999) { |pres|
47:           # Presence time
48:           time = nil
49:           pres.each_element('x') { |x|
50:             if x.kind_of?(Delay::XDelay)
51:               time = x.stamp
52:             end
53:           }
54: 
55:           # Invoke...
56:           @join_block.call(time, pres.from.resource) if @join_block
57:           false
58:         }
59: 
60:         @leave_block = nil
61:         @self_leave_block = nil
62:         add_leave_callback(999) { |pres|
63:           # Presence time
64:           time = nil
65:           pres.each_element('x') { |x|
66:             if x.kind_of?(Delay::XDelay)
67:               time = x.stamp
68:             end
69:           }
70: 
71:           # Invoke...
72:           if pres.from == jid
73:             @self_leave_block.call(time) if @self_leave_block
74:           else
75:             @leave_block.call(time, pres.from.resource) if @leave_block
76:           end
77:           false
78:         }
79:       end

Public Instance methods

Request the MUC to invite users to this room

Sample usage:

  my_muc.invite( {'wiccarocks@shakespeare.lit/laptop' => 'This coven needs both wiccarocks and hag66.',
                  'hag66@shakespeare.lit' => 'This coven needs both hag66 and wiccarocks.'} )
recipients:[Hash] of [JID] => [String] Reason

[Source]

     # File lib/xmpp4r/muc/helper/simplemucclient.rb, line 152
152:       def invite(recipients)
153:         msg = Message.new
154:         x = msg.add(XMucUser.new)
155:         recipients.each { |jid,reason|
156:           x.add(XMucUserInvite.new(jid, reason))
157:         }
158:         send(msg)
159:       end

Block to be called when somebody enters the room

If there is a non-nil time passed to the block, chances are great that this is initial presence from a participant after you have joined the room.

block:Takes two arguments: time, nickname

[Source]

     # File lib/xmpp4r/muc/helper/simplemucclient.rb, line 201
201:       def on_join(&block)
202:         @join_block = block
203:       end

Block to be called when somebody leaves the room

block:Takes two arguments: time, nickname

[Source]

     # File lib/xmpp4r/muc/helper/simplemucclient.rb, line 208
208:       def on_leave(&block)
209:         @leave_block = block
210:       end

Block to be invoked when a message from a participant to the whole room arrives

block:Takes three arguments: time, sender nickname, text

[Source]

     # File lib/xmpp4r/muc/helper/simplemucclient.rb, line 175
175:       def on_message(&block)
176:         @message_block = block
177:       end

Block to be invoked when a private message from a participant to you arrives.

block:Takes three arguments: time, sender nickname, text

[Source]

     # File lib/xmpp4r/muc/helper/simplemucclient.rb, line 183
183:       def on_private_message(&block)
184:         @private_message_block = block
185:       end

Block to be invoked when a message from the room arrives

Example:

  Astro has joined this session
block:Takes two arguments: time, text

[Source]

     # File lib/xmpp4r/muc/helper/simplemucclient.rb, line 167
167:       def on_room_message(&block)
168:         @room_message_block = block
169:       end

Block to be called when you leave the room

Deactivation occurs afterwards.

block:Takes one argument: time

[Source]

     # File lib/xmpp4r/muc/helper/simplemucclient.rb, line 217
217:       def on_self_leave(&block)
218:         @self_leave_block = block
219:       end

Block to be invoked when somebody sets a new room subject

block:Takes three arguments: time, nickname, new subject

[Source]

     # File lib/xmpp4r/muc/helper/simplemucclient.rb, line 190
190:       def on_subject(&block)
191:         @subject_block = block
192:       end

Send a simple text message

text:[String] Message body
to:[String] Optional nick if directed to specific user

[Source]

     # File lib/xmpp4r/muc/helper/simplemucclient.rb, line 141
141:       def say(text, to=nil)
142:         send(Message.new(nil, text), to)
143:       end

Room subject/topic

result:[String] The subject

[Source]

     # File lib/xmpp4r/muc/helper/simplemucclient.rb, line 121
121:       def subject
122:         @subject
123:       end

Change the room‘s subject/topic

This will not be reflected by SimpleMUCClient#subject immediately, wait for SimpleMUCClient#on_subject

s:[String] New subject

[Source]

     # File lib/xmpp4r/muc/helper/simplemucclient.rb, line 131
131:       def subject=(s)
132:         msg = Message.new
133:         msg.subject = s
134:         send(msg)
135:       end

Private Instance methods

[Source]

     # File lib/xmpp4r/muc/helper/simplemucclient.rb, line 83
 83:       def handle_message(msg)
 84:         super
 85: 
 86:         # Message time (e.g. history)
 87:         time = nil
 88:         msg.each_element('x') { |x|
 89:           if x.kind_of?(Delay::XDelay)
 90:             time = x.stamp
 91:           end
 92:         }
 93:         sender_nick = msg.from.resource
 94: 
 95: 
 96:         if msg.subject
 97:           @subject = msg.subject
 98:           @subject_block.call(time, sender_nick, @subject) if @subject_block
 99:         end
100:         
101:         if msg.body
102:           if sender_nick.nil?
103:             @room_message_block.call(time, msg.body) if @room_message_block
104:           else
105:             if msg.type == :chat
106:               @private_message_block.call(time, msg.from.resource, msg.body) if @private_message_block
107:             elsif msg.type == :groupchat
108:               @message_block.call(time, msg.from.resource, msg.body) if @message_block
109:             else
110:               # ...?
111:             end
112:           end
113:         end
114:       end

[Validate]