public async Task <bool> AppendSnapshotUpdate(string _id, SnapshotUpdate snapshotUpdate) { var data = new BsonDocument(); foreach (var kvEntry in snapshotUpdate.data) { var element = new BsonElement(kvEntry.Key, new BsonString(kvEntry.Value)); data.Add(element); } var entry = new BsonDocument { { "created", new BsonDateTime(DateTime.UtcNow) }, { "data", data }, { "completed", new BsonBoolean(snapshotUpdate.completed) } }; var filter = Builders <BsonDocument> .Filter.Eq("_id", new ObjectId(_id)); var update = Builders <BsonDocument> .Update.Push("updates", entry); var result = await collection.UpdateOneAsync(filter, update); var success = result.IsAcknowledged && result.IsModifiedCountAvailable && result.ModifiedCount > 0; if (success && snapshotUpdate.completed) { ConnectionFactory factory = connectionFactory.Get(); using (IConnection connection = factory.CreateConnection()) { using (IModel channel = connection.CreateModel()) { var lookup = new SnapshotLookup(); lookup._id = _id; var fullSnapshot = (await Lookup(lookup)).First(); var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(fullSnapshot); byte[] messageBodyBytes = System.Text.Encoding.UTF8.GetBytes(jsonString); IBasicProperties props = channel.CreateBasicProperties(); props.ContentType = "application/json"; props.Headers = new Dictionary <string, object>(); props.Headers["X-OpenSpy-GameId"] = snapshotUpdate.gameid; channel.BasicPublish(GSTATS_EXCHANGE, GSTATS_ROUTING_KEY, props, messageBodyBytes); return(true); } } } return(success); }
public async Task <IEnumerable <Snapshot> > Lookup(SnapshotLookup lookup) { var searchRequest = new BsonDocument { }; if (lookup._id != null) { searchRequest["_id"] = new BsonObjectId(lookup._id); } else { Game game = (await gameRepository.Lookup(lookup.gameLookup)).FirstOrDefault(); if (game != null) { searchRequest["gameid"] = new BsonInt32(game.Id); } } if (lookup.processed.HasValue) { searchRequest["processed"] = new BsonBoolean(lookup.processed.Value); } var results = (await collection.FindAsync(searchRequest)).ToList(); var output = new List <Snapshot>(); foreach (var result in results) { var snapshot = new Snapshot(); snapshot._id = result["_id"].AsObjectId; snapshot.gameid = result["gameid"].AsInt32; if (result.Contains("processed")) { snapshot.processed = result["processed"].AsBoolean; } else { snapshot.processed = false; } if (result.Contains("profileid")) { snapshot.profileid = result["profileid"].AsInt32; } snapshot.ip = result["ip"].AsString; if (result["created"].IsDateTime) { snapshot.created = result["created"].AsDateTime; } snapshot.updates = new List <SnapshotUpdate>(); var updates = result["updates"].AsBsonArray; foreach (var update in updates) { var sub_update = new SnapshotUpdate(); if (update["created"].IsDateTime) { sub_update.created = update["created"].AsDateTime; } if (update.AsBsonDocument.Contains("profileid")) { sub_update.profileid = update["profileid"].AsInt32; } else { sub_update.profileid = snapshot.profileid; } if (update.AsBsonDocument.Contains("gameid")) { sub_update.gameid = update["gameid"].AsInt32; } else { sub_update.gameid = snapshot.gameid; } if (update.AsBsonDocument.Contains("complete")) { sub_update.completed = update["complete"].AsBoolean; } sub_update.data = new Dictionary <string, string>(); var data = update["data"].AsBsonDocument; var elements = data.Elements; foreach (var element in elements) { sub_update.data[element.Name] = element.Value.AsString; } snapshot.updates.Add(sub_update); } output.Add(snapshot); } return(output); }