aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/share/ruby/userserv.rb
blob: 18559c099c2dcf24d4df21eeeddc6a684dc4e9a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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
85
86
87
88
89
90
91
92
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
require "webrick"
require "xmlrpc/server"
require 'xmlrpc/client'
require 'config.rb'

class SessionServlet < WEBrick::HTTPServlet::AbstractServlet
  def do_DELETE(req, res)
    # does nothing, obviously
    STDERR.print "----\n"
  end
end

s = XMLRPC::WEBrickServlet.new
s.add_handler("login_to_simulator") do |param|
   sc = SimConfig.new
   #
   # Some stuff just grabbed from a sniff of the session with OGS
   #
   zSessionId = "133086b6-1270-78c6-66f7-c7f64865b16c"
   zSecureSessionId = "6ee4df6a-0ea9-4cf5-8ac7-9745acbacccc"
   zAgentId = "0f00ba47-42d1-498e-b010-aa585a81862e"
   zAgentId = UUID.new.to_dashed_s
   STDERR.print "AgentID: #{zAgentId}\n"
   zCircuitCode = rand(0x1000000)
   zRegionX = sc.cfgSimX
   zRegionY = sc.cfgSimY

   xxSimParams = Hash.new
   xxSimParams["session_id"] = zSessionId.gsub("-","")
   xxSimParams["secure_session_id"] = zSecureSessionId.gsub("-","")
   xxSimParams["firstname"] = param["first"];
   xxSimParams["lastname"] = param["last"];
   xxSimParams["agent_id"] = zAgentId.gsub("-", "")
   xxSimParams["circuit_code"] = zCircuitCode
   xxSimParams["startpos_x"] = 128
   xxSimParams["startpos_y"] = 128
   xxSimParams["startpos_z"] = 30
   xxSimParams["regionhandle"] = ((zRegionX << 40) + (zRegionY *256)).to_s
   STDERR.print "Region handle: #{xxSimParams["regionhandle"]}\n"



   server = XMLRPC::Client.new2("http://#{sc.cfgSimIP}:#{sc.cfgSimPort}/")
   # the dispatcher in OpenSim.exe did not get excited from specifying
   # the content-type in the request.. no XML was executed at all.
   # this "fixes" it.
   server.http_header_extra = { "Content-Type" => "text/xml" };
   result = server.call("expect_user", xxSimParams )
   # STDERR.print result.inspect

   STDERR.print "---- notified the sim ----\n"

   responseData = Hash.new

   xxGlobalT = Hash.new
   xxGlobalT["sun_texture_id"] = "cce0f112-878f-4586-a2e2-a8f104bba271";
   xxGlobalT["cloud_texture_id"] = "fc4b9f0b-d008-45c6-96a4-01dd947ac621";
   xxGlobalT["moon_texture_id"] = "fc4b9f0b-d008-45c6-96a4-01dd947ac621";

   xxLoginFlags = Hash.new
   xxLoginFlags["daylight_savings"] = "N"
   xxLoginFlags["stipend_since_login"] = "N"
   xxLoginFlags["gendered"] = "Y"
   xxLoginFlags["ever_logged_in"] = "Y"

   responseData["first_name"] = param["first"]
   responseData["last_name"] = param["last"]
   responseData["ui-config"] = [ { "allow_first_life" => "Y" } ]

   responseData["login-flags"] = [ xxLoginFlags ]
   responseData["global-textures"] = [ xxGlobalT ]
   # responseData["classified_categories"] = [ { category_name => "Generic", category_id => 1 } ]
   # responseData["event_categories"] = 
   responseData["inventory-skeleton"] = [
   	  { "folder_id" => "9846e02a-f41b-4199-860e-cde46cc25649",
	    "parent_id" => "00000000-0000-0000-0000-000000000000",
	    "name" => "My Inventory test",
	    "type_default" => 8,
	    "version" => 1 },
   	  { "folder_id" => "b846e02a-f41b-4199-860e-cde46cc25649",
   	    "parent_id" => "9846e02a-f41b-4199-860e-cde46cc25649",
	    "name" => "test",
	    "type_default" => 0,
	    "version" => 1 }
   	]
   responseData["inventory-skel-lib"] = [ 
   	  { "folder_id" => "a846e02a-f41b-4199-860e-cde46cc25649",
	    "parent_id" => "00000000-0000-0000-0000-000000000000",
	    "name" => "Lib Inventory",
	    "type_default" => 8,
	    "version" => 1 }
   	]
   responseData["inventory-root"] = [ { "folder_id" => "9846e02a-f41b-4199-860e-cde46cc25649" } ]
   # responseData["event_notifications"] = [ ]
   responseData["gestures"] = [ ]
   # responseData["inventory-lib-owner"] = 
   responseData["initial-outfit"] = [
   	{ "folder_name" => "Nightclub female", "gender" => "female" }
      	]
   responseData["seconds_since_epoch"] = Time.new.to_i
   responseData["start_location"] = "last";
   responseData["message"] = "Hello there!"
   responseData["circuit_code"] = zCircuitCode # random
   # responseData["look_at"] = 
   responseData["agent_id"] = zAgentId
   responseData["home"] = "\{'region_handle':[r#{zRegionX*256}.0,r#{zRegionY*256}.0], 'position':[r128.0,r128.0,r30.0], 'look_at':[r0.0,r0.0,r0.0]\}"
   # responseData["home"] = "\{'region_handle':[r255232,r254976], 'position':[r128,r128,r100], 'look_at':[r128,r128,r100]\}"

   responseData["region_x"] = zRegionX*256
   responseData["region_y"] = zRegionY*256
   responseData["sim_ip"] = "192.168.1.103" 
   responseData["sim_port"] = 9000
   # responseData["seed_capability"] 
   responseData["agent_access"] = "M";
   responseData["session_id"] = zSessionId
   responseData["secure_session_id"] = zSecureSessionId
   responseData["login"] = "true"

   # raise XMLRPC::FaultException.new(1, "just some exception")
   responseData
end

s.set_default_handler do |name, *args|
  STDERR.print "Unknown method #{name}, #{args.inspect}\n\n"
  raise XMLRPC::FaultException.new(-99, "Method #{name} missing" +
                                   " or wrong number of parameters!")
end

httpserver = WEBrick::HTTPServer.new(:Port => 8002)    
httpserver.mount("/", s)
httpserver.mount("/usersessions", SessionServlet);

trap(:INT) { httpserver.shutdown }  
httpserver.start