예제 #1
0
 public AudioPlayer(DiscordVoiceConfig __config)
 {
     config               = __config;
     callbackInfo         = WaveCallbackInfo.FunctionCallback();
     outputDevice         = new WaveOut(callbackInfo);
     bufferedWaveProvider = new BufferedWaveProvider(new WaveFormat(48000, 16, config.Channels));
 }
예제 #2
0
        public override void Install(CommandsManager manager)
        {
            manager.AddCommand(new CommandStub("yt", "Streams a YouTube Video. Lewd.", "", PermissionType.Owner, 1, cmdArgs =>
            {
                if (cmdArgs.Args[0].Length > 0)
                {
                    string url  = cmdArgs.Args[0];
                    var youtube = YouTube.Default;
                    var video   = youtube.GetVideo(url);
                    if (video.AudioFormat == AudioFormat.Mp3 || video.AudioFormat == AudioFormat.Vorbis)
                    {
                        SendVoice("", manager.Client, video);
                    }
                    else
                    {
                        cmdArgs.Channel.SendMessage($"Tell Axiom not to get lazy and support other audio codecs besides MP3! (This was in {video.AudioFormat})");
                    }
                }
                else
                {
                    cmdArgs.Channel.SendMessage($"wrong");
                }
            }), this);
            manager.AddCommand(new CommandStub("disconnect", "Disconnects from voice", "", PermissionType.Owner, 1, cmdArgs =>
            {
                manager.Client.DisconnectFromVoice();
            }), this);
            manager.AddCommand(new CommandStub("testvoice", "Broadcasts specified file over voice.", "", PermissionType.Owner, 1, cmdArgs =>
            {
                if (File.Exists(cmdArgs.Args[0]))
                {
                    if (manager.Client.ConnectedToVoice())
                    {
                        SendVoice(cmdArgs.Args[0], manager.Client);
                    }
                    else
                    {
                        cmdArgs.Channel.SendMessage("Not connected to voice!");
                    }
                }
                else
                {
                    cmdArgs.Channel.SendMessage("Couldn't broadcast specified file! It doesn't exist!");
                }
            }), this);
            manager.AddCommand(new CommandStub("joinvoice", "Joins a specified voice channel", "Arg is case insensitive voice channel name to join.", PermissionType.Owner, 1, cmdArgs =>
            {
                DiscordChannel channelToJoin = cmdArgs.Channel.Parent.Channels.Find(x => x.Name.ToLower() == cmdArgs.Args[0].ToLower() && x.Type == ChannelType.Voice);
                if (channelToJoin != null)
                {
                    DiscordVoiceConfig config = new DiscordVoiceConfig
                    {
                        FrameLengthMs = 60,
                        Channels      = 1,
                        OpusMode      = DiscordSharp.Voice.OpusApplication.MusicOrMixed,
                        SendOnly      = true
                    };

                    //waveFormat = new WaveFormat(48000, 16, config.Channels);

                    //if (!config.SendOnly)
                    //{
                    //    waveCallbackInfo = WaveCallbackInfo.FunctionCallback();
                    //    outputDevice = new WaveOut();
                    //}

                    manager.Client.ConnectToVoiceChannel(channelToJoin, config);
                    manager.Client.VoiceQueueEmpty += (sender, e) =>
                    {
                        Console.WriteLine("Queue empty.");
                    };
                }
                else
                {
                    cmdArgs.Channel.SendMessage("Couldn't find the specified channel as a voice channel!");
                }
            }), this);
            manager.AddCommand(new CommandStub("stop", "Stops current voice without disconnecting.", "", PermissionType.Owner, cmdArgs =>
            {
                if (manager.Client.GetVoiceClient() != null)
                {
                    manager.Client.GetVoiceClient().ClearVoiceQueue();
                }
            }), this);
        }
