using MongoDB.Bson; using MongoDB.Driver; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace lolDataSimulation { /// /// 시뮬레이션으로 게임데이터를 만들기위한 프로그램 /// /// 좀 쓰다 버릴줄알고 발로짰다. 이렇게 많이 쓸줄 알았으면 여기에 목숨을 걸어야했는데.. /// /// public partial class SimulationForm : Form { public SimulationForm() { InitializeComponent(); updateTimer.Tick += timeup; } private void button2_Click(object sender, EventArgs e) { var mEventDataBaseTarget = mDBClient.GetDatabase("datalol"); mEventDataBaseTarget.GetCollection("champ_select").DeleteMany("{ RequestGameID : '" + textBox1.Text + "' }"); textBox2.Text = (-1000).ToString(); } private void btnBanPickNect_Click(object sender, EventArgs e) { banPickNext(); } //MongoClient mDBClient = new MongoClient("mongodb://root:veryhardpassword123@203.251.148.27:50002"); MongoClient mDBClient = new MongoClient("mongodb://root:veryhardpassword123@211.42.188.8:50003"); //MongoClient mDBClient = new MongoClient("mongodb://root:veryhardpassword123@localhost:60001"); void banPickNext() { var mEventDataBaseSeed = mDBClient.GetDatabase("data_lol_test_seed"); var filter = Builders.Filter.And( Builders.Filter.Eq("RequestGameID", textBox1.Text), Builders.Filter.Eq("sequenceIndex", Convert.ToInt32(textBox2.Text)) ); var projection = Builders.Projection .Exclude("_id") .Include("RequestGameID") .Include("sequenceIndex") .Include("eventDocument"); List documents = mEventDataBaseSeed.GetCollection("champ_select") .Find(filter) .SortByDescending(x => x["sequenceIndex"]) .Project(projection) .Limit(1) .ToList(); if (documents.Count == 0) { MessageBox.Show("업데이트할 데이터가 없습니다."); return; } var mEventDataBaseTarget = mDBClient.GetDatabase("datalol"); mEventDataBaseTarget.GetCollection("champ_select").InsertOne(documents.Last()); textBox2.Text = (Convert.ToInt32(textBox2.Text) + 1).ToString(); } Timer updateTimer = new Timer(); private void button3_Click(object sender, EventArgs e) { updateTimer.Interval = 1000; updateTimer.Start(); } void timeup(object o, EventArgs e) { if (Convert.ToInt32(numericUpDown2.Value) == 59) { numericUpDown1.Value += 1; numericUpDown2.Value = 0; } else { numericUpDown2.Value += 1; } } string[] bufUpdateCollectionsName = { "stats_update", "epic_monster_kill", "building_destroyed", "turret_plate_destroyed", "queued_dragon_info" }; void liveDataUpdateWork() { var mEventDataBaseSeed = mDBClient.GetDatabase("data_lol_test_seed"); var mEventDataBaseTarget = mDBClient.GetDatabase("datalol"); int calculatedTime = 0; calculatedTime += Convert.ToInt32(numericUpDown1.Value) * 60 * 1000; calculatedTime += Convert.ToInt32(numericUpDown2.Value) * 1000; Dictionary>> bufDataTable = new Dictionary>>(); var subFilter = MongoDB.Bson.Serialization.BsonSerializer.Deserialize("{'eventDocument.gameTime' : {$lt : " + calculatedTime + " }}"); var filter = Builders.Filter.And( Builders.Filter.Eq("RequestGameID", textBox1.Text), subFilter ); foreach (string item in bufUpdateCollectionsName) { var projection = Builders.Projection .Exclude("_id") .Include("RequestGameID") .Include("sequenceIndex") .Include("eventDocument"); List documents = mEventDataBaseSeed.GetCollection(item) .Find(filter) .SortByDescending(x => x["sequenceIndex"]) .Project(projection) .Limit(1) .ToList(); if (documents.Count == 0) { continue; } BsonDocument bufUpdateValue = documents[0].AsBsonDocument; string bufStatus = bufUpdateValue["eventDocument"]["rfc461Schema"].ToString(); var gameFilter = Builders.Filter.Eq(x => x["RequestGameID"], textBox1.Text); var sequanceFilter = Builders.Filter.Eq(x => x["sequenceIndex"], documents[0]["sequenceIndex"]); var Parentfilter = Builders.Filter.And(gameFilter, sequanceFilter); UpdateOneModel updateRaw = new UpdateOneModel( Parentfilter, Builders.Update.Set(x => x["eventDocument"], bufUpdateValue["eventDocument"]) ) { IsUpsert = true }; if (!bufDataTable.ContainsKey(bufStatus)) { bufDataTable.Add(bufStatus, new List>()); } if (item == "stats_update") { Console.WriteLine(bufUpdateValue["eventDocument"]["gameTime"].ToString()); } bufDataTable[bufStatus].Add(updateRaw); } foreach (var item in bufDataTable) { mEventDataBaseTarget.GetCollection(item.Key) .BulkWriteAsync(item.Value); } } private void numericUpDown2_ValueChanged(object sender, EventArgs e) { liveDataUpdateWork(); } private void btnClearGameData_Click(object sender, EventArgs e) { var mEventDataBaseTarget = mDBClient.GetDatabase("datalol"); foreach (string item in bufUpdateCollectionsName) { mEventDataBaseTarget.GetCollection(item) .DeleteMany(x => true); } } private void btnAutoplayEnd_Click(object sender, EventArgs e) { updateTimer.Stop(); } private void btnSyncGameData_Click(object sender, EventArgs e) { var mEventDataBaseTarget = mDBClient.GetDatabase("datalol"); var mEventDataBaseSeed = mDBClient.GetDatabase("data_lol_test_seed"); int calculatedTime = 0; calculatedTime += Convert.ToInt32(numericUpDown1.Value) * 60 * 1000; calculatedTime += Convert.ToInt32(numericUpDown2.Value) * 1000; Dictionary>> bufDataTable = new Dictionary>>(); var subFilter = MongoDB.Bson.Serialization.BsonSerializer.Deserialize("{'eventDocument.gameTime' : {$lt : " + calculatedTime + " }}"); var filter = Builders.Filter.And( Builders.Filter.Eq("RequestGameID", textBox1.Text), subFilter ); foreach (string item in bufUpdateCollectionsName) { var projection = Builders.Projection .Exclude("_id") .Include("RequestGameID") .Include("sequenceIndex") .Include("eventDocument"); List documents = mEventDataBaseSeed.GetCollection(item) .Find(filter) //.SortByDescending(x => x["sequenceIndex"]) .Project(projection) .ToList(); if (documents.Count == 0) { continue; } //BsonDocument bufUpdateValue = documents[0].AsBsonDocument; foreach (BsonDocument itemd in documents) { string bufStatus = itemd["eventDocument"]["rfc461Schema"].ToString(); var gameFilter = Builders.Filter.Eq(x => x["RequestGameID"], textBox1.Text); var sequanceFilter = Builders.Filter.Eq(x => x["sequenceIndex"], itemd["sequenceIndex"]); var Parentfilter = Builders.Filter.And(gameFilter, sequanceFilter); UpdateOneModel updateRaw = new UpdateOneModel( Parentfilter, Builders.Update.Set(x => x["eventDocument"], itemd["eventDocument"]) ) { IsUpsert = true }; if (!bufDataTable.ContainsKey(bufStatus)) { bufDataTable.Add(bufStatus, new List>()); } if (item == "stats_update") { Console.WriteLine(itemd["eventDocument"]["gameTime"].ToString()); } bufDataTable[bufStatus].Add(updateRaw); } } foreach (var item in bufDataTable) { mEventDataBaseTarget.GetCollection(item.Key) .BulkWriteAsync(item.Value); } } } }