예제 #1
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "pick")
            .Description("Picks a flower planted in this channel.")
            .Do(async e =>
            {
                Message msg;

                await e.Message.Delete().ConfigureAwait(false);
                if (!plantedFlowerChannels.TryRemove(e.Channel.Id, out msg))
                {
                    return;
                }

                await msg.Delete().ConfigureAwait(false);
                await FlowersHandler.AddFlowersAsync(e.User, "Picked a flower.", 1, true).ConfigureAwait(false);
                msg = await e.Channel.SendMessage($"**{e.User.Name}** picked a {WizBot.Config.CurrencyName}!").ConfigureAwait(false);
                await Task.Delay(10000).ConfigureAwait(false);
                await msg.Delete().ConfigureAwait(false);
            });

            cgb.CreateCommand(Module.Prefix + "plant")
            .Description("Spend a flower to plant it in this channel. (If bot is restarted or crashes, flower will be lost)")
            .Do(async e =>
            {
                lock (locker)
                {
                    if (plantedFlowerChannels.ContainsKey(e.Channel.Id))
                    {
                        e.Channel.SendMessage($"There is already a {WizBot.Config.CurrencyName} in this channel.");
                        return;
                    }
                    var removed = FlowersHandler.RemoveFlowers(e.User, "Planted a flower.", 1);
                    if (!removed)
                    {
                        e.Channel.SendMessage($"You don't have any {WizBot.Config.CurrencyName}s.").Wait();
                        return;
                    }

                    var rng  = new Random();
                    var file = Directory.GetFiles("data/currency_images").OrderBy(s => rng.Next()).FirstOrDefault();
                    Message msg;
                    //todo send message after, not in lock
                    if (file == null)
                    {
                        msg = e.Channel.SendMessage(WizBot.Config.CurrencySign).GetAwaiter().GetResult();
                    }
                    else
                    {
                        msg = e.Channel.SendFile(file).GetAwaiter().GetResult();
                    }
                    plantedFlowerChannels.TryAdd(e.Channel.Id, msg);
                }
                var vowelFirst = new[] { 'a', 'e', 'i', 'o', 'u' }.Contains(WizBot.Config.CurrencyName[0]);
                var msg2       = await e.Channel.SendMessage($"Oh how Nice! **{e.User.Name}** planted {(vowelFirst ? "an" : "a")} {WizBot.Config.CurrencyName}. Pick it using {Module.Prefix}pick");
                await Task.Delay(20000).ConfigureAwait(false);
                await msg2.Delete().ConfigureAwait(false);
            });
        }
예제 #2
0
        public Func <CommandEventArgs, Task> BetFlipCoinFunc() => async e =>
        {
            var amountstr = e.GetArg("amount").Trim();

            var guessStr = e.GetArg("guess").Trim().ToUpperInvariant();
            if (guessStr != "H" && guessStr != "T" && guessStr != "HEADS" && guessStr != "TAILS")
            {
                return;
            }

            int amount;
            if (!int.TryParse(amountstr, out amount) || amount < 1)
            {
                return;
            }

            var userFlowers = GamblingModule.GetUserFlowers(e.User.Id);

            if (userFlowers < amount)
            {
                await e.Channel.SendMessage($"{e.User.Mention} You don't have enough {WizBot.Config.CurrencyName}s. You only have {userFlowers}{WizBot.Config.CurrencySign}.").ConfigureAwait(false);

                return;
            }

            await FlowersHandler.RemoveFlowers(e.User, "Betflip Gamble", (int)amount, true).ConfigureAwait(false);

            //heads = true
            //tails = false

            var  guess  = guessStr == "HEADS" || guessStr == "H";
            bool result = false;
            if (rng.Next(0, 2) == 1)
            {
                await e.Channel.SendFile("heads.png", Properties.Resources.heads.ToStream(System.Drawing.Imaging.ImageFormat.Png)).ConfigureAwait(false);

                result = true;
            }
            else
            {
                await e.Channel.SendFile("tails.png", Properties.Resources.tails.ToStream(System.Drawing.Imaging.ImageFormat.Png)).ConfigureAwait(false);
            }

            string str;
            if (guess == result)
            {
                str = $"{e.User.Mention}`You guessed it!` You won {amount * 2}{WizBot.Config.CurrencySign}";
                await FlowersHandler.AddFlowersAsync(e.User, "Betflip Gamble", amount * 2, true).ConfigureAwait(false);
            }
            else
            {
                str = $"{e.User.Mention}`More luck next time.`";
            }

            await e.Channel.SendMessage(str).ConfigureAwait(false);
        };
예제 #3
0
        private async void PotentialGuess(object sender, MessageEventArgs e)
        {
            try
            {
                if (e.Channel.IsPrivate)
                {
                    return;
                }
                if (e.Server != server)
                {
                    return;
                }
                if (e.User.Id == WizBot.Client.CurrentUser.Id)
                {
                    return;
                }

                var guess = false;
                await _guessLock.WaitAsync().ConfigureAwait(false);

                try
                {
                    if (GameActive && CurrentQuestion.IsAnswerCorrect(e.Message.Text) && !triviaCancelSource.IsCancellationRequested)
                    {
                        Users.TryAdd(e.User, 0); //add if not exists
                        Users[e.User]++;         //add 1 point to the winner
                        guess = true;
                    }
                }
                finally { _guessLock.Release(); }
                if (!guess)
                {
                    return;
                }
                triviaCancelSource.Cancel();
                await channel.SendMessage($"☑️ {e.User.Mention} guessed it! The answer was: **{CurrentQuestion.Answer}**").ConfigureAwait(false);

                if (Users[e.User] != WinRequirement)
                {
                    return;
                }
                ShouldStopGame = true;
                await channel.Send($":exclamation: We have a winner! It's {e.User.Mention}.").ConfigureAwait(false);

                // add points to the winner
                await FlowersHandler.AddFlowersAsync(e.User, "Won Trivia", 2).ConfigureAwait(false);
            }
            catch { }
        }
예제 #4
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Prefix + "race")
            .Description($"Startet ein neues Tier-Rennen. | `{Prefix}race`")
            .Do(e =>
            {
                var ar = new AnimalRace(e.Server.Id, e.Channel);
                if (ar.Fail)
                {
                    return;
                }
            });

            cgb.CreateCommand(Prefix + "joinrace")
            .Alias(Prefix + "jr")
            .Description($"Tritt einem Rennen bei. Du kannst eine Anzahl an {MidnightBot.Config.CurrencyName} zum Wetten setzen (Optional). Du bekommst deine Wette*(Teilnehmer-1) zurück, wenn du gewinnst. | `{Prefix}jr` oder `{Prefix}jr 5`")
            .Parameter("amount", ParameterType.Optional)
            .Do(async e =>
            {
                int amount;
                if (!int.TryParse(e.GetArg("amount"), out amount) || amount < 0)
                {
                    amount = 0;
                }

                var userFlowers = GamblingModule.GetUserFlowers(e.User.Id);

                if (userFlowers < amount)
                {
                    await e.Channel.SendMessage($"{e.User.Mention} Du hast nicht genug {MidnightBot.Config.CurrencyName}. Du hast nur {userFlowers}{MidnightBot.Config.CurrencySign}.").ConfigureAwait(false);
                    return;
                }

                if (amount > 0)
                {
                    await FlowersHandler.RemoveFlowers(e.User, "BetRace", (int)amount, true).ConfigureAwait(false);
                }

                AnimalRace ar;

                if (!AnimalRaces.TryGetValue(e.Server.Id, out ar))
                {
                    await e.Channel.SendMessage("Es existiert kein Rennen auf diesem Server.");
                    return;
                }
                await ar.JoinRace(e.User, amount);
            });
        }
예제 #5
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Prefix + "race")
            .Description($"Starts a new animal race. | `{Prefix}race`")
            .Do(e =>
            {
                var ar = new AnimalRace(e.Server.Id, e.Channel);
                if (ar.Fail)
                {
                    return;
                }
            });


            cgb.CreateCommand(Prefix + "joinrace")
            .Alias(Prefix + "jr")
            .Description($"Joins a new race. You can specify an amount of flowers for betting (optional). You will get YourBet*(participants-1) back if you win. | `{Prefix}jr` or `{Prefix}jr 5`")
            .Parameter("amount", ParameterType.Optional)
            .Do(async e =>
            {
                int amount;
                if (!int.TryParse(e.GetArg("amount"), out amount) || amount < 0)
                {
                    amount = 0;
                }

                var userFlowers = GamblingModule.GetUserFlowers(e.User.Id);

                if (userFlowers < amount)
                {
                    await e.Channel.SendMessage($"{e.User.Mention} You don't have enough {NadekoBot.Config.CurrencyName}s. You only have {userFlowers}{NadekoBot.Config.CurrencySign}.").ConfigureAwait(false);
                    return;
                }

                if (amount > 0)
                {
                    await FlowersHandler.RemoveFlowers(e.User, "BetRace", (int)amount, true).ConfigureAwait(false);
                }

                AnimalRace ar;
                if (!AnimalRaces.TryGetValue(e.Server.Id, out ar))
                {
                    await e.Channel.SendMessage("No race exists on this server");
                    return;
                }
                await ar.JoinRace(e.User, amount);
            });
        }
예제 #6
0
            public AnimalRace(ulong serverId, Channel ch)
            {
                this.serverId    = serverId;
                this.raceChannel = ch;
                if (!AnimalRaces.TryAdd(serverId, this))
                {
                    Fail = true;
                    return;
                }
                var cancelSource = new CancellationTokenSource();
                var token        = cancelSource.Token;
                var fullgame     = CheckForFullGameAsync(token);

                Task.Run(async() =>
                {
                    try
                    {
                        await raceChannel.SendMessage($"🏁`Rennen startet in 20 Sekunden oder wenn der Raum voll ist. Gib {MidnightBot.Config.CommandPrefixes.Gambling}jr ein, um dem Rennen beizutreten.`");
                        var t   = await Task.WhenAny(Task.Delay(20000, token), fullgame);
                        Started = true;
                        cancelSource.Cancel();
                        if (t == fullgame)
                        {
                            await raceChannel.SendMessage("🏁`Rennen ist voll, wird gestartet!`");
                        }
                        else if (participants.Count > 1)
                        {
                            await raceChannel.SendMessage("🏁`Spiel startet mit " + participants.Count + " Teilnehmern.`");
                        }
                        else
                        {
                            await raceChannel.SendMessage("🏁`Rennen konnte nicht starten da es nicht genug Teilnehmer gab.`");
                            var p = participants.FirstOrDefault();
                            if (p != null)
                            {
                                await FlowersHandler.AddFlowersAsync(p.User, "BetRace", p.AmountBet, true).ConfigureAwait(false);
                            }
                            End();
                            return;
                        }
                        await Task.Run(StartRace);
                        End();
                    }
                    catch { }
                });
            }
예제 #7
0
            public AnimalRace(ulong serverId, Channel ch)
            {
                this.serverId    = serverId;
                this.raceChannel = ch;
                if (!AnimalRaces.TryAdd(serverId, this))
                {
                    Fail = true;
                    return;
                }
                var cancelSource = new CancellationTokenSource();
                var token        = cancelSource.Token;
                var fullgame     = CheckForFullGameAsync(token);

                Task.Run(async() =>
                {
                    try
                    {
                        await raceChannel.SendMessage($"🏁`Race is starting in 20 seconds or when the room is full. Type {NadekoBot.Config.CommandPrefixes.Gambling}jr to join the race.`");
                        var t   = await Task.WhenAny(Task.Delay(20000, token), fullgame);
                        Started = true;
                        cancelSource.Cancel();
                        if (t == fullgame)
                        {
                            await raceChannel.SendMessage("🏁`Race full, starting right now!`");
                        }
                        else if (participants.Count > 1)
                        {
                            await raceChannel.SendMessage("🏁`Game starting with " + participants.Count + " participants.`");
                        }
                        else
                        {
                            await raceChannel.SendMessage("🏁`Race failed to start since there was not enough participants.`");
                            var p = participants.FirstOrDefault();
                            if (p != null)
                            {
                                await FlowersHandler.AddFlowersAsync(p.User, "BetRace", p.AmountBet, true).ConfigureAwait(false);
                            }
                            End();
                            return;
                        }
                        await Task.Run(StartRace);
                        End();
                    }
                    catch { }
                });
            }
예제 #8
0
        private async void PotentialGuess(object sender, MessageEventArgs e)
        {
            try {
                if (e.Channel.IsPrivate)
                {
                    return;
                }
                if (e.Server != _server)
                {
                    return;
                }

                bool guess = false;
                lock (_guessLock) {
                    if (GameActive && CurrentQuestion.IsAnswerCorrect(e.Message.Text) && !triviaCancelSource.IsCancellationRequested)
                    {
                        users.TryAdd(e.User, 0); //add if not exists
                        users[e.User]++;         //add 1 point to the winner
                        guess = true;
                    }
                }
                if (guess)
                {
                    triviaCancelSource.Cancel();
                    await _channel.SendMessage($"☑️ {e.User.Mention} guessed it! The answer was: **{CurrentQuestion.Answer}**");

                    if (users[e.User] == WinRequirement)
                    {
                        ShouldStopGame = true;
                        await _channel.Send($":exclamation: We have a winner! Its {e.User.Mention}.");

                        // add points to the winner
                        await FlowersHandler.AddFlowersAsync(e.User, "Won Trivia", 2);
                    }
                }
            }
            catch { }
        }
예제 #9
0
        public override void Install(ModuleManager manager)
        {
            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                commands.ForEach(cmd => cmd.Init(cgb));

                cgb.CreateCommand(Prefix + "attack")
                .Description("Attacks a target with the given move")
                .Parameter("move", ParameterType.Required)
                .Parameter("target", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var move      = e.GetArg("move");
                    var targetStr = e.GetArg("target")?.Trim();
                    if (string.IsNullOrWhiteSpace(targetStr))
                    {
                        return;
                    }
                    var target = e.Server.FindUsers(targetStr).FirstOrDefault();
                    if (target == null)
                    {
                        await e.Channel.SendMessage("No such person.");
                        return;
                    }
                    else if (target == e.User)
                    {
                        await e.Channel.SendMessage("You can't attack yourself.");
                        return;
                    }
                    // Checking stats first, then move
                    //Set up the userstats
                    PokeStats userStats;
                    userStats = Stats.GetOrAdd(e.User.Id, new PokeStats());

                    //Check if able to move
                    //User not able if HP < 0, has made more than 4 attacks
                    if (userStats.Hp < 0)
                    {
                        await e.Channel.SendMessage($"{e.User.Mention} has fainted and was not able to move!");
                        return;
                    }
                    if (userStats.MovesMade >= 5)
                    {
                        await e.Channel.SendMessage($"{e.User.Mention} has used too many moves in a row and was not able to move!");
                        return;
                    }
                    if (userStats.LastAttacked.Contains(target.Id))
                    {
                        await e.Channel.SendMessage($"{e.User.Mention} can't attack again without retaliation!");
                        return;
                    }
                    //get target stats
                    PokeStats targetStats;
                    targetStats = Stats.GetOrAdd(target.Id, new PokeStats());

                    //If target's HP is below 0, no use attacking
                    if (targetStats.Hp <= 0)
                    {
                        await e.Channel.SendMessage($"{target.Mention} has already fainted!");
                        return;
                    }

                    //Check whether move can be used
                    PokemonType userType = GetPokeType(e.User.Id);

                    var enabledMoves = userType.Moves;
                    if (!enabledMoves.Contains(move.ToLowerInvariant()))
                    {
                        await e.Channel.SendMessage($"{e.User.Mention} was not able to use **{move}**, use `{Prefix}ml` to see moves you can use");
                        return;
                    }

                    //get target type
                    PokemonType targetType = GetPokeType(target.Id);
                    //generate damage
                    int damage = GetDamage(userType, targetType);
                    //apply damage to target
                    targetStats.Hp -= damage;

                    var response = $"{e.User.Mention} used **{move}**{userType.Icon} on {target.Mention}{targetType.Icon} for **{damage}** damage";

                    //Damage type
                    if (damage < 40)
                    {
                        response += "\nIt's not effective..";
                    }
                    else if (damage > 60)
                    {
                        response += "\nIt's super effective!";
                    }
                    else
                    {
                        response += "\nIt's somewhat effective";
                    }

                    //check fainted

                    if (targetStats.Hp <= 0)
                    {
                        response += $"\n**{target.Name}** has fainted!";
                    }
                    else
                    {
                        response += $"\n**{target.Name}** has {targetStats.Hp} HP remaining";
                    }

                    //update other stats
                    userStats.LastAttacked.Add(target.Id);
                    userStats.MovesMade++;
                    targetStats.MovesMade = 0;
                    if (targetStats.LastAttacked.Contains(e.User.Id))
                    {
                        targetStats.LastAttacked.Remove(e.User.Id);
                    }

                    //update dictionary
                    //This can stay the same right?
                    Stats[e.User.Id] = userStats;
                    Stats[target.Id] = targetStats;

                    await e.Channel.SendMessage(response);
                });

                cgb.CreateCommand(Prefix + "ml")
                .Alias("movelist")
                .Description("Lists the moves you are able to use")
                .Do(async e =>
                {
                    var userType  = GetPokeType(e.User.Id);
                    var movesList = userType.Moves;
                    var str       = $"**Moves for `{userType.Name}` type.**";
                    foreach (string m in movesList)
                    {
                        str += $"\n{userType.Icon}{m}";
                    }
                    await e.Channel.SendMessage(str);
                });

                cgb.CreateCommand(Prefix + "heal")
                .Description($"Heals someone. Revives those that fainted. Costs a {NadekoBot.Config.CurrencyName} \n**Usage**:{Prefix}revive @someone")
                .Parameter("target", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var targetStr = e.GetArg("target")?.Trim();
                    if (string.IsNullOrWhiteSpace(targetStr))
                    {
                        return;
                    }
                    var usr = e.Server.FindUsers(targetStr).FirstOrDefault();
                    if (usr == null)
                    {
                        await e.Channel.SendMessage("No such person.");
                        return;
                    }
                    if (Stats.ContainsKey(usr.Id))
                    {
                        var targetStats = Stats[usr.Id];
                        int HP          = targetStats.Hp;
                        if (targetStats.Hp == targetStats.MaxHp)
                        {
                            await e.Channel.SendMessage($"{usr.Name} already has full HP!");
                            return;
                        }
                        //Payment~
                        var amount = 1;
                        var pts    = Classes.DbHandler.Instance.GetStateByUserId((long)e.User.Id)?.Value ?? 0;
                        if (pts < amount)
                        {
                            await e.Channel.SendMessage($"{e.User.Mention} you don't have enough {NadekoBot.Config.CurrencyName}s! \nYou still need {amount - pts} {NadekoBot.Config.CurrencySign} to be able to do this!");
                            return;
                        }
                        var target = (usr.Id == e.User.Id) ? "yourself" : usr.Name;
                        FlowersHandler.RemoveFlowers(e.User, $"Poke-Heal {target}", amount);
                        //healing
                        targetStats.Hp = targetStats.MaxHp;
                        if (HP < 0)
                        {
                            //Could heal only for half HP?
                            Stats[usr.Id].Hp = (targetStats.MaxHp / 2);
                            await e.Channel.SendMessage($"{e.User.Name} revived {usr.Name} with one {NadekoBot.Config.CurrencySign}");
                            return;
                        }
                        var vowelFirst = new[] { 'a', 'e', 'i', 'o', 'u' }.Contains(NadekoBot.Config.CurrencyName[0]);
                        await e.Channel.SendMessage($"{e.User.Name} healed {usr.Name} for {targetStats.MaxHp - HP} HP with {(vowelFirst ? "an" : "a")} {NadekoBot.Config.CurrencySign}");
                        return;
                    }
                    else
                    {
                        await e.Channel.SendMessage($"{usr.Name} already has full HP!");
                    }
                });

                cgb.CreateCommand(Prefix + "type")
                .Description($"Get the poketype of the target.\n**Usage**: {Prefix}type @someone")
                .Parameter("target", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var usrStr = e.GetArg("target")?.Trim();
                    if (string.IsNullOrWhiteSpace(usrStr))
                    {
                        return;
                    }
                    var usr = e.Server.FindUsers(usrStr).FirstOrDefault();
                    if (usr == null)
                    {
                        await e.Channel.SendMessage("No such person.");
                        return;
                    }
                    var pType = GetPokeType(usr.Id);
                    await e.Channel.SendMessage($"Type of {usr.Name} is **{pType.Name.ToLowerInvariant()}**{pType.Icon}");
                });

                cgb.CreateCommand(Prefix + "settype")
                .Description($"Set your poketype. Costs a {NadekoBot.Config.CurrencyName}.\n**Usage**: {Prefix}settype fire")
                .Parameter("targetType", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var targetTypeStr = e.GetArg("targetType")?.ToUpperInvariant();
                    if (string.IsNullOrWhiteSpace(targetTypeStr))
                    {
                        return;
                    }
                    var targetType = stringToPokemonType(targetTypeStr);
                    if (targetType == null)
                    {
                        await e.Channel.SendMessage("Invalid type specified. Type must be one of:\nNORMAL, FIRE, WATER, ELECTRIC, GRASS, ICE, FIGHTING, POISON, GROUND, FLYING, PSYCHIC, BUG, ROCK, GHOST, DRAGON, DARK, STEEL");
                        return;
                    }
                    if (targetType == GetPokeType(e.User.Id))
                    {
                        await e.Channel.SendMessage($"Your type is already {targetType.Name.ToLowerInvariant()}{targetType.Icon}");
                        return;
                    }

                    //Payment~
                    var amount = 1;
                    var pts    = DbHandler.Instance.GetStateByUserId((long)e.User.Id)?.Value ?? 0;
                    if (pts < amount)
                    {
                        await e.Channel.SendMessage($"{e.User.Mention} you don't have enough {NadekoBot.Config.CurrencyName}s! \nYou still need {amount - pts} {NadekoBot.Config.CurrencySign} to be able to do this!");
                        return;
                    }
                    FlowersHandler.RemoveFlowers(e.User, $"set usertype to {targetTypeStr}", amount);
                    //Actually changing the type here
                    var preTypes = DbHandler.Instance.GetAllRows <UserPokeTypes>();
                    Dictionary <long, int> Dict = preTypes.ToDictionary(x => x.UserId, y => y.Id.Value);
                    if (Dict.ContainsKey((long)e.User.Id))
                    {
                        //delete previous type
                        DbHandler.Instance.Delete <UserPokeTypes>(Dict[(long)e.User.Id]);
                    }

                    DbHandler.Instance.InsertData(new UserPokeTypes
                    {
                        UserId = (long)e.User.Id,
                        type   = targetType.Name
                    });

                    //Now for the response

                    await e.Channel.SendMessage($"Set type of {e.User.Mention} to {targetTypeStr}{targetType.Icon} for a {NadekoBot.Config.CurrencySign}");
                });
            });
        }
예제 #10
0
        public override void Install(ModuleManager manager)
        {
            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                cgb.CreateCommand(Prefix + "active")
                .Description($"Zeigt das aktive Pokemon von jemandem oder einem selbst | `{Prefix}active` oder `{Prefix}active @Someone`")
                .Parameter("target", ParameterType.Optional)
                .Do(async e =>
                {
                    var target = e.Server.FindUsers(e.GetArg("target")).DefaultIfEmpty(null).FirstOrDefault() ?? e.User;

                    await e.Channel.SendMessage($"**{target.Mention}**:\n{ActivePokemon (target).PokemonString ()}");
                });

                cgb.CreateCommand(Prefix + "pokehelp")
                .Description($"Zeigt die Basis Hilfe für Pokemon Kämpfe | `{Prefix}pokehelp`")
                .Alias(Prefix + "ph")
                .Do(async e =>
                {
                    User user = null;
                    try {
                        user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user"));
                    }
                    catch (Exception)
                    {
                        user = e.User;
                    }
                    await e.User.SendMessage($">list um deine Pokemon anzuzeigen. >switch name um dein aktives Pokemon auszutauschen. >ml um seine Angriffe anzuzeigen. >attack move @person um anzugreifen.\n Du bekommst {MidnightBot.Config.CurrencySign} für das besiegen anderer Pokemon, welche als Tränke mit >heal oder als Pokebälle mit >catch benutzt werden können.");
                    await e.Message.Delete().ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "movelist")
                .Alias(Prefix + "ml")
                .Description($"Zeigt eine Liste der verfügbaren Angriffe. | `{Prefix}movelist` oder `{Prefix}ml` oder `{Prefix}ml charmander`")
                .Parameter("name", ParameterType.Optional)
                .Do(async e =>
                {
                    var list = PokemonList(e.User);
                    var pkm  = list.Where(x => x.NickName == e.GetArg("name").Trim()).DefaultIfEmpty(null).FirstOrDefault() ?? ActivePokemon(e.User);

                    await e.User.SendMessage($"{e.User.Mention}\n**{pkm.NickName}'s Angriffe:**\n{pkm.PokemonMoves()}");
                });

                cgb.CreateCommand(Prefix + "switch")
                .Description($"Setzt dein aktives Pokemon per Nickname | `{Prefix}switch mudkip`")
                .Parameter("name", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var list  = PokemonList(e.User);
                    var toSet = list.Where(x => x.NickName == e.GetArg("name").Trim()).DefaultIfEmpty(null).FirstOrDefault();
                    if (toSet == null)
                    {
                        await e.Channel.SendMessage($"Konnte Pokemon mit Name \"{e.GetArg ("name").Trim ()}\" nicht finden.");
                        return;
                    }

                    var trainerStats = UserStats.GetOrAdd(e.User.Id, new TrainerStats());
                    if (trainerStats.LastAttacked.Contains(e.User.Id))
                    {
                        await e.Channel.SendMessage($"{e.User.Mention} kann sich nicht bewegen!");
                        return;
                    }
                    if (trainerStats.MovesMade > TrainerStats.MaxMoves)
                    {
                        await e.Channel.SendMessage($"{e.User.Mention} hat zu oft angegriffen und kann sich nicht bewegen!");
                        return;
                    }

                    switch (SwitchPokemon(e.User, toSet))
                    {
                    case 0:
                        {
                            trainerStats.LastAttacked.Add(e.User.Id);
                            trainerStats.MovesMade++;
                            UserStats.AddOrUpdate(e.User.Id, trainerStats, (s, t) => trainerStats);
                            await e.Channel.SendMessage($"Aktives Pokemon von {e.User.Mention} auf {toSet.NickName} gesetzt");
                            break;
                        }

                    case 2:
                        {
                            await e.Channel.SendMessage($"Das ausgetauschte Pokemon muss HP haben!");
                            break;
                        }

                    case 1:
                        {
                            await e.Channel.SendMessage($"Kein aktives Pokemon!");
                            break;
                        }
                    }
                });

                cgb.CreateCommand(Prefix + "allmoves")
                .Description($"Sendet dir eine private Nachticht mit allen Attacken deiner Pokemon. | `{Prefix}allmoves` oder `{Prefix}am`")
                .Alias(Prefix + "am")
                .Do(async e =>
                {
                    var list   = PokemonList(e.User);
                    string str = $"{e.User.Mention}'s Pokemon sind:\n";
                    foreach (var pkm in list)
                    {
                        str += $"`{pkm.NickName}:` Level: {pkm.Level}\n{pkm.PokemonMoves ()}\n";
                    }
                    var msg = await e.Channel.SendMessage($"{e.User.Mention} ich habe dir eine Liste aller deiner Angriffe geschickt.");
                    await e.User.SendMessage(str);
                });

                cgb.CreateCommand(Prefix + "list")
                .Description($"Gibt eine Liste deiner Pokemon (6) zurück (aktives Pokemon ist unterstrichen) | `{Prefix}list`")
                .Do(async e =>
                {
                    var list   = PokemonList(e.User);
                    string str = $"{e.User.Mention}'s Pokemon sind:\n";
                    foreach (var pkm in list)
                    {
                        if (pkm.HP <= 0)
                        {
                            str += $"~~**{pkm.NickName}** : *{pkm.GetSpecies().name}*  HP: {pkm.HP}/{pkm.MaxHP}~~💀\nBildlink: {pkm.GetSpecies().imageLink}\n";
                        }
                        else if (pkm.IsActive)
                        {
                            str += $"__**{pkm.NickName}** : *{pkm.GetSpecies().name}*  HP: {pkm.HP}/{pkm.MaxHP}__\nBildlink: {pkm.GetSpecies ().imageLink}\n";
                        }
                        else
                        {
                            str += $"**{pkm.NickName}** : *{pkm.GetSpecies ().name}*  HP: {pkm.HP}/{pkm.MaxHP}\nBildlink: {pkm.GetSpecies ().imageLink}\n";
                        }
                    }
                    await e.User.SendMessage(str);
                });

                cgb.CreateCommand(Prefix + "elite4")
                .Description($"Zeigt die 5 stärksten Pokemon. | `{Prefix}elite4`")
                .Alias(Prefix + "e4")
                .Do(async e =>
                {
                    var db     = DbHandler.Instance.GetAllRows <PokemonSprite>();
                    var elites = db.OrderByDescending(i => i.XP).Take(4);
                    string str = "**Top 4 Pokemon:**";
                    foreach (PokemonSprite elite in elites)
                    {
                        str += $"\n`Trainer:` <@{elite.OwnerId}>";
                        str += $"\n```Pokemon Name: {elite.NickName}";
                        str += $"\nPokemon Level: {elite.Level}```";
                    }
                    await e.Channel.SendMessage(str);
                });

                cgb.CreateCommand(Prefix + "heal")
                .Description($"Heilt dein angegebenes Pokemon (per Nicknamen) oder das aktive Pokemon der gegebenen Person. | `{Prefix}heal bulbasaur` oder `{Prefix}heal @user` oder `{Prefix}heal all`")
                .Parameter("args", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var args = e.GetArg("args");

                    var target = e.Server.FindUsers(args).DefaultIfEmpty(null).FirstOrDefault() ?? e.User;

                    if (target == e.User)
                    {
                        if (args == "all")
                        {
                            var pkms   = PokemonList(target).Where(x => x.HP < x.MaxHP);
                            string str = $"{target.Mention} geheilt:";
                            int count  = pkms.Count();
                            if (count <= 0)
                            {
                                await e.Channel.SendMessage($"{e.User.Mention}, All of your pokemon are at full health!");
                                return;
                            }
                            if (await FlowersHandler.RemoveFlowers(target, "Healed pokemon", count))
                            {
                                foreach (var pkm in pkms)
                                {
                                    var hp = pkm.HP;
                                    pkm.HP = pkm.MaxHP;
                                    str   += $"\n{pkm.NickName} um {pkm.HP - hp} HP";
                                    //await e.Channel.SendMessage($"{target.Mention} successfully healed {pkm.NickName} for {pkm.HP - hp} HP for a {Uni.Config.CurrencySign}");
                                    DbHandler.Instance.Save(pkm);
                                    //Heal your own userstats as well?
                                }
                            }
                            else
                            {
                                await e.Channel.SendMessage($"Konnte {MidnightBot.Config.CurrencySign} nicht bezahlen.**");
                                return;
                            }
                            str += $"\n*Benutzte {count.ToString()} {MidnightBot.Config.CurrencySign}*";
                            await e.Channel.SendMessage(str);
                            return;
                        }

                        var toHeal = PokemonList(target).Where(x => x.NickName == args.Trim()).DefaultIfEmpty(null).FirstOrDefault();
                        if (toHeal == null)
                        {
                            await e.Channel.SendMessage($"Konnte Pokemon mit Namen \"{e.GetArg ("args").Trim ()}\" nicht finden");
                            return;
                        }

                        if (await FlowersHandler.RemoveFlowers(target, "Healed pokemon", 1))
                        {
                            var hp    = toHeal.HP;
                            toHeal.HP = toHeal.MaxHP;
                            await e.Channel.SendMessage($"{target.Mention} hat {toHeal.NickName} erfolgreich um {toHeal.HP - hp} HP für einen {MidnightBot.Config.CurrencySign} geheilt.");
                            DbHandler.Instance.Save(toHeal);
                            //Heal your own userstats as well?
                        }
                        else
                        {
                            await e.Channel.SendMessage($"Konnte {MidnightBot.Config.CurrencySign} nicht zahlen.");
                        }
                        return;
                    }
                    var toHealn = ActivePokemon(target);
                    if (toHealn == null)
                    {
                        await e.Channel.SendMessage($"Konnte Pokemon von {target.Name} nicht finden");
                        return;
                    }
                    if (await FlowersHandler.RemoveFlowers(target, "Healed pokemon", 1))
                    {
                        var hp     = toHealn.HP;
                        toHealn.HP = toHealn.MaxHP;
                        await e.Channel.SendMessage($"{target.Mention} hat {toHealn.NickName} erfolgreich um {toHealn.HP - hp} HP geheilt, für einen {MidnightBot.Config.CurrencySign}");
                        DbHandler.Instance.Save(toHealn);
                    }
                    else
                    {
                        await e.Channel.SendMessage($"Konnte {MidnightBot.Config.CurrencySign} nicht bezahlen.");
                    }
                    return;
                });

                cgb.CreateCommand(Prefix + "rename")
                .Alias(Prefix + "rn")
                .Description($"Benennt dein aktives Pokemon um. | `{Prefix}rename dickbutt` oder `{Prefix}rn Mittens`")
                .Parameter("name", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var newName = e.GetArg("name");
                    if (string.IsNullOrWhiteSpace(newName))
                    {
                        await e.Channel.SendMessage("Name benötigt");
                        return;
                    }
                    var activePkm      = ActivePokemon(e.User);
                    activePkm.NickName = newName;
                    DbHandler.Instance.Save(activePkm);
                    await e.Channel.SendMessage($"Aktives Pokemon zu {newName} umbenannt");
                });


                cgb.CreateCommand(Prefix + "reset")
                .Description($"Setzt deine Pokemon zurück. KANN NICHT RÜCKGÄNGIG GEMACHT WERDEN | `{Prefix}reset true`")
                .Parameter("true", ParameterType.Unparsed)
                .Do(async e =>
                {
                    bool willReset;
                    if (bool.TryParse(e.GetArg("true"), out willReset))
                    {
                        if (willReset)
                        {
                            var db  = DbHandler.Instance.GetAllRows <PokemonSprite>();
                            var row = db.Where(x => x.OwnerId == (long)e.User.Id);
                            //var toDelete = DbHandler.Instance.FindAll<PokemonSprite>(s => s.OwnerId == (long)e.User.Id);
                            foreach (var todel in row)
                            {
                                DbHandler.Instance.Delete <PokemonSprite>(todel.Id.Value);
                            }
                            await e.Channel.SendMessage("Deine Pokemon wurden gelöscht.\n\nGrauenhaft.\n\n\nIch habe keine Worte dafür.");
                        }
                    }
                    else
                    {
                        await e.Channel.SendMessage($"Benutze `{Prefix}reset true` um deine Pokemon wirklich zu töten 🔫");
                    }
                });

                Random rand = new Random();
                cgb.CreateCommand(Prefix + "catch")
                .Description($"Versucht das derzeitige wilde Pokemon zu fangen. Du musst das Pokemon angeben, welches du ersetzen willst. Kostet einen {MidnightBot.Config.CurrencyName} | `{Prefix}catch MyMudkip`")
                .Parameter("replace", ParameterType.Unparsed)
                .Do(async e =>
                {
                    string str = "";
                    var list   = PokemonList(e.User);
                    var pkm    = list.Where(x => x.NickName == e.GetArg("replace").Trim()).DefaultIfEmpty(null).FirstOrDefault();
                    if (pkm == null)
                    {
                        await e.Channel.SendMessage($"Konnte Pokemon mit Namen \"{e.GetArg("replace").Trim()}\" nicht finden.");
                        return;
                    }
                    var defenderPokemon = ActivePokemon(e.Server.GetUser(MidnightBot.Creds.BotId));
                    var removed         = FlowersHandler.RemoveFlowers(e.User, "Put a euro down.", 1).GetAwaiter().GetResult();
                    if (!removed)
                    {
                        await e.Channel.SendMessage($"{e.User.Mention}, es benötigt einen {MidnightBot.Config.CurrencySign} {MidnightBot.Config.CurrencyName} um einen Pokeball zu kaufen!");
                        return;
                    }
                    int rate   = 1;
                    int chance = ((3 * defenderPokemon.MaxHP - 2 * defenderPokemon.HP) * rate) / 3 * defenderPokemon.MaxHP;
                    //str += chance.ToString() + "\n";
                    int randm = rand.Next(1, 255);
                    //str += randm.ToString();
                    if (randm < chance)
                    {
                        pkm.NickName       = defenderPokemon.NickName;
                        pkm.HP             = defenderPokemon.HP;
                        pkm.SpeciesId      = defenderPokemon.SpeciesId;
                        pkm.Speed          = defenderPokemon.Speed;
                        pkm.Level          = defenderPokemon.Level;
                        pkm.Attack         = defenderPokemon.Attack;
                        pkm.Defense        = defenderPokemon.Defense;
                        pkm.SpecialAttack  = defenderPokemon.SpecialAttack;
                        pkm.SpecialDefense = defenderPokemon.SpecialDefense;
                        pkm.XP             = defenderPokemon.XP;
                        pkm.MaxHP          = defenderPokemon.MaxHP;
                        DbHandler.Instance.Save(pkm);
                        var db  = DbHandler.Instance.GetAllRows <PokemonSprite>();
                        var row = db.Where(x => x.OwnerId == (long)MidnightBot.Creds.BotId);
                        //var toDelete = DbHandler.Instance.FindAll<PokemonSprite>(s => s.OwnerId == (long)e.User.Id);
                        foreach (var todel in row)
                        {
                            DbHandler.Instance.Delete <PokemonSprite>(todel.Id.Value);
                        }
                        str += $"{e.User.Mention} hat {defenderPokemon.NickName} gefangen!";
                    }
                    else
                    {
                        str += $"{defenderPokemon.NickName} escaped!";
                    }
                    await e.Channel.SendMessage(str);
                });

                cgb.CreateCommand(Prefix + "attack")
                .Alias(Prefix)
                .Description($"Greift gegebenes Ziel mit gegebener Attacke an. | `{Prefix}attack hyperbeam @user oder, `{Prefix}attack @user flame-charge, {Prefix} sunny-day @user`")
                .Parameter("args", ParameterType.Unparsed)
                .Do(async e =>
                {
                    Regex regex = new Regex(@"<@!?(?<id>\d+)>");
                    var args    = e.GetArg("args");
                    if (!regex.IsMatch(args))
                    {
                        await e.Channel.SendMessage("Bitte gib Ziel ein");
                        return;
                    }
                    Match m = regex.Match(args);
                    var id  = ulong.Parse(m.Groups["id"].Value);
                    if (id == MidnightBot.Creds.BotId)
                    {
                    }
                    var target = e.Server.GetUser(id);
                    if (target == null)
                    {
                        await e.Channel.SendMessage("Bitte gib Ziel ein");
                        return;
                    }
                    if (target == e.User)
                    {
                        await e.Channel.SendMessage("Du kannst dich nicht selbst angreifen!");
                        return;
                    }
                    var moveString = args.Replace(m.Value, string.Empty).Replace("\"", "").Trim();
                    string attstr  = await Attack(e.User, target, moveString);
                    await e.Channel.SendMessage(attstr);

                    if (target.Id == MidnightBot.Creds.BotId && !attstr.Contains("Cannot use"))
                    {
                        string moves   = ActivePokemon(target).PokemonMoves(true);
                        string[] lines = moves.Split('\n');
                        int linenum    = rand.Next(0, 3);
                        string move    = $"{lines[linenum]}";
                        move           = move.Trim('\n', ' ');
                        string output  = $"{e.User.Mention}\n";
                        output        += await Attack(target, e.User, move);
                        await e.Channel.SendMessage(output);
                    }
                });
            });
        }
예제 #11
0
        public Func <CommandEventArgs, Task> BetFlipCoinFunc() => async e =>
        {
            var amountstr = e.GetArg("amount").Trim();

            var guessStr = e.GetArg("guess").Trim().ToUpperInvariant();
            if (guessStr != "K" && guessStr != "Z" && guessStr != "KOPF" && guessStr != "ZAHL")
            {
                return;
            }

            int amount;
            if (!int.TryParse(amountstr, out amount) || amount < 1)
            {
                return;
            }

            var userFlowers = GamblingModule.GetUserFlowers(e.User.Id);

            if (userFlowers < amount)
            {
                await e.Channel.SendMessage($"{e.User.Mention} Du hast nicht genug {MidnightBot.Config.CurrencyName}s. Du hast nur {userFlowers}{MidnightBot.Config.CurrencySign}.").ConfigureAwait(false);

                return;
            }

            await FlowersHandler.RemoveFlowers(e.User, "Betflip Gamble", (int)amount, true).ConfigureAwait(false);

            //kopf = true
            //zahl = false
            if (guessStr == "KOPF" || guessStr == "K")
            {
                var  guess  = guessStr == "KOPF" || guessStr == "K";
                bool result = false;
                if (rng.Next(0, 3) == 1)
                {
                    await e.Channel.SendFile("heads.png", Properties.Resources.heads.ToStream(System.Drawing.Imaging.ImageFormat.Png)).ConfigureAwait(false);

                    result = true;
                }
                else
                {
                    await e.Channel.SendFile("tails.png", Properties.Resources.tails.ToStream(System.Drawing.Imaging.ImageFormat.Png)).ConfigureAwait(false);
                }

                string str;
                if (guess == result)
                {
                    str = $"{e.User.Mention}`Du hast richtig geraten!` Du hast {amount * 2}{MidnightBot.Config.CurrencySign} gewonnen.";
                    await FlowersHandler.AddFlowersAsync(e.User, "Betflip Gamble", amount * 2, true).ConfigureAwait(false);
                }
                else
                {
                    str = $"{e.User.Mention}`Viel Glück beim nächsten Mal.`";
                }

                await e.Channel.SendMessage(str).ConfigureAwait(false);
            }
            else
            {
                var  guess  = guessStr == "ZAHL" || guessStr == "Z";
                bool result = false;
                if (rng.Next(0, 3) == 1)
                {
                    await e.Channel.SendFile("tails.png", Properties.Resources.tails.ToStream(System.Drawing.Imaging.ImageFormat.Png)).ConfigureAwait(false);

                    result = true;
                }
                else
                {
                    await e.Channel.SendFile("heads.png", Properties.Resources.heads.ToStream(System.Drawing.Imaging.ImageFormat.Png)).ConfigureAwait(false);
                }

                string str;
                if (guess == result)
                {
                    str = $"{e.User.Mention}`Du hast richtig geraten!` Du hast {amount * 2}{MidnightBot.Config.CurrencySign} gewonnen.";
                    await FlowersHandler.AddFlowersAsync(e.User, "Betflip Gamble", amount * 2, true).ConfigureAwait(false);
                }
                else
                {
                    str = $"{e.User.Mention}`Viel Glück beim nächsten Mal.`";
                }

                await e.Channel.SendMessage(str).ConfigureAwait(false);
            }
        };
예제 #12
0
        public override void Install(ModuleManager manager)
        {
            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                commands.ForEach(com => com.Init(cgb));

                cgb.CreateCommand(Prefix + "raffle")
                .Description("Prints a name and ID of a random user from the online list from the (optional) role.")
                .Parameter("role", ParameterType.Optional)
                .Do(async e =>
                {
                    var arg  = string.IsNullOrWhiteSpace(e.GetArg("role")) ? "@everyone" : e.GetArg("role");
                    var role = e.Server.FindRoles(arg).FirstOrDefault();
                    if (role == null)
                    {
                        await e.Channel.SendMessage("💢 Role not found.").ConfigureAwait(false);
                        return;
                    }
                    var members      = role.Members.Where(u => u.Status == UserStatus.Online); // only online
                    var membersArray = members as User[] ?? members.ToArray();
                    var usr          = membersArray[new Random().Next(0, membersArray.Length)];
                    await e.Channel.SendMessage($"**Raffled user:** {usr.Name} (id: {usr.Id})").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "$$")
                .Description(string.Format("Check how much {0}s a person has. (Defaults to yourself)\n**Usage**:`{1}$$` or `{1}$$ @Someone`",
                                           NadekoBot.Config.CurrencyName, Prefix))
                .Parameter("all", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var usr = e.Message.MentionedUsers.FirstOrDefault() ?? e.User;
                    var pts = GetUserFlowers(usr.Id);
                    var str = $"{usr.Name} has {pts} {NadekoBot.Config.CurrencySign}";
                    await e.Channel.SendMessage(str).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "give")
                .Description(string.Format("Give someone a certain amount of {0}s", NadekoBot.Config.CurrencyName))
                .Parameter("amount", ParameterType.Required)
                .Parameter("receiver", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var amountStr = e.GetArg("amount")?.Trim();
                    long amount;
                    if (!long.TryParse(amountStr, out amount) || amount < 0)
                    {
                        return;
                    }

                    var mentionedUser = e.Message.MentionedUsers.FirstOrDefault(u =>
                                                                                u.Id != NadekoBot.Client.CurrentUser.Id &&
                                                                                u.Id != e.User.Id);
                    if (mentionedUser == null)
                    {
                        return;
                    }

                    var userFlowers = GetUserFlowers(e.User.Id);

                    if (userFlowers < amount)
                    {
                        await e.Channel.SendMessage($"{e.User.Mention} You don't have enough {NadekoBot.Config.CurrencyName}s. You have only {userFlowers}{NadekoBot.Config.CurrencySign}.").ConfigureAwait(false);
                        return;
                    }

                    FlowersHandler.RemoveFlowers(e.User, "Gift", (int)amount);
                    await FlowersHandler.AddFlowersAsync(mentionedUser, "Gift", (int)amount).ConfigureAwait(false);

                    await e.Channel.SendMessage($"{e.User.Mention} successfully sent {amount} {NadekoBot.Config.CurrencyName}s to {mentionedUser.Mention}!").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "award")
                .Description("Gives someone a certain amount of flowers. **Bot Owner Only!**\n**Usage**: `$award 100 @person`")
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Parameter("amount", ParameterType.Required)
                .Parameter("receiver", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var amountStr = e.GetArg("amount")?.Trim();
                    long amount;
                    if (!long.TryParse(amountStr, out amount) || amount < 0)
                    {
                        return;
                    }

                    var mentionedUser = e.Message.MentionedUsers.FirstOrDefault(u =>
                                                                                u.Id != NadekoBot.Client.CurrentUser.Id);
                    if (mentionedUser == null)
                    {
                        return;
                    }

                    await FlowersHandler.AddFlowersAsync(mentionedUser, $"Awarded by bot owner. ({e.User.Name}/{e.User.Id})", (int)amount).ConfigureAwait(false);

                    await e.Channel.SendMessage($"{e.User.Mention} successfully awarded {amount} {NadekoBot.Config.CurrencyName}s to {mentionedUser.Mention}!").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "take")
                .Description("Takes a certain amount of flowers from someone. **Bot Owner Only!**")
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Parameter("amount", ParameterType.Required)
                .Parameter("rektperson", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var amountStr = e.GetArg("amount")?.Trim();
                    long amount;
                    if (!long.TryParse(amountStr, out amount) || amount < 0)
                    {
                        return;
                    }

                    var mentionedUser = e.Message.MentionedUsers.FirstOrDefault(u =>
                                                                                u.Id != NadekoBot.Client.CurrentUser.Id);
                    if (mentionedUser == null)
                    {
                        return;
                    }

                    FlowersHandler.RemoveFlowers(mentionedUser, $"Taken by bot owner.({e.User.Name}/{e.User.Id})", (int)amount);

                    await e.Channel.SendMessage($"{e.User.Mention} successfully took {amount} {NadekoBot.Config.CurrencyName}s from {mentionedUser.Mention}!").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "leaderboard")
                .Alias(Prefix + "lb")
                .Do(async e =>
                {
                    var richestTemp = DbHandler.Instance.GetTopRichest();
                    var richest     = richestTemp as CurrencyState[] ?? richestTemp.ToArray();
                    if (richest.Length == 0)
                    {
                        return;
                    }
                    await e.Channel.SendMessage(
                        richest.Aggregate(new StringBuilder(
                                              $@"```xl
┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━┓
┃        Id         ┃  $$$  ┃
"),
                                          (cur, cs) => cur.AppendLine(
                                              $@"┣━━━━━━━━━━━━━━━━━━━╋━━━━━━━┫
┃{cs.UserId,-18} ┃ {cs.Value,5} ┃")
                                          ).ToString() + "┗━━━━━━━━━━━━━━━━━━━┻━━━━━━━┛```");
                });
            });
        }
예제 #13
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "pick")
            .Description($"Picks a flower planted in this channel. | `{Prefix}pick`")
            .Do(async e =>
            {
                IEnumerable <Message> msgs;

                await e.Message.Delete().ConfigureAwait(false);
                if (!plantedFlowerChannels.TryRemove(e.Channel.Id, out msgs))
                {
                    return;
                }

                foreach (var msgToDelete in msgs)
                {
                    await msgToDelete.Delete().ConfigureAwait(false);
                }

                await FlowersHandler.AddFlowersAsync(e.User, "Picked a flower.", 1, true).ConfigureAwait(false);
                var msg = await e.Channel.SendMessage($"**{e.User.Name}** picked a {NadekoBot.Config.CurrencyName}!").ConfigureAwait(false);
                ThreadPool.QueueUserWorkItem(async(state) =>
                {
                    try
                    {
                        await Task.Delay(10000).ConfigureAwait(false);
                        await msg.Delete().ConfigureAwait(false);
                    }
                    catch { }
                });
            });

            cgb.CreateCommand(Module.Prefix + "plant")
            .Description($"Spend a flower to plant it in this channel. (If bot is restarted or crashes, flower will be lost) | `{Prefix}plant`")
            .Do(async e =>
            {
                await locker.WaitAsync().ConfigureAwait(false);
                try
                {
                    if (plantedFlowerChannels.ContainsKey(e.Channel.Id))
                    {
                        await e.Channel.SendMessage($"There is already a {NadekoBot.Config.CurrencyName} in this channel.").ConfigureAwait(false);
                        return;
                    }
                    var removed = await FlowersHandler.RemoveFlowers(e.User, "Planted a flower.", 1, true).ConfigureAwait(false);
                    if (!removed)
                    {
                        await e.Channel.SendMessage($"You don't have any {NadekoBot.Config.CurrencyName}s.").ConfigureAwait(false);
                        return;
                    }

                    var file = GetRandomCurrencyImagePath();
                    Message msg;
                    if (file == null)
                    {
                        msg = await e.Channel.SendMessage(NadekoBot.Config.CurrencySign).ConfigureAwait(false);
                    }
                    else
                    {
                        msg = await e.Channel.SendFile(file).ConfigureAwait(false);
                    }
                    var vowelFirst = new[] { 'a', 'e', 'i', 'o', 'u' }.Contains(NadekoBot.Config.CurrencyName[0]);
                    var msg2       = await e.Channel.SendMessage($"Oh how Nice! **{e.User.Name}** planted {(vowelFirst ? "an" : "a")} {NadekoBot.Config.CurrencyName}. Pick it using {Module.Prefix}pick").ConfigureAwait(false);
                    plantedFlowerChannels.TryAdd(e.Channel.Id, new[] { msg, msg2 });
                }
                finally { locker.Release(); }
            });

            cgb.CreateCommand(Prefix + "gencurrency")
            .Alias(Prefix + "gc")
            .Description($"Toggles currency generation on this channel. Every posted message will have 2% chance to spawn a {NadekoBot.Config.CurrencyName}. Optional parameter cooldown time in minutes, 5 minutes by default. Requires Manage Messages permission. | `{Prefix}gc` or `{Prefix}gc 60`")
            .AddCheck(SimpleCheckers.ManageMessages())
            .Parameter("cd", ParameterType.Unparsed)
            .Do(async e =>
            {
                var cdStr = e.GetArg("cd");
                int cd    = 2;
                if (!int.TryParse(cdStr, out cd) || cd < 0)
                {
                    cd = 2;
                }
                var config = SpecificConfigurations.Default.Of(e.Server.Id);
                int throwaway;
                if (config.GenerateCurrencyChannels.TryRemove(e.Channel.Id, out throwaway))
                {
                    await e.Channel.SendMessage("`Currency generation disabled on this channel.`").ConfigureAwait(false);
                }
                else
                {
                    if (config.GenerateCurrencyChannels.TryAdd(e.Channel.Id, cd))
                    {
                        await e.Channel.SendMessage($"`Currency generation enabled on this channel. Cooldown is {cd} minutes.`").ConfigureAwait(false);
                    }
                }
            });
        }
예제 #14
0
        public override void Install(ModuleManager manager)
        {
            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                commands.ForEach(com => com.Init(cgb));

                cgb.CreateCommand(Prefix + "raffle")
                .Description($"Prints a name and ID of a random user from the online list from the (optional) role. | `{Prefix}raffle` or `{Prefix}raffle RoleName`")
                .Parameter("role", ParameterType.Optional)
                .Do(async e =>
                {
                    var arg  = string.IsNullOrWhiteSpace(e.GetArg("role")) ? "@everyone" : e.GetArg("role");
                    var role = e.Server.FindRoles(arg).FirstOrDefault();
                    if (role == null)
                    {
                        await e.Channel.SendMessage("💢 Role not found.").ConfigureAwait(false);
                        return;
                    }
                    var members      = role.Members.Where(u => u.Status == UserStatus.Online); // only online
                    var membersArray = members as User[] ?? members.ToArray();
                    var usr          = membersArray[new Random().Next(0, membersArray.Length)];
                    await e.Channel.SendMessage($"**Raffled user:** {usr.Name} (id: {usr.Id})").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "$$")
                .Description(string.Format("Check how much {0}s a person has. (Defaults to yourself) |`{1}$$` or `{1}$$ @Someone`",
                                           WizBot.Config.CurrencyName, Prefix))
                .Parameter("all", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var usr = e.Message.MentionedUsers.FirstOrDefault() ?? e.User;
                    var pts = GetUserFlowers(usr.Id);
                    var str = $"{usr.Name} has {pts} {WizBot.Config.CurrencySign}";
                    await e.Channel.SendMessage(str).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "give")
                .Description(string.Format("Give someone a certain amount of {0}s", WizBot.Config.CurrencyName) + $"|`{Prefix}give 1 \"@SomeGuy\"`")
                .Parameter("amount", ParameterType.Required)
                .Parameter("receiver", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var amountStr = e.GetArg("amount")?.Trim();
                    long amount;
                    if (!long.TryParse(amountStr, out amount) || amount <= 0)
                    {
                        return;
                    }

                    var mentionedUser = e.Message.MentionedUsers.FirstOrDefault(u =>
                                                                                u.Id != WizBot.Client.CurrentUser.Id &&
                                                                                u.Id != e.User.Id);
                    if (mentionedUser == null)
                    {
                        return;
                    }

                    var userFlowers = GetUserFlowers(e.User.Id);

                    if (userFlowers < amount)
                    {
                        await e.Channel.SendMessage($"{e.User.Mention} You don't have enough {WizBot.Config.CurrencyName}s. You only have {userFlowers}{WizBot.Config.CurrencySign}.").ConfigureAwait(false);
                        return;
                    }

                    await FlowersHandler.RemoveFlowers(e.User, "Gift", (int)amount, true).ConfigureAwait(false);
                    await FlowersHandler.AddFlowersAsync(mentionedUser, "Gift", (int)amount).ConfigureAwait(false);

                    await e.Channel.SendMessage($"{e.User.Mention} successfully sent {amount} {WizBot.Config.CurrencyName}s to {mentionedUser.Mention}!").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "award")
                .Description($"Gives someone a certain amount of flowers. **Bot Owner Only!** | `{Prefix}award 100 @person`")
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Parameter("amount", ParameterType.Required)
                .Parameter("receiver", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var amountStr = e.GetArg("amount")?.Trim();
                    long amount;
                    if (!long.TryParse(amountStr, out amount) || amount < 0)
                    {
                        return;
                    }

                    var mentionedUser = e.Message.MentionedUsers.FirstOrDefault(u =>
                                                                                u.Id != WizBot.Client.CurrentUser.Id);
                    if (mentionedUser == null)
                    {
                        return;
                    }

                    await FlowersHandler.AddFlowersAsync(mentionedUser, $"Awarded by bot owner. ({e.User.Name}/{e.User.Id})", (int)amount).ConfigureAwait(false);

                    await e.Channel.SendMessage($"{e.User.Mention} successfully awarded {amount} {WizBot.Config.CurrencyName}s to {mentionedUser.Mention}!").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "take")
                .Description($"Takes a certain amount of flowers from someone. **Bot Owner Only!** | `{Prefix}take 1 \"@someguy\"`")
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Parameter("amount", ParameterType.Required)
                .Parameter("rektperson", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var amountStr = e.GetArg("amount")?.Trim();
                    long amount;
                    if (!long.TryParse(amountStr, out amount) || amount < 0)
                    {
                        return;
                    }

                    var mentionedUser = e.Message.MentionedUsers.FirstOrDefault(u =>
                                                                                u.Id != WizBot.Client.CurrentUser.Id);
                    if (mentionedUser == null)
                    {
                        return;
                    }

                    await FlowersHandler.RemoveFlowers(mentionedUser, $"Taken by bot owner.({e.User.Name}/{e.User.Id})", (int)amount).ConfigureAwait(false);

                    await e.Channel.SendMessage($"{e.User.Mention} successfully took {amount} {WizBot.Config.CurrencyName}s from {mentionedUser.Mention}!").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "betroll")
                .Alias(Prefix + "br")
                .Description($"Bets a certain amount of {WizBot.Config.CurrencyName}s and rolls a dice. Rolling over 66 yields x2 flowers, over 90 - x3 and 100 x10. | `{Prefix}br 5`")
                .Parameter("amount", ParameterType.Required)
                .Do(async e =>
                {
                    var amountstr = e.GetArg("amount").Trim();
                    int amount;

                    if (!int.TryParse(amountstr, out amount) || amount < 1)
                    {
                        return;
                    }

                    var userFlowers = GetUserFlowers(e.User.Id);

                    if (userFlowers < amount)
                    {
                        await e.Channel.SendMessage($"{e.User.Mention} You don't have enough {WizBot.Config.CurrencyName}s. You only have {userFlowers}{WizBot.Config.CurrencySign}.").ConfigureAwait(false);
                        return;
                    }

                    await FlowersHandler.RemoveFlowers(e.User, "Betroll Gamble", (int)amount, true).ConfigureAwait(false);

                    var rng = new Random().Next(0, 101);
                    var str = $"{e.User.Mention} `You rolled {rng}.` ";
                    if (rng < 67)
                    {
                        str += "Better luck next time.";
                    }
                    else if (rng < 90)
                    {
                        str += $"Congratulations! You won {amount * 2}{WizBot.Config.CurrencySign} for rolling above 66";
                        await FlowersHandler.AddFlowersAsync(e.User, "Betroll Gamble", amount * 2, true).ConfigureAwait(false);
                    }
                    else if (rng < 100)
                    {
                        str += $"Congratulations! You won {amount * 3}{WizBot.Config.CurrencySign} for rolling above 90.";
                        await FlowersHandler.AddFlowersAsync(e.User, "Betroll Gamble", amount * 3, true).ConfigureAwait(false);
                    }
                    else
                    {
                        str += $"👑 Congratulations! You won {amount * 10}{WizBot.Config.CurrencySign} for rolling **100**. 👑";
                        await FlowersHandler.AddFlowersAsync(e.User, "Betroll Gamble", amount * 10, true).ConfigureAwait(false);
                    }

                    await e.Channel.SendMessage(str).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "leaderboard")
                .Alias(Prefix + "lb")
                .Description($"Displays bot currency leaderboard | `{Prefix}lb`")
                .Do(async e =>
                {
                    var richestTemp = DbHandler.Instance.GetTopRichest();
                    var richest     = richestTemp as CurrencyState[] ?? richestTemp.ToArray();
                    if (richest.Length == 0)
                    {
                        return;
                    }
                    await e.Channel.SendMessage(
                        richest.Aggregate(new StringBuilder(
                                              $@"```xl
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┓
┃        Id           ┃  $$$  ┃
"),
                                          (cur, cs) => cur.AppendLine(
                                              $@"┣━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━┫
┃{(e.Server.Users.Where(u => u.Id == (ulong)cs.UserId).FirstOrDefault()?.Name.TrimTo(18, true) ?? cs.UserId.ToString()),-20} ┃ {cs.Value,5} ┃")
                                          ).ToString() + "┗━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━┛```").ConfigureAwait(false);
                });
            });
        }
예제 #15
0
        public override void Install(ModuleManager manager)
        {
            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(Classes.Permissions.PermissionChecker.Instance);

                commands.ForEach(com => com.Init(cgb));

                cgb.CreateCommand(Prefix + "raffle")
                .Description("Prints a name and ID of a random user from the online list from the (optional) role.")
                .Parameter("role", ParameterType.Optional)
                .Do(RaffleFunc());

                cgb.CreateCommand(Prefix + "$$")
                .Description(string.Format("Check how much {0}s you have.", NadekoBot.Config.CurrencyName))
                .Do(NadekoFlowerCheckFunc());

                cgb.CreateCommand(Prefix + "give")
                .Description(string.Format("Give someone a certain amount of {0}s", NadekoBot.Config.CurrencyName))
                .Parameter("amount", ParameterType.Required)
                .Parameter("receiver", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var amountStr = e.GetArg("amount")?.Trim();
                    long amount;
                    if (!long.TryParse(amountStr, out amount) || amount < 0)
                    {
                        return;
                    }

                    var mentionedUser = e.Message.MentionedUsers.FirstOrDefault(u =>
                                                                                u.Id != NadekoBot.Client.CurrentUser.Id &&
                                                                                u.Id != e.User.Id);
                    if (mentionedUser == null)
                    {
                        return;
                    }

                    var userFlowers = GetUserFlowers(e.User.Id);

                    if (userFlowers < amount)
                    {
                        await e.Channel.SendMessage($"{e.User.Mention} You don't have enough {NadekoBot.Config.CurrencyName}s. You have only {userFlowers}{NadekoBot.Config.CurrencySign}.");
                        return;
                    }

                    FlowersHandler.RemoveFlowers(e.User, "Gift", (int)amount);
                    await FlowersHandler.AddFlowersAsync(mentionedUser, "Gift", (int)amount);

                    await e.Channel.SendMessage($"{e.User.Mention} successfully sent {amount} {NadekoBot.Config.CurrencyName}s to {mentionedUser.Mention}!");
                });

                cgb.CreateCommand(Prefix + "award")
                .Description("Gives someone a certain amount of flowers. **Owner only!**")
                .AddCheck(Classes.Permissions.SimpleCheckers.OwnerOnly())
                .Parameter("amount", ParameterType.Required)
                .Parameter("receiver", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var amountStr = e.GetArg("amount")?.Trim();
                    long amount;
                    if (!long.TryParse(amountStr, out amount) || amount < 0)
                    {
                        return;
                    }

                    var mentionedUser = e.Message.MentionedUsers.FirstOrDefault(u =>
                                                                                u.Id != NadekoBot.Client.CurrentUser.Id);
                    if (mentionedUser == null)
                    {
                        return;
                    }

                    await FlowersHandler.AddFlowersAsync(mentionedUser, $"Awarded by bot owner. ({e.User.Name}/{e.User.Id})", (int)amount);

                    await e.Channel.SendMessage($"{e.User.Mention} successfully awarded {amount} {NadekoBot.Config.CurrencyName}s to {mentionedUser.Mention}!");
                });

                cgb.CreateCommand(Prefix + "take")
                .Description("Takes a certain amount of flowers from someone. **Owner only!**")
                .AddCheck(Classes.Permissions.SimpleCheckers.OwnerOnly())
                .Parameter("amount", ParameterType.Required)
                .Parameter("rektperson", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var amountStr = e.GetArg("amount")?.Trim();
                    long amount;
                    if (!long.TryParse(amountStr, out amount) || amount < 0)
                    {
                        return;
                    }

                    var mentionedUser = e.Message.MentionedUsers.FirstOrDefault(u =>
                                                                                u.Id != NadekoBot.Client.CurrentUser.Id);
                    if (mentionedUser == null)
                    {
                        return;
                    }

                    FlowersHandler.RemoveFlowers(mentionedUser, $"Taken by bot owner.({e.User.Name}/{e.User.Id})", (int)amount);

                    await e.Channel.SendMessage($"{e.User.Mention} successfully took {amount} {NadekoBot.Config.CurrencyName}s from {mentionedUser.Mention}!");
                });
            });
        }
        /// <summary>
        /// This is what happens when NadekoBot receives messages
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public async void PotentialPlacement(object sender, MessageEventArgs e)
        {
            try
            {
                #region checks
                //Getting the messages we want
                if (e.Channel.IsPrivate)
                {
                    return;                      //Because the default message would show up as well
                }
                if (e.Server != server)
                {
                    return;
                }
                if (!Players.Keys.Contains(e.User))
                {
                    return;                                 //Only track current players
                }
                if (e.User == currentCzar && !CzarDecision)
                {
                    return;
                }
                if (CzarDecision && e.User != currentCzar)
                {
                    return;
                }
                #endregion

                #region CzarDecision
                //if the Tzar is making the decision
                if (CzarDecision)
                {
                    int choice;
                    if (!int.TryParse(e.Message.Text, out choice))
                    {
                        return;
                    }
                    choice--;
                    //check whether it's out of range
                    if (choice > WhiteCardsAssortment.Count - 1)
                    {
                        return;
                    }
                    var chosen  = WhiteCardsAssortment[choice];
                    var winner  = chosen.Key;
                    var message = $"{winner.Name} has won this round with:\n";
                    var cards   = WhiteCardsAssortment[choice].Value;
                    if (currentBlackCard.CardContents.Contains("\\_\\_\\_"))
                    {
                        var str        = currentBlackCard.ToString();
                        var cardsArray = cards.ToArray();
                        for (int i = 0; i < cards.Count(); i++)
                        {
                            var c = cardsArray[0];
                            str = str.Replace("\\_\\_\\_", c.CardContents);
                        }
                        message += str;
                    }
                    else
                    {
                        message += currentBlackCard.ToString();
                        cards.ToList().ForEach(x => message += x.CardContents + "\n");
                    }
                    //cahCancelSource.Cancel();
                    CzarDecision = false;
                    Players[winner].Points++;
                    GameActive = false;
                    await channel.SendMessage(message);

                    //Remove chosen card of winner

                    foreach (var card in cards)
                    {
                        Players[winner].Hand.Remove(card);
                    }
                    //Is it a final win?
                    if (Players[winner].Points != WinRequirement)
                    {
                        return;
                    }
                    ShouldStopGame = true;
                    await channel.Send($"We have a winner! Its {winner.Mention}\n{getLeaderboard()}"); //add leaderboard

                    await FlowersHandler.AddFlowersAsync(winner, "Won CAH", 2);

                    return;
                }
                #endregion

                #region regularPlayers
                var      msg     = e.Message.Text;
                var      cardSet = new HashSet <CAHWhiteCard>();
                CAHStats stat;
                if (!Players.TryGetValue(e.User, out stat))
                {
                    return;
                }



                if (currentBlackCard.WhiteCards == 1)
                {
                    int index;
                    if (!int.TryParse(msg.Trim(), out index))
                    {
                        return;
                    }
                    index--; //!!!
                    if (index > stat.Hand.Count() - 1)
                    {
                        return;
                    }
                    cardSet.Add(stat.Hand[index]);
                }
                else
                {
                    if (!Regex.IsMatch(msg, @"\d"))
                    {
                        return;
                    }
                    var matches = Regex.Matches(msg, @"\d+");
                    if (matches.Count < currentBlackCard.WhiteCards)
                    {
                        await channel.SendMessage($"Black card need {currentBlackCard.WhiteCards} cards, seperated from each other.");

                        return;
                    }


                    foreach (Match m  in matches)
                    {
                        var s = m.Value;
                        int index;
                        if (!int.TryParse(s, out index))
                        {
                            return;
                        }
                        index--; //!!!
                        if (index < 0 || index > stat.Hand.Count() - 1)
                        {
                            cardSet.Add(stat.Hand[index]);
                        }
                    }
                }



                var newIndex   = getRandomIndex();
                var kvp        = new KeyValuePair <User, HashSet <CAHWhiteCard> >(e.User, cardSet);
                var containing = false;
                WhiteCardsAssortment.Values.ForEach(x =>
                {
                    if (x.Key == e.User)
                    {
                        containing   = true;
                        var toUpdate = WhiteCardsAssortment.Where(y => y.Value.Equals(x)).First();
                        WhiteCardsAssortment.TryUpdate(toUpdate.Key, kvp, toUpdate.Value);
                    }
                });
                if (!containing)
                {
                    WhiteCardsAssortment.TryAdd(newIndex, kvp);
                }

                //chosenWhiteCards.Add(e.User, stat.Hand[index]); //catch the outofRangeExceptions
                var unset = unSetPlayers();
                await channel.SendMessage($"Registered chosen card(s) for {e.User.Mention}\n{unset}");

                if (unset == String.Empty) //There are no players who haven't chosen yet
                {
                    allChosen = true;
                }
                #endregion
            }
            catch (IndexOutOfRangeException)
            {
                //This shouldn't happen anymore
                await channel.SendMessage("Index given was out of range");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
예제 #17
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "pick")
            .Description($"Nimmt einen in diesem Channel hinterlegten {MidnightBot.Config.CurrencyName}. | `{Prefix}pick`")
            .Do(async e =>
            {
                IEnumerable <Message> msgs;

                await e.Message.Delete().ConfigureAwait(false);
                if (!plantedFlowerChannels.TryRemove(e.Channel.Id, out msgs))
                {
                    return;
                }

                foreach (var msgToDelete in msgs)
                {
                    await msgToDelete.Delete().ConfigureAwait(false);
                }
                await FlowersHandler.AddFlowersAsync(e.User, "Took a dollar.", 1, true).ConfigureAwait(false);
                var msg = await e.Channel.SendMessage($"**{e.User.Name}** hat den {MidnightBot.Config.CurrencyName} aufgehoben!").ConfigureAwait(false);
                ThreadPool.QueueUserWorkItem(async(state) =>
                {
                    try
                    {
                        await Task.Delay(10000).ConfigureAwait(false);
                        await msg.Delete().ConfigureAwait(false);
                    }
                    catch { }
                });
            });

            cgb.CreateCommand(Module.Prefix + "plant")
            .Description($"Gib einen {MidnightBot.Config.CurrencyName} aus, um in in diesen Channel zu legen. (Wenn der Bot neustartet, oder crashed, ist der {MidnightBot.Config.CurrencyName} verloren) | `{Prefix}plant`")
            .Do(async e =>
            {
                await locker.WaitAsync().ConfigureAwait(false);
                try
                {
                    if (plantedFlowerChannels.ContainsKey(e.Channel.Id))
                    {
                        await e.Channel.SendMessage($"Hier liegt bereits ein {MidnightBot.Config.CurrencyName} in diesem Channel.").ConfigureAwait(false);
                        return;
                    }
                    var removed = await FlowersHandler.RemoveFlowers(e.User, "Planted a flower.", 1, true).ConfigureAwait(false);
                    if (!removed)
                    {
                        await e.Channel.SendMessage($"Du hast keinen {MidnightBot.Config.CurrencyName}s.").ConfigureAwait(false);
                        return;
                    }

                    var file = GetRandomCurrencyImagePath();
                    Message msg;
                    if (file == null)
                    {
                        msg = await e.Channel.SendMessage(MidnightBot.Config.CurrencySign).ConfigureAwait(false);
                    }
                    else
                    {
                        msg = await e.Channel.SendFile(file).ConfigureAwait(false);
                    }
                    var vowelFirst = new[] { 'a', 'e', 'i', 'o', 'u' }.Contains(MidnightBot.Config.CurrencyName[0]);
                    var msg2       = await e.Channel.SendMessage($"Oh wie nett! **{e.User.Name}** hinterlies {(vowelFirst ? "einen" : "einen")} {MidnightBot.Config.CurrencyName}. Nimm ihn per {Module.Prefix}pick").ConfigureAwait(false);
                    plantedFlowerChannels.TryAdd(e.Channel.Id, new[] { msg, msg2 });
                }
                finally { locker.Release(); }
            });

            cgb.CreateCommand(Prefix + "gencurrency")
            .Alias(Prefix + "gc")
            .Description($"Ändert Währungs Erstellung in diesem Channel. Jede geschriebene Nachricht hat eine Chance von 2%, einen {MidnightBot.Config.CurrencyName} zu spawnen. Optionaler Parameter ist die Cooldown Zeit in Minuten. 5 Minuten sind Standard. Benötigt Manage Messages Berechtigungen | `{Prefix}gc` oder `{Prefix}gc 60`")
            .AddCheck(SimpleCheckers.ManageMessages())
            .Parameter("cd", ParameterType.Unparsed)
            .Do(async e =>
            {
                var cdStr = e.GetArg("cd");
                int cd    = 2;
                if (!int.TryParse(cdStr, out cd) || cd < 0)
                {
                    cd = 2;
                }
                var config = SpecificConfigurations.Default.Of(e.Server.Id);
                int throwaway;
                if (config.GenerateCurrencyChannels.TryRemove(e.Channel.Id, out throwaway))
                {
                    await e.Channel.SendMessage("`Währungs Erstellung deaktiviert in diesem Channel.`").ConfigureAwait(false);
                }
                else
                {
                    if (config.GenerateCurrencyChannels.TryAdd(e.Channel.Id, cd))
                    {
                        await e.Channel.SendMessage($"`Währungserstellung aktiviert in diesem Channel. Cooldown ist {cd} Minuten.`").ConfigureAwait(false);
                    }
                }
            });
        }
예제 #18
0
        private async System.Threading.Tasks.Task <string> Attack(User attacker, User target, string moveString)
        {
            PokemonSprite attackerPokemon = ActivePokemon(attacker);
            string        returnstring    = "";
            var           species         = attackerPokemon.GetSpecies();

            if (!species.moves.Keys.Contains(moveString))
            {
                returnstring = $"Kann \"{moveString}\" nicht benutzen, benutze `{Prefix}ml` um eine Liste der Attacken zu sehen";
                return(returnstring);
            }
            var attackerStats = UserStats.GetOrAdd(attacker.Id, new TrainerStats());
            var defenderStats = UserStats.GetOrAdd(target.Id, new TrainerStats());

            if (attackerStats.MovesMade > TrainerStats.MaxMoves || attackerStats.LastAttacked.Contains(target.Id))
            {
                returnstring = $"{attacker.Mention} kann sich nicht bewegen!";
                return(returnstring);
            }
            if (attackerPokemon.HP == 0)
            {
                returnstring = $"{attackerPokemon.NickName} wurde besiegt und kann nicht angreifen!";
                return(returnstring);
            }
            var defenderPokemon = ActivePokemon(target);

            if (defenderPokemon.HP <= 0)
            {
                returnstring = $"{defenderPokemon.NickName} wurde bereits besiegt!";
                return(returnstring);
            }
            double p = 0.90 * attackerPokemon.Speed / defenderPokemon.Speed;

            //await e.Channel.SendMessage($"p: {p.ToString()} 1-p: {(1- p).ToString()}");
            if (rng.NextDouble() < (1 - p))
            {
                if (target.Id == MidnightBot.Creds.BotId)
                {
                    attackerStats.LastAttacked.Remove(target.Id);
                    attackerStats.MovesMade = 0;
                    UserStats.AddOrUpdate(attacker.Id, x => attackerStats, (s, t) => attackerStats);
                    UserStats.AddOrUpdate(target.Id, x => defenderStats, (s, t) => defenderStats);
                    DbHandler.Instance.Save(defenderPokemon);
                    DbHandler.Instance.Save(attackerPokemon);
                }
                else
                {
                    defenderStats.LastAttacked.Remove(target.Id);
                    attackerStats.LastAttacked.Add(target.Id);
                    attackerStats.MovesMade++;
                    defenderStats.LastAttacked = new List <ulong>();
                    defenderStats.MovesMade    = 0;
                    UserStats.AddOrUpdate(attacker.Id, x => attackerStats, (s, t) => attackerStats);
                    UserStats.AddOrUpdate(target.Id, x => defenderStats, (s, t) => defenderStats);
                    DbHandler.Instance.Save(defenderPokemon);
                    DbHandler.Instance.Save(attackerPokemon);
                }
                returnstring = $"{attackerPokemon.NickName}'s Attacke fehlgeschlagen!";
                return(returnstring);
            }

            KeyValuePair <string, string> move = new KeyValuePair <string, string> (moveString, species.moves[moveString]);

            PokemonAttack attack = new PokemonAttack(attackerPokemon, defenderPokemon, move);

            returnstring       += attack.AttackString();
            defenderPokemon.HP -= attack.Damage;

            var HP = (defenderPokemon.HP < 0) ? 0 : defenderPokemon.HP;

            returnstring += $"{defenderPokemon.NickName} hat {HP} HP über!\n";


            attackerStats.LastAttacked.Add(target.Id);
            attackerStats.MovesMade++;
            defenderStats.LastAttacked = new List <ulong>();
            defenderStats.MovesMade    = 0;
            UserStats.AddOrUpdate(attacker.Id, x => attackerStats, (s, t) => attackerStats);
            UserStats.AddOrUpdate(target.Id, x => defenderStats, (s, t) => defenderStats);
            DbHandler.Instance.Save(defenderPokemon);
            DbHandler.Instance.Save(attackerPokemon);
            if (defenderPokemon.HP <= 0)
            {
                defenderPokemon.HP = 0;

                if (target.Id != MidnightBot.Creds.BotId)
                {
                    returnstring += $"{defenderPokemon.NickName} wurde besiegt!\n{attackerPokemon.NickName}'s Besitzer {attacker.Mention} erhält 1 {MidnightBot.Config.CurrencySign}\n";
                }
                var lvl = attackerPokemon.Level;

                var extraXP = attackerPokemon.Reward(defenderPokemon);

                returnstring += $"{attackerPokemon.NickName} erhält {extraXP} von diesem Kampf\n";

                if (attackerPokemon.Level > lvl) //levled up
                {
                    returnstring += $"**{attackerPokemon.NickName}** ist aufgelevelt!\n**{attackerPokemon.NickName}** ist nun Level **{attackerPokemon.Level}**";
                    //Check evostatus
                }
                if (target.Id != MidnightBot.Creds.BotId)
                {
                    var list = PokemonList(target).Where(s => (s.HP > 0 && s != defenderPokemon));
                    if (list.Any())
                    {
                        var toSet = list.FirstOrDefault();
                        switch (SwitchPokemon(target, toSet))
                        {
                        case 0:
                        {
                            returnstring            += $"\n{target.Mention}'s aktives Pokemon auf **{toSet.NickName}** gesetzt";
                            defenderPokemon.IsActive = false;
                            break;
                        }

                        case 1:
                        case 2:
                        {
                            returnstring += $"\n **Error:** konnte Pokemon nicht austauschen";
                            break;
                        }
                        }
                    }
                    else
                    {
                        returnstring += $"\n{target.Mention} hat keine Pokemon über!";
                        returnstring += $"\n{attacker.Mention} erhält 3 {MidnightBot.Config.CurrencySign} für das Besiegen von {target.Mention}";
                        await FlowersHandler.AddFlowersAsync(attacker, $"Defeated {target.Mention} in pokemon!", 3);

                        //do something?
                    }
                }
                //await e.Channel.SendMessage(str);
                if (target.Id != MidnightBot.Creds.BotId)
                {
                    await FlowersHandler.AddFlowersAsync(attacker, "Victorious in pokemon", 1, true);
                }
            }

            //Update stats, you shall
            defenderStats.LastAttacked.Remove(target.Id);
            attackerStats.LastAttacked.Add(target.Id);
            attackerStats.MovesMade++;
            defenderStats.LastAttacked = new List <ulong>();
            defenderStats.MovesMade    = 0;
            UserStats.AddOrUpdate(attacker.Id, x => attackerStats, (s, t) => attackerStats);
            UserStats.AddOrUpdate(target.Id, x => defenderStats, (s, t) => defenderStats);
            DbHandler.Instance.Save(defenderPokemon);
            DbHandler.Instance.Save(attackerPokemon);
            if (defenderPokemon.HP == 0 && target.Id == MidnightBot.Creds.BotId)
            {
                var db  = DbHandler.Instance.GetAllRows <PokemonSprite> ();
                var row = db.Where(x => x.OwnerId == (long)MidnightBot.Creds.BotId);
                //var toDelete = DbHandler.Instance.FindAll<PokemonSprite>(s => s.OwnerId == (long)e.User.Id);
                foreach (var todel in row)
                {
                    DbHandler.Instance.Delete <PokemonSprite>(todel.Id.Value);
                }
                PokemonList(target, attackerPokemon.Level);
            }
            return(returnstring);
        }
예제 #19
0
            private async Task StartRace()
            {
                var         rng    = new Random();
                Participant winner = null;
                Message     msg    = null;
                int         place  = 1;

                try
                {
                    NadekoBot.Client.MessageReceived += Client_MessageReceived;

                    while (!participants.All(p => p.Total >= 60))
                    {
                        //update the state
                        participants.ForEach(p =>
                        {
                            p.Total += 1 + rng.Next(0, 10);
                            if (p.Total > 60)
                            {
                                p.Total = 60;
                                if (winner == null)
                                {
                                    winner = p;
                                }
                                if (p.Place == 0)
                                {
                                    p.Place = place++;
                                }
                            }
                        });


                        //draw the state

                        var text = $@"|🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🔚|
{String.Join("\n", participants.Select(p => $"{(int)(p.Total / 60f * 100),-2}%|{p.ToString()}"))}
|🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🏁🔚|";
                        if (msg == null || messagesSinceGameStarted >= 10) // also resend the message if channel was spammed
                        {
                            if (msg != null)
                            {
                                try { await msg.Delete(); } catch { }
                            }
                            msg = await raceChannel.SendMessage(text);

                            messagesSinceGameStarted = 0;
                        }
                        else
                        {
                            await msg.Edit(text);
                        }

                        await Task.Delay(2500);
                    }
                }
                finally
                {
                    NadekoBot.Client.MessageReceived -= Client_MessageReceived;
                }

                if (winner.AmountBet > 0)
                {
                    var wonAmount = winner.AmountBet * (participants.Count - 1);
                    await FlowersHandler.AddFlowersAsync(winner.User, "Won a Race", wonAmount).ConfigureAwait(false);

                    await raceChannel.SendMessage($"🏁 {winner.User.Mention} as {winner.Animal} **Won the race and {wonAmount}{NadekoBot.Config.CurrencySign}!**");
                }
                else
                {
                    await raceChannel.SendMessage($"🏁 {winner.User.Mention} as {winner.Animal} **Won the race!**");
                }
            }
예제 #20
0
        public override void Install(ModuleManager manager)
        {
            manager.CreateCommands("", cgb =>
            {
                cgb.AddCheck(PermissionChecker.Instance);

                commands.ForEach(com => com.Init(cgb));

                cgb.CreateCommand(Prefix + "raffle")
                .Description($"Schreibt den Namen und die ID eines zufälligen Benutzers aus der Online Liste einer (optionalen) Rolle. | `{Prefix}raffle` oder `{Prefix}raffle RoleName`")
                .Parameter("role", ParameterType.Optional)
                .Do(async e =>
                {
                    var arg  = string.IsNullOrWhiteSpace(e.GetArg("role")) ? "@everyone" : e.GetArg("role");
                    var role = e.Server.FindRoles(arg).FirstOrDefault();
                    if (role == null)
                    {
                        await e.Channel.SendMessage("💢 Rolle nicht gefunden.").ConfigureAwait(false);
                        return;
                    }
                    var members      = role.Members.Where(u => u.Status == UserStatus.Online); // only online
                    var membersArray = members as User[] ?? members.ToArray();
                    var usr          = membersArray[new Random().Next(0, membersArray.Length)];
                    await e.Channel.SendMessage($"**Gezogener Benutzer:** {usr.Name} (Id: {usr.Id})").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "$$")
                .Description(string.Format("Überprüft, wieviele {0} du hast.", MidnightBot.Config.CurrencyName))
                .Parameter("all", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var usr = e.Message.MentionedUsers.FirstOrDefault() ?? e.User;
                    var pts = GetUserFlowers(usr.Id);
                    var str = $"{usr.Name} hat {pts} {MidnightBot.Config.CurrencyName} {MidnightBot.Config.CurrencySign}";
                    await e.Channel.SendMessage(str).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "award")
                .Description(string.Format($"Gibt jemanden eine bestimmte Anzahl an {MidnightBot.Config.CurrencyName}. **Bot Owner Only!** | `{Prefix}award 5 @Benutzer`"))
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Parameter("amount", ParameterType.Required)
                .Parameter("receiver", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var amountStr = e.GetArg("amount")?.Trim();
                    long amount;
                    if (!long.TryParse(amountStr, out amount) || amount <= 0)
                    {
                        return;
                    }
                    var mentionedUser = e.Message.MentionedUsers.FirstOrDefault(u =>
                                                                                u.Id != MidnightBot.Client.CurrentUser.Id);
                    if (mentionedUser == null)
                    {
                        return;
                    }

                    await FlowersHandler.AddFlowersAsync(mentionedUser, $"Awarded by bot owner. ({e.User.Name}/{e.User.Id})", (int)amount).ConfigureAwait(false);

                    await e.Channel.SendMessage($"{e.User.Mention} erfolgreich {amount}  {MidnightBot.Config.CurrencyName} zu {mentionedUser.Mention} hinzugefügt!").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "dailymoney")
                .Description($"Tägliches Geld (20 Euro, wird um 0 Uhr zurückgesetzt.) | `{Prefix}dailymoney`")
                .Do(async e =>
                {
                    DateTime today = DateTime.Today;
                    var uid        = (long)e.User.Id;
                    var sid        = (long)e.Server.Id;

                    var user = DbHandler.Instance.FindOne <DailyMoney>(dm => dm.UserId == uid && dm.ServerId == sid);
                    if (user == null)
                    {
                        var data = new DailyMoney
                        {
                            UserId         = (long)e.User.Id,
                            LastTimeGotten = today.AddDays(-1),
                            ServerId       = (long)e.Server.Id
                        };
                        DbHandler.Instance.InsertData(data);
                        user = DbHandler.Instance.FindOne <DailyMoney>(dm => dm.UserId == uid && dm.ServerId == sid);
                    }
                    if (user.LastTimeGotten.Date.DayOfYear < today.Date.DayOfYear)
                    {
                        var data = DbHandler.Instance.FindAll <DailyMoney>(d => d.ServerId == sid && d.UserId == uid);
                        DbHandler.Instance.UpdateAll <DailyMoney>(data.Select(i => { i.LastTimeGotten = today; return(i); }));
                        await FlowersHandler.AddFlowersAsync(e.User, $"Daily Reward. ({e.User.Name}/{e.User.Id})", 20).ConfigureAwait(false);
                        await e.Channel.SendMessage($"{e.User.Mention} hat sich seinen täglichen Anteil  von 20 {MidnightBot.Config.CurrencyName} abgeholt.");
                        return;
                    }
                    else
                    {
                        await e.Channel.SendMessage("Du hast deinen täglichen Anteil heute bereits abgeholt.");
                    }
                });

                cgb.CreateCommand(Prefix + "take")
                .Description(string.Format($"Entfernt eine bestimmte Anzahl an {MidnightBot.Config.CurrencyName} von jemanden. **Bot Owner Only!** | `{Prefix}take 1 \"@someguy\"`"))
                .AddCheck(SimpleCheckers.OwnerOnly())
                .Parameter("amount", ParameterType.Required)
                .Parameter("rektperson", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var amountStr = e.GetArg("amount")?.Trim();
                    long amount;
                    if (!long.TryParse(amountStr, out amount) || amount < 0)
                    {
                        return;
                    }

                    var mentionedUser = e.Message.MentionedUsers.FirstOrDefault(u =>
                                                                                u.Id != MidnightBot.Client.CurrentUser.Id);
                    if (mentionedUser == null)
                    {
                        return;
                    }

                    await FlowersHandler.RemoveFlowers(mentionedUser, $"Taken by bot owner.({e.User.Name}/{e.User.Id})", (int)amount).ConfigureAwait(false);

                    await e.Channel.SendMessage($"{e.User.Mention} erfolgreich {amount} {MidnightBot.Config.CurrencyName} von {mentionedUser.Mention} entfernt!").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "give")
                .Description($"Gibt jemanden eine Anzahl {MidnightBot.Config.CurrencyName}. |`{Prefix}give 1 \"@SomeGuy\"`")
                .Parameter("amount", ParameterType.Required)
                .Parameter("receiver", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var amountStr = e.GetArg("amount")?.Trim();
                    long amount;
                    if (!long.TryParse(amountStr, out amount) || amount <= 0)
                    {
                        return;
                    }

                    var mentionedUser = e.Message.MentionedUsers.FirstOrDefault(u =>
                                                                                u.Id != MidnightBot.Client.CurrentUser.Id &&
                                                                                u.Id != e.User.Id);
                    if (mentionedUser == null)
                    {
                        return;
                    }

                    var userFlowers = GetUserFlowers(e.User.Id);

                    if (userFlowers < amount)
                    {
                        await e.Channel.SendMessage($"{e.User.Mention} Du hast nicht genug {MidnightBot.Config.CurrencyName}. Du hast nur {userFlowers} {MidnightBot.Config.CurrencySign}.").ConfigureAwait(false);
                        return;
                    }

                    await FlowersHandler.RemoveFlowers(e.User, "Gift", (int)amount, true).ConfigureAwait(false);
                    await FlowersHandler.AddFlowersAsync(mentionedUser, "Gift", (int)amount).ConfigureAwait(false);

                    await e.Channel.SendMessage($"{e.User.Mention} erfolgreich {amount}{MidnightBot.Config.CurrencyName} gesendet an {mentionedUser.Mention}!").ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "betroll")
                .Alias(Prefix + "br")
                .Description($"Wettet einen bestimmten Betrag an {MidnightBot.Config.CurrencyName} und wirft einen Würfel. Bei über 66 Punkten: x2 {MidnightBot.Config.CurrencyName}, über 90 Punkte: x3 und 100 x10. | `{Prefix}br 5`")
                .Parameter("amount", ParameterType.Required)
                .Do(async e =>
                {
                    var amountstr = e.GetArg("amount").Trim();
                    int amount;

                    if (!int.TryParse(amountstr, out amount) || amount < 1)
                    {
                        return;
                    }

                    var userFlowers = GetUserFlowers(e.User.Id);

                    if (userFlowers < amount)
                    {
                        await e.Channel.SendMessage($"{e.User.Mention} Du hast nicht genug {MidnightBot.Config.CurrencyName}. Du hast nur {userFlowers}{MidnightBot.Config.CurrencySign}.").ConfigureAwait(false);
                        return;
                    }

                    await FlowersHandler.RemoveFlowers(e.User, "Betroll Gamble", (int)amount, true).ConfigureAwait(false);

                    var rng = new Random().Next(0, 101);
                    var str = $"{e.User.Mention} `Du hast folgende Punktzahl geworfen: {rng}` ";
                    if (rng < 67)
                    {
                        str += "Viel Glück beim nächsten Mal.";
                    }
                    else if (rng < 90)
                    {
                        str += $"Glückwunsch! Du hast {amount * 2}{MidnightBot.Config.CurrencySign} für das erzielen von mehr als 66 Punkten gewonnen.";
                        await FlowersHandler.AddFlowersAsync(e.User, "Betroll Gamble", amount * 2, true).ConfigureAwait(false);
                    }
                    else if (rng < 100)
                    {
                        str += $"Glückwunsch! Du hast {amount * 3}{MidnightBot.Config.CurrencySign} für das erzielen von mehr als 90 Punkten gewonnen.";
                        await FlowersHandler.AddFlowersAsync(e.User, "Betroll Gamble", amount * 3, true).ConfigureAwait(false);
                    }
                    else
                    {
                        str += $"👑 Glückwunsch! Du hast {amount * 10}{MidnightBot.Config.CurrencySign} für das erzielen von **100** Punkten gewonnen. 👑";
                        await FlowersHandler.AddFlowersAsync(e.User, "Betroll Gamble", amount * 10, true).ConfigureAwait(false);
                    }

                    await e.Channel.SendMessage(str).ConfigureAwait(false);
                });

                cgb.CreateCommand(Prefix + "leaderboard")
                .Alias(Prefix + "lb")
                .Description($"Displays bot currency leaderboard | {Prefix}lb")
                .Do(async e =>
                {
                    var richestTemp = DbHandler.Instance.GetTopRichest();
                    var richest     = richestTemp as CurrencyState[] ?? richestTemp.ToArray();
                    if (richest.Length == 0)
                    {
                        return;
                    }
                    await e.Channel.SendMessage
                    (
                        richest.Aggregate(new StringBuilder(
                                              $@"```xl
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┓
┃        Id           ┃  $$$  ┃
"),
                                          (cur, cs) => cur.AppendLine(
                                              $@"┣━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━┫
┃{(e.Server.Users.Where(u => u.Id == (ulong)cs.UserId).FirstOrDefault()?.Name.TrimTo(18, true) ?? cs.UserId.ToString()),-20} ┃ {cs.Value,5} ┃")
                                          ).ToString() + "┗━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━┛```").ConfigureAwait(false);
                });
            });
        }