예제 #3
0
        static Task ClientTask(DiscordClient client)
        {
            return(Task.Run(() =>
            {
                Console.WriteLine("WELCOME TO DISCORD BOT" + "\n=============================");

                // voice messages
                client.MessageReceived += (sender, e) =>
                {
                    // Joining a voice channel
                    if (e.message.content.StartsWith("!joinvoice"))
                    {
                        string[] split = e.message.content.Split(new char[] { ' ' }, 2);
                        if (!String.IsNullOrEmpty(split[1]))
                        {
                            DiscordChannel toJoin = e.Channel.parent.channels.Find(x => (x.Name.ToLower() == split[1].ToLower()) && (x.Type == ChannelType.Voice));
                            if (toJoin != null)
                            {
                                DiscordVoiceConfig voiceCfg = new DiscordVoiceConfig()
                                {
                                    Bitrate = null, Channels = 1, FrameLengthMs = 60, OpusMode = Discord.Audio.Opus.OpusApplication.LowLatency, SendOnly = false
                                };
                                audio = new AudioPlayer(voiceCfg);
                                client.ConnectToVoiceChannel(toJoin);
                            }
                        }
                    }
                    else if (e.message.content.StartsWith("!addsong"))
                    {
                        string[] split = e.message.content.Split(new char[] { ' ' }, 3);

                        if (split.Count() >= 3 && !String.IsNullOrEmpty(split[1]) && !String.IsNullOrEmpty(split[2]))
                        {
                            DoVoiceURL(client.GetVoiceClient(), split[1], split[2]);
                        }
                        else
                        {
                            client.SendMessageToChannel("Incorrect add song syntax.", e.Channel);
                        }
                    }
                    else if (e.message.content.StartsWith("!play"))
                    {
                        string[] split = e.message.content.Split(new char[] { ' ' }, 2);

                        if (File.Exists(split[1]))
                        {
                            DoVoiceMP3(client.GetVoiceClient(), split[1]);
                        }
                        else
                        {
                            client.SendMessageToChannel("Song does not exist.", e.Channel);
                        }
                    }
                    else if (e.message.content.StartsWith("!disconnect"))
                    {
                        client.DisconnectFromVoice();
                    }
                };

                // other messages
                client.MessageReceived += (sender, e) =>
                {
                    Console.WriteLine($"[" + e.Channel.Name.ToString() + "] " + e.message.author.Username + ": " + e.message.content.ToString());

                    if (e.Channel.Name == "thatbelikeitis" || e.Channel.Name == "newtestchannel")
                    {
                        mainText = e.Channel;
                        quoteMuseum = client.GetChannelByName("quotes");
                    }

                    if (e.message.content.StartsWith("!help"))
                    {
                        string helpMsg = "Welcome to DiscordBot! The following commands are available:\n"
                                         + "help, hello, joinvoice [channelname], play [mp3 path], addsong [youtube url] [song name], roll [XdX] [+/-] [mod]";
                        client.SendMessageToChannel(helpMsg, e.Channel);
                    }

                    // Text detection
                    if (e.message.content.Contains("Kappa") || e.message.content.Contains("kappa"))
                    {
                        client.SendMessageToChannel("We don't use that word here.", e.Channel);
                    }
                    else if (e.message.content.Contains("I'm back") || e.message.content.Contains("im back"))
                    {
                        client.SendMessageToChannel("I'm front", e.Channel);
                    }
                    else if (e.message.content.Contains("ryan") || e.message.content.Contains("Ryan") ||
                             e.message.content.Contains("jimmy"))
                    {
                        client.AttachFile(e.Channel, "", "jimmyneukong.jpg");
                        //client.SendMessageToChannel("ryan", e.Channel);
                    }
                    else if (e.message.content.Contains("f14"))
                    {
                        client.AttachFile(e.Channel, "", "f14.jpg");
                    }

                    // Commands!
                    if (e.message.content.StartsWith("!hello"))
                    {
                        client.SendMessageToChannel("Hello World!", e.Channel);
                    }
                    else if (e.message.content.StartsWith("!quote"))
                    {
                        string quote = GetRandomQuote(client);
                        client.SendMessageToChannel(quote, e.Channel);
                    }
                    else if (e.message.content.StartsWith("!addquote"))
                    {
                        char[] newQuote = e.message.content.Skip(9).ToArray();
                        client.SendMessageToChannel(new string(newQuote), quoteMuseum);
                    }
                    else if (e.message.content.StartsWith("!roll"))
                    {
                        string[] split = e.message.content.Split(new char[] { ' ' }, 4);

                        if (split.Count() >= 2 && !String.IsNullOrEmpty(split[1]))
                        {
                            string[] split2 = split[1].Split(new char[] { 'd' }, 2);

                            int roll = 0;
                            if (split.Count() >= 4 && !String.IsNullOrEmpty(split[2]) && !String.IsNullOrEmpty(split[3]))
                            {
                                if (split[2] == "+")
                                {
                                    roll = Roll(Int32.Parse(split2[0]), Int32.Parse(split2[1]), Int32.Parse(split[3]));
                                }
                                else if (split[2] == "-")
                                {
                                    roll = Roll(Int32.Parse(split2[0]), Int32.Parse(split2[1]), Int32.Parse(split[3]) * -1);
                                }
                                else
                                {
                                    client.SendMessageToChannel("Can only mod by + or -! Result invalid.", e.Channel);
                                }
                            }
                            else
                            {
                                roll = Roll(Int32.Parse(split2[0]), Int32.Parse(split2[1]), 0);
                            }
                            string msg = split2[0] + "d" + split2[1] + ": " + roll;
                            client.SendMessageToChannel(msg, e.Channel);
                        }
                        else
                        {
                            client.SendMessageToChannel("Missing arguments!", e.Channel);
                        }
                    }
                    else if (e.message.content.StartsWith("!chat"))
                    {
                        char[] chatMsg = e.message.content.Skip(6).ToArray();
                        string reply = chatBot.Think(new string(chatMsg));

                        Console.WriteLine(new string(chatMsg));
                        Console.WriteLine(reply);

                        client.SendMessageToChannel(reply, e.Channel);
                    }
                    else if (e.message.content.StartsWith("!supersecretshutdowncommand"))
                    {
                        System.Environment.Exit(0);
                    }
                };

                client.Connected += (sender, e) =>
                {
                    Console.WriteLine($"Connected! User: {e.user.Username}");
                };
                client.Connect();
            }));
        }
예제 #4
0
        private void SetupCommands()
        {
            #region Owner only
            CommandsManager.AddCommand(new CommandStub("selfdestruct", "Shuts the bot down.", "", PermissionType.Owner, cmdArgs =>
            {
                Exit();
            }));
            CommandsManager.AddCommand(new CommandStub("joinvoice", "Joins a specified voice channel", "Arg is case insensitive voice channel name to join.", PermissionType.Owner, 1, cmdArgs =>
            {
                DiscordChannel channelToJoin = cmdArgs.Channel.parent.channels.Find(x => x.Name.ToLower() == cmdArgs.Args[0].ToLower() && x.Type == ChannelType.Voice);
                if (channelToJoin != null)
                {
                    DiscordVoiceConfig config = new DiscordVoiceConfig
                    {
                        FrameLengthMs = 20,
                        Channels      = 1,
                        OpusMode      = Discord.Audio.Opus.OpusApplication.LowLatency,
                        SendOnly      = true
                    };

                    waveFormat = new WaveFormat(48000, 16, config.Channels);

                    if (!config.SendOnly)
                    {
                        waveCallbackInfo = WaveCallbackInfo.FunctionCallback();
                        outputDevice     = new WaveOut();
                    }

                    client.ConnectToVoiceChannel(channelToJoin, config);
                }
                else
                {
                    cmdArgs.Channel.SendMessage("Couldn't find the specified channel as a voice channel!");
                }
            }));
            CommandsManager.AddCommand(new CommandStub("disconnect", "Disconnects from voice", "", PermissionType.Owner, 1, cmdArgs =>
            {
                client.DisconnectFromVoice();
            }));
            CommandsManager.AddCommand(new CommandStub("testvoice", "Broadcasts specified file over voice.", "", PermissionType.Owner, 1, cmdArgs =>
            {
                if (File.Exists(cmdArgs.Args[0]))
                {
                    if (client.ConnectedToVoice())
                    {
                        SendVoice(cmdArgs.Args[0]);
                    }
                    else
                    {
                        cmdArgs.Channel.SendMessage("Not connected to voice!");
                    }
                }
                else
                {
                    cmdArgs.Channel.SendMessage("Couldn't broadcast specified file! It doesn't exist!");
                }
            }));
            CommandsManager.AddCommand(new CommandStub("statusof", "`Status` test", "", PermissionType.Owner, 1, cmdArgs =>
            {
                string id = cmdArgs.Args[0].Trim(new char[] { '<', '@', '>' });
                if (!string.IsNullOrEmpty(id))
                {
                    DiscordMember member = cmdArgs.Channel.parent.members.Find(x => x.ID == id);
                    if (member != null)
                    {
                        string msg = $"Status of `{member.Username}`\n{member.Status}";
                        if (!string.IsNullOrEmpty(member.CurrentGame))
                        {
                            msg += $"\nPlaying: *{member.CurrentGame}*";
                        }
                        cmdArgs.Channel.SendMessage(msg);
                    }
                }
            }));
            CommandsManager.AddCommand(new CommandStub("changepic", "Changes the bot's guild pic test.", "Test", PermissionType.Owner, 1, cmdArgs =>
            {
                Regex linkParser = new Regex(@"\b(?:https?://|www\.)\S+\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);
                string rawString = $"{cmdArgs.Args[0]}";
                if (linkParser.Matches(rawString).Count > 0)
                {
                    string url = linkParser.Matches(rawString)[0].ToString();
                    using (WebClient wc = new WebClient())
                    {
                        byte[] data = wc.DownloadData(url);
                        using (MemoryStream mem = new MemoryStream(data))
                        {
                            using (var image = System.Drawing.Image.FromStream(mem))
                            {
                                client.ChangeClientAvatar(new Bitmap(image));
                            }
                        }
                    }
                }
            }));
            CommandsManager.AddCommand(new CommandStub("sendchanneltest", "`Client.SendMessageToChannel` Test", "", PermissionType.Owner, cmdArgs =>
            {
                client.SendMessageToChannel("Works!", cmdArgs.Channel);
            }));
            CommandsManager.AddCommand(new CommandStub("setplaying", "Sets the current game the bot is playing.", "", PermissionType.Owner, 1, cmdArgs =>
            {
                client.UpdateCurrentGame(cmdArgs.Args[0]);
            }));
            CommandsManager.AddCommand(new CommandStub("join", "Joins a specified server", "", PermissionType.Owner, 1, cmdArgs =>
            {
                string substring = cmdArgs.Args[0].Substring(cmdArgs.Args[0].LastIndexOf('/') + 1);
                client.AcceptInvite(substring);
            }));
            CommandsManager.AddCommand(new CommandStub("changeprefix", "Changes the command prefix to a specified character.", "", PermissionType.Owner, 1, cmdArgs =>
            {
                if (cmdArgs.Args.Count > 0)
                {
                    char newPrefix       = cmdArgs.Args[0][0];
                    config.CommandPrefix = newPrefix;
                    cmdArgs.Channel.SendMessage($"Command prefix changed to **{config.CommandPrefix}** successfully!");
                }
                else
                {
                    cmdArgs.Channel.SendMessage("What prefix?");
                }
            }));
            CommandsManager.AddCommand(new CommandStub("giveperm", "Gives the perm to the specified user (bot scope)", "", PermissionType.Owner, 2, e =>
            {
                //giveperm Admin <@2309208509852>
                if (e.Args.Count > 1)
                {
                    string permString   = e.Args[0];
                    PermissionType type = PermissionType.User;
                    switch (permString.ToLower())
                    {
                    case "admin":
                        type = PermissionType.Admin;
                        break;

                    case "mod":
                        type = PermissionType.Mod;
                        break;

                    case "none":
                        type = PermissionType.None;
                        break;

                    case "user":
                        type = PermissionType.User;
                        break;
                    }
                    string id = e.Args[1].Trim(new char[] { '<', '@', '>' });
                    CommandsManager.AddPermission(id, type);
                    e.Channel.SendMessage($"Given permission {type.ToString().Substring(type.ToString().IndexOf('.') + 1)} to <@{id}>!");
                }
            }));
            CommandsManager.AddCommand(new CommandStub("prune", "Prune test", "", PermissionType.Owner, 1, cmdArgs =>
            {
                int messageCount = 0;
                if (int.TryParse(cmdArgs.Args[0], out messageCount))
                {
                    var messagesToPrune = client.GetMessageHistory(cmdArgs.Channel, messageCount);
                    foreach (var msg in messagesToPrune)
                    {
                        client.DeleteMessage(msg);
                        Thread.Sleep(100);
                    }
                    cmdArgs.Channel.SendMessage($"Attempted pruning of {messageCount} messages.");
                }
            }));
            #endregion
            #region Admin
            CommandsManager.AddCommand(new CommandStub("eval", "Evaluates real-time C# code. Be careful with this",
                                                       "Evaluates C# code that is dynamically compiled.\n\nThe following namespaces are available for use:\n * DiscordSharp\n * System.Threading\n * DiscordSharp.Objects\n\n\nMake sure your function returns a string value.\nYou can reference the DiscordSharp client by using `discordClient`.", PermissionType.Admin, 1, e =>
            {
                string whatToEval = e.Args[0];
                if (whatToEval.StartsWith("`") && whatToEval.EndsWith("`"))
                {
                    whatToEval = whatToEval.Trim('`');
                }
                try
                {
                    var eval   = EvalProvider.CreateEvalMethod <DiscordClient, string>(whatToEval, new string[] { "DiscordSharp", "System.Threading", "DiscordSharp.Objects" }, new string[] { "DiscordSharp.dll" });
                    string res = "";
                    Thread.Sleep(1000);
                    Thread executionThread = null;
                    Task evalTask          = new Task(() =>
                    {
                        executionThread = Thread.CurrentThread;
                        if (eval != null)
                        {
                            res = eval(client);
                        }
                        else
                        {
                            string errors = "Errors While Compiling: \n";
                            if (EvalProvider.errors != null)
                            {
                                if (EvalProvider.errors.Count > 0)
                                {
                                    foreach (var error in EvalProvider.errors)
                                    {
                                        errors += $"{error.ToString()}\n\n";
                                    }
                                }
                                e.Channel.SendMessage($"```\n{errors}\n```");
                            }
                            else
                            {
                                e.Channel.SendMessage("Errors!");
                            }
                        }
                    });
                    evalTask.Start();
                    evalTask.Wait(10 * 1000);
                    if (executionThread != null)
                    {
                        executionThread.Abort();
                    }
                    if (res == null || res == "")
                    {
                        e.Channel.SendMessage("Terminated after 10 second timeout.");
                    }
                    else
                    {
                        e.Channel.SendMessage($"**Result**\n```\n{res}\n```");
                    }
                }
                catch (Exception ex)
                {
                    string errors = "Errors While Compiling: \n";
                    if (EvalProvider.errors != null)
                    {
                        if (EvalProvider.errors.Count > 0)
                        {
                            foreach (var error in EvalProvider.errors)
                            {
                                errors += $"{error.ToString()}\n\n";
                            }
                        }
                        else
                        {
                            errors += ex.Message;
                        }
                        e.Channel.SendMessage($"```\n{errors}\n```");
                    }
                    else
                    {
                        e.Channel.SendMessage("Errors!");
                    }
                }
            }));
            #endregion
            #region Anyone, but limited to server mods
            CommandsManager.AddCommand(new CommandStub("gtfo", "Makes the bot leave the server", "", PermissionType.User, cmdArgs =>
            {
                bool canExecute = false;
                foreach (var roll in cmdArgs.Author.Roles)
                {
                    if (roll.permissions.HasPermission(DiscordSpecialPermissions.ManageServer))
                    {
                        canExecute = true;
                    }
                }
                if (canExecute)
                {
                    client.LeaveServer(cmdArgs.Channel.parent);
                }
                else
                {
                    cmdArgs.Channel.SendMessage("You don't have the proper permissions to do this! You need the ManagerServer permission.");
                }
            }));
            #endregion
            #region Literally anyone
            CommandsManager.AddCommand(new CommandStub("cmdinfo", "Displays help for a command.", "Help", PermissionType.User, 2, e =>
            {
                if (!String.IsNullOrEmpty(e.Args[0]))
                {
                    ICommand stub = CommandsManager.Commands.Find(x => x.CommandName == e.Args[0]);
                    if (stub != null)
                    {
                        string msg = "**Help for " + stub.CommandName + "**";
                        msg       += $"\n{stub.Description}";
                        if (!String.IsNullOrEmpty(stub.HelpTag))
                        {
                            msg += $"\n\n{stub.HelpTag}";
                        }
                        e.Channel.SendMessage(msg);
                    }
                    else
                    {
                        e.Channel.SendMessage("What command?");
                    }
                }
                else
                {
                    e.Channel.SendMessage("What command?");
                }
            }));
            CommandsManager.AddCommand(new CommandStub("about", "Shows bot information", "", cmdArgs =>
            {
                string message = "**About Luigibot**\n";
                message       += "Owner: " + owner.Username + "\n";
                message       += $"Library: DiscordSharp {typeof(DiscordClient).Assembly.GetName().Version.ToString()}\n";
                var uptime     = (DateTime.Now - loginDate);
                message       += $"Uptime: {uptime.Days} days, {uptime.Hours} hours, {uptime.Minutes} minutes.\n";
                message       += "Runtime: ";

                if (runningOnMono)
                {
                    message += "Mono\n";
                }
                else
                {
                    message += ".Net\n";
                }

                message      += $"OS: {osString}\n";
                long memUsage = GetMemoryUsage();
                if (memUsage > 0)
                {
                    message += "Memory Usage: " + (memUsage / 1024) / 2 + "mb\n";
                }
                message += "Commands: " + CommandsManager.Commands.Count + "\n";
                message += "Command Prefix: " + config.CommandPrefix + "\n";
                message += "Total Servers: " + client.GetServersList().Count + "\n";
                cmdArgs.Channel.SendMessage(message);
            }));
            CommandsManager.AddCommand(new CommandStub("ygo", "Retrieves information for a Yu-Gi-Oh card from the YugiohPrices database.",
                                                       "Card names are (unfortunately) case sensitive.\n\n**Valid:** Dark Magician\n**Invalid: **dark magician", PermissionType.User, 1, cmdArgs =>
            {
                if (cmdArgs.Args.Count > 0)
                {
                    YugiohPricesSearcher searcher = new YugiohPricesSearcher();
                    try
                    {
                        var card = searcher.GetCardByName(cmdArgs.Args[0]).Result;
                        if (card.Name != "<NULL CARD>")
                        {
                            card.CardImage.Save("ygotemp.png");
                            string message = $"**{card.Name}**";
                            if (card.Type == CardType.Monster)
                            {
                                message += $" Level: {card.Level} Attribute: {card.Attribute}\n";
                            }
                            else
                            {
                                message += "\n";
                            }
                            message += $"**Description:** {card.Description}";
                            if (card.Type == CardType.Monster)
                            {
                                message += $"\n**Type:** {card.MonsterType}\n**ATK/DEF:** {card.Attack}/{card.Defense}";
                            }

                            client.AttachFile(cmdArgs.Channel, message, "ygotemp.png");
                        }
                        else
                        {
                            cmdArgs.Channel.SendMessage("Couldn't find that specified card!");
                        }
                    }
                    catch (HttpRequestException ex)
                    {
                        cmdArgs.Channel.SendMessage("Couldn't find that specified card! (" + ex.Message + ")");
                    }
                }
            }));
            CommandsManager.AddCommand(new CommandStub("khaled", "Anotha one.", "", cmdArgs =>
            {
                if (rng == null)
                {
                    Console.WriteLine("RNG null?!");
                    rng = new Random((int)DateTime.Now.Ticks);
                }
                cmdArgs.Channel.SendMessage($"***{KhaledQuotes[rng.Next(0, KhaledQuotes.Length - 1)]}***");
            }));
            #endregion
        }
예제 #5
0
        /// <summary>
        /// Setting up some commands
        /// </summary>
        private void SetUpCommands()
        {
            CommandsManager.AddCommand(new CommandStub("about", "Tells about bot.", "", PermissionType.User, 1, cmdArgs =>
            {
                this._client.SendMessageToChannel("Currently being in development this bot will assists moderators and administrators in managing server and channels.\nAuthor: Reverendo\nCourtesy: Big thanks to Luigifan", cmdArgs.Channel);
            }));
            CommandsManager.AddCommand(new CommandStub("help", "Provide discriptions to all avaliable commands", "", PermissionType.User, cmdArgs =>
            {
                string help = String.Format("inComplete set of commands:\n");
                foreach (var command in CommandsManager.Commands)
                {
                    help += String.Format("{0,-15} {1,-100}\n", this._config.CommandPrefix + command.CommandName, "-" + command.Description + " Level: " + command.MinimumPermission);
                }
                cmdArgs.Channel.SendMessage(help);
            }));
            CommandsManager.AddCommand(new CommandStub("join", "Join a specified server. Ownder only.", "", PermissionType.Owner, 1, cmdArgs =>
            {
                string substring = cmdArgs.Args[0].Substring(cmdArgs.Args[0].LastIndexOf('/') + 1);
                this._client.AcceptInvite(substring);
                Console.WriteLine($"Joined new server.");
                cmdArgs.Author.SlideIntoDMs("Joined server you requested!");
            }));
            CommandsManager.AddCommand(new CommandStub("wakeup", $"Mentions user multiple times. Example: {this._config.CommandPrefix}wakeup Username n-times", "specify victim", PermissionType.User, 2, cmdArgs =>
            {
                string substring = cmdArgs.Args[0].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[0];
                var victim       = this._client.GetMemberFromChannel(cmdArgs.Channel, cmdArgs.Args[0], false);
                int times        = 0;
                if (!int.TryParse(cmdArgs.Args[1], out times))
                {
                    cmdArgs.Channel.SendMessage("Numbers, not random letters, dummy!");
                }
                for (int i = 0; i < times; i++)
                {
                    cmdArgs.Channel.SendMessage($"@{victim.Username}, wake up!");
                }
            }));
            CommandsManager.AddCommand(new CommandStub("deletemsg", $"Delete last n messages. Example: {this._config.CommandPrefix}deletemsg n", "specify amount of messages", PermissionType.Mod, 1, cmdArgs =>
            {
                int amount = 0;
                int.TryParse(cmdArgs.Args[0], out amount);
                this._client.DeleteMultipleMessagesInChannel(cmdArgs.Channel, amount + 1);
            }));
            CommandsManager.AddCommand(new CommandStub("ban", $"Bans user for specified amount of days. Example: {this._config.CommandPrefix}ban user days", "", PermissionType.Mod, 2, cmdArgs =>
            {
                int days = 1;
                int.TryParse(cmdArgs.Args[1], out days);
                _client.BanMember(_client.GetMemberFromChannel(cmdArgs.Channel, cmdArgs.Args[0]));
            }));
            CommandsManager.AddCommand(new CommandStub("kick", $"Kicks user. Example: {this._config.CommandPrefix}kick user", "", PermissionType.Mod, 1, cmdArgs =>
            {
                this._client.KickMember(this._client.GetMemberFromChannel(cmdArgs.Channel, cmdArgs.Args[0]));
            }));
            CommandsManager.AddCommand(new CommandStub("permission", $"Grants user specified permission: Admin, Mod or User. Example: {this._config.CommandPrefix}permission user level", "", PermissionType.Owner, 2, cmdArgs =>
            {
                var member          = this._client.GetMemberFromChannel(cmdArgs.Channel, cmdArgs.Args[0], false);
                PermissionType type = PermissionType.User;
                switch (cmdArgs.Args[1].ToLower())
                {
                case "admin":
                    type = PermissionType.Admin;
                    break;

                case "mod":
                    type = PermissionType.Mod;
                    break;

                case "user":
                    type = PermissionType.User;
                    break;

                case "none":
                    type = PermissionType.None;
                    break;

                default:
                    break;
                }
                cmdArgs.Channel.SendMessage($"User {member.Username} become {type.ToString()}");
                Console.WriteLine($"New {type.ToString()} - {member.Username}({member.ID})");
                CommandsManager.AddPermission(member, type);
            }));
            CommandsManager.AddCommand(new CommandStub("q", $"Posts random quote. Example: {this._config.CommandPrefix}q", "", PermissionType.None, 1, cmdArgs =>
            {
                cmdArgs.Channel.SendMessage("\"" + ConfuQuote[CommandsManager.rng.Next(0, ConfuQuote.Length)] + "\"" + " - Конфуций");
            }));
            CommandsManager.AddCommand(new CommandStub("ball", $"If you seek for advice, just ask. Example: {this._config.CommandPrefix}ball", "", PermissionType.None, cmdArgs =>
            {
                cmdArgs.Channel.SendMessage(Ball8[CommandsManager.rng.Next(0, Ball8.Length)]);
            }));
            CommandsManager.AddCommand(new CommandStub("joinvoice", "Join voice channel", "", PermissionType.Owner, 1, cmdArgs =>
            {
                DiscordChannel channelToJoin = cmdArgs.Channel.Parent.Channels.Find(x => x.Name.ToLower() == cmdArgs.Args[0].ToLower() && x.Type == ChannelType.Voice);
                if (channelToJoin != null)
                {
                    DiscordVoiceConfig config = new DiscordVoiceConfig
                    {
                        FrameLengthMs = 60,
                        Channels      = 1,
                        OpusMode      = DiscordSharp.Voice.OpusApplication.MusicOrMixed,
                        SendOnly      = true
                    };
                    this.CommandsManager.Client.ConnectToVoiceChannel(channelToJoin, config);
                    this.ap = new AudioPlayer(this.CommandsManager.Client, config, channelToJoin);
                }
            }));
            CommandsManager.AddCommand(new CommandStub("disconnect", "Disconnects from voice channel.", "", PermissionType.Owner, 0, cmdArgs =>
            {
                this._client.DisconnectFromVoice();
            }));
            CommandsManager.AddCommand(new CommandStub("player", "Granting access to audio player. Currently avaliable commands: play", "", PermissionType.User, 1, cmdArgs =>
            {
                switch (cmdArgs.Args[0])
                {
                case "play":
                    this.ap.Play();
                    break;

                case "stop":
                    if (this._client.GetVoiceClient() != null)
                    {
                        this._client.GetVoiceClient().ClearVoiceQueue();
                    }
                    break;

                default:
                    break;
                }
            }));
            CommandsManager.AddCommand(new CommandStub("roles", "Shows permission levels for users.", "", PermissionType.Owner, 0, cmdArgs =>
            {
                string msg = $"Roles for \"{cmdArgs.Channel.Parent.Name}\"\n";
                foreach (var role in cmdArgs.Channel.Parent.Roles)
                {
                    msg += $"{role.Position} - {role.ID} - {role.Permissions.GetRawPermissions()}\n";
                }
                owner.SlideIntoDMs(msg);
            }));
            CommandsManager.AddCommand(new CommandStub("shutdown", "Shutdown bot. Owner only.", "", PermissionType.Owner, 0, cmdArgs =>
            {
                Exit();
            }));
        }