Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }