Class: Jabber::MUC::SimpleMUCClient

Inherits:
MUCClient
  • Object
show all
Defined in:
lib/xmpp4r/muc/helper/simplemucclient.rb

Overview

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, …

Instance Attribute Summary

Attributes inherited from MUCClient

#jid, #my_jid, #roster

Instance Method Summary collapse

Methods inherited from MUCClient

#active?, #add_join_callback, #add_leave_callback, #add_message_callback, #add_presence_callback, #add_private_message_callback, #configure, #exit, #from_room?, #get_room_configuration, #join, #nick, #nick=, #owner?, #room, #send, #send_affiliations, #submit_room_configuration

Constructor Details

#initialize(stream) ⇒ SimpleMUCClient

Initialize a SimpleMUCClient

stream
Stream

to operate on

jid
JID

room@component/nick

password
String

Optional password

[View source]

40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/xmpp4r/muc/helper/simplemucclient.rb', line 40

def initialize(stream)
  super

  @room_message_block = nil
  @message_block = nil
  @private_message_block = nil
  @subject_block = nil

  @subject = nil

  @join_block = nil
  add_join_callback(999) { |pres|
    # Presence time
    time = nil
    pres.each_element('x') { |x|
      if x.kind_of?(Delay::XDelay)
        time = x.stamp
      end
    }

    # Invoke...
    @join_block.call(time, pres.from.resource) if @join_block
    false
  }

  @leave_block = nil
  @self_leave_block = nil
  add_leave_callback(999) { |pres|
    # Presence time
    time = nil
    pres.each_element('x') { |x|
      if x.kind_of?(Delay::XDelay)
        time = x.stamp
      end
    }

    # Invoke...
    if pres.from == jid
      @self_leave_block.call(time) if @self_leave_block
    else
      @leave_block.call(time, pres.from.resource) if @leave_block
    end
    false
  }
end

Instance Method Details

#invite(recipients) ⇒ Object

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

[View source]

157
158
159
160
161
162
163
164
# File 'lib/xmpp4r/muc/helper/simplemucclient.rb', line 157

def invite(recipients)
  msg = Message.new
  x = msg.add(XMUCUser.new)
  recipients.each { |jid,reason|
    x.add(XMUCUserInvite.new(jid, reason))
  }
  send(msg)
end

#kick(recipients, reason) ⇒ Object

Administratively remove one or more users from the room.

Will wait for response, possibly raising ServerError

Sample usage:

my_muc.kick 'pistol', 'Avaunt, you cullion!'
my_muc.kick(['Bill', 'Linus'], 'Stop flaming')
recipients
Array

of, or single [String]: Nicks

reason
String

Kick reason

[View source]

177
178
179
180
181
182
183
184
185
186
187
# File 'lib/xmpp4r/muc/helper/simplemucclient.rb', line 177

def kick(recipients, reason)
  recipients = [recipients] unless recipients.kind_of? Array
  items = recipients.collect { |recipient|
    item = IqQueryMUCAdminItem.new
    item.nick = recipient
    item.role = :none
    item.reason = reason
    item
  }
  send_affiliations(items)
end

#on_join(&block) ⇒ Object

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

[View source]

229
230
231
# File 'lib/xmpp4r/muc/helper/simplemucclient.rb', line 229

def on_join(&block)
  @join_block = block
end

#on_leave(&block) ⇒ Object

Block to be called when somebody leaves the room

block

Takes two arguments: time, nickname

[View source]

236
237
238
# File 'lib/xmpp4r/muc/helper/simplemucclient.rb', line 236

def on_leave(&block)
  @leave_block = block
end

#on_message(&block) ⇒ Object

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

block

Takes three arguments: time, sender nickname, text

[View source]

203
204
205
# File 'lib/xmpp4r/muc/helper/simplemucclient.rb', line 203

def on_message(&block)
  @message_block = block
end

#on_private_message(&block) ⇒ Object

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

block

Takes three arguments: time, sender nickname, text

[View source]

211
212
213
# File 'lib/xmpp4r/muc/helper/simplemucclient.rb', line 211

def on_private_message(&block)
  @private_message_block = block
end

#on_room_message(&block) ⇒ Object

Block to be invoked when a message from the room arrives

Example:

Astro has joined this session
block

Takes two arguments: time, text

[View source]

195
196
197
# File 'lib/xmpp4r/muc/helper/simplemucclient.rb', line 195

def on_room_message(&block)
  @room_message_block = block
end

#on_self_leave(&block) ⇒ Object

Block to be called when you leave the room

Deactivation occurs afterwards.

block

Takes one argument: time

[View source]

245
246
247
# File 'lib/xmpp4r/muc/helper/simplemucclient.rb', line 245

def on_self_leave(&block)
  @self_leave_block = block
end

#on_subject(&block) ⇒ Object

Block to be invoked when somebody sets a new room subject

block

Takes three arguments: time, nickname, new subject

[View source]

218
219
220
# File 'lib/xmpp4r/muc/helper/simplemucclient.rb', line 218

def on_subject(&block)
  @subject_block = block
end

#say(text, to = nil) ⇒ Object

Send a simple text message

text
String

Message body

to
String

Optional nick if directed to specific user

[View source]

146
147
148
# File 'lib/xmpp4r/muc/helper/simplemucclient.rb', line 146

def say(text, to=nil)
  send(Message.new(nil, text), to)
end

#subjectObject

Room subject/topic

result
String

The subject

[View source]

126
127
128
# File 'lib/xmpp4r/muc/helper/simplemucclient.rb', line 126

def subject
  @subject
end

#subject=(s) ⇒ Object

Change the room’s subject/topic

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

s
String

New subject

[View source]

136
137
138
139
140
# File 'lib/xmpp4r/muc/helper/simplemucclient.rb', line 136

def subject=(s)
  msg = Message.new
  msg.subject = s
  send(msg)
end