Method: ChatBot#join_room

Defined in:
lib/chatx.rb

#join_room(room_id, server: @default_server) ⇒ Hash

Attempts to join a room, and for every room joined opens a websocket. Websockets seem to be the way to show your presence in a room. It’s weird that way.

Each websocket is added to the @websockets instance variable which can be read but not written to.

Parameters:

  • room_id (#to_i)

    A valid room ID on the server designated by the server param.

Returns:

  • (Hash)

    The hash of currently active websockets.

Keyword Arguments:

  • server (String)

    A string referring to the relevant server. The default value is set by the @default_server instance variable.



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/chatx.rb', line 93

def join_room(room_id, server: @default_server)
  @logger.info "Joining #{room_id} on server #{server}"

  fkey = get_fkey(server, "rooms/#{room_id}")

  @agent.get("https://chat.#{server}.com/rooms/#{room_id}", fkey: fkey)

  events_json = @agent.post("https://chat.#{server}.com/chats/#{room_id}/events",
                            fkey: fkey,
                            since: 0,
                            mode: "Messages",
                            msgCount: 100).body

  events = JSON.parse(events_json)["events"]

  @logger.info "Retrieved events (length #{events.length})"

  ws_auth_data = @agent.post("https://chat.#{server}.com/ws-auth",
                             roomid: room_id,
                             fkey: fkey)

  @logger.info "Began room auth for room id: #{room_id}"

  @rooms[room_id.to_i] = {}
  @rooms[room_id.to_i][:events] = events.map do |e|
    begin
      ChatX::Event.new e, server, self
    rescue ChatX::InitializationDataException => e
      @logger.warn "Caught InitializationDataException during events population (#{e}); skipping event"
      nil
    end
  end.compact

  @logger.info "Rooms: #{@rooms.keys}"

  unless @websockets[server].nil? || @websockets[server].dead
    @logger.info "Websocket #{@websockets[server]} already open; clearing."
    @websockets[server].close
    @websockets[server] = nil
  end
  @logger.info "SOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
  ws_uri = JSON.parse(ws_auth_data.body)["url"]
  last_event_time = events.max_by { |event| event['time_stamp'] }['time_stamp']
  cookies = (@agent.cookies.map { |cookie| "#{cookie.name}=#{cookie.value}" if cookie.domain == "chat.#{server}.com" || cookie.domain == "#{server}.com" } - [nil]).join("; ")
  @logger.info "Launching new WSCLient"
  @websockets[server] = WSClient.new("#{ws_uri}?l=#{last_event_time}", cookies, self, server)
  @logger.info "New websocket open (#{@websockets[server]}"
end