diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs | 774 |
1 files changed, 0 insertions, 774 deletions
diff --git a/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs b/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs deleted file mode 100644 index cb1766a..0000000 --- a/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs +++ /dev/null | |||
@@ -1,774 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Net; | ||
32 | using System.Reflection; | ||
33 | using System.Text.RegularExpressions; | ||
34 | using System.Xml.Serialization; | ||
35 | using log4net; | ||
36 | using Nwc.XmlRpc; | ||
37 | using OpenMetaverse; | ||
38 | using OpenSim.Data; | ||
39 | using OpenSim.Framework; | ||
40 | using OpenSim.Framework.Communications; | ||
41 | using OpenSim.Framework.Communications.Clients; | ||
42 | |||
43 | namespace OpenSim.Region.Communications.OGS1 | ||
44 | { | ||
45 | public class OGS1UserDataPlugin : IUserDataPlugin | ||
46 | { | ||
47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
48 | |||
49 | protected CommunicationsManager m_commsManager; | ||
50 | |||
51 | public OGS1UserDataPlugin() | ||
52 | { | ||
53 | } | ||
54 | |||
55 | public OGS1UserDataPlugin(CommunicationsManager commsManager) | ||
56 | { | ||
57 | m_log.DebugFormat("[OGS1 USER SERVICES]: {0} initialized", Name); | ||
58 | m_commsManager = commsManager; | ||
59 | } | ||
60 | |||
61 | public string Version { get { return "0.1"; } } | ||
62 | public string Name { get { return "Open Grid Services 1 (OGS1) User Data Plugin"; } } | ||
63 | public void Initialise() {} | ||
64 | |||
65 | public void Initialise(string connect) {} | ||
66 | |||
67 | public void Dispose() {} | ||
68 | |||
69 | // Arguably the presence of these means that IUserDataPlugin could be fissioned | ||
70 | public UserAgentData GetUserAgent(string name) { return null; } | ||
71 | public UserAgentData GetAgentByName(string name) { return null; } | ||
72 | public UserAgentData GetAgentByName(string fname, string lname) { return null; } | ||
73 | public void StoreWebLoginKey(UUID agentID, UUID webLoginKey) {} | ||
74 | public void AddNewUserProfile(UserProfileData user) {} | ||
75 | public void AddNewUserAgent(UserAgentData agent) {} | ||
76 | public bool MoneyTransferRequest(UUID from, UUID to, uint amount) { return false; } | ||
77 | public bool InventoryTransferRequest(UUID from, UUID to, UUID inventory) { return false; } | ||
78 | public void ResetAttachments(UUID userID) {} | ||
79 | public void LogoutUsers(UUID regionID) {} | ||
80 | |||
81 | public virtual void AddTemporaryUserProfile(UserProfileData userProfile) | ||
82 | { | ||
83 | // Not interested | ||
84 | } | ||
85 | |||
86 | public UserProfileData GetUserByUri(Uri uri) | ||
87 | { | ||
88 | WebRequest request = WebRequest.Create(uri); | ||
89 | |||
90 | WebResponse webResponse = request.GetResponse(); | ||
91 | |||
92 | XmlSerializer deserializer = new XmlSerializer(typeof(XmlRpcResponse)); | ||
93 | XmlRpcResponse xmlRpcResponse = (XmlRpcResponse)deserializer.Deserialize(webResponse.GetResponseStream()); | ||
94 | |||
95 | Hashtable respData = (Hashtable)xmlRpcResponse.Value; | ||
96 | |||
97 | return ConvertXMLRPCDataToUserProfile(respData); | ||
98 | } | ||
99 | |||
100 | // public Uri GetUserUri(UserProfileData userProfile) | ||
101 | // { | ||
102 | // throw new NotImplementedException(); | ||
103 | // } | ||
104 | |||
105 | public virtual UserAgentData GetAgentByUUID(UUID userId) | ||
106 | { | ||
107 | try | ||
108 | { | ||
109 | Hashtable param = new Hashtable(); | ||
110 | param["avatar_uuid"] = userId.ToString(); | ||
111 | IList parameters = new ArrayList(); | ||
112 | parameters.Add(param); | ||
113 | XmlRpcRequest req = new XmlRpcRequest("get_agent_by_uuid", parameters); | ||
114 | |||
115 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 6000); | ||
116 | Hashtable respData = (Hashtable)resp.Value; | ||
117 | if (respData.Contains("error_type")) | ||
118 | { | ||
119 | //m_log.Warn("[GRID]: " + | ||
120 | // "Error sent by user server when trying to get agent: (" + | ||
121 | // (string) respData["error_type"] + | ||
122 | // "): " + (string)respData["error_desc"]); | ||
123 | return null; | ||
124 | } | ||
125 | UUID sessionid = UUID.Zero; | ||
126 | |||
127 | UserAgentData userAgent = new UserAgentData(); | ||
128 | userAgent.Handle = Convert.ToUInt64((string)respData["handle"]); | ||
129 | UUID.TryParse((string)respData["sessionid"], out sessionid); | ||
130 | userAgent.SessionID = sessionid; | ||
131 | |||
132 | if ((string)respData["agent_online"] == "TRUE") | ||
133 | { | ||
134 | userAgent.AgentOnline = true; | ||
135 | } | ||
136 | else | ||
137 | { | ||
138 | userAgent.AgentOnline = false; | ||
139 | } | ||
140 | |||
141 | return userAgent; | ||
142 | } | ||
143 | catch (Exception e) | ||
144 | { | ||
145 | m_log.ErrorFormat( | ||
146 | "[OGS1 USER SERVICES]: Error when trying to fetch agent data by uuid from remote user server: {0}", | ||
147 | e); | ||
148 | } | ||
149 | |||
150 | return null; | ||
151 | } | ||
152 | |||
153 | public virtual UserProfileData GetUserByName(string firstName, string lastName) | ||
154 | { | ||
155 | return GetUserProfile(firstName + " " + lastName); | ||
156 | } | ||
157 | |||
158 | public virtual List<AvatarPickerAvatar> GeneratePickerResults(UUID queryID, string query) | ||
159 | { | ||
160 | List<AvatarPickerAvatar> pickerlist = new List<AvatarPickerAvatar>(); | ||
161 | Regex objAlphaNumericPattern = new Regex("[^a-zA-Z0-9 ]"); | ||
162 | try | ||
163 | { | ||
164 | Hashtable param = new Hashtable(); | ||
165 | param["queryid"] = (string)queryID.ToString(); | ||
166 | param["avquery"] = objAlphaNumericPattern.Replace(query, String.Empty); | ||
167 | IList parameters = new ArrayList(); | ||
168 | parameters.Add(param); | ||
169 | XmlRpcRequest req = new XmlRpcRequest("get_avatar_picker_avatar", parameters); | ||
170 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 3000); | ||
171 | Hashtable respData = (Hashtable)resp.Value; | ||
172 | pickerlist = ConvertXMLRPCDataToAvatarPickerList(queryID, respData); | ||
173 | } | ||
174 | catch (WebException e) | ||
175 | { | ||
176 | m_log.Warn("[OGS1 USER SERVICES]: Error when trying to fetch Avatar Picker Response: " + | ||
177 | e.Message); | ||
178 | // Return Empty picker list (no results) | ||
179 | } | ||
180 | return pickerlist; | ||
181 | } | ||
182 | |||
183 | /// <summary> | ||
184 | /// Get a user profile from the user server | ||
185 | /// </summary> | ||
186 | /// <param name="avatarID"></param> | ||
187 | /// <returns>null if the request fails</returns> | ||
188 | protected virtual UserProfileData GetUserProfile(string name) | ||
189 | { | ||
190 | try | ||
191 | { | ||
192 | Hashtable param = new Hashtable(); | ||
193 | param["avatar_name"] = name; | ||
194 | IList parameters = new ArrayList(); | ||
195 | parameters.Add(param); | ||
196 | XmlRpcRequest req = new XmlRpcRequest("get_user_by_name", parameters); | ||
197 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 30000); | ||
198 | Hashtable respData = (Hashtable)resp.Value; | ||
199 | |||
200 | return ConvertXMLRPCDataToUserProfile(respData); | ||
201 | } | ||
202 | catch (WebException e) | ||
203 | { | ||
204 | m_log.ErrorFormat( | ||
205 | "[OGS1 USER SERVICES]: Error when trying to fetch profile data by name from remote user server: {0}", | ||
206 | e); | ||
207 | } | ||
208 | |||
209 | return null; | ||
210 | } | ||
211 | |||
212 | /// <summary> | ||
213 | /// Get a user profile from the user server | ||
214 | /// </summary> | ||
215 | /// <param name="avatarID"></param> | ||
216 | /// <returns>null if the request fails</returns> | ||
217 | public virtual UserProfileData GetUserByUUID(UUID avatarID) | ||
218 | { | ||
219 | try | ||
220 | { | ||
221 | Hashtable param = new Hashtable(); | ||
222 | param["avatar_uuid"] = avatarID.ToString(); | ||
223 | IList parameters = new ArrayList(); | ||
224 | parameters.Add(param); | ||
225 | XmlRpcRequest req = new XmlRpcRequest("get_user_by_uuid", parameters); | ||
226 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 30000); | ||
227 | Hashtable respData = (Hashtable)resp.Value; | ||
228 | |||
229 | return ConvertXMLRPCDataToUserProfile(respData); | ||
230 | } | ||
231 | catch (Exception e) | ||
232 | { | ||
233 | m_log.ErrorFormat( | ||
234 | "[OGS1 USER SERVICES]: Error when trying to fetch profile data by uuid from remote user server: {0}", | ||
235 | e); | ||
236 | } | ||
237 | |||
238 | return null; | ||
239 | } | ||
240 | |||
241 | public virtual bool UpdateUserProfile(UserProfileData userProfile) | ||
242 | { | ||
243 | m_log.Debug("[OGS1 USER SERVICES]: Asking UserServer to update profile."); | ||
244 | |||
245 | Hashtable param = new Hashtable(); | ||
246 | param["avatar_uuid"] = userProfile.ID.ToString(); | ||
247 | //param["AllowPublish"] = userProfile.ToString(); | ||
248 | param["FLImageID"] = userProfile.FirstLifeImage.ToString(); | ||
249 | param["ImageID"] = userProfile.Image.ToString(); | ||
250 | //param["MaturePublish"] = MaturePublish.ToString(); | ||
251 | param["AboutText"] = userProfile.AboutText; | ||
252 | param["FLAboutText"] = userProfile.FirstLifeAboutText; | ||
253 | //param["ProfileURL"] = userProfile.ProfileURL.ToString(); | ||
254 | |||
255 | param["home_region"] = userProfile.HomeRegion.ToString(); | ||
256 | param["home_region_id"] = userProfile.HomeRegionID.ToString(); | ||
257 | |||
258 | param["home_pos_x"] = userProfile.HomeLocationX.ToString(); | ||
259 | param["home_pos_y"] = userProfile.HomeLocationY.ToString(); | ||
260 | param["home_pos_z"] = userProfile.HomeLocationZ.ToString(); | ||
261 | param["home_look_x"] = userProfile.HomeLookAtX.ToString(); | ||
262 | param["home_look_y"] = userProfile.HomeLookAtY.ToString(); | ||
263 | param["home_look_z"] = userProfile.HomeLookAtZ.ToString(); | ||
264 | param["user_flags"] = userProfile.UserFlags.ToString(); | ||
265 | param["god_level"] = userProfile.GodLevel.ToString(); | ||
266 | param["custom_type"] = userProfile.CustomType.ToString(); | ||
267 | param["partner"] = userProfile.Partner.ToString(); | ||
268 | |||
269 | IList parameters = new ArrayList(); | ||
270 | parameters.Add(param); | ||
271 | |||
272 | XmlRpcRequest req = new XmlRpcRequest("update_user_profile", parameters); | ||
273 | XmlRpcResponse resp = req.Send(GetUserServerURL(userProfile.ID), 3000); | ||
274 | Hashtable respData = (Hashtable)resp.Value; | ||
275 | if (respData != null) | ||
276 | { | ||
277 | if (respData.Contains("returnString")) | ||
278 | { | ||
279 | if (((string)respData["returnString"]).ToUpper() != "TRUE") | ||
280 | { | ||
281 | m_log.Warn("[GRID]: Unable to update user profile, User Server Reported an issue"); | ||
282 | return false; | ||
283 | } | ||
284 | } | ||
285 | else | ||
286 | { | ||
287 | m_log.Warn("[GRID]: Unable to update user profile, UserServer didn't understand me!"); | ||
288 | return false; | ||
289 | } | ||
290 | } | ||
291 | else | ||
292 | { | ||
293 | m_log.Warn("[GRID]: Unable to update user profile, UserServer didn't understand me!"); | ||
294 | return false; | ||
295 | } | ||
296 | |||
297 | return true; | ||
298 | } | ||
299 | |||
300 | /// <summary> | ||
301 | /// Adds a new friend to the database for XUser | ||
302 | /// </summary> | ||
303 | /// <param name="friendlistowner">The agent that who's friends list is being added to</param> | ||
304 | /// <param name="friend">The agent that being added to the friends list of the friends list owner</param> | ||
305 | /// <param name="perms">A uint bit vector for set perms that the friend being added has; 0 = none, 1=This friend can see when they sign on, 2 = map, 4 edit objects </param> | ||
306 | public virtual void AddNewUserFriend(UUID friendlistowner, UUID friend, uint perms) | ||
307 | { | ||
308 | try | ||
309 | { | ||
310 | Hashtable param = new Hashtable(); | ||
311 | param["ownerID"] = friendlistowner.Guid.ToString(); | ||
312 | param["friendID"] = friend.Guid.ToString(); | ||
313 | param["friendPerms"] = perms.ToString(); | ||
314 | IList parameters = new ArrayList(); | ||
315 | parameters.Add(param); | ||
316 | |||
317 | XmlRpcRequest req = new XmlRpcRequest("add_new_user_friend", parameters); | ||
318 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 3000); | ||
319 | Hashtable respData = (Hashtable)resp.Value; | ||
320 | if (respData != null) | ||
321 | { | ||
322 | if (respData.Contains("returnString")) | ||
323 | { | ||
324 | if ((string)respData["returnString"] == "TRUE") | ||
325 | { | ||
326 | |||
327 | } | ||
328 | else | ||
329 | { | ||
330 | m_log.Warn("[GRID]: Unable to add new friend, User Server Reported an issue"); | ||
331 | } | ||
332 | } | ||
333 | else | ||
334 | { | ||
335 | m_log.Warn("[GRID]: Unable to add new friend, UserServer didn't understand me!"); | ||
336 | } | ||
337 | } | ||
338 | else | ||
339 | { | ||
340 | m_log.Warn("[GRID]: Unable to add new friend, UserServer didn't understand me!"); | ||
341 | |||
342 | } | ||
343 | } | ||
344 | catch (WebException e) | ||
345 | { | ||
346 | m_log.Warn("[GRID]: Error when trying to AddNewUserFriend: " + | ||
347 | e.Message); | ||
348 | |||
349 | } | ||
350 | } | ||
351 | |||
352 | /// <summary> | ||
353 | /// Delete friend on friendlistowner's friendlist. | ||
354 | /// </summary> | ||
355 | /// <param name="friendlistowner">The agent that who's friends list is being updated</param> | ||
356 | /// <param name="friend">The Ex-friend agent</param> | ||
357 | public virtual void RemoveUserFriend(UUID friendlistowner, UUID friend) | ||
358 | { | ||
359 | try | ||
360 | { | ||
361 | Hashtable param = new Hashtable(); | ||
362 | param["ownerID"] = friendlistowner.Guid.ToString(); | ||
363 | param["friendID"] = friend.Guid.ToString(); | ||
364 | |||
365 | IList parameters = new ArrayList(); | ||
366 | parameters.Add(param); | ||
367 | |||
368 | XmlRpcRequest req = new XmlRpcRequest("remove_user_friend", parameters); | ||
369 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 3000); | ||
370 | Hashtable respData = (Hashtable)resp.Value; | ||
371 | if (respData != null) | ||
372 | { | ||
373 | if (respData.Contains("returnString")) | ||
374 | { | ||
375 | if ((string)respData["returnString"] == "TRUE") | ||
376 | { | ||
377 | |||
378 | } | ||
379 | else | ||
380 | { | ||
381 | m_log.Warn("[GRID]: Unable to remove friend, User Server Reported an issue"); | ||
382 | } | ||
383 | } | ||
384 | else | ||
385 | { | ||
386 | m_log.Warn("[GRID]: Unable to remove friend, UserServer didn't understand me!"); | ||
387 | } | ||
388 | } | ||
389 | else | ||
390 | { | ||
391 | m_log.Warn("[GRID]: Unable to remove friend, UserServer didn't understand me!"); | ||
392 | |||
393 | } | ||
394 | } | ||
395 | catch (WebException e) | ||
396 | { | ||
397 | m_log.Warn("[GRID]: Error when trying to RemoveUserFriend: " + | ||
398 | e.Message); | ||
399 | |||
400 | } | ||
401 | } | ||
402 | |||
403 | /// <summary> | ||
404 | /// Update permissions for friend on friendlistowner's friendlist. | ||
405 | /// </summary> | ||
406 | /// <param name="friendlistowner">The agent that who's friends list is being updated</param> | ||
407 | /// <param name="friend">The agent that is getting or loosing permissions</param> | ||
408 | /// <param name="perms">A uint bit vector for set perms that the friend being added has; 0 = none, 1=This friend can see when they sign on, 2 = map, 4 edit objects </param> | ||
409 | public virtual void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms) | ||
410 | { | ||
411 | try | ||
412 | { | ||
413 | Hashtable param = new Hashtable(); | ||
414 | param["ownerID"] = friendlistowner.Guid.ToString(); | ||
415 | param["friendID"] = friend.Guid.ToString(); | ||
416 | param["friendPerms"] = perms.ToString(); | ||
417 | IList parameters = new ArrayList(); | ||
418 | parameters.Add(param); | ||
419 | |||
420 | XmlRpcRequest req = new XmlRpcRequest("update_user_friend_perms", parameters); | ||
421 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 3000); | ||
422 | Hashtable respData = (Hashtable)resp.Value; | ||
423 | if (respData != null) | ||
424 | { | ||
425 | if (respData.Contains("returnString")) | ||
426 | { | ||
427 | if ((string)respData["returnString"] == "TRUE") | ||
428 | { | ||
429 | |||
430 | } | ||
431 | else | ||
432 | { | ||
433 | m_log.Warn("[GRID]: Unable to update_user_friend_perms, User Server Reported an issue"); | ||
434 | } | ||
435 | } | ||
436 | else | ||
437 | { | ||
438 | m_log.Warn("[GRID]: Unable to update_user_friend_perms, UserServer didn't understand me!"); | ||
439 | } | ||
440 | } | ||
441 | else | ||
442 | { | ||
443 | m_log.Warn("[GRID]: Unable to update_user_friend_perms, UserServer didn't understand me!"); | ||
444 | |||
445 | } | ||
446 | } | ||
447 | catch (WebException e) | ||
448 | { | ||
449 | m_log.Warn("[GRID]: Error when trying to update_user_friend_perms: " + | ||
450 | e.Message); | ||
451 | } | ||
452 | } | ||
453 | /// <summary> | ||
454 | /// Returns a list of FriendsListItems that describe the friends and permissions in the friend relationship for UUID friendslistowner | ||
455 | /// </summary> | ||
456 | /// <param name="friendlistowner">The agent that we're retreiving the friends Data.</param> | ||
457 | public virtual List<FriendListItem> GetUserFriendList(UUID friendlistowner) | ||
458 | { | ||
459 | List<FriendListItem> buddylist = new List<FriendListItem>(); | ||
460 | |||
461 | try | ||
462 | { | ||
463 | Hashtable param = new Hashtable(); | ||
464 | param["ownerID"] = friendlistowner.Guid.ToString(); | ||
465 | |||
466 | IList parameters = new ArrayList(); | ||
467 | parameters.Add(param); | ||
468 | XmlRpcRequest req = new XmlRpcRequest("get_user_friend_list", parameters); | ||
469 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 8000); | ||
470 | Hashtable respData = (Hashtable)resp.Value; | ||
471 | |||
472 | if (respData != null && respData.Contains("avcount")) | ||
473 | { | ||
474 | buddylist = ConvertXMLRPCDataToFriendListItemList(respData); | ||
475 | } | ||
476 | |||
477 | } | ||
478 | catch (WebException e) | ||
479 | { | ||
480 | m_log.Warn("[OGS1 USER SERVICES]: Error when trying to fetch Avatar's friends list: " + | ||
481 | e.Message); | ||
482 | // Return Empty list (no friends) | ||
483 | } | ||
484 | return buddylist; | ||
485 | } | ||
486 | |||
487 | public virtual Dictionary<UUID, FriendRegionInfo> GetFriendRegionInfos(List<UUID> uuids) | ||
488 | { | ||
489 | Dictionary<UUID, FriendRegionInfo> result = new Dictionary<UUID, FriendRegionInfo>(); | ||
490 | |||
491 | // ask MessageServer about the current on-/offline status and regions the friends are in | ||
492 | ArrayList parameters = new ArrayList(); | ||
493 | Hashtable map = new Hashtable(); | ||
494 | |||
495 | ArrayList list = new ArrayList(); | ||
496 | foreach (UUID uuid in uuids) | ||
497 | { | ||
498 | list.Add(uuid.ToString()); | ||
499 | list.Add(uuid.ToString()); | ||
500 | } | ||
501 | map["uuids"] = list; | ||
502 | |||
503 | map["recv_key"] = m_commsManager.NetworkServersInfo.UserRecvKey; | ||
504 | map["send_key"] = m_commsManager.NetworkServersInfo.UserSendKey; | ||
505 | |||
506 | parameters.Add(map); | ||
507 | |||
508 | try | ||
509 | { | ||
510 | XmlRpcRequest req = new XmlRpcRequest("get_presence_info_bulk", parameters); | ||
511 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.MessagingURL, 8000); | ||
512 | Hashtable respData = resp != null ? (Hashtable)resp.Value : null; | ||
513 | |||
514 | if (respData == null || respData.ContainsKey("faultMessage")) | ||
515 | { | ||
516 | m_log.WarnFormat("[OGS1 USER SERVICES]: Contacting MessagingServer about user-regions resulted in error: {0}", | ||
517 | respData == null ? "<unknown error>" : respData["faultMessage"]); | ||
518 | } | ||
519 | else if (!respData.ContainsKey("count")) | ||
520 | { | ||
521 | m_log.WarnFormat("[OGS1 USER SERVICES]: Wrong format in response for MessagingServer request get_presence_info_bulk: missing 'count' field"); | ||
522 | } | ||
523 | else | ||
524 | { | ||
525 | int count = (int)respData["count"]; | ||
526 | m_log.DebugFormat("[OGS1 USER SERVICES]: Request returned {0} results.", count); | ||
527 | for (int i = 0; i < count; ++i) | ||
528 | { | ||
529 | if (respData.ContainsKey("uuid_" + i) && respData.ContainsKey("isOnline_" + i) && respData.ContainsKey("regionHandle_" + i)) | ||
530 | { | ||
531 | UUID uuid; | ||
532 | if (UUID.TryParse((string)respData["uuid_" + i], out uuid)) | ||
533 | { | ||
534 | FriendRegionInfo info = new FriendRegionInfo(); | ||
535 | info.isOnline = (bool)respData["isOnline_" + i]; | ||
536 | if (info.isOnline) | ||
537 | { | ||
538 | // TODO remove this after the next protocol update (say, r7800?) | ||
539 | info.regionHandle = Convert.ToUInt64(respData["regionHandle_" + i]); | ||
540 | |||
541 | // accept missing id | ||
542 | if (respData.ContainsKey("regionID_" + i)) | ||
543 | UUID.TryParse((string)respData["regionID_" + i], out info.regionID); | ||
544 | } | ||
545 | |||
546 | result.Add(uuid, info); | ||
547 | } | ||
548 | } | ||
549 | else | ||
550 | { | ||
551 | m_log.WarnFormat("[OGS1 USER SERVICES]: Response to get_presence_info_bulk contained an error in entry {0}", i); | ||
552 | } | ||
553 | } | ||
554 | } | ||
555 | } | ||
556 | catch (WebException e) | ||
557 | { | ||
558 | m_log.ErrorFormat("[OGS1 USER SERVICES]: Network problems when trying to fetch friend infos: {0}", e.Message); | ||
559 | } | ||
560 | |||
561 | m_log.DebugFormat("[OGS1 USER SERVICES]: Returning {0} entries", result.Count); | ||
562 | |||
563 | return result; | ||
564 | } | ||
565 | |||
566 | public virtual AvatarAppearance GetUserAppearance(UUID user) | ||
567 | { | ||
568 | AvatarAppearance appearance = null; | ||
569 | |||
570 | try | ||
571 | { | ||
572 | Hashtable param = new Hashtable(); | ||
573 | param["owner"] = user.ToString(); | ||
574 | |||
575 | IList parameters = new ArrayList(); | ||
576 | parameters.Add(param); | ||
577 | XmlRpcRequest req = new XmlRpcRequest("get_avatar_appearance", parameters); | ||
578 | XmlRpcResponse resp = req.Send(GetUserServerURL(user), 8000); | ||
579 | Hashtable respData = (Hashtable)resp.Value; | ||
580 | |||
581 | return ConvertXMLRPCDataToAvatarAppearance(respData); | ||
582 | } | ||
583 | catch (WebException e) | ||
584 | { | ||
585 | m_log.ErrorFormat("[OGS1 USER SERVICES]: Network problems when trying to fetch appearance for avatar {0}, {1}", user, e.Message); | ||
586 | } | ||
587 | |||
588 | return appearance; | ||
589 | } | ||
590 | |||
591 | public virtual void UpdateUserAppearance(UUID user, AvatarAppearance appearance) | ||
592 | { | ||
593 | try | ||
594 | { | ||
595 | Hashtable param = appearance.ToHashTable(); | ||
596 | param["owner"] = user.ToString(); | ||
597 | |||
598 | IList parameters = new ArrayList(); | ||
599 | parameters.Add(param); | ||
600 | XmlRpcRequest req = new XmlRpcRequest("update_avatar_appearance", parameters); | ||
601 | XmlRpcResponse resp = req.Send(GetUserServerURL(user), 8000); | ||
602 | Hashtable respData = (Hashtable)resp.Value; | ||
603 | |||
604 | if (respData != null) | ||
605 | { | ||
606 | if (respData.Contains("returnString")) | ||
607 | { | ||
608 | if ((string)respData["returnString"] == "TRUE") | ||
609 | { | ||
610 | m_log.DebugFormat("[OGS1 USER SERVICES]: Updated user appearance in {0}", GetUserServerURL(user)); | ||
611 | } | ||
612 | else | ||
613 | { | ||
614 | m_log.Warn("[GRID]: Unable to update_user_appearance, User Server Reported an issue"); | ||
615 | } | ||
616 | } | ||
617 | else | ||
618 | { | ||
619 | m_log.Warn("[GRID]: Unable to update_user_appearance, UserServer didn't understand me!"); | ||
620 | } | ||
621 | } | ||
622 | else | ||
623 | { | ||
624 | m_log.Warn("[GRID]: Unable to update_user_appearance, UserServer didn't understand me!"); | ||
625 | } | ||
626 | } | ||
627 | catch (WebException e) | ||
628 | { | ||
629 | m_log.WarnFormat("[OGS1 USER SERVICES]: Error when trying to update Avatar's appearance in {0}: {1}", | ||
630 | GetUserServerURL(user), e.Message); | ||
631 | // Return Empty list (no friends) | ||
632 | } | ||
633 | } | ||
634 | |||
635 | protected virtual string GetUserServerURL(UUID userID) | ||
636 | { | ||
637 | return m_commsManager.NetworkServersInfo.UserURL; | ||
638 | } | ||
639 | |||
640 | protected UserProfileData ConvertXMLRPCDataToUserProfile(Hashtable data) | ||
641 | { | ||
642 | if (data.Contains("error_type")) | ||
643 | { | ||
644 | //m_log.Warn("[GRID]: " + | ||
645 | // "Error sent by user server when trying to get user profile: (" + | ||
646 | // data["error_type"] + | ||
647 | // "): " + data["error_desc"]); | ||
648 | return null; | ||
649 | } | ||
650 | |||
651 | UserProfileData userData = new UserProfileData(); | ||
652 | userData.FirstName = (string)data["firstname"]; | ||
653 | userData.SurName = (string)data["lastname"]; | ||
654 | if (data["email"] != null) | ||
655 | userData.Email = (string)data["email"]; | ||
656 | userData.ID = new UUID((string)data["uuid"]); | ||
657 | userData.Created = Convert.ToInt32(data["profile_created"]); | ||
658 | if (data.Contains("server_inventory") && data["server_inventory"] != null) | ||
659 | userData.UserInventoryURI = (string)data["server_inventory"]; | ||
660 | if (data.Contains("server_asset") && data["server_asset"] != null) | ||
661 | userData.UserAssetURI = (string)data["server_asset"]; | ||
662 | if (data.Contains("profile_firstlife_about") && data["profile_firstlife_about"] != null) | ||
663 | userData.FirstLifeAboutText = (string)data["profile_firstlife_about"]; | ||
664 | userData.FirstLifeImage = new UUID((string)data["profile_firstlife_image"]); | ||
665 | userData.CanDoMask = Convert.ToUInt32((string)data["profile_can_do"]); | ||
666 | userData.WantDoMask = Convert.ToUInt32(data["profile_want_do"]); | ||
667 | userData.AboutText = (string)data["profile_about"]; | ||
668 | userData.Image = new UUID((string)data["profile_image"]); | ||
669 | userData.LastLogin = Convert.ToInt32((string)data["profile_lastlogin"]); | ||
670 | userData.HomeRegion = Convert.ToUInt64((string)data["home_region"]); | ||
671 | if (data.Contains("home_region_id")) | ||
672 | userData.HomeRegionID = new UUID((string)data["home_region_id"]); | ||
673 | else | ||
674 | userData.HomeRegionID = UUID.Zero; | ||
675 | userData.HomeLocation = | ||
676 | new Vector3((float)Convert.ToDecimal((string)data["home_coordinates_x"], Culture.NumberFormatInfo), | ||
677 | (float)Convert.ToDecimal((string)data["home_coordinates_y"], Culture.NumberFormatInfo), | ||
678 | (float)Convert.ToDecimal((string)data["home_coordinates_z"], Culture.NumberFormatInfo)); | ||
679 | userData.HomeLookAt = | ||
680 | new Vector3((float)Convert.ToDecimal((string)data["home_look_x"], Culture.NumberFormatInfo), | ||
681 | (float)Convert.ToDecimal((string)data["home_look_y"], Culture.NumberFormatInfo), | ||
682 | (float)Convert.ToDecimal((string)data["home_look_z"], Culture.NumberFormatInfo)); | ||
683 | if (data.Contains("user_flags")) | ||
684 | userData.UserFlags = Convert.ToInt32((string)data["user_flags"]); | ||
685 | if (data.Contains("god_level")) | ||
686 | userData.GodLevel = Convert.ToInt32((string)data["god_level"]); | ||
687 | |||
688 | if (data.Contains("custom_type")) | ||
689 | userData.CustomType = (string)data["custom_type"]; | ||
690 | else | ||
691 | userData.CustomType = ""; | ||
692 | if (userData.CustomType == null) | ||
693 | userData.CustomType = ""; | ||
694 | |||
695 | if (data.Contains("partner")) | ||
696 | userData.Partner = new UUID((string)data["partner"]); | ||
697 | else | ||
698 | userData.Partner = UUID.Zero; | ||
699 | |||
700 | return userData; | ||
701 | } | ||
702 | |||
703 | protected AvatarAppearance ConvertXMLRPCDataToAvatarAppearance(Hashtable data) | ||
704 | { | ||
705 | if (data != null) | ||
706 | { | ||
707 | if (data.Contains("error_type")) | ||
708 | { | ||
709 | m_log.Warn("[GRID]: " + | ||
710 | "Error sent by user server when trying to get user appearance: (" + | ||
711 | data["error_type"] + | ||
712 | "): " + data["error_desc"]); | ||
713 | return null; | ||
714 | } | ||
715 | else | ||
716 | { | ||
717 | return new AvatarAppearance(data); | ||
718 | } | ||
719 | } | ||
720 | else | ||
721 | { | ||
722 | m_log.Error("[GRID]: The avatar appearance is null, something bad happenend"); | ||
723 | return null; | ||
724 | } | ||
725 | } | ||
726 | |||
727 | protected List<AvatarPickerAvatar> ConvertXMLRPCDataToAvatarPickerList(UUID queryID, Hashtable data) | ||
728 | { | ||
729 | List<AvatarPickerAvatar> pickerlist = new List<AvatarPickerAvatar>(); | ||
730 | int pickercount = Convert.ToInt32((string)data["avcount"]); | ||
731 | UUID respqueryID = new UUID((string)data["queryid"]); | ||
732 | if (queryID == respqueryID) | ||
733 | { | ||
734 | for (int i = 0; i < pickercount; i++) | ||
735 | { | ||
736 | AvatarPickerAvatar apicker = new AvatarPickerAvatar(); | ||
737 | UUID avatarID = new UUID((string)data["avatarid" + i.ToString()]); | ||
738 | string firstname = (string)data["firstname" + i.ToString()]; | ||
739 | string lastname = (string)data["lastname" + i.ToString()]; | ||
740 | apicker.AvatarID = avatarID; | ||
741 | apicker.firstName = firstname; | ||
742 | apicker.lastName = lastname; | ||
743 | pickerlist.Add(apicker); | ||
744 | } | ||
745 | } | ||
746 | else | ||
747 | { | ||
748 | m_log.Warn("[OGS1 USER SERVICES]: Got invalid queryID from userServer"); | ||
749 | } | ||
750 | return pickerlist; | ||
751 | } | ||
752 | |||
753 | protected List<FriendListItem> ConvertXMLRPCDataToFriendListItemList(Hashtable data) | ||
754 | { | ||
755 | List<FriendListItem> buddylist = new List<FriendListItem>(); | ||
756 | int buddycount = Convert.ToInt32((string)data["avcount"]); | ||
757 | |||
758 | |||
759 | for (int i = 0; i < buddycount; i++) | ||
760 | { | ||
761 | FriendListItem buddylistitem = new FriendListItem(); | ||
762 | |||
763 | buddylistitem.FriendListOwner = new UUID((string)data["ownerID" + i.ToString()]); | ||
764 | buddylistitem.Friend = new UUID((string)data["friendID" + i.ToString()]); | ||
765 | buddylistitem.FriendListOwnerPerms = (uint)Convert.ToInt32((string)data["ownerPerms" + i.ToString()]); | ||
766 | buddylistitem.FriendPerms = (uint)Convert.ToInt32((string)data["friendPerms" + i.ToString()]); | ||
767 | |||
768 | buddylist.Add(buddylistitem); | ||
769 | } | ||
770 | |||
771 | return buddylist; | ||
772 | } | ||
773 | } | ||
774 | } | ||