예제 #1
0
        private void PostInitialize()
        {
            this.Client.Ready += (e) =>
            {
                this.Client.DebugLogger.LogMessage(LogLevel.Info, nameof(this.Client), "Ready", DateTime.Now);
                return(Task.CompletedTask);
            };

            this.CancellationTokenSource = new CancellationTokenSource();

            AppDomain.CurrentDomain.ProcessExit += (s, e)
                                                   => this.CancellationTokenSource.Cancel();

            Console.CancelKeyPress += (s, e)
                                      => this.CancellationTokenSource.Cancel();

            /* This way you can access the Bot object without globals */
            var deps = new ServiceCollection()
                       .AddSingleton <Bot>(f => this)
                       .BuildServiceProvider();
            var cnext = this.Client.UseCommandsNext(new CommandsNextConfiguration()
            {
                StringPrefixes       = this.Config.Prefixes,
                CaseSensitive        = false,
                IgnoreExtraArguments = true,
                Services             = deps
            });

            /* Basic command handling */
            cnext.CommandErrored += async(e) =>
            {
                var et = e.Exception.GetType();
                if (et == typeof(CommandNotFoundException))
                {
                    return;
                }
                if (et == typeof(UserException))
                {
                    await e.Context.RespondAsync(e.Exception.Message);
                }
                else
                {
                    if (et == typeof(ArgumentException) &&
                        e.Exception.Message == "Could not find a suitable overload for the command.")
                    {
                        await e.Context.RespondAsync($"Invalid syntax for `{e.Command.QualifiedName}`. See `{e.Context.Prefix}help {e.Command.QualifiedName}` for info on that.");

                        return;
                    }
                    if (e.Exception.Message == "No matching subcommands were found, and this group is not executable.")
                    {
                        await e.Context.RespondAsync($"You either spelled the command wrong or it doesn't exist in specified group.");

                        return;
                    }
                    if (e.Exception.GetType() == typeof(ChecksFailedException))
                    {
                        var ce = (ChecksFailedException)e.Exception;
                        foreach (var failed in ce.FailedChecks)
                        {
                            if (failed.GetType() == typeof(RequirePermissionsAttribute))
                            {
                                // permission failed
                                await e.Context.RespondAsync("You do not have permission to use this command.");

                                return;
                            }
                            else if (failed.GetType() == typeof(CooldownAttribute))
                            {
                                if (e.Exception.Message == "One or more pre-execution checks failed.")
                                {
                                    var time = e.Command.GetType().GetCustomAttributes(typeof(CooldownAttribute), true);
                                    if (time != null)
                                    {
                                        await e.Context.RespondAsync($"The command is on cooldown. {((e.Command.ExecutionChecks[0] as CooldownAttribute).GetBucket(e.Context).ResetsAt - DateTimeOffset.UtcNow).TotalSeconds.ToString("N0")} seconds left");
                                    }
                                    return;
                                }
                            }
                        }
                    }
                    await e.Context.RespondAsync($"error: ```{e.Exception}```");
                }
            };
            cnext.RegisterCommands(System.Reflection.Assembly.GetExecutingAssembly());

            this.Client.UseInteractivity(new InteractivityConfiguration()
            {
                Timeout = TimeSpan.FromHours(2)
            });

            /* Put Db initialization code here */
            this.Db = new Database("./Resources/database.db");
            ManageCharacter.Initialize(this.Db);
            Helpers.Owners.InitCache();
            Helpers.TimerChr.Init(this.Db);


            /*XP System*/
            this.Client.MessageCreated += async(e) =>
            {
                if (e.Guild == null)
                {
                    return;
                }
                if (e.Author.IsBot)
                {
                    return;
                }

                Console.WriteLine($"${e.Guild.Name} | #{e.Channel.Name} | @{e.Author.Username + "#" + e.Author.Discriminator} → {e.Message.Content}");
                if (e.Channel.Name.StartsWith("darii"))
                {
                    if (Helpers.Tools.RNG.Next(5) != 0)
                    {
                        return;
                    }
                    await e.Message.CreateReactionAsync(DiscordEmoji.FromUnicode(client2, "😢"));

                    return;
                }
                var CH = await ManageCharacter.GetChannel(e.Channel.Id);

                if (CH == null)
                {
                    return;
                }
                if (CH.Category != ChannelCategory.Rp)
                {
                    return;
                }
                int XP = e.Message.Content.Count() / 100 + CH.XP;
                if (XP > 5)
                {
                    var Accg = new AccountGet()
                    {
                        UID = e.Author.Id,
                        GID = e.Guild.Id
                    };
                    var Check = await ManageCharacter.GetAll(Acc : Accg);

                    if (Check == null)
                    {
                        return;
                    }
                    var OwnGet = new OwnerGet()
                    {
                        UID  = e.Author.Id,
                        GID  = e.Guild.Id,
                        Slot = Check.Slot
                    };
                    var Own = await ManageCharacter.GetAll(OwnGet);

                    var ChrGet = new ChrGet()
                    {
                        Entry = Own.CharEntry,
                    };
                    var Chr = await ManageCharacter.GetAll(ChrGet);

                    var Cdr = await Helpers.TimerChr.GetCooldown(Chr.Entry, "xp");

                    if (Cdr != null)
                    {
                        return;
                    }
                    XP     += Helpers.Tools.RNG.Next(20) * Chr.Level;
                    XP      = XP * 2;
                    Chr.XP += XP;
                    DiscordMember mem = await e.Guild.GetMemberAsync(e.Author.Id);

                    if (Chr.XP >= Convert.ToInt32(Chr.Level * 100.57 / 4.2 * Chr.Level))
                    {
                        var olvl = Chr.Level;
begin:
                        Chr.XP    -= Convert.ToInt32(Chr.Level * 100.57 / 4.2 * Chr.Level);
                        Chr.Level += 1;
                        if (Chr.Level > 10 && Chr.Level < 15)
                        {
                            Chr.SP += 4;
                        }
                        else if (Chr.Level > 15 && Chr.Level < 20)
                        {
                            Chr.SP += 3;
                        }
                        else if (Chr.Level > 20)
                        {
                            Chr.SP += 2;
                        }
                        else
                        {
                            Chr.SP += 5;
                        }
                        if (Chr.Level > 10)
                        {
                            Chr.UPoints += 1;
                        }
                        Chr.Balance += 60;
                        if (Chr.XP >= Convert.ToInt32(Chr.Level * 100.57 / 4.2 * Chr.Level))
                        {
                            goto begin;
                        }
                        await ManageCharacter.UpdateAsync(Chr);

                        await mem.SendMessageAsync($"**{Chr.Name}** Leveled! `{olvl}` → `{Chr.Level}`");
                    }
                    else
                    {
                        await ManageCharacter.UpdateAsync(Chr);
                    }
                    await mem.SendMessageAsync($"**{Chr.Name}** earned `{XP}` **XP**");

                    await Helpers.TimerChr.AddCooldown(Chr.Entry, "xp", 120);
                }
            };
        }