public static string SubmitSpringBattleResult(Spring.SpringBattleContext result, ZkLobbyServer.ZkLobbyServer server) { try { if (!result.GameEndedOk) return "Game didn't end properly"; if (result.IsCheating) return "Cheats were enabled during this game"; var db = new ZkDataContext(); var text = new StringBuilder(); var sb = SaveSpringBattle(result, db); ProcessExtras(result.OutputExtras, sb, db); if (result.LobbyStartContext.Mode == AutohostMode.Planetwars) ProcessPlanetWars(result, server, sb, db, text); ProcessElos(result, server, db, sb); text.AppendLine(string.Format("BATTLE DETAILS AND REPLAY ----> {1}/Battles/Detail/{0} <-----", sb.SpringBattleID, GlobalConst.BaseSiteUrl)); return text.ToString(); } catch (Exception ex) { var data = JsonConvert.SerializeObject(result); Trace.TraceError($"{ex}\nData:\n{data}"); return $"{ex}\nData:\n{data}"; } }
public BattleListUpdater(ZkLobbyServer server) { this.server = server; timer = new Timer(UpdateIntervalSeconds*1000); timer.Elapsed += TimerOnElapsed; timer.Start(); }
public ZkServerTraceListener(ZkLobbyServer zkLobbyServer = null) { using (var db = new ZkDataContext()) { var oldEntry = DateTime.UtcNow.AddDays(-14); db.Database.ExecuteSqlCommand("delete from LogEntries where Time < {0}", oldEntry); } this.ZkLobbyServer = zkLobbyServer; }
public ChannelManager(ZkLobbyServer server) { this.server = server; using (var db = new ZkDataContext()) { factionChannels = new ConcurrentDictionary<string, Faction>(db.Factions.Where(x => !x.IsDeleted).ToDictionary(x => x.Shortcut, x => x)); clanChannels = new ConcurrentDictionary<string, Clan>(db.Clans.Where(x => !x.IsDeleted).ToList().ToDictionary(x => x.GetClanChannel(), x => x)); } }
public ChatRelay(ZkLobbyServer zkServer, string password, List<string> channels) { this.zkServer = zkServer; this.springTas = new TasClient(null, "ChatRelay", 0); this.channels = channels; springTas.LoginAccepted += OnSpringTasLoginAccepted; springTas.Said += OnSpringTasSaid; zkServer.Said += OnZkServerSaid; SetupSpringTasConnection(password); }
public PlanetWarsMatchMaker(ZkLobbyServer.ZkLobbyServer tas) { AttackOptions = new List<AttackOption>(); RunningBattles = new Dictionary<string, AttackOption>(); var db = new ZkDataContext(); pwHostName = db.AutohostConfigs.First(x => x.AutohostMode == AutohostMode.Planetwars).Login.TrimNumbers(); Galaxy gal = db.Galaxies.First(x => x.IsDefault); factions = db.Factions.Where(x => !x.IsDeleted).ToList(); MatchMakerState dbState = null; if (gal.MatchMakerState != null) { try { dbState = JsonConvert.DeserializeObject<MatchMakerState>(gal.MatchMakerState); } catch (Exception ex) { Trace.TraceError(ex.ToString()); } } if (dbState != null) { AttackerSideCounter = dbState.AttackerSideCounter; AttackOptions = dbState.AttackOptions; Challenge = dbState.Challenge; ChallengeTime = dbState.ChallengeTime; AttackerSideChangeTime = dbState.AttackerSideChangeTime; RunningBattles = dbState.RunningBattles; } else { AttackerSideCounter = gal.AttackerSideCounter; AttackerSideChangeTime = gal.AttackerSideChangeTime ?? DateTime.UtcNow; } // TODO reimplement this // this.tas = tas; // tas.PreviewSaid += TasOnPreviewSaid; // tas.UserRemoved += TasOnUserRemoved; // tas.ChannelUserAdded += TasOnChannelUserAdded; // tas.ChannelJoined += (sender, args) => { if (args.Name == "extension") tas.Extensions.SendJsonData(GenerateLobbyCommand()); }; timer = new Timer(10000); timer.AutoReset = true; timer.Elapsed += TimerOnElapsed; timer.Start(); }
public MatchMakerBattle(ZkLobbyServer server, MatchMaker.ProposedBattle bat) : base(server, null) { IsMatchMakerBattle = true; EngineVersion = server.Engine; ModName = server.Game; FounderName = "MatchMaker #" + BattleID; Title = "MatchMaker " + BattleID; Mode = bat.QueueType.Mode; MaxPlayers = bat.Size; Prototype = bat; foreach (var pe in bat.Players) Users[pe.Name] = new UserBattleStatus(pe.Name, pe.LobbyUser, Guid.NewGuid().ToString()); ValidateAndFillDetails(); }
public MatchMaker(ZkLobbyServer server) { this.server = server; using (var db = new ZkDataContext()) { possibleQueues.Add(new MatchMakerSetup.Queue() { Name = "Teams", Description = "Small teams 2v2 to 4v4 with reasonable skill difference", MaxPartySize = 4, MinSize = 4, MaxSize = 8, Game = server.Game, Mode = AutohostMode.Teams, Maps = db.Resources.Where( x => (x.MapSupportLevel >= MapSupportLevel.MatchMaker) && (x.MapIsTeams == true) && (x.TypeID == ResourceType.Map)) .Select(x => x.InternalName) .ToList() }); possibleQueues.Add(new MatchMakerSetup.Queue() { Name = "1v1", Description = "Duels with reasonable skill difference", MaxPartySize = 1, MinSize = 2, MaxSize = 2, Game = server.Game, Maps = db.Resources.Where( x => (x.MapSupportLevel >= MapSupportLevel.MatchMaker) && (x.MapIs1v1 == true) && (x.TypeID == ResourceType.Map)) .Select(x => x.InternalName) .ToList(), Mode = AutohostMode.Game1v1, }); } timer = new Timer(TimerSeconds * 1000); timer.AutoReset = true; timer.Elapsed += TimerTick; timer.Start(); queuesCounts = CountQueuedPeople(players.Values); ingameCounts = CountIngamePeople(); }
private static void ProcessElos(Spring.SpringBattleContext result, ZkLobbyServer.ZkLobbyServer server, ZkDataContext db, SpringBattle sb) { bool noElo = result.OutputExtras.Any(x => x?.StartsWith("noElo", true, System.Globalization.CultureInfo.CurrentCulture) == true); Dictionary<int, int> orgLevels = sb.SpringBattlePlayers.Select(x => x.Account).ToDictionary(x => x.AccountID, x => x.Level); sb.CalculateAllElo(noElo); foreach (var u in sb.SpringBattlePlayers.Where(x => !x.IsSpectator)) u.Account.CheckLevelUp(); db.SaveChanges(); try { foreach (Account a in sb.SpringBattlePlayers.Where(x => !x.IsSpectator).Select(x => x.Account)) server.PublishAccountUpdate(a); } catch (Exception ex) { Trace.TraceError("error updating extension data: {0}", ex); } foreach (Account account in sb.SpringBattlePlayers.Select(x => x.Account)) { if (account.Level > orgLevels[account.AccountID]) { try { string message = string.Format("Congratulations {0}! You just leveled up to level {1}. {3}/Users/Detail/{2}", account.Name, account.Level, account.AccountID, GlobalConst.BaseSiteUrl); //text.AppendLine(message); server.GhostPm(account.Name, message); } catch (Exception ex) { Trace.TraceError("Error sending level up lobby message: {0}", ex); } } } }
public MatchMaker(ZkLobbyServer server) { this.server = server; using (var db = new ZkDataContext()) { possibleQueues.Add(new MatchMakerSetup.Queue() { Name = "4v4", Description = "Play 4v4 with players of similar skill.", MaxPartySize = 4, MinSize = 8, MaxSize = 8, EloCutOffExponent = 0.96, Game = server.Game, Mode = AutohostMode.Teams, Maps = db.Resources.Where( x => (x.MapSupportLevel >= MapSupportLevel.MatchMaker) && (x.MapIsTeams == true) && (x.TypeID == ResourceType.Map)) .Select(x => x.InternalName) .ToList() }); possibleQueues.Add(new MatchMakerSetup.Queue() { Name = "3v3", Description = "Play 3v3 with players of similar skill.", MaxPartySize = 3, MinSize = 6, MaxSize = 6, EloCutOffExponent = 0.965, Game = server.Game, Mode = AutohostMode.Teams, Maps = db.Resources.Where( x => (x.MapSupportLevel >= MapSupportLevel.MatchMaker) && (x.MapIsTeams == true) && (x.TypeID == ResourceType.Map)) .Select(x => x.InternalName) .ToList() }); possibleQueues.Add(new MatchMakerSetup.Queue() { Name = "2v2", Description = "Play 2v2 with players of similar skill.", MaxPartySize = 2, MinSize = 4, MaxSize = 4, EloCutOffExponent = 0.97, Game = server.Game, Mode = AutohostMode.Teams, Maps = db.Resources.Where( x => (x.MapSupportLevel >= MapSupportLevel.MatchMaker) && (x.MapIsTeams == true) && (x.TypeID == ResourceType.Map)) .Select(x => x.InternalName) .ToList() }); possibleQueues.Add(new MatchMakerSetup.Queue() { Name = "1v1", Description = "Duel an opponent of similar skill in a 1v1 match.", MaxPartySize = 1, MinSize = 2, MaxSize = 2, EloCutOffExponent = 0.98, Game = server.Game, Maps = db.Resources.Where( x => (x.MapSupportLevel >= MapSupportLevel.MatchMaker) && (x.MapIs1v1 == true) && (x.TypeID == ResourceType.Map)) .Select(x => x.InternalName) .ToList(), Mode = AutohostMode.Game1v1, }); } timer = new Timer(TimerSeconds * 1000); timer.AutoReset = true; timer.Elapsed += TimerTick; timer.Start(); queuesCounts = CountQueuedPeople(players.Values); ingameCounts = CountIngamePeople(); }
public PartyManager(ZkLobbyServer zkLobbyServer) { server = zkLobbyServer; }
public static BattleDebriefing SubmitSpringBattleResult(SpringBattleContext result, ZkLobbyServer.ZkLobbyServer server) { var ret = new BattleDebriefing(); try { if (!result.GameEndedOk) { ret.Message = "Game didn't end properly"; return ret; } if (result.IsCheating) { ret.Message = "Cheats were enabled during this game"; return ret; } var db = new ZkDataContext(); var text = new StringBuilder(); var sb = SaveSpringBattle(result, db); ProcessExtras(result.OutputExtras, sb, db); if (result.LobbyStartContext.Mode == AutohostMode.Planetwars) ProcessPlanetWars(result, server, sb, db, text); Dictionary<int, int> orgLevels = sb.SpringBattlePlayers.Select(x => x.Account).ToDictionary(x => x.AccountID, x => x.Level); ProcessElos(result, server, db, sb); ret.Url = string.Format("{1}/Battles/Detail/{0}", sb.SpringBattleID, GlobalConst.BaseSiteUrl); ret.ServerBattleID = sb.SpringBattleID; server.GhostSay( new Say() { Text = string.Format("BATTLE DETAILS AND REPLAY ----> {0} <-----", ret.Url), IsEmote = true, Place = SayPlace.Battle, User = GlobalConst.NightwatchName }, result.LobbyStartContext.BattleID); foreach (var p in sb.SpringBattlePlayers.Where(x=>!x.IsSpectator)) { ret.DebriefingUsers[p.Account.Name] = new BattleDebriefing.DebriefingUser() { LoseTime = p.LoseTime, AllyNumber = p.AllyNumber, IsInVictoryTeam = p.IsInVictoryTeam, EloChange = p.EloChange, XpChange = p.XpChange, IsLevelUp = orgLevels[p.AccountID] < p.Account.Level, Awards = sb.AccountBattleAwards.Where(x=>x.AccountID == p.AccountID).Select(x=> new BattleDebriefing.DebriefingAward() { Value = x.Value, Key = x.AwardKey, Description = x.AwardDescription }).ToList() }; } return ret; } catch (Exception ex) { var data = JsonConvert.SerializeObject(result); Trace.TraceError($"{ex}\nData:\n{data}"); ret.Message = "Error processing game result: " + ex.Message; return ret; } }
public ServerTextCommands(ZkLobbyServer server) { this.server = server; server.Said += OnZkServerSaid; }
public LoginChecker(ZkLobbyServer state, string geoipPath) { this.state = state; geoIP = new DatabaseReader(Path.Combine(geoipPath, "GeoLite2-Country.mmdb"), FileAccessMode.Memory); }
public ServerRunner(string geoIPpath, IPlanetwarsEventCreator creator, ITopPlayerProvider topPlayerProvider) { ZkLobbyServer = new ZkLobbyServer(geoIPpath, creator, topPlayerProvider); }
static void SpecPlayerOnCondition(PlayerTeam player, Account account, string userMessage, ZkLobbyServer.ZkLobbyServer server) { player.IsSpectator = true; server.GhostPm(account.Name, userMessage); }
private static void ProcessElos(SpringBattleContext result, ZkLobbyServer.ZkLobbyServer server, ZkDataContext db, SpringBattle sb) { bool noElo = result.OutputExtras.Any(x => x?.StartsWith("noElo", true, System.Globalization.CultureInfo.CurrentCulture) == true); sb.CalculateAllElo(noElo); foreach (var u in sb.SpringBattlePlayers.Where(x => !x.IsSpectator)) u.Account.CheckLevelUp(); db.SaveChanges(); try { foreach (Account a in sb.SpringBattlePlayers.Where(x => !x.IsSpectator).Select(x => x.Account)) server.PublishAccountUpdate(a); } catch (Exception ex) { Trace.TraceError("error updating extension data: {0}", ex); } }
private static void ProcessPlanetWars(Spring.SpringBattleContext result, ZkLobbyServer.ZkLobbyServer server, SpringBattle sb, ZkDataContext db, StringBuilder text) { if (result.LobbyStartContext.Mode != AutohostMode.Planetwars || sb.PlayerCount < 2 || sb.Duration >= GlobalConst.MinDurationForPlanetwars) return; List<int> winnerTeams = sb.SpringBattlePlayers.Where(x => x.IsInVictoryTeam && !x.IsSpectator).Select(x => x.AllyNumber).Distinct().ToList(); int? winNum = null; if (winnerTeams.Count == 1) { winNum = winnerTeams[0]; if (winNum > 1) winNum = null; } PlanetWarsTurnHandler.EndTurn(result.LobbyStartContext.Map, result.OutputExtras, db, winNum, sb.SpringBattlePlayers.Where(x => !x.IsSpectator).Select(x => x.Account).ToList(), text, sb, sb.SpringBattlePlayers.Where(x => !x.IsSpectator && x.AllyNumber == 0).Select(x => x.Account).ToList(), server.PlanetWarsEventCreator); // TODO HACK Global.PlanetWarsMatchMaker.RemoveFromRunningBattles(context.AutohostName); }
public ServerRunner(string geoIPpath) { ZkLobbyServer = new ZkLobbyServer(geoIPpath); }