Esempio n. 1
0
        public async Task CreateWar(int size, [Remainder] string enemyClan = null)
        {
            if (!(Context.User as IGuildUser).GuildPermissions.ManageChannels)
            {
                return;
            }

            if (string.IsNullOrWhiteSpace(enemyClan))
            {
                return;
            }

            if (size < 10 || size > 50 || size % 5 != 0)
            {
                await ReplyErrorLocalized("invalid_size").ConfigureAwait(false);

                return;
            }
            List <ClashWar> wars;

            if (!ClashWars.TryGetValue(Context.Guild.Id, out wars))
            {
                wars = new List <ClashWar>();
                if (!ClashWars.TryAdd(Context.Guild.Id, wars))
                {
                    return;
                }
            }


            var cw = await CreateWar(enemyClan, size, Context.Guild.Id, Context.Channel.Id);

            wars.Add(cw);
            await ReplyErrorLocalized("war_created", cw.ShortPrint()).ConfigureAwait(false);
        }
Esempio n. 2
0
        public async Task CreateWar(int size, [Remainder] string enemyClan = null)
        {
            if (!(Context.User as IGuildUser).GuildPermissions.ManageChannels)
            {
                return;
            }

            if (string.IsNullOrWhiteSpace(enemyClan))
            {
                return;
            }

            if (size < 10 || size > 50 || size % 5 != 0)
            {
                await Context.Channel.SendErrorAsync("πŸ”° Not a Valid war size").ConfigureAwait(false);

                return;
            }
            List <ClashWar> wars;

            if (!ClashWars.TryGetValue(Context.Guild.Id, out wars))
            {
                wars = new List <ClashWar>();
                if (!ClashWars.TryAdd(Context.Guild.Id, wars))
                {
                    return;
                }
            }


            var cw = await CreateWar(enemyClan, size, Context.Guild.Id, Context.Channel.Id);

            wars.Add(cw);
            await Context.Channel.SendConfirmAsync($"β—πŸ”°**CREATED CLAN WAR AGAINST {cw.ShortPrint()}**").ConfigureAwait(false);
        }
Esempio n. 3
0
        private Tuple <List <ClashWar>, int> GetInfo(CommandEventArgs e)
        {
            //check if there are any wars
            List <ClashWar> wars = null;

            ClashWars.TryGetValue(e.Server.Id, out wars);
            if (wars == null || wars.Count == 0)
            {
                return(null);
            }
            // get the number of the war
            int num;

            if (string.IsNullOrWhiteSpace(e.GetArg("number")))
            {
                num = 0;
            }
            else if (!int.TryParse(e.GetArg("number"), out num) || num > wars.Count)
            {
                return(null);
            }
            num -= 1;
            //get the actual war
            return(new Tuple <List <ClashWar>, int>(wars, num));
        }
Esempio n. 4
0
        private static Tuple <List <ClashWar>, int> GetWarInfo(IGuild guild, int num)
        {
            List <ClashWar> wars = null;

            ClashWars.TryGetValue(guild.Id, out wars);
            if (wars == null || wars.Count == 0)
            {
                return(null);
            }
            // get the number of the war
            else if (num < 1 || num > wars.Count)
            {
                return(null);
            }
            num -= 1;
            //get the actual war
            return(new Tuple <List <ClashWar>, int>(wars, num));
        }
Esempio n. 5
0
        public async Task ListWar([Remainder] string number = null)
        {
            // if number is null, print all wars in a short way
            if (string.IsNullOrWhiteSpace(number))
            {
                //check if there are any wars
                List <ClashWar> wars = null;
                ClashWars.TryGetValue(Context.Guild.Id, out wars);
                if (wars == null || wars.Count == 0)
                {
                    await ReplyErrorLocalized("no_active_wars").ConfigureAwait(false);

                    return;
                }

                var sb = new StringBuilder();
                sb.AppendLine("**-------------------------**");
                for (var i = 0; i < wars.Count; i++)
                {
                    sb.AppendLine($"**#{i + 1}.**  `{GetText("enemy")}:` **{wars[i].EnemyClan}**");
                    sb.AppendLine($"\t\t`{GetText("size")}:` **{wars[i].Size} v {wars[i].Size}**");
                    sb.AppendLine("**-------------------------**");
                }
                await Context.Channel.SendConfirmAsync(GetText("list_active_wars"), sb.ToString()).ConfigureAwait(false);

                return;
            }
            var num = 0;

            int.TryParse(number, out num);
            //if number is not null, print the war needed
            var warsInfo = GetWarInfo(Context.Guild, num);

            if (warsInfo == null)
            {
                await ReplyErrorLocalized("war_not_exist").ConfigureAwait(false);

                return;
            }
            var war = warsInfo.Item1[warsInfo.Item2];
            await Context.Channel.SendConfirmAsync(war.Localize("info_about_war", $"`{war.EnemyClan}` ({war.Size} v {war.Size})"), war.ToPrettyString()).ConfigureAwait(false);
        }
Esempio n. 6
0
        public async Task ListWar([Remainder] string number = null)
        {
            // if number is null, print all wars in a short way
            if (string.IsNullOrWhiteSpace(number))
            {
                //check if there are any wars
                List <ClashWar> wars = null;
                ClashWars.TryGetValue(Context.Guild.Id, out wars);
                if (wars == null || wars.Count == 0)
                {
                    await Context.Channel.SendErrorAsync("πŸ”° **No active wars.**").ConfigureAwait(false);

                    return;
                }

                var sb = new StringBuilder();
                sb.AppendLine("πŸ”° **LIST OF ACTIVE WARS**");
                sb.AppendLine("**-------------------------**");
                for (var i = 0; i < wars.Count; i++)
                {
                    sb.AppendLine($"**#{i + 1}.**  `Enemy:` **{wars[i].EnemyClan}**");
                    sb.AppendLine($"\t\t`Size:` **{wars[i].Size} v {wars[i].Size}**");
                    sb.AppendLine("**-------------------------**");
                }
                await Context.Channel.SendConfirmAsync(sb.ToString()).ConfigureAwait(false);

                return;
            }
            var num = 0;

            int.TryParse(number, out num);
            //if number is not null, print the war needed
            var warsInfo = GetWarInfo(Context.Guild, num);

            if (warsInfo == null)
            {
                await Context.Channel.SendErrorAsync("πŸ”° **That war does not exist.**").ConfigureAwait(false);

                return;
            }
            await Context.Channel.SendConfirmAsync(warsInfo.Item1[warsInfo.Item2].ToPrettyString()).ConfigureAwait(false);
        }
Esempio n. 7
0
        public override Func <CommandEventArgs, Task> DoFunc() => async e => {
            if (!e.User.ServerPermissions.ManageChannels)
            {
                return;
            }
            List <ClashWar> wars;
            if (!ClashWars.TryGetValue(e.Server.Id, out wars))
            {
                wars = new List <ClashWar>();
                if (!ClashWars.TryAdd(e.Server.Id, wars))
                {
                    return;
                }
            }
            string enemyClan = e.GetArg("enemy_clan");
            if (string.IsNullOrWhiteSpace(enemyClan))
            {
                return;
            }
            int size;
            if (!int.TryParse(e.GetArg("size"), out size) || size < 10 || size > 50 || size % 5 != 0)
            {
                await e.Channel.SendMessage("πŸ’’πŸ”° Not a Valid war size");

                return;
            }
            var cw = new ClashWar(enemyClan, size, e);
            //cw.Start();
            wars.Add(cw);
            cw.OnUserTimeExpired += async(u) => {
                await e.Channel.SendMessage($"β—πŸ”°**Claim from @{u} for a war against {cw.ShortPrint()} has expired.**");
            };
            cw.OnWarEnded += async() => {
                await e.Channel.SendMessage($"β—πŸ”°**War against {cw.ShortPrint()} ended.**");
            };
            await e.Channel.SendMessage($"β—πŸ”°**CREATED CLAN WAR AGAINST {cw.ShortPrint()}**");

            //war with the index X started.
        };
Esempio n. 8
0
        public override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(prefix + "createwar")
            .Alias(prefix + "cw")
            .Description($"Creates a new war by specifying a size (>10 and multiple of 5) and enemy clan name.\n**Usage**:{prefix}cw 15 The Enemy Clan")
            .Parameter("size")
            .Parameter("enemy_clan", ParameterType.Unparsed)
            .Do(DoFunc());

            cgb.CreateCommand(prefix + "sw")
            .Alias(prefix + "startwar")
            .Description("Starts a war with a given number.")
            .Parameter("number", ParameterType.Required)
            .Do(async e => {
                var warsInfo = GetInfo(e);
                if (warsInfo == null)
                {
                    await e.Channel.SendMessage("πŸ’’πŸ”° **That war does not exist.**");
                    return;
                }
                var war = warsInfo.Item1[warsInfo.Item2];
                try {
                    war.Start();
                    await e.Channel.SendMessage($"πŸ”°**STARTED WAR AGAINST {war.ShortPrint()}**");
                }
                catch {
                    await e.Channel.SendMessage($"πŸ”°**WAR AGAINST {war.ShortPrint()} IS ALREADY STARTED**");
                }
            });

            cgb.CreateCommand(prefix + "listwar")
            .Alias(prefix + "lw")
            .Description($"Shows the active war claims by a number. Shows all wars in a short way if no number is specified.\n**Usage**: {prefix}lw [war_number] or {prefix}lw")
            .Parameter("number", ParameterType.Optional)
            .Do(async e => {
                // if number is null, print all wars in a short way
                if (string.IsNullOrWhiteSpace(e.GetArg("number")))
                {
                    //check if there are any wars
                    List <ClashWar> wars = null;
                    ClashWars.TryGetValue(e.Server.Id, out wars);
                    if (wars == null || wars.Count == 0)
                    {
                        await e.Channel.SendMessage("πŸ”° **No active wars.**");
                        return;
                    }

                    var sb = new StringBuilder();
                    sb.AppendLine("πŸ”° **LIST OF ACTIVE WARS**");
                    sb.AppendLine("**-------------------------**");
                    for (int i = 0; i < wars.Count; i++)
                    {
                        sb.AppendLine($"**#{i + 1}.**  `Enemy:` **{wars[i].EnemyClan}**");
                        sb.AppendLine($"\t\t`Size:` **{wars[i].Size} v {wars[i].Size}**");
                        sb.AppendLine("**-------------------------**");
                    }
                    await e.Channel.SendMessage(sb.ToString());
                    return;
                }
                //if number is not null, print the war needed
                var warsInfo = GetInfo(e);
                if (warsInfo == null)
                {
                    await e.Channel.SendMessage("πŸ’’πŸ”° **That war does not exist.**");
                    return;
                }
                await e.Channel.SendMessage(warsInfo.Item1[warsInfo.Item2].ToString());
            });

            cgb.CreateCommand(prefix + "claim")
            .Alias(prefix + "call")
            .Alias(prefix + "c")
            .Description($"Claims a certain base from a certain war. You can supply a name in the third optional argument to claim in someone else's place. \n**Usage**: {prefix}call [war_number] [base_number] (optional_otheruser)")
            .Parameter("number")
            .Parameter("baseNumber")
            .Parameter("other_name", ParameterType.Unparsed)
            .Do(async e => {
                var warsInfo = GetInfo(e);
                if (warsInfo == null || warsInfo.Item1.Count == 0)
                {
                    await e.Channel.SendMessage("πŸ’’πŸ”° **That war does not exist.**");
                    return;
                }
                int baseNum;
                if (!int.TryParse(e.GetArg("baseNumber"), out baseNum))
                {
                    await e.Channel.SendMessage("πŸ’’πŸ”° **Invalid base number.**");
                    return;
                }
                string usr =
                    string.IsNullOrWhiteSpace(e.GetArg("other_name")) ?
                    e.User.Name :
                    e.GetArg("other_name");
                try {
                    var war = warsInfo.Item1[warsInfo.Item2];
                    await war.Call(usr, baseNum - 1);
                    await e.Channel.SendMessage($"πŸ”°**{usr}** claimed a base #{baseNum} for a war against {war.ShortPrint()}");
                }
                catch (Exception ex) {
                    await e.Channel.SendMessage($"πŸ’’πŸ”° {ex.Message}");
                }
            });

            cgb.CreateCommand(prefix + "cf")
            .Alias(prefix + "claimfinish")
            .Description($"Finish your claim if you destroyed a base. Optional second argument finishes for someone else.\n**Usage**: {prefix}cf [war_number]")
            .Parameter("number", ParameterType.Required)
            .Parameter("other_name", ParameterType.Unparsed)
            .Do(async e => {
                var warInfo = GetInfo(e);
                if (warInfo == null || warInfo.Item1.Count == 0)
                {
                    await e.Channel.SendMessage("πŸ’’πŸ”° **That war does not exist.**");
                    return;
                }
                string usr =
                    string.IsNullOrWhiteSpace(e.GetArg("other_name")) ?
                    e.User.Name :
                    e.GetArg("other_name");

                var war = warInfo.Item1[warInfo.Item2];
                try {
                    var baseNum = war.FinishClaim(usr);
                    await e.Channel.SendMessage($"β—πŸ”°{e.User.Mention} **DESTROYED** a base #{baseNum + 1} in a war against {war.ShortPrint()}");
                }
                catch (Exception ex) {
                    await e.Channel.SendMessage($"πŸ’’πŸ”° {ex.Message}");
                }
            });

            cgb.CreateCommand(prefix + "unclaim")
            .Alias(prefix + "uncall")
            .Alias(prefix + "uc")
            .Description($"Removes your claim from a certain war. Optional second argument denotes a person in whos place to unclaim\n**Usage**: {prefix}uc [war_number] (optional_other_name)")
            .Parameter("number", ParameterType.Required)
            .Parameter("other_name", ParameterType.Unparsed)
            .Do(async e => {
                var warsInfo = GetInfo(e);
                if (warsInfo == null || warsInfo.Item1.Count == 0)
                {
                    await e.Channel.SendMessage("πŸ’’πŸ”° **That war does not exist.**");
                    return;
                }
                string usr =
                    string.IsNullOrWhiteSpace(e.GetArg("other_name")) ?
                    e.User.Name :
                    e.GetArg("other_name");
                try {
                    var war        = warsInfo.Item1[warsInfo.Item2];
                    int baseNumber = war.Uncall(usr);
                    await e.Channel.SendMessage($"πŸ”° @{usr} has **UNCLAIMED** a base #{baseNumber + 1} from a war against {war.ShortPrint()}");
                }
                catch (Exception ex) {
                    await e.Channel.SendMessage($"πŸ’’πŸ”° {ex.Message}");
                }
            });

            /*
             * cgb.CreateCommand(prefix + "forceunclaim")
             *  .Alias(prefix + "forceuncall")
             *  .Alias(prefix + "fuc")
             *  .Description($"Force removes a base claim from a certain war from a certain base. \n**Usage**: {prefix}fuc [war_number] [base_number]")
             *  .Parameter("number", ParameterType.Required)
             *  .Parameter("other_name", ParameterType.Unparsed)
             *  .Do(async e => {
             *      var warsInfo = GetInfo(e);
             *      if (warsInfo == null || warsInfo.Item1.Count == 0) {
             *          await e.Channel.SendMessage("πŸ’’πŸ”° **That war does not exist.**");
             *          return;
             *      }
             *      string usr =
             *          string.IsNullOrWhiteSpace(e.GetArg("other_name")) ?
             *          e.User.Name :
             *          e.GetArg("other_name").Trim();
             *      try {
             *          var war = warsInfo.Item1[warsInfo.Item2];
             *          int baseNumber = war.Uncall(usr);
             *          await e.Channel.SendMessage($"πŸ”° @{usr} has **UNCLAIMED** a base #{baseNumber + 1} from a war against {war.ShortPrint()}");
             *      }
             *      catch (Exception ex) {
             *          await e.Channel.SendMessage($"πŸ’’πŸ”° {ex.Message}");
             *      }
             *  });
             */

            cgb.CreateCommand(prefix + "endwar")
            .Alias(prefix + "ew")
            .Description($"Ends the war with a given index.\n**Usage**:{prefix}ew [war_number]")
            .Parameter("number")
            .Do(async e => {
                var warsInfo = GetInfo(e);
                if (warsInfo == null)
                {
                    await e.Channel.SendMessage("πŸ’’πŸ”° That war does not exist.");
                    return;
                }
                warsInfo.Item1[warsInfo.Item2].End();

                int size = warsInfo.Item1[warsInfo.Item2].Size;
                warsInfo.Item1.RemoveAt(warsInfo.Item2);
            });
        }