public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (string.IsNullOrEmpty(arguments)) { battle.Respond(e, "You must specify a player name"); return(null); } target = battle.GetAllUserNames().FirstOrDefault(x => x.ToLower().Contains(arguments.ToLower())); if (target == null) { battle.Respond(e, "Player " + arguments + " not found!"); return(null); } if (target == battle.FounderName) { battle.Respond(e, "Cannot kick the host"); return(null); } if (e != null && battle.spring.IsRunning && battle.spring.LobbyStartContext?.Players.Any(x => x.Name == e.User && !x.IsSpectator) == false) { battle.Respond(e, "Only players can invoke this during a game"); return(null); } return($"Do you want to kick {target}?"); }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { map = string.IsNullOrEmpty(arguments) ? MapPicker.GetRecommendedMap(battle.GetContext()) : MapPicker.FindResources(ResourceType.Map, arguments, battle.MinimalMapSupportLevel).FirstOrDefault(); if (map == null) { battle.Respond(e, "Cannot find such map."); return(null); } else if (map.InternalName == battle.MapName) { battle.Respond(e, "Already on this map."); return(null); } else if (!string.IsNullOrEmpty(arguments) && map.MapSupportLevel < MapSupportLevel.Supported) { alternativeMap = MapPicker.FindResources(ResourceType.Map, arguments, MapSupportLevel.Supported).FirstOrDefault(); } if (map.MapSupportLevel >= MapSupportLevel.Supported) { return($"Change map to {map.InternalName} {GlobalConst.BaseSiteUrl}/Maps/Detail/{map.ResourceID} ?"); } else { return($"Change to UNSUPPORTED map {map.InternalName} {GlobalConst.BaseSiteUrl}/Maps/Detail/{map.ResourceID} ?"); } }
public override async Task ExecuteArmed(ServerBattle battle, Say e) { foreach (var grp in ServerBattle.Commands.Values.GroupBy(x => x.Access).OrderBy(x=>x.Key)) { await battle.Respond(e, $"=== {grp.Key} {grp.Key.Description()} ==="); foreach (var com in grp.OrderBy(x=>x.Shortcut)) await battle.Respond(e, $"!{com.Shortcut} {com.Help}"); await battle.Respond(e, $"==="); } }
public override async Task ExecuteArmed(ServerBattle battle, Say e) { if (games.Any()) { await battle.Respond(e, "---"); foreach (var map in games) await battle.Respond(e, map.ResourceID + ": " + map.InternalName); await battle.Respond(e, "---"); } else await battle.Respond(e, "no such game found"); }
public override async Task ExecuteArmed(ServerBattle battle, Say e) { if (engines.Any()) { await battle.Respond(e, "---"); foreach (var eng in engines) await battle.Respond(e, eng); await battle.Respond(e, "---"); } else await battle.Respond(e, "no such engine found"); }
private static Dictionary <string, string> GetOptionsDictionary(ServerBattle battle, Say e, string s) { var ret = new Dictionary <string, string>(); if (battle.HostedModInfo == null) { return(ret); } var pairs = s.Split(new[] { ',' }); if (pairs.Length == 0 || pairs[0].Length == 0) { battle.Respond(e, "requires key=value format"); return(ret); } foreach (var pair in pairs) { var parts = pair.Split(new[] { '=' }, 2); if (parts.Length != 2) { battle.Respond(e, "requires key=value format"); return(ret); } var key = parts[0].Trim(); //Trim() to make "key = value format" ignore whitespace var val = parts[1].Trim(); var found = false; var mod = battle.HostedModInfo; foreach (var o in mod.Options) { if (o.Key == key) { found = true; string res; if (o.GetPair(val, out res)) { ret[key] = val; } else { battle.Respond(e, "Value " + val + " is not valid for this option"); } break; } } if (!found) { battle.Respond(e, "No option called " + key + " found"); return(ret); } } return(ret); }
public override async Task ExecuteArmed(ServerBattle battle, Say e) { foreach (var grp in ServerBattle.Commands.Values.GroupBy(x => x.Access).OrderBy(x => x.Key)) { await battle.Respond(e, $"=== {grp.Key} {grp.Key.Description()} ==="); foreach (var com in grp.OrderBy(x => x.Shortcut)) { await battle.Respond(e, $"!{com.Shortcut} {com.Help}"); } await battle.Respond(e, $"==="); } }
public override async Task ExecuteArmed(ServerBattle battle, Say e) { var mod = battle.HostedModInfo; if (mod == null || mod.Options.Length == 0) { await battle.Respond(e, "this game has no options"); } else { foreach (var opt in mod.Options) { await battle.Respond(e, opt.ToString()); } } }
//Vote for an option, one-indexed public async Task <bool> Vote(Say e, int vote) { if (e == null) { return(false); } string ineligibilityReason = EligiblitySelector(e.User); if (ineligibilityReason == null && !Ended) { userVotes[e.User] = vote - 1; if (yesNoVote) { battle.SayGame(string.Format("Poll: {0} [!y={1}/{3}, !n={2}/{3}]", Topic, userVotes.Count(x => x.Value == 0), userVotes.Count(x => x.Value == 1), winCount)); } await battle.server.Broadcast(battle.Users.Keys, GetBattlePoll()); if (await CheckEnd(false)) { return(true); } } else { await battle.Respond(e, ineligibilityReason); return(false); } return(false); }
public override async Task ExecuteArmed(ServerBattle battle, Say e) { var b = battle; Dictionary<int, double> grouping; using (var db = new ZkDataContext()) { if (battle.IsInGame) grouping = b.spring.LobbyStartContext?.Players.Where(u => !u.IsSpectator) .GroupBy(u => u.AllyID) .ToDictionary(x => x.Key, x => x.Average(y => Account.AccountByName(db, y.Name).EffectiveMmElo)); else grouping = b.Users.Values.Where(u => !u.IsSpectator) .GroupBy(u => u.AllyNumber) .ToDictionary(x => x.Key, x => x.Average(y => y.LobbyUser.EffectiveMmElo)); } KeyValuePair<int, double>? oldg = null; foreach (var g in grouping) { if (oldg != null) { var t1elo = oldg.Value.Value; var t2elo = g.Value; await battle.Respond(e, $"team {oldg.Value.Key + 1} has {Utils.GetWinChancePercent(t2elo - t1elo)}% chance to win over team {g.Key + 1}"); } oldg = g; } }
public async Task <bool> Vote(Say e, bool vote) { if (e == null) { return(false); } string reason; if (command.GetRunPermissions(battle, e.User, out reason) >= BattleCommand.RunPermission.Vote && !Ended) { if (command.IsSpectator(battle, e.User, null)) { return(false); } userVotes[e.User] = vote; var yes = userVotes.Count(x => x.Value == true); var no = userVotes.Count(x => x.Value == false); await battle.SayBattle(string.Format("Poll: {0} [!y={1}/{3}, !n={2}/{3}]", question, yes, no, winCount)); if (await CheckEnd(false)) { return(true); } } else { await battle.Respond(e, reason); return(false); } return(false); }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (string.IsNullOrEmpty(arguments)) { battle.Respond(e, "You must specify a player name"); return null; } target = battle.GetAllUserNames().FirstOrDefault(x => x.Contains(arguments)); if (target == null) target = arguments; if (target == battle.FounderName) { battle.Respond(e, "Cannot kick the host"); return null; } return $"do you want to kick {target}?"; }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { Map = string.IsNullOrEmpty(arguments) ? MapPicker.GetRecommendedMap(battle.GetContext(), (battle.MinimalMapSupportLevel > MapSupportLevel.Featured) ? battle.MinimalMapSupportLevel : MapSupportLevel.Featured) : MapPicker.FindResources(ResourceType.Map, arguments, battle.MinimalMapSupportLevel, true).FirstOrDefault(); if (Map == null) { var unsupportedMap = MapPicker.FindResources(ResourceType.Map, arguments, MapSupportLevel.None).FirstOrDefault(); if (unsupportedMap != null) { if (battle.IsAutohost) { battle.Respond(e, $"The map {unsupportedMap.InternalName} {GlobalConst.BaseSiteUrl}/Maps/Detail/{unsupportedMap.ResourceID} is not available on this autohost. Play it in a player hosted battle."); } else { battle.Respond(e, $"The map {unsupportedMap.InternalName} {GlobalConst.BaseSiteUrl}/Maps/Detail/{unsupportedMap.ResourceID} is not supported. Unsupported maps can only be played on passworded hosts."); } } else { battle.Respond(e, "Cannot find such a map."); } return(null); } else if (Map.InternalName == battle.MapName) { battle.Respond(e, "Already on this map."); return(null); } else if (!string.IsNullOrEmpty(arguments) && Map.MapSupportLevel < MapSupportLevel.Supported) { alternativeMap = MapPicker.FindResources(ResourceType.Map, arguments, MapSupportLevel.Supported, true).FirstOrDefault(); } if (Map.MapSupportLevel >= MapSupportLevel.Supported) { return($"Change map to {Map.InternalName}?"); } else { return($"Change to UNSUPPORTED map {Map.InternalName}?"); } }
private static Dictionary<string, string> GetOptionsDictionary(ServerBattle battle, Say e, string s) { var ret = new Dictionary<string, string>(); if (battle.HostedModInfo == null) return ret; var pairs = s.Split(new[] { ',' }); if (pairs.Length == 0 || pairs[0].Length == 0) { battle.Respond(e, "requires key=value format"); return ret; } foreach (var pair in pairs) { var parts = pair.Split(new[] { '=' }, 2); if (parts.Length != 2) { battle.Respond(e, "requires key=value format"); return ret; } var key = parts[0].Trim(); //Trim() to make "key = value format" ignore whitespace var val = parts[1].Trim(); var found = false; var mod = battle.HostedModInfo; foreach (var o in mod.Options) { if (o.Key == key) { found = true; string res; if (o.GetPair(val, out res)) { ret[key] = val; } else battle.Respond(e, "Value " + val + " is not valid for this option"); break; } } if (!found) { battle.Respond(e, "No option called " + key + " found"); return ret; } } return ret; }
public override async Task ExecuteArmed(ServerBattle battle, Say e) { if (engines.Any()) { await battle.Respond(e, "---"); foreach (var eng in engines) { await battle.Respond(e, eng); } await battle.Respond(e, "---"); } else { await battle.Respond(e, "no such engine found"); } }
public override async Task ExecuteArmed(ServerBattle battle, Say e) { if (maps.Any()) { await battle.Respond(e, "---"); foreach (var map in maps) { await battle.Respond(e, map.ResourceID + ": " + map.InternalName); } await battle.Respond(e, "---"); } else { await battle.Respond(e, "no such map found"); } }
public override async Task ExecuteArmed(ServerBattle battle, Say e) { if (!battle.toNotify.Contains(e.User)) { battle.toNotify.Add(e.User); } await battle.Respond(e, "I will notify you when the game ends."); }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (string.IsNullOrEmpty(arguments)) { battle.Respond(e, "Pick a command to poll, e.g. !poll map tabula"); return null; } var parts = arguments.Split(new[] { ' ' }, 2); var commandName = parts[0] ?? ""; var commandArgs = parts.Length > 1 ? parts[1] : null; commandToRun = battle.GetCommandByName(commandName); if (commandToRun.GetRunPermissions(battle, e.User) >= RunPermission.Vote) { return commandToRun.Arm(battle, e, commandArgs); } battle.Respond(e, "You cannot poll this"); return null; }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (!battle.IsMatchMakerBattle) { battle.Respond(e, "Not a matchmaker battle, cannot predict"); return(null); } return(string.Empty); }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { this.gameName = arguments; if ((battle.Mode != AutohostMode.None || !battle.IsPassworded) && arguments != "zk:stable") { battle.Respond(e, $"You can only do this on custom passworded hosts."); return(null); } if (string.IsNullOrEmpty(arguments)) { battle.Respond(e, "Please specify game name."); return(null); } return($"Force change game to ?"); }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (battle.IsMatchMakerBattle || battle.ApplicableRating != RatingCategory.Casual) { battle.Respond(e, "Only casual battles may have clan balance toggled"); return(null); } return(string.Empty); }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (battle.IsMatchMakerBattle || battle.ApplicableRating != RatingCategory.Casual) { battle.Respond(e, "Only casual battles be repurposed as autohosts"); return(null); } return(string.Empty); }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (!battle.IsMatchMakerBattle) { battle.Respond(e, "Not a matchmaker battle, cannot predict"); return null; } return string.Empty; }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (string.IsNullOrEmpty(arguments)) { battle.Respond(e, "Pick a command to poll, e.g. !poll map tabula"); return(null); } var parts = arguments.Split(new[] { ' ' }, 2); var commandName = parts[0] ?? ""; var commandArgs = parts.Length > 1 ? parts[1] : null; commandToRun = battle.GetCommandByName(commandName); if (commandToRun.GetRunPermissions(battle, e.User) >= RunPermission.Vote && commandToRun.Access != AccessType.NoCheck) { return(commandToRun.Arm(battle, e, commandArgs)); } battle.Respond(e, "You cannot poll this"); return(null); }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (DateTime.UtcNow.Subtract(battle.spring.IngameStartTime ?? DateTime.UtcNow).TotalSeconds < GlobalConst.MinDurationForElo) { battle.Respond(e, "You cannot resign so early"); return null; } var voteStarter = battle.spring.LobbyStartContext?.Players.FirstOrDefault(x => x.Name == e.User && !x.IsSpectator); if (voteStarter != null) { alliance = voteStarter.AllyID; return $"Resign team {voteStarter.AllyID + 1}?"; } else { battle.Respond(e, "Only players can invoke this"); } return null; }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (string.IsNullOrEmpty(arguments)) { battle.Respond(e, "You must specify a player name"); return(null); } target = battle.GetAllUserNames().FirstOrDefault(x => x.Contains(arguments)); if (target == null) { target = arguments; } if (target == battle.FounderName) { battle.Respond(e, "Cannot kick the host"); return(null); } return($"do you want to kick {target}?"); }
public async Task <bool> Vote(Say e, bool vote) { string reason; if (command.GetRunPermissions(battle, e.User, out reason) >= BattleCommand.RunPermission.Vote && !ended) { if (command.IsSpectator(battle, e.User, null)) { return(false); } userVotes[e.User] = vote; var yes = userVotes.Count(x => x.Value == true); var no = userVotes.Count(x => x.Value == false); if (yes >= winCount) { ended = true; } await battle.SayBattle(string.Format("Poll: {0} [!y={1}/{3}, !n={2}/{3}]", question, yes, no, winCount)); if (yes >= winCount) { ended = true; await battle.SayBattle($"Poll: {question} [END:SUCCESS]"); if (command.Access == BattleCommand.AccessType.NotIngame && battle.spring.IsRunning) { return(true); } if (command.Access == BattleCommand.AccessType.Ingame && !battle.spring.IsRunning) { return(true); } await command.ExecuteArmed(battle, Creator); return(true); } else if (no >= winCount) { await End(); return(true); } } else { await battle.Respond(e, reason); return(false); } return(false); }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (DateTime.UtcNow.Subtract(battle.spring.IngameStartTime ?? DateTime.UtcNow).TotalSeconds < GlobalConst.MinDurationForElo) { battle.Respond(e, "You cannot resign so early"); return(null); } var voteStarter = battle.spring.LobbyStartContext?.Players.FirstOrDefault(x => x.Name == e.User && !x.IsSpectator); if (voteStarter != null) { alliance = voteStarter.AllyID; return($"Resign team {voteStarter.AllyID + 1}?"); } else { battle.Respond(e, "Only players can invoke this"); } return(null); }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (string.IsNullOrEmpty(arguments)) { battle.Respond(e, "Pick a command to poll, e.g. !poll map tabula"); return(null); } var parts = arguments.Split(new[] { ' ' }, 2); var commandName = parts[0] ?? ""; var commandArgs = parts.Length > 1 ? parts[1] : null; commandToRun = battle.GetCommandByName(commandName); string reason; if (commandToRun.GetRunPermissions(battle, e.User, out reason) >= RunPermission.Vote && commandToRun.Access != AccessType.NoCheck && commandToRun.Access != AccessType.Admin && !(commandToRun.Access == AccessType.NotIngameNotAutohost && battle.IsAutohost)) { return(commandToRun.Arm(battle, e, commandArgs)); } battle.Respond(e, reason); return(null); }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (string.IsNullOrEmpty(arguments)) { battle.Respond(e, "please specify options"); return null; } optionsAsString = arguments; options = GetOptionsDictionary(battle, e, arguments); if (options.Count == 0) return null; return $"Set options {arguments} ?"; }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (string.IsNullOrEmpty(arguments)) { arguments = battle.server.Game ?? GlobalConst.DefaultZkTag; } game = MapPicker.FindResources(ResourceType.Mod, arguments).FirstOrDefault(); if ((battle.Mode != AutohostMode.None || !battle.IsPassworded) && arguments != "zk:stable" && !battle.IsAutohost) { battle.Respond(e, $"You can only do this on custom passworded hosts."); return(null); } if (game == null) { battle.Respond(e, "Cannot find such game."); return(null); } return($"Change game to {game.RapidTag} {game.InternalName}?"); }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (string.IsNullOrEmpty(arguments)) arguments = battle.server.Game ?? "zk:stable"; game = MapPicker.FindResources(ResourceType.Mod, arguments).FirstOrDefault(); if (game == null) { battle.Respond(e, "Cannot find such game."); return null; } return $"Change game to {game.RapidTag} {game.InternalName}?"; }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { engine = string.IsNullOrEmpty(arguments) ? battle.server.Engine : arguments; if ((battle.Mode != AutohostMode.None || !battle.IsPassworded) && engine != battle.server.Engine) { battle.Respond(e, $"You cannot change engine to version other than {battle.server.Engine} here, use custom passworded room"); return(null); } if (!battle.server.SpringPaths.HasEngineVersion(engine)) { var serv = GlobalConst.GetContentService(); // TODO this can be done directly, we are in server if (!serv.GetEngineList(null).Any(x => x == engine)) { battle.Respond(e, "Engine not found"); return(null); } battle.server.Downloader.GetResource(DownloadType.ENGINE, engine); } return($"Change engine to {engine}?"); }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { engine = string.IsNullOrEmpty(arguments) ? battle.server.Engine : arguments; if (battle.Mode != AutohostMode.None && engine != battle.server.Engine) { battle.Respond(e, $"You cannot change engine to version other than {battle.server.Engine} here, use custom room"); return null; } if (!battle.server.SpringPaths.HasEngineVersion(engine)) { var serv = GlobalConst.GetContentService(); // TODO this can be done directly, we are in server if (!serv.GetEngineList(null).Any(x => x == engine)) { battle.Respond(e, "Engine not found"); return null; } battle.server.Downloader.GetResource(DownloadType.ENGINE, engine); } return $"Change engine to {engine}?"; }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { map = string.IsNullOrEmpty(arguments) ? MapPicker.GetRecommendedMap(battle.GetContext()) : MapPicker.FindResources(ResourceType.Map, arguments).FirstOrDefault(); if (map == null) { battle.Respond(e, "Cannot find such map."); return null; } return $"Change map to {map.InternalName} {GlobalConst.BaseSiteUrl}/Maps/Detail/{map.ResourceID} ?"; }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { map = string.IsNullOrEmpty(arguments) ? MapPicker.GetRecommendedMap(battle.GetContext()) : MapPicker.FindResources(ResourceType.Map, arguments).FirstOrDefault(); if (map == null) { battle.Respond(e, "Cannot find such map."); return(null); } return($"Change map to {map.InternalName} {GlobalConst.BaseSiteUrl}/Maps/Detail/{map.ResourceID} ?"); }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (battle.Mode != AutohostMode.None) { battle.Respond(e, $"Balance is only for custom hosts, this host is {battle.Mode.Description()}"); return null; } if (arguments != null) { int tc; if (int.TryParse(arguments, out tc)) teamCount = tc; } return $"Do you want to balance {teamCount}"; }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (string.IsNullOrEmpty(arguments)) { battle.Respond(e, "please specify options"); return(null); } optionsAsString = arguments; options = GetOptionsDictionary(battle, e, arguments); if (options.Count == 0) { return(null); } return($"Set options {arguments} ?"); }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (string.IsNullOrEmpty(arguments)) { target = null; return($"do you want to spectate AFK?"); } target = battle.GetAllUserNames().FirstOrDefault(x => x.Contains(arguments)); if (target == null) { battle.Respond(e, "Player not found"); return(null); } return($"do you want to spectate {target}?"); }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (string.IsNullOrEmpty(arguments)) { target = null; return $"do you want to spectate AFK?"; } target = battle.GetAllUserNames().FirstOrDefault(x => x.Contains(arguments)); if (target == null) { battle.Respond(e, "Player not found"); return null; } return $"do you want to spectate {target}?"; }
public override string Arm(ServerBattle battle, Say e, string arguments = null) { if (battle.Mode != AutohostMode.None) { battle.Respond(e, $"Balance is only for custom hosts, this host is {battle.Mode.Description()}"); return(null); } if (arguments != null) { int tc; if (int.TryParse(arguments, out tc)) { teamCount = tc; } } return($"Do you want to balance {teamCount} ?"); }
public override async Task ExecuteArmed(ServerBattle battle, Say e) { var b = battle; Dictionary <int, double> grouping; using (var db = new ZkDataContext()) { if (battle.IsInGame) { grouping = b.spring.LobbyStartContext?.Players.Where(u => !u.IsSpectator) .GroupBy(u => u.AllyID) .ToDictionary(x => x.Key, x => x.Average(y => RatingSystems.DisableRatingSystems ? Account.AccountByName(db, y.Name).BestEffectiveElo : Account.AccountByName(db, y.Name).GetBestRating().Elo)); } else { grouping = b.Users.Values.Where(u => !u.IsSpectator) .GroupBy(u => u.AllyNumber) .ToDictionary(x => x.Key, x => x.Average(y => Math.Max(y.LobbyUser.EffectiveMmElo, y.LobbyUser.EffectiveElo))); } } KeyValuePair <int, double>?oldg = null; foreach (var g in grouping) { if (oldg != null) { var t1elo = oldg.Value.Value; var t2elo = g.Value; await battle.Respond(e, $"team {oldg.Value.Key + 1} has {Utils.GetWinChancePercent(t2elo - t1elo)}% chance to win over team {g.Key + 1}"); } oldg = g; } }
public override async Task ExecuteArmed(ServerBattle battle, Say e) { if (!battle.toNotify.Contains(e.User)) battle.toNotify.Add(e.User); await battle.Respond(e, "I will notify you when the game ends."); }
public override async Task ExecuteArmed(ServerBattle battle, Say e) { var mod = battle.HostedModInfo; if (mod == null || mod.Options.Length == 0) await battle.Respond(e, "this game has no options"); else foreach (var opt in mod.Options) await battle.Respond(e, opt.ToString()); }