Class: JsChat::Room

Inherits:
Object
  • Object
show all
Defined in:
lib/jschat/server.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name) ⇒ Room

Returns a new instance of Room.



118
119
120
121
# File 'lib/jschat/server.rb', line 118

def initialize(name)
  @name = name
  @users = []
end

Instance Attribute Details

#nameObject

Returns the value of attribute name.



116
117
118
# File 'lib/jschat/server.rb', line 116

def name
  @name
end

#usersObject

Returns the value of attribute users.



116
117
118
# File 'lib/jschat/server.rb', line 116

def users
  @users
end

Class Method Details

.find(item) ⇒ Object



127
128
129
130
131
132
133
134
135
# File 'lib/jschat/server.rb', line 127

def self.find(item)
  @@rooms ||= []

  if item.kind_of? String
    @@rooms.find { |room| room.name.downcase == item.downcase if room.name }
  elsif item.kind_of? User
    @@rooms.find_all { |room| room.users.include? item }
  end
end

.find_or_create(room_name) ⇒ Object



137
138
139
140
141
142
143
144
# File 'lib/jschat/server.rb', line 137

def self.find_or_create(room_name)
  room = find room_name
  if room.nil?
    room = new(room_name)
    @@rooms << room
  end
  room
end

.roomsObject



146
147
148
# File 'lib/jschat/server.rb', line 146

def self.rooms
  @@rooms
end

.valid_name?(name) ⇒ Boolean

Returns:

  • (Boolean)


123
124
125
# File 'lib/jschat/server.rb', line 123

def self.valid_name?(name)
  User.valid_name?(name[1..-1]) and name[0].chr == '#'
end

Instance Method Details

#add_to_lastlog(message) ⇒ Object



176
177
178
179
180
181
# File 'lib/jschat/server.rb', line 176

def add_to_lastlog(message)
  if message
    message['time'] = Time.now.utc
    JsChat::Storage.driver.log message, name
  end
end

#change_notice(user, response) ⇒ Object



234
235
236
# File 'lib/jschat/server.rb', line 234

def change_notice(user, response)
  notice(user, response, true)
end

#join(user) ⇒ Object



183
184
185
186
187
188
189
190
191
192
# File 'lib/jschat/server.rb', line 183

def join(user)
  if @users.include? user
    Error.new(:already_joined, 'Already in that room')
  else
    @users << user
    user.rooms << self
    join_notice user
    { 'display' => 'join', 'join' => { 'user' => user.name, 'room' => @name } }
  end
end

#join_notice(user) ⇒ Object



238
239
240
# File 'lib/jschat/server.rb', line 238

def join_notice(user)
  notice(user, { 'display' => 'join_notice', 'join_notice' => { 'user' => user.name, 'room' => @name } })
end

#last_update_timeObject



158
159
160
161
# File 'lib/jschat/server.rb', line 158

def last_update_time
  message = JsChat::Storage.driver.lastlog(LASTLOG_DEFAULT, name).last
  message['time'] if message
end

#lastlog(since = nil) ⇒ Object



150
151
152
# File 'lib/jschat/server.rb', line 150

def lastlog(since = nil)
  { 'display' => 'messages', 'messages' => messages_since(since) }
end

#member_namesObject



216
217
218
# File 'lib/jschat/server.rb', line 216

def member_names
  @users.collect { |user| user.name }
end

#message_search(query, limit) ⇒ Object



172
173
174
# File 'lib/jschat/server.rb', line 172

def message_search(query, limit)
  JsChat::Storage.driver.search(query, name, limit)
end

#messages_since(since) ⇒ Object



163
164
165
166
167
168
169
170
# File 'lib/jschat/server.rb', line 163

def messages_since(since)
  messages = JsChat::Storage.driver.lastlog(LASTLOG_DEFAULT, name)
  if since.nil?
    messages
  else
    messages.select { |m| m['time'] && m['time'] > since }
  end
end

#notice(user, message, all = false) ⇒ Object



224
225
226
227
228
229
230
231
232
# File 'lib/jschat/server.rb', line 224

def notice(user, message, all = false)
  add_to_lastlog message

  @users.each do |u|
    if (u != user and !all) or all
      u.connection.send_response(message)
    end
  end
end

#part(user) ⇒ Object



194
195
196
197
198
199
200
201
202
203
# File 'lib/jschat/server.rb', line 194

def part(user)
  if not @users.include?(user)
    Error.new(:not_in_room, 'Not in that room')
  else
    user.rooms.delete_if { |r| r == self }
    @users.delete_if { |u| u == user }
    part_notice user
    { 'display' => 'part', 'part' => { 'user' => user.name, 'room' => @name } }
  end
end

#part_notice(user) ⇒ Object



242
243
244
# File 'lib/jschat/server.rb', line 242

def part_notice(user)
  notice(user, { 'display' => 'part_notice', 'part_notice' => { 'user' => user.name, 'room' => @name } })
end

#quit_notice(user) ⇒ Object



246
247
248
249
# File 'lib/jschat/server.rb', line 246

def quit_notice(user)
  notice(user, { 'display' => 'quit_notice', 'quit_notice' => { 'user' => user.name, 'room' => @name } })
  @users.delete_if { |u| u == user }
end

#search(query, limit = 100) ⇒ Object



154
155
156
# File 'lib/jschat/server.rb', line 154

def search(query, limit = 100)
  { 'display' => 'messages', 'messages' => message_search(query, limit) }
end

#send_message(message) ⇒ Object



205
206
207
208
209
210
211
212
213
214
# File 'lib/jschat/server.rb', line 205

def send_message(message)
  message['room'] = name
  response = { 'display' => 'message', 'message' => message }

  add_to_lastlog response

  @users.each do |user|
    user.connection.send_response response
  end
end

#to_jsonObject



220
221
222
# File 'lib/jschat/server.rb', line 220

def to_json
  { 'name' => @name, 'members' => member_names }.to_json
end