public async void Handle(IGluonSession session, DataServiceWrapperPDU packet) { try //data service throws exceptions (SecurityException, etc) when invalid requests are made. These should not crash the server... { if (packet.Body is cTSOTopicUpdateMessage) { //Client wants to update a value in the data service var update = packet.Body as cTSOTopicUpdateMessage; DataService.ApplyUpdate(update, session); List <uint> resultDotPath = new List <uint>(); foreach (var item in update.DotPath) { resultDotPath.Add(item); if (item == packet.RequestTypeID) { break; } } try { var result = await DataService.SerializePath(resultDotPath.ToArray()); if (result != null) { session.Write(new DataServiceWrapperPDU() { SendingAvatarID = packet.SendingAvatarID, RequestTypeID = packet.RequestTypeID, Body = result }); } } catch (Exception e) { //TODO //keep this silent for now - bookmarks tend to spam errors. } } } catch (Exception e) { LOG.Error(e, "Gluon DataService request failed!"); } }
public void Sync(object item, string[] fieldPaths) { var updates = new List <cTSOTopicUpdateMessage>(); foreach (var fieldPath in fieldPaths) { var path = fieldPath.Split('.'); var dotPath = GetDotPath(item, fieldPath); var curObj = item.GetType().GetProperty(path[0]).GetValue(item); for (int i = 1; i < path.Length; i++) { var curField = GetFieldByName(curObj.GetType(), path[i]); dotPath[i + 2] = curField.ID; curObj = curObj.GetType().GetProperty(path[i]).GetValue(curObj); } updates.Add(SerializeUpdate(curObj, dotPath)); } if (updates.Count == 0) { return; } var packets = new DataServiceWrapperPDU[updates.Count]; for (int i = 0; i < updates.Count; i++) { var messageId = NextMessageId(); var update = updates[i]; packets[i] = new DataServiceWrapperPDU() { Body = update, RequestTypeID = 0, SendingAvatarID = messageId }; } CityClient.Write(packets); }
public Task <object> Request(MaskedStruct mask, uint id) { var messageId = NextMessageId(); var request = new DataServiceWrapperPDU() { RequestTypeID = mask.GetID(), SendingAvatarID = messageId, //Reusing this field for easier callbacks rather than scoping them Body = new cTSONetMessageStandard() { DataServiceType = mask.GetID(), Parameter = id } }; CityClient.Write(request); //TODO: Add timeouts var result = new PendingDataRequest(messageId, this, Get(mask, id)); lock (PendingCallbacks) PendingCallbacks.Add(messageId, result); return(result.Task); }
public void Sync(IAriesSession target, T item) { var asObject = (object)item; var updates = DataService.SerializeUpdate(Fields, asObject, (uint)KeyField.GetValue(asObject)); if (updates.Count == 0) { return; } var packets = new DataServiceWrapperPDU[updates.Count]; for (int i = 0; i < updates.Count; i++) { var update = updates[i]; packets[i] = new DataServiceWrapperPDU() { Body = update, RequestTypeID = 0, SendingAvatarID = 0 }; } target.Write(packets); }
/// <summary> /// The user is asking for some in RAM data /// </summary> /// <param name="session"></param> /// <param name="packet"></param> public async void Handle(IVoltronSession session, DataServiceWrapperPDU packet) { try //data service throws exceptions (SecurityException, etc) when invalid requests are made. These should not crash the server... { if (packet.Body is cTSONetMessageStandard) { var msg = (cTSONetMessageStandard)packet.Body; if (msg.ComplexParameter is cTSOTopicUpdateMessage) { var update = msg.ComplexParameter as cTSOTopicUpdateMessage; DataService.ApplyUpdate(update, session); return; } var type = MaskedStructUtils.FromID(packet.RequestTypeID); if (!msg.Parameter.HasValue) { return; } //Lookup the entity, then process the request and send the response var task = DataService.Get(type, msg.Parameter.Value); if (task != null) { var entity = await task; var serialized = DataService.SerializeUpdate(type, entity, msg.Parameter.Value); for (int i = 0; i < serialized.Count; i++) { object serial = serialized[i]; session.Write(new DataServiceWrapperPDU() { SendingAvatarID = packet.SendingAvatarID, RequestTypeID = packet.RequestTypeID, Body = serial }); } } } else if (packet.Body is cTSOTopicUpdateMessage) { //Client wants to update a value in the data service var update = packet.Body as cTSOTopicUpdateMessage; DataService.ApplyUpdate(update, session); List <uint> resultDotPath = new List <uint>(); foreach (var item in update.DotPath) { var ires = item; if (ires == 0x1095C1E1) { ires = 0x7EA285CD; //rewrite: filter id -> returns -> result list } resultDotPath.Add(ires); if (ires == packet.RequestTypeID) { break; } } var result = await DataService.SerializePath(resultDotPath.ToArray()); if (result != null) { session.Write(new DataServiceWrapperPDU() { SendingAvatarID = packet.SendingAvatarID, RequestTypeID = packet.RequestTypeID, Body = result }); } /*var task = DataService.Get(update.DotPath[0], update.DotPath[1]); * if(task != null) * { * var entity = await task; * * var serialized = DataService.SerializeUpdate(type, entity, msg.Parameter.Value); * }*/ /**/ } } catch (Exception e) { //SerializePath throws generic exceptions. //plus we don't want weird special cases crashing the whole server. LOG.Error(e, "Voltron DataService request failed: from avatar " + session.AvatarId + ", \n" + e.ToString()); } }
/// <summary> /// The user is asking for some in RAM data /// </summary> /// <param name="session"></param> /// <param name="packet"></param> public async void Handle(IVoltronSession session, DataServiceWrapperPDU packet) { try //data service throws exceptions (SecurityException, etc) when invalid requests are made. These should not crash the server... { if (packet.Body is cTSONetMessageStandard) { var msg = (cTSONetMessageStandard)packet.Body; if (msg.ComplexParameter is cTSOTopicUpdateMessage) { var update = msg.ComplexParameter as cTSOTopicUpdateMessage; DataService.ApplyUpdate(update, session); return; } var type = MaskedStructUtils.FromID(packet.RequestTypeID); if (!msg.Parameter.HasValue) { return; } //if (type == MaskedStruct.MapView_NearZoom_Lot_Thumbnail || type == MaskedStruct.Thumbnail_Lot || type == MaskedStruct.MapView_NearZoom_Lot) { } if (type != MaskedStruct.MyAvatar && type != MaskedStruct.SimPage_Main && type != MaskedStruct.MapView_RollOverInfo_Lot_Price && type != MaskedStruct.MapView_RollOverInfo_Lot && type != MaskedStruct.Unknown && type != MaskedStruct.SimPage_DescriptionPanel && type != MaskedStruct.PropertyPage_LotInfo && type != MaskedStruct.Messaging_Message_Avatar && type != MaskedStruct.Messaging_Icon_Avatar && type != MaskedStruct.MapView_NearZoom_Lot_Thumbnail && type != MaskedStruct.Thumbnail_Lot && type != MaskedStruct.CurrentCity && type != MaskedStruct.MapView_NearZoom_Lot && type != MaskedStruct.Thumbnail_Avatar && type != MaskedStruct.SimPage_MyLot && type != MaskedStruct.SimPage_JobsPanel && type != MaskedStruct.FriendshipWeb_Avatar && type != MaskedStruct.SimPage_SkillsPanel && type != MaskedStruct.AdmitInfo_Lot) { //Currently broken for some reason return; } //Lookup the entity, then process the request and send the response var task = DataService.Get(type, msg.Parameter.Value); if (task != null) { var entity = await task; var serialized = DataService.SerializeUpdate(type, entity, msg.Parameter.Value); for (int i = 0; i < serialized.Count; i++) { object serial = serialized[i]; session.Write(new DataServiceWrapperPDU() { SendingAvatarID = packet.SendingAvatarID, RequestTypeID = packet.RequestTypeID, Body = serial }); } } } else if (packet.Body is cTSOTopicUpdateMessage) { //Client wants to update a value in the data service var update = packet.Body as cTSOTopicUpdateMessage; DataService.ApplyUpdate(update, session); List <uint> resultDotPath = new List <uint>(); foreach (var item in update.DotPath) { var ires = item; if (ires == 0x1095C1E1) { ires = 0x7EA285CD; //rewrite: filter id -> returns -> result list } resultDotPath.Add(ires); if (ires == packet.RequestTypeID) { break; } } var result = await DataService.SerializePath(resultDotPath.ToArray()); if (result != null) { session.Write(new DataServiceWrapperPDU() { SendingAvatarID = packet.SendingAvatarID, RequestTypeID = packet.RequestTypeID, Body = result }); } /*var task = DataService.Get(update.DotPath[0], update.DotPath[1]); * if(task != null) * { * var entity = await task; * * var serialized = DataService.SerializeUpdate(type, entity, msg.Parameter.Value); * }*/ /**/ } } catch (Exception e) { //SerializePath throws generic exceptions. //plus we don't want weird special cases crashing the whole server. LOG.Error(e, "Voltron DataService request failed!"); } }