public async Task <IActionResult> EntryPlayer([FromBody] EntryPlayer.Request req) { if (req.pingResults != null) { var results = new List <LogModels.PingResults.Result>(); foreach (var pingResult in req.pingResults) { results.Add(new LogModels.PingResults.Result { regionCode = pingResult.regionCode, time = pingResult.time, }); } Logger.Logging( new LogObj().AddChild(new LogModels.PingResults { PlayerId = SelfHost.playerInfo.playerId, Results = results, }) ); } if (!VersionChecker.Get(VersionChecker.CheckTarget.EnabledMatchmake).Check()) { return(BuildErrorResponse(Error.LowCode.DisabledMatchmake)); } var requester = new evomatching.ProtocolModels.Matching.EntryPlayer(); requester.request.playerId = SelfHost.playerInfo.playerId; requester.request.matchType = req.matchType.Value; var response = await requester.PostAsyncXXX(MatchingServerInfo.AreaUri(SelfHost.matchingArea)); if (response.StatusCode != System.Net.HttpStatusCode.OK) { return(BuildErrorResponse(Error.LowCode.ServerInternalError)); } switch (response.Payload.resultCode) { case evomatching.ProtocolModels.Matching.EntryPlayer.Response.ResultCode.Ok: return(Ok(new EntryPlayer.Response())); case evomatching.ProtocolModels.Matching.EntryPlayer.Response.ResultCode.OldPackageVersion: return(BuildErrorResponse(Error.LowCode.NgPackageVersion)); case evomatching.ProtocolModels.Matching.EntryPlayer.Response.ResultCode.SendedPgInvitation: return(BuildErrorResponse(Error.LowCode.SentPgInvitation)); case evomatching.ProtocolModels.Matching.EntryPlayer.Response.ResultCode.RecievedPgInvitation: return(BuildErrorResponse(Error.LowCode.RecievedPgInvitation)); default: return(BuildErrorResponse(Error.LowCode.CouldNotMatchingEnty)); } }
public async Task <IActionResult> SearchAllReplay([FromBody] SearchAllReplay.Request req) { // get data from DB int selectNum = req.getNum.Value; var query = Common3DB.ReplayInfoAllMatch.OrderByDescending( i => i.date ).Take(selectNum); var replaySrc = await query.ToListAsync(); // check version var checker = VersionChecker.Get(VersionChecker.CheckTarget.Replay); for (int i = replaySrc.Count - 1; i >= 0; i--) { checker.PackageVersion = replaySrc[i].packageVersion; checker.MasterDataVersion = replaySrc[i].masterDataVersion; if (!checker.Check()) { replaySrc.RemoveAt(i); } } var infoDst = new List <SearchAllReplay.UserReplayInfo>(); // response data replaySrc.ForEach( i => infoDst.Add(new SearchAllReplay.UserReplayInfo() { date = i.date, matchType = i.matchType, gameMode = i.gameMode, totalTime = i.totalTime, mvpUnit = i.mvpUnitId, matchId = i.matchId, result = i.result, mapId = i.mapId, mvpPlayer = i.mvpUserName, }) ); var res = new SearchAllReplay.Response(); res.ReplayInfos = infoDst; return(Ok(res)); }
public async Task <IActionResult> SearchUserReplay([FromBody] SearchUserReplay.Request req) { // get UserPlay data int selectNum = req.getNum.Value; var personalDb = PDBSM.PersonalDBContext(SelfHost.playerInfo.playerId); var userSelect = personalDb.ReplayUserHistory.Where(i => i.playerId == SelfHost.playerInfo.playerId ); if (req.matchType >= 0) { userSelect = userSelect.Where(i => i.matchType == req.matchType); } userSelect = userSelect.OrderByDescending( i => i.date ); userSelect = userSelect.Take(selectNum); var userSrc = await userSelect.ToListAsync(); // check version var checker = VersionChecker.Get(VersionChecker.CheckTarget.Replay); for (int i = userSrc.Count - 1; i >= 0; i--) { checker.PackageVersion = userSrc[i].packageVersion; checker.MasterDataVersion = userSrc[i].masterDataVersion; if (!checker.Check()) { userSrc.RemoveAt(i); } } // Make match-id array string[] ids = new string[userSrc.Count]; for (int i = 0; i < userSrc.Count; i++) { ids[i] = userSrc[i].matchId; } // main data var query = Common3DB.ReplayInfoAllMatch.Where(i => ids.Contains(i.matchId) ); var replaySrc = await query.ToListAsync(); // response data var infoDst = new List <SearchUserReplay.UserReplayInfo>(); foreach (var oneData in userSrc) { var temp = new SearchUserReplay.UserReplayInfo(); temp.date = oneData.date; temp.matchType = oneData.matchType; temp.matchId = oneData.matchId; temp.result = oneData.resultType.ToString(); // Win or Defeat string var rData = replaySrc.FirstOrDefault(i => i.matchId == oneData.matchId); if (rData != null) { temp.gameMode = rData.gameMode; temp.totalTime = rData.totalTime; temp.mvpUnit = rData.mvpUnitId; temp.matchId = rData.matchId; temp.mapId = rData.mapId; temp.mvpPlayer = rData.mvpUserName; } infoDst.Add(temp); } var res = new SearchUserReplay.Response(); res.ReplayInfos = infoDst; return(Ok(res)); }
public async Task <IActionResult> SearchFeaturedReplay([FromBody] SearchFeaturedReplay.Request req) { int selectNum = req.getNum.Value; // RankMatch data at FeaturedFlag ON var rankSelect = Common3DB.ReplayInfoRankMatch.Where(i => i.isFeatured == true ).OrderByDescending( i => i.date ).Take(selectNum); var rankSrc = await rankSelect.ToListAsync(); // check version var checker = VersionChecker.Get(VersionChecker.CheckTarget.Replay); for (int i = rankSrc.Count - 1; i >= 0; i--) { checker.PackageVersion = rankSrc[i].packageVersion; checker.MasterDataVersion = rankSrc[i].masterDataVersion; if (!checker.Check()) { rankSrc.RemoveAt(i); } } // Make match-id array string[] ids = new string[rankSrc.Count]; for (int i = 0; i < rankSrc.Count; i++) { ids[i] = rankSrc[i].matchId; } // main data var query = Common3DB.ReplayInfoAllMatch.Where(i => ids.Contains(i.matchId) ); var replaySrc = await query.ToListAsync(); // Match Members var memberquery = Common3DB.MatchMember.Where(i => ids.Contains(i.matchId) ); var membersSrc = await memberquery.ToListAsync(); // View Num var viewquery = Common3DB.ReplayViewNum.Where(i => ids.Contains(i.matchId) ); var viewnumSrc = await viewquery.ToListAsync(); // response data var infoDst = new List <SearchFeaturedReplay.FeaturedInfo>(); foreach (var oneData in rankSrc) { var temp = new SearchFeaturedReplay.FeaturedInfo(); temp.date = oneData.date; temp.matchId = oneData.matchId; temp.ratingAverage = oneData.ratingAverage;// for Rank var rData = replaySrc.FirstOrDefault(i => i.matchId == oneData.matchId); if (rData != null) { temp.gameMode = rData.gameMode; temp.totalTime = rData.totalTime; temp.mvpUnit = rData.mvpUnitId; temp.matchId = rData.matchId; temp.result = rData.result; temp.mapId = rData.mapId; temp.mvpPlayer = rData.mvpUserName; } var memberinfo = membersSrc.FirstOrDefault(i => i.matchId == oneData.matchId); if (memberinfo != null) { temp.members = memberinfo.playersInfo; } var numdata = viewnumSrc.FirstOrDefault(i => i.matchId == oneData.matchId); if (numdata != null) { temp.viewNum = numdata.ViewNum; } infoDst.Add(temp); } var res = new SearchFeaturedReplay.Response(); res.FeaturedInfos = infoDst; return(Ok(res)); }
public async Task <IActionResult> SearchRankReplay([FromBody] SearchRankReplay.Request req) { int selectNum = req.getNum.Value; // 出撃機体フィルタ作成 UInt64 spawn = 0; if (req.filter.spawnUnits.Count > 0) { foreach (int bit_idx in req.filter.spawnUnits) { UInt64 mask = (UInt64)(1 << bit_idx); spawn |= mask; } } // 表彰機体フィルタ作成 UInt64 award = 0; if (req.filter.awardUnits.Count > 0) { foreach (int bit_idx in req.filter.awardUnits) { UInt64 mask = (UInt64)(1 << bit_idx); award |= mask; } } var checker = VersionChecker.Get(VersionChecker.CheckTarget.Replay); var rankSrc = new List <ReplayInfoRankMatch>(); // 指定件数の2倍を仮取得 var tempData = await Common3DB.ReplayInfoRankMatch.OrderByDescending( i => i.date ).Take(selectNum * 2).ToListAsync(); // TODO:このリクエストは全ユーザ共通のDB検索結果となるため、tempDataはAPIサーバーにローカルキャッシュするなどして // せめて同じAPIサーバーを利用するユーザ間で共有したい。 // 仮取得したデータを全チェック foreach (var oneLow in tempData) { checker.PackageVersion = oneLow.packageVersion; checker.MasterDataVersion = oneLow.masterDataVersion; if (!checker.Check()) { break; // 日付降順に取得しているのでバージョン不適合があればそれより昔のデータは全部不適合なので終了 } if (req.filter.gameMode > 0 && oneLow.gameMode != req.filter.gameMode) { continue; //GameMode が違う } if (req.filter.mapId.Length > 0 && oneLow.mapId != req.filter.mapId) { continue; // Map が違う } if (req.filter.ratingBottom > 0) { if (oneLow.ratingAverage < req.filter.ratingBottom || req.filter.ratingUpper <= oneLow.ratingAverage) { continue; //指定ランク帯と違う } } if (spawn > 0 && (spawn & oneLow.spawnUnits) == 0) { continue; // 出撃機体指定が1つも当てはまらない } if (award > 0 && (award & oneLow.awardUnits) == 0) { continue; // 表彰機体指定が1つも当てはまらない } // 厳しい条件を乗り越え、検索結果として有効だったデータ rankSrc.Add(oneLow); // 指定件数集まれば即終了 if (rankSrc.Count >= selectNum) { break; } } //-------- 検索ここまで、これ以降は詳細データのアタッチ --------------- // Make match-id array string[] ids = new string[selectNum]; for (int i = 0; i < rankSrc.Count; i++) { ids[i] = rankSrc[i].matchId; } // main data var query = Common3DB.ReplayInfoAllMatch.Where(i => ids.Contains(i.matchId) ); var replaySrc = await query.ToListAsync(); // View Num var viewquery = Common3DB.ReplayViewNum.Where(i => ids.Contains(i.matchId) ); var viewnumSrc = await viewquery.ToListAsync(); // response data var infoDst = new List <SearchRankReplay.UserReplayInfo>(); foreach (var oneData in rankSrc) { var temp = new SearchRankReplay.UserReplayInfo(); temp.date = oneData.date; temp.matchType = evolib.Battle.MatchType.Rank; temp.matchId = oneData.matchId; temp.ratingAverage = oneData.ratingAverage;// for Rank var rData = replaySrc.FirstOrDefault(i => i.matchId == oneData.matchId); if (rData != null) { temp.gameMode = rData.gameMode; temp.totalTime = rData.totalTime; temp.mvpUnit = rData.mvpUnitId; temp.matchId = rData.matchId; temp.result = rData.result; temp.mapId = rData.mapId; temp.mvpPlayer = rData.mvpUserName; } var numdata = viewnumSrc.FirstOrDefault(i => i.matchId == oneData.matchId); if (numdata != null) { temp.viewNum = numdata.ViewNum; } infoDst.Add(temp); } var res = new SearchRankReplay.Response(); res.ReplayInfos = infoDst; return(Ok(res)); }
public void Start() { PgInvitationManager = new PgInvitationManager(); PremadeGroupManager = new PremadeGroupManager(); BattleEntryManager = new BattleEntryManager(); MatchManager = new MatchManager(); var matchMaker = new Logic.Matchmaker2(); var sessionCheckTimer = new IntervalTimer(5000); var autoMatchmakeTimer = new IntervalTimer(30000); var generateSessionCntTimer = new IntervalTimer(5000); var LogSessionCntTimer = new IntervalTimer(30000); Task.Run(async() => { while (true) { if (Settings.MatchingArea != MatchingArea.Unknown) { WatchDogSession = new WatchDogSession(Settings.MatchingArea); break; } await Task.Delay(1000); } var enabledMatchesCnt = 0; var entriedPlayersCnt = 0; while (true) { // ----------------------------------------- // Session有効確認 // ----------------------------------------- if (sessionCheckTimer.Timeup()) { var tmp = EnqueueJob(async() => { BattleEntryManager.CheckSessions(WatchDogSession.Alive); MatchManager.CheckSessions(WatchDogSession.Alive); PgInvitationManager.ClearExpiredInvitations(); //Clear!! ExpiredInvitations var changedPlayers = PremadeGroupManager.CheckSessions(WatchDogSession.Alive); for (int i = 0; i < changedPlayers.Count; i++) { var player = changedPlayers[i]; await new evolib.Kvs.Models.ConnectionQueue(player.SessionId).EnqueueAsync( this.CreatePremadeGroupQueueData(player.PlayerId) ); } sessionCheckTimer.Start(); }); } // ----------------------------------------- // Auto Matchmake // ----------------------------------------- if (autoMatchmakeTimer.Timeup()) { var tmp = EnqueueJob(async() => { var enabledMatches = MatchManager.GatherMatches(m => { return (m.State == MatchState.Matching && m.Server.AutoMatchmakeTarget); }); enabledMatchesCnt = enabledMatches.Count; entriedPlayersCnt = BattleEntryManager.EntriedPlayersCount; if (VersionChecker.Get(VersionChecker.CheckTarget.EnabledMatchmake).Check()) { var limitPackagerVer = VersionChecker.Valued( VersionChecker.ReferenceSrc.PackageVersion, VersionChecker.LimitPackageVersion(VersionChecker.CheckTarget.Matchmake) ); var minMatchmakeEntriedPlayersNumber = MinMatchmakeEntriedPlayersNumber.Pop(null); using (var common2Db = DbContextFactory.CreateCommon2()) { minMatchmakeEntriedPlayersNumber = MinMatchmakeEntriedPlayersNumber.Pop( await common2Db.GenericDatas.FindAsync(GenericData.Type.MinMatchmakeEntriedPlayersNumber) ); } var result = matchMaker.MatchmakeForCBT1( enabledMatches.Count, BattleEntryManager.GetEntries(e => { return(limitPackagerVer <= e.MinPackageVersion); }, 5000), minMatchmakeEntriedPlayersNumber ); // Sort by entryTime. enabledMatches.Sort((a, b) => (a.Server.EntryTime < b.Server.EntryTime) ? -1 : 1); for (int i = 0; i < result.Count; i++) { var match = enabledMatches[i]; var matchmake = result[i]; var players = new Dictionary <string, long>(); foreach (var e in matchmake.Elements) { if (MatchManager.AssignPlayers( match.MatchId, e.Entry.Players, e.Side)) { BattleEntryManager.Cancel(e.Entry.EntryId, match.MatchId, evolib.BattleEntry.Type.Matching); foreach (var p in e.Entry.Players) { players[p.SessionId] = p.PlayerId; } } } foreach (var p in players) { await new ConnectionQueue(p.Key).EnqueueAsync( match.JoinBattleServer(p.Value) ); } await new ConnectionQueue(match.Server.SessionId).EnqueueAsync( match.MatchInfo() ); } } autoMatchmakeTimer.Start(); }); } // ----------------------------------------- // 同時接続数出力 // ----------------------------------------- if (generateSessionCntTimer.Timeup()) { var now = DateTime.UtcNow; var areaName = Settings.MatchingArea.ToString(); var total = 0; var breakDown = "{"; foreach (var cnt in WatchDogSession.ClientCounts) { total += cnt.Value; breakDown += $"{cnt.Key}:{cnt.Value},"; } breakDown += "}"; var currentSessionCount = new CurrentSessionCount(Settings.MatchingArea); currentSessionCount.Model.areaName = areaName; currentSessionCount.Model.count = total; currentSessionCount.Model.date = now; currentSessionCount.Model.breakDown = breakDown; currentSessionCount.Model.enabledMatchesCnt = enabledMatchesCnt; currentSessionCount.Model.entriedPlayersCnt = entriedPlayersCnt; await currentSessionCount.SaveAsync( TimeSpan.FromMilliseconds(generateSessionCntTimer.Interval * 2) ); if (LogSessionCntTimer.Timeup()) { Logger.Logging( new LogObj().AddChild(new LogModels.CurrentSessionCount { AreaName = areaName, Count = total, BreakDown = breakDown, Date = now, entriedPlayersCnt = entriedPlayersCnt, enabledMatchesCnt = enabledMatchesCnt, }) ); LogSessionCntTimer.Start(); } generateSessionCntTimer.Start(); } await Task.Delay(100); } }); }