Dans cette première partie, nous verrons comment communiquer avec un objet in-world depuis une application ruby on rails grâce à XML-RPC. Pour commencer on définit une structure second life (app/models/second_life_struct.rb) qui représentera le format de l'api second life :

class SecondLifeStruct < ActionWebService::Struct
  member "Channel", :string
  member "StringValue", :string
  member "IntValue", :int
end

Ensuite, on créé une nouvelle api (app/apis/second_life_api.rb) qui utilise cette structure:

class SecondLifeApi < ActionWebService::API::Base
  inflect_names false
  api_method "llRemoteData", :expects=>[SecondLifeStruct], :returns=>[SecondLifeStruct]
end

Avant de continuer, intéressons nous rapidement au script LSL de l'objet qui permettra de recevoir la communication :

default
{
  state_entry()
    {
     llOpenRemoteDataChannel(); 
    }

    remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval) 
    {
      if(type==REMOTE_DATA_CHANNEL) {
	llOwnerSay("Canal de communication : "+(string)channel);
      } 

      if(type==REMOTE_DATA_REQUEST) {
        llOwnerSay(sval);
        llRemoteDataReply(channel,message_id,"Tout va bien",0);
      }
    }
}

Le canal de communication correspond à un identifiant unique permettant de communiquer par la suite avec cet objet depuis le service web de Linden. Il faudra copier cet identifiant pour pouvoir appeler notre page dans rails (/second_life/tester_objet?canal=identifiant).

Il ne reste plus qu'à définir le controlleur :

class SecondLifeController < ApplicationController
  web_client_api :second_life, :xmlrpc, "http://xmlrpc.secondlife.com/cgi-bin/xmlrpc.cgi", :timeout=>90

  def tester_objet
    canal=params[:canal]
    begin
      resultat=second_life.llRemoteData(SecondLifeStruct.new("Channel"=>canal,"StringValue"=>"Bonjour tout le monde !","IntValue"=>"0"))
      render :text=>resultat["StringValue"]
    rescue
     render :text=>"L'objet ne répond pas"
    end
  end
end

Et voila, lorsque l'on se connecte à la page, l'objet dans second life nous dira "Bonjour tout le monde !".

Comme on vient de le voir, le système de service web de ruby on rails permet d'interfacer facilement votre application à second life. Le prochain article montrera comment faire l'opération inverse : communiquer depuis un objet second life vers une application rails.

Pour plus d'information sur le format XML-RPC de second life, voir ici.