예제 #1
0
        public bool HasDuplicateServerPermissions()
        {
            var duplicates = ServerPermissions
                             .Where(i => !i.IsDeleted)
                             .GroupBy(i => i.WindowsGroup)
                             .Where(g => g.Count() > 1)
                             .Select(g => g.Key);

            return(duplicates.Any());
        }
예제 #2
0
        private async Task <Discord.Role> addToRole(string roleName, ServerPermissions permissions, Discord.User target, MessageEventArgs e)
        {
            Discord.Role newrole = null;
            try
            {
                newrole = await e.Server.CreateRole(roleName, permissions);

                await target.AddRoles(newrole);
            } catch (Exception)
            {
                await newrole.Delete();

                await e.Channel.SendMessage(SystemMessages.MESSAGE_ROLESETEXCEPTION);

                return(null);
            }
            return(newrole);
        }
예제 #3
0
        void OnPermissionPropertyChanged(object sender, PropertyChangedEventArgs args)
        {
            IsDirty = true;
            UpdateOverridingPermission(sender as WindowsGroupPermission, args.PropertyName);
            if (args.PropertyName == "WindowsGroup" || args.PropertyName == "ResourceName")
            {
                var permission = (WindowsGroupPermission)sender;

                if (permission.IsNew)
                {
                    if (permission.IsValid)
                    {
                        permission.IsNew = false;
                        var newPermission = CreateNewPermission(permission.IsServer);

                        if (permission.IsServer)
                        {
                            ServerPermissions.Add(newPermission);
                        }
                        else
                        {
                            ResourcePermissions.Add(newPermission);
                        }
                    }
                }
                else
                {
                    var isEmpty = string.IsNullOrEmpty(permission.WindowsGroup);
                    if (isEmpty)
                    {
                        if (permission.IsServer)
                        {
                            ServerPermissions.Remove(permission);
                        }
                        else
                        {
                            ResourcePermissions.Remove(permission);
                        }
                    }
                }
            }
        }
예제 #4
0
 private static Task WriteServerToJson(ServerPermissions serverPerms) => Task.Run(() =>
 {
     string pathToFile = $"data/permissions/{serverPerms.Id}.json";
     File.WriteAllText(pathToFile,
         Newtonsoft.Json.JsonConvert.SerializeObject(serverPerms, Newtonsoft.Json.Formatting.Indented));
 });
예제 #5
0
        private async void parseInput(string input, MessageEventArgs e)
        {
            string[] toParse  = input.Split(' ');
            string   command  = toParse[0];
            int      inputLen = toParse.Length;
            Server   server   = e.Server;

            if (e.Channel.IsPrivate)
            {
                return;
            }
            else if (command == "")
            {
                return;
            }
            else if (inputLen == 1)
            {
                if (command == Constants.COMMAND_HELP)
                {
                    await e.Channel.SendMessage("Testing Testing 1 2 3");
                }
                else if (command == Constants.COMMAND_DEVTESTNEWLINE)
                {
                    string sentence = "```";
                    for (int i = 0; i < 5; i++)
                    {
                        sentence += i + ") " + "Satsuo" + "\n";
                    }
                    sentence += "```";
                    await e.Channel.SendMessage(sentence);
                }
                else if (command == Constants.COMMAND_LISTUSERS)
                {
                    foreach (Discord.User user in e.Channel.Users)
                    {
                        //TODO: Check for users in a voice channel and only list those
                        await e.Channel.SendMessage(user.ToString());

                        await user.SendMessage("Will this work?");
                    }
                }
                else if (command == Constants.COMMAND_GITHUB)
                {
                    await e.Channel.SendMessage(Constants.URL_GITHUB);
                }
                else if (command == Constants.COMMAND_LISTSERVERSWITHGAMES)
                {
                    if (!PartyGames.Any())
                    {
                        await e.Channel.SendMessage("No server is running a game right now!");
                    }
                    else
                    {
                        for (int i = 0; i < PartyGames.Count(); i++)
                        {
                            Game game = PartyGames.ElementAt(i);
                            await e.Channel.SendMessage("Server " + game.getGameServerID().ToString() + " running game type " + game.getGameType() + " on text channel " +
                                                        game.getTextChannelID().ToString() + " and on voice channel " + game.getVoiceChannelID().ToString());
                        }
                    }
                }
                else if (command == Constants.COMMAND_JOINPARTYGAME)
                {
                    Game game = ServerStartingGame(server);
                    if (game != null)
                    {
                        if (game.playerAlreadyJoined(e.User))
                        {
                            await e.Channel.SendMessage(SystemMessages.MESSAGE_GAMEALREADYJOINED);
                        }
                        else
                        {
                            bool added = await addToRole(game.getPlayerRole(), e.User, e);

                            if (added)
                            {
                                game.addPlayer(e.User);
                                await e.Channel.SendMessage(e.User.NicknameMention + " has joined the " + game.getGameType() + " game. Click " + client.GetChannel(game.getTextChannelID()).Mention + " to enter the text channel.");
                            }
                        }
                    }
                    else
                    {
                        await e.Channel.SendMessage(SystemMessages.MESSAGE_GAMESTARTEDORNONE);
                    }
                }
                else if (command == Constants.COMMAND_LEAVEPARTYGAME)
                {
                    Game game = ServerStartingGame(server);
                    if (game != null)
                    {
                        if (game.playerAlreadyJoined(e.User))
                        {
                            game.removePlayer(e.User);
                            await e.Channel.SendMessage(e.User.NicknameMention + " has left the " + game.getGameType() + " game.");
                        }
                        else
                        {
                            await e.Channel.SendMessage("You haven't even joined the game!");
                        }
                    }
                    else
                    {
                        await e.Channel.SendMessage(SystemMessages.MESSAGE_GAMESTARTEDNOLEAVE);
                    }
                }
                else if (commandRollDice(command))
                {
                    string value = command.Remove(0, 2);
                    if (isValidDiceRoll(value))
                    {
                        int rollValue = getDiceRoll(value);
                        await e.Channel.SendMessage(e.User.Mention + " rolled a d" + value + " and got: " + rollValue);

                        return;
                    }
                    else
                    {
                        await e.Channel.SendMessage("USAGE: !d#, where # is between 1-" + Int32.MaxValue + ".");

                        return;
                    }
                }
                //The Secret Santa module
                else if (command == Constants.COMMAND_STARTSECRETSANTA)
                {
                    if (secretSanta == null)
                    {
                        secretSanta = new SecretSanta(server, client);
                        await e.Channel.SendMessage("The Secret Santa module has been initialized!");
                    }
                }
            }
            else if (inputLen > 1)
            {
                if (command == Constants.COMMAND_SETGAME)
                {
                    string game = input.Remove(0, Constants.COMMAND_SETGAME.Length + 1);
                    client.SetGame(game);
                }
                else if (command == Constants.COMMAND_CREATECHANNEL)
                {
                    string channelname = input.Remove(0, Constants.COMMAND_CREATECHANNEL.Length + 1);
                    await createNewChannel(channelname, ChannelType.Text, e);
                }
                else if (command == Constants.COMMAND_TTS)
                {
                    string message = input.Remove(0, Constants.COMMAND_TTS.Length + 1);
                    await e.Channel.SendTTSMessage(message);
                }
                else if (command == Constants.COMMAND_SETROLE)
                {
                    string            rolename    = input.Remove(0, Constants.COMMAND_SETROLE.Length + 1);
                    ServerPermissions permissions = new ServerPermissions(true);
                    try {
                        await addToRole(rolename, permissions, e.User, e);
                    }
                    catch (Exception) {
                        return;
                    }
                }
                else if (command == Constants.COMMAND_STARTDND)
                {
                    if (!isHostingGame)
                    {
                        Discord.Channel   text, voice = null;
                        Discord.Role      gamerole    = null;
                        string            channelname = input.Remove(0, Constants.COMMAND_STARTDND.Length + 1);
                        ServerPermissions permissions = new ServerPermissions();
                        gamerole = await addToRole(Constants.GAME_DNDGAME, permissions, e.User, e);

                        if (gamerole != null)
                        {
                            text = await createNewChannel(channelname, ChannelType.Text, e);

                            if (text != null)
                            {
                                isHostingGame = true;
                                voice         = await createNewChannel(channelname + " Voice", ChannelType.Voice, e);

                                ChannelPermissionOverrides memberPermOverride = new ChannelPermissionOverrides(PermValue.Deny, PermValue.Deny, PermValue.Allow,
                                                                                                               PermValue.Allow, PermValue.Allow, PermValue.Deny, PermValue.Allow, PermValue.Deny, PermValue.Allow, PermValue.Deny, PermValue.Deny,
                                                                                                               PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny);
                                ChannelPermissionOverrides everyonePermOverride = new ChannelPermissionOverrides(PermValue.Deny, PermValue.Deny, PermValue.Allow,
                                                                                                                 PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny,
                                                                                                                 PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny);
                                await text.AddPermissionsRule(gamerole, memberPermOverride);

                                await text.AddPermissionsRule(e.Server.EveryoneRole, everyonePermOverride);

                                Game DnDGame = new DnDGame(server, text, voice, e.Channel, gamerole, client, e.User.Id);
                                DnDGame.addPlayer(e.User);
                                PartyGames.Add(DnDGame);

                                await setChannelToTop(text);
                                await setChannelToTop(voice);

                                await e.Channel.SendMessage(DnDGame.getGameType() + SystemMessages.MESSAGE_GAMECREATED + text.Mention);

                                Console.WriteLine("Game was created at server: " + server.Id);
                            }
                            else
                            {
                                await gamerole.Delete();
                            }
                        }
                    }
                    else
                    {
                        Console.WriteLine(SystemMessages.MESSAGE_GAMEHASSTARTED);
                    }
                }
                else if (command == Constants.COMMAND_STARTRESISTANCE)
                {
                    bool createGame = false;
                    if (!PartyGames.Any())
                    {
                        createGame = true;
                    }
                    Game game = null;
                    if (!createGame && PartyGames.Any())
                    {
                        int i = 0; bool found = false;
                        while (i < PartyGames.Count())
                        {
                            game = PartyGames.ElementAt(i);
                            if (game.getGameServerID() == server.Id)
                            {
                                found = true;
                            }
                            i++;
                        }
                        createGame = found ? false : true;
                    }
                    if (createGame && !isHostingGame)
                    {
                        Discord.Channel   text, voice = null;
                        Discord.Role      gamerole    = null;
                        string            channelname = input.Remove(0, Constants.COMMAND_STARTRESISTANCE.Length + 1);
                        ServerPermissions permissions = new ServerPermissions();
                        gamerole = await addToRole(Constants.GAME_RESISTANCE, permissions, e.User, e);

                        if (gamerole != null)
                        {
                            text = await createNewChannel(channelname, ChannelType.Text, e);

                            if (text != null)
                            {
                                isHostingGame = true;
                                voice         = await createNewChannel(channelname + " Voice", ChannelType.Voice, e);

                                ChannelPermissionOverrides memberPermOverride = new ChannelPermissionOverrides(PermValue.Deny, PermValue.Deny, PermValue.Allow,
                                                                                                               PermValue.Allow, PermValue.Allow, PermValue.Deny, PermValue.Allow, PermValue.Deny, PermValue.Allow, PermValue.Deny, PermValue.Deny,
                                                                                                               PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny);
                                ChannelPermissionOverrides everyonePermOverride = new ChannelPermissionOverrides(PermValue.Deny, PermValue.Deny, PermValue.Allow,
                                                                                                                 PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny,
                                                                                                                 PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny);
                                await text.AddPermissionsRule(gamerole, memberPermOverride);

                                await text.AddPermissionsRule(e.Server.EveryoneRole, everyonePermOverride);

                                Game resistanceGame = new ResistanceGame(server, text, voice, e.Channel, gamerole, client, e.User.Id);
                                resistanceGame.addPlayer(e.User);
                                PartyGames.Add(resistanceGame);

                                await setChannelToTop(text);
                                await setChannelToTop(voice);

                                await e.Channel.SendMessage(resistanceGame.getGameType() + SystemMessages.MESSAGE_GAMECREATED + text.Mention);

                                Console.WriteLine("Game was created at server: " + server.Id);
                            }
                            else
                            {
                                await gamerole.Delete();
                            }
                        }
                    }
                    else
                    {
                        Console.WriteLine(SystemMessages.MESSAGE_GAMEHASSTARTED);
                    }
                }
                else if (command == Constants.COMMAND_FLOODMESSAGE)
                {
                    int repeat;
                    if (Int32.TryParse(toParse[1], out repeat))
                    {
                        string message = input.Remove(0, Constants.COMMAND_FLOODMESSAGE.Length + toParse[1].Length + 2);
                        for (int i = 0; i < repeat; i++)
                        {
                            await e.Channel.SendMessage(message);
                        }
                    }
                    else
                    {
                        await e.Channel.SendMessage("Invalid use of command, nerd");
                    }
                }
            }
            if (Constants.TESTBUILD)
            {
                await e.Channel.SendMessage("Length of input: " + inputLen);
            }
        }
예제 #6
0
        void IModule.Install(ModuleManager manager)
        {
            manager.CreateDynCommands("channel", PermissionLevel.ServerAdmin, group =>
            {
                group.CreateCommand("list text")
                .Description("Lists all text channels in server")
                .Do(async e =>
                {
                    StringBuilder builder = new StringBuilder();
                    builder.AppendLine("**Listing text channels in server:**");
                    CreateNameIdList(builder, e.Server.TextChannels);
                    await e.Channel.SafeSendMessage(builder.ToString());
                });

                group.CreateCommand("list voice")
                .Description("Lists all voice channels in server")
                .Do(async e =>
                {
                    StringBuilder builder = new StringBuilder();
                    builder.AppendLine("**Listing voice channels in server:**");
                    CreateNameIdList(builder, e.Server.VoiceChannels);
                    await e.Channel.SafeSendMessage(builder.ToString());
                });

                group.CreateCommand("prune")
                .AddCheck((cmd, usr, chnl) => chnl.Server.CurrentUser.ServerPermissions.ManageMessages ||
                          chnl.Server.CurrentUser.GetPermissions(chnl).ManageMessages)
                .Description("Deletes the last 100 messages sent in this channel.")
                .Do(async e =>
                {
                    foreach (Message msg in await e.Channel.DownloadMessages())
                    {
                        if (msg != null)
                        {
                            await msg.Delete();
                        }
                    }
                });

                group.CreateCommand("topic")
                .Description("Sets the topic of a channel, found by its id.")
                .Parameter(Constants.ChannelIdArg)
                .Parameter("topic", ParameterType.Unparsed)
                .Do(async e =>
                {
                    Channel channel = e.GetChannel();
                    string topic    = e.GetArg("topic");

                    if (channel == null)
                    {
                        await e.Channel.SendMessage($"Channel not found.");
                        return;
                    }
                    if (!await channel.SafeEditChannel(topic: topic))
                    {
                        await
                        e.Channel.SendMessage($"I don't have sufficient permissions to edit {channel.Mention}");
                        return;
                    }

                    await e.Channel.SendMessage($"Set the topic of {channel.Mention} to `{topic}`.");
                });

                group.CreateCommand("name")
                .Description("Sets the name of a channel, found by its id.")
                .Parameter(Constants.ChannelIdArg)
                .Parameter("name")
                .Do(async e =>
                {
                    Channel channel = e.GetChannel();
                    string name     = e.GetArg("name");

                    if (channel == null)
                    {
                        await e.Channel.SendMessage($"Channel not found.");
                        return;
                    }
                    string nameBefore = channel.Name;

                    if (!await channel.SafeEditChannel(name))
                    {
                        await
                        e.Channel.SendMessage($"I don't have sufficient permissions to edit {channel.Mention}");
                        return;
                    }

                    await e.Channel.SendMessage($"Set the name of `{nameBefore}` to `{name}`.");
                });
            });

            manager.CreateDynCommands("role", PermissionLevel.ServerAdmin, group =>
            {
                group.CreateCommand("list")
                .Description("Lists all the roles the server has")
                .Do(async e =>
                {
                    StringBuilder builder = new StringBuilder();
                    builder.AppendLine("**Listing roles in server:**");
                    CreateNameIdList(builder, e.Server.Roles);
                    await e.Channel.SafeSendMessage(builder.ToString());
                });

                // commands, which can only be called if the bot user has rights to manager roles.
                group.CreateGroup("", manageRolesGroup =>
                {
                    manageRolesGroup.AddCheck((cmd, usr, chnl) => chnl.Server.CurrentUser.ServerPermissions.ManageRoles);

                    manageRolesGroup.CreateCommand("add")
                    .Description("Adds a role with the given name if it doesn't exist.")
                    .Parameter("name", ParameterType.Unparsed)
                    .Do(async e =>
                    {
                        string name = e.GetArg("name");
                        Role role   = FindRole(name, e);
                        if (role != null)
                        {
                            await e.Channel.SendMessage("Role not found.");
                            return;
                        }

                        await e.Server.CreateRole(name);
                        await e.Channel.SafeSendMessage($"Created role `{name}`");
                    });
                    manageRolesGroup.CreateCommand("rem")
                    .Description("Removes a role with the given id if it exists.")
                    .Parameter(Constants.RoleIdArg)
                    .Do(async e =>
                    {
                        Role role = e.GetRole();

                        if (role == null)
                        {
                            await e.Channel.SendMessage("Role not found.");
                            return;
                        }

                        if (role.IsEveryone || role.IsHoisted || role.IsManaged)
                        {
                            await e.Channel.SendMessage("You cannot remove this role.");
                            return;
                        }

                        await role.Delete();
                        await e.Channel.SafeSendMessage($"Removed role `{role.Name}`");
                    });

                    manageRolesGroup.CreateCommand("edit perm")
                    .Description("Edits permissions for a given role, found by id, if it exists.")
                    .Parameter(Constants.RoleIdArg)
                    .Parameter("permission")
                    .Parameter("value")
                    .Do(async e =>
                    {
                        Role role = e.GetRole();

                        if (role == null)
                        {
                            await e.Channel.SendMessage("Role not found.");
                            return;
                        }

                        ServerPermissions edited = role.Permissions;
                        PropertyInfo prop        = edited.GetType().GetProperty(e.GetArg("permission"));

                        bool value = bool.Parse(e.GetArg("value"));
                        prop.SetValue(edited, value);

                        await role.SafeEdit(perm: edited);
                        await
                        e.Channel.SafeSendMessage(
                            $"Set permission `{prop.Name}` in `{role.Name}` to `{value}`");
                    });

                    manageRolesGroup.CreateCommand("edit color")
                    .Description("Edits the color (RRGGBB) for a given role, found by id, if it exists. ")
                    .Parameter(Constants.RoleIdArg)
                    .Parameter("hex")
                    .Do(async e =>
                    {
                        Role role = e.GetRole();

                        if (role == null)
                        {
                            await e.Channel.SendMessage("Role not found.");
                            return;
                        }

                        uint hex;

                        if (!DiscordUtils.ToHex(e.GetArg("hex"), out hex))
                        {
                            return;
                        }

                        if (!await role.SafeEdit(color: new Color(hex)))
                        {
                            await
                            e.Channel.SendMessage(
                                $"Failed editing role. Make sure it's not everyone or managed.");
                        }
                    });
                });

                group.CreateCommand("listperm")
                .Description("Lists the permissions for a given roleid")
                .Parameter(Constants.RoleIdArg)
                .Do(async e =>
                {
                    Role role = e.GetRole();

                    if (role == null)
                    {
                        await e.Channel.SendMessage("Role not found.");
                        return;
                    }

                    ServerPermissions perms = role.Permissions;
                    await
                    e.Channel.SafeSendMessage($"**Listing permissions for {role.Name}**\r\n:" +
                                              $"{"CreateInstantInvite",-25}: {perms.CreateInstantInvite}\r\n" +
                                              $"{"KickMembers",-25}: {perms.KickMembers}\r\n" +
                                              $"{"BanMembers",-25}: {perms.BanMembers}\r\n" +
                                              $"{"ManageRoles",-25}: {perms.ManageRoles}\r\n" +
                                              $"{"ManageChannels",-25}: {perms.ManageChannels}\r\n" +
                                              $"{"ManageServer",-25}: {perms.ManageServer}\r\n" +
                                              $"{"ReadMessages",-25}: {perms.ReadMessages}\r\n" +
                                              $"{"SafeSendMessages",-25}: {perms.SendMessages}\r\n" +
                                              $"{"SendTTSMessages",-25}: {perms.SendTTSMessages}\r\n" +
                                              $"{"ManageMessages",-25}: {perms.ManageMessages}\r\n" +
                                              $"{"EmbedLinks",-25}: {perms.EmbedLinks}\r\n" +
                                              $"{"AttachFiles",-25}: {perms.AttachFiles}\r\n" +
                                              $"{"ReadMessageHistory",-25}: {perms.ReadMessageHistory}\r\n" +
                                              $"{"MentionEveryone",-25}: {perms.MentionEveryone}\r\n" +
                                              $"{"Connect",-25}: {perms.Connect}\r\n" +
                                              $"{"Speak",-25}: {perms.Speak}\r\n" +
                                              $"{"MuteMembers",-25}: {perms.MuteMembers}\r\n" +
                                              $"{"DeafenMembers",-25}: {perms.DeafenMembers}\r\n" +
                                              $"{"MoveMembers",-25}: {perms.MoveMembers}\r\n" +
                                              $"{"UseVoiceActivation",-25}: {perms.UseVoiceActivation}`"
                                              );
                });
            });

            manager.CreateDynCommands("ued", PermissionLevel.ServerModerator, group =>
            {
                group.CreateCommand("list")
                .Description("Lists users in server and their UIDs")
                .Do(async e =>
                {
                    StringBuilder builder = new StringBuilder();
                    builder.AppendLine("**Listing users in server:**");
                    CreateNameIdList(builder, e.Server.Users);
                    await e.Channel.SafeSendMessage(builder.ToString());
                });

                group.CreateCommand("mute")
                .AddCheck((cmd, usr, chnl) => chnl.Server.CurrentUser.ServerPermissions.MuteMembers)
                .Description("Mutes(true)/unmutes(false) the userid")
                .Parameter(Constants.UserMentionArg)
                .Parameter("val")
                .Do(async e =>
                {
                    User user = e.GetUser();

                    if (user == null)
                    {
                        await e.Channel.SendMessage("User not found.");
                        return;
                    }

                    await user.Edit(bool.Parse(e.GetArg("val")));
                    await e.Channel.SafeSendMessage($"Muted `{user.Name}`");
                });
                group.CreateCommand("deaf")
                .AddCheck((cmd, usr, chnl) => chnl.Server.CurrentUser.ServerPermissions.DeafenMembers)
                .Description("Deafens(true)/Undeafens(false) @user")
                .Parameter(Constants.UserMentionArg)
                .Parameter("val")
                .Do(async e =>
                {
                    User user = e.GetUser();

                    if (user == null)
                    {
                        await e.Channel.SendMessage("User not found.");
                        return;
                    }

                    await user.Edit(isDeafened: bool.Parse(e.GetArg("val")));
                    await e.Channel.SafeSendMessage($"Deafened `{user.Name}`");
                });
                group.CreateCommand("move")
                .AddCheck((cmd, usr, chnl) => chnl.Server.CurrentUser.ServerPermissions.MoveMembers)
                .Description("Moves a @user to a given voice channel")
                .Parameter(Constants.UserMentionArg)
                .Parameter("channelid", ParameterType.Unparsed)
                .Do(async e =>
                {
                    User user = e.GetUser();

                    if (user == null)
                    {
                        await e.Channel.SendMessage("User not found.");
                        return;
                    }

                    Channel moveChnl = e.Server.GetChannel(ulong.Parse(e.GetArg("channelid")));
                    await user.Edit(voiceChannel: moveChnl);
                    await e.Channel.SafeSendMessage($"Moved `{user.Name}` to `{moveChnl.Name}`");
                });
                group.CreateCommand("role add")
                .AddCheck((cmd, usr, chnl) => chnl.Server.CurrentUser.ServerPermissions.ManageRoles)
                .Description("Adds a role, found by id, to @user if they dont have it.")
                .Parameter(Constants.UserMentionArg)
                .Parameter(Constants.RoleIdArg)
                .Do(async e =>
                {
                    User user = e.GetUser();
                    Role role = e.GetRole();

                    if (user == null)
                    {
                        await e.Channel.SendMessage("User not found.");
                        return;
                    }

                    if (role == null)
                    {
                        await e.Channel.SendMessage("Role not found.");
                        return;
                    }

                    if (!user.HasRole(role))
                    {
                        await user.Edit(roles: user.Roles.Concat(new[] { role }));
                        await e.Channel.SafeSendMessage($"Given role `{role.Name}` to `{user.Mention}`");
                    }
                });

                group.CreateCommand("role list")
                .Description("Returns a list of roles a @user has.")
                .Parameter(Constants.UserMentionArg)
                .Do(async e =>
                {
                    StringBuilder builder = new StringBuilder();
                    User user             = e.GetUser();
                    builder.AppendLine($"**Listing roles for {user.Name}:**");
                    CreateNameIdList(builder, e.Server.Roles);
                    await e.Channel.SafeSendMessage(builder.ToString());
                });
                group.CreateCommand("role rem")
                .AddCheck((cmd, usr, chnl) => chnl.Server.CurrentUser.ServerPermissions.ManageRoles)
                .Description("Removes a roleid from a @user if they have it.")
                .Parameter(Constants.UserMentionArg)
                .Parameter(Constants.RoleIdArg)
                .Do(async e =>
                {
                    User user = e.GetUser();
                    Role role = e.GetRole();

                    if (user == null)
                    {
                        await e.Channel.SendMessage("User not found.");
                        return;
                    }

                    if (role == null)
                    {
                        await e.Channel.SendMessage("Role not found.");
                        return;
                    }

                    if (user.HasRole(role))
                    {
                        await user.RemoveRoles(role);
                        await e.Channel.SafeSendMessage($"Removed role `{role.Name}` from `{user.Name}`.");
                    }
                });

                group.CreateCommand("kick")
                .Description("Kicks a @user.")
                .AddCheck((cmd, usr, chnl) => chnl.Server.CurrentUser.ServerPermissions.KickMembers)
                .Parameter("userMention")
                .Do(async e =>
                {
                    User user = e.Server.GetUser(DiscordUtils.ParseMention(e.GetArg("userMention")).First());
                    if (user == null)
                    {
                        await e.Channel.SendMessage($"User not found.");
                        return;
                    }
                    string userName = user.Name;     // in case user is disposed right after we kick them.

                    await user.Kick();
                    await e.Channel.SendMessage($"Kicked {userName}.");
                });

                group.CreateCommand("ban")
                .Description("Bans an @user. Also allows for message pruning for a given amount of days.")
                .AddCheck((cmd, usr, chnl) => chnl.Server.CurrentUser.ServerPermissions.BanMembers)
                .Parameter("userMention")
                .Parameter("pruneDays", ParameterType.Optional)
                .Do(async e =>
                {
                    User user       = e.Server.GetUser(DiscordUtils.ParseMention(e.GetArg("userMention")).First());
                    int pruneDays   = 0;
                    string pruneRaw = e.GetArg("pruneDays");

                    if (!string.IsNullOrEmpty(pruneRaw))
                    {
                        pruneDays = int.Parse(pruneRaw);
                    }

                    if (user == null)
                    {
                        await e.Channel.SendMessage($"User not found.");
                        return;
                    }
                    string userName = user.Name;     // in case user is disposed right after we kick them.

                    await e.Server.Ban(user, pruneDays);
                    await e.Channel.SendMessage($"Banned {userName}");
                });
            });
        }
예제 #7
0
 public static Task EditRole(this DiscordClient client, Role role, string name = null, ServerPermissions permissions = null, Color color = null, bool? isHoisted = null, int? position = null)
 {
     if (role == null) throw new ArgumentNullException(nameof(role));
     return role.Edit(name, permissions, color, isHoisted, position);
 }
예제 #8
0
 public static Task<Role> CreateRole(this DiscordClient client, Server server, string name, ServerPermissions permissions = null, Color color = null, bool isHoisted = false)
 {
     if (server == null) throw new ArgumentNullException(nameof(server));
     return server.CreateRole(name, permissions, color);
 }
예제 #9
0
 public static Task EditRole(this DiscordClient client, Role role, string name = null, ServerPermissions permissions = null, Color color = null, bool?isHoisted = null, int?position = null)
 {
     if (role == null)
     {
         throw new ArgumentNullException(nameof(role));
     }
     return(role.Edit(name, permissions, color, isHoisted, position));
 }
예제 #10
0
 public static Task <Role> CreateRole(this DiscordClient client, Server server, string name, ServerPermissions permissions = null, Color color = null, bool isHoisted = false)
 {
     if (server == null)
     {
         throw new ArgumentNullException(nameof(server));
     }
     return(server.CreateRole(name, permissions, color));
 }
예제 #11
0
        private async Task Init()
        {
            Logger.Writeline("Initializing Stormbot v2");
            Logger.Writeline("Installing services... ");

            Client.AddService(new HttpService());
            Client.AddService(new ModuleService());

            DataIoService io = Client.AddService(new DataIoService());

            Client.AddService(new PastebinService());

            Client.UsingCommands(cmd =>
            {
                cmd.AllowMentionPrefix = true;
                cmd.ErrorHandler      += async(s, e) =>
                {
                    switch (e.ErrorType)
                    {
                    case CommandErrorType.Exception:
                        await
                        e.Channel.SendMessage(
                            $"{e.User.Mention} Something went wrong while processing your command! Make sure your input is in the valid format. `({e.Exception.GetType().Name})`");

                        Logger.FormattedWrite("CommandService", $"Exception on command: {e.Exception}",
                                              ConsoleColor.Yellow);
                        break;

                    case CommandErrorType.UnknownCommand:
                        await e.Channel.SendMessage($"{e.User.Mention} that command does not exist.");
                        break;

                    case CommandErrorType.BadPermissions:
                        StringBuilder builder =
                            new StringBuilder(
                                $"{e.User.Mention} you do not have sufficient permissions for that command. ");
                        if (!string.IsNullOrEmpty(e.Exception?.Message))
                        {
                            builder.AppendLine($"Error message: ```{e.Exception.Message}```");
                        }
                        await e.Channel.SendMessage(builder.ToString());
                        break;

                    case CommandErrorType.BadArgCount:
                        await
                        e.Channel.SendMessage(
                            $"{e.User.Mention} bad argument count.");
                        break;

                    case CommandErrorType.InvalidInput:
                        await e.Channel.SendMessage($"{e.User.Mention} invalid command input.");
                        break;

                    default:
                        Logger.FormattedWrite("CommandService", $"e.ErrorType ({e.ErrorType}) is not handled.",
                                              ConsoleColor.Yellow);
                        break;
                    }
                };
                cmd.PrefixChar = '}';
                cmd.HelpMode   = HelpMode.Public;
            });

            Client.UsingAudio(audio =>
            {
                audio.EnableMultiserver = true;
                audio.Mode             = AudioMode.Outgoing;
                audio.Channels         = 2;
                audio.EnableEncryption = true;
            });

            Client.UsingPermissionLevels((u, c) =>
            {
                if (u.Id == Constants.UserOwner)
                {
                    return((int)PermissionLevel.BotOwner);
                }

                if (u.Server != null)
                {
                    if (Equals(u, c.Server.Owner))
                    {
                        return((int)PermissionLevel.ServerOwner);
                    }

                    ServerPermissions serverPerms = u.ServerPermissions;
                    if (serverPerms.ManageRoles)
                    {
                        return((int)PermissionLevel.ServerAdmin);
                    }
                    if (serverPerms.ManageMessages && serverPerms.KickMembers && serverPerms.BanMembers)
                    {
                        return((int)PermissionLevel.ServerModerator);
                    }

                    ChannelPermissions channelPerms = u.GetPermissions(c);
                    if (channelPerms.ManagePermissions)
                    {
                        return((int)PermissionLevel.ChannelAdmin);
                    }
                    if (channelPerms.ManageMessages)
                    {
                        return((int)PermissionLevel.ChannelModerator);
                    }
                }

                return((int)PermissionLevel.User);
            });

            Client.UsingDynamicPerms();

            Logger.Writeline("Connecting to Discord... ");
            await Client.Connect(_email, _password);

            Logger.Writeline("Installing modules... ");

            Client.AddModule <BotManagementModule>("Bot", ModuleFilter.ServerWhitelist | ModuleFilter.ChannelWhitelist | ModuleFilter.AlwaysAllowPrivate);
            Client.AddModule <ServerManagementModule>("Server Management", ModuleFilter.ServerWhitelist | ModuleFilter.ChannelWhitelist);
            Client.AddModule <AudioStreamModule>("Audio", ModuleFilter.ServerWhitelist | ModuleFilter.ChannelWhitelist);
            Client.AddModule <QualityOfLifeModule>("QoL", ModuleFilter.ServerWhitelist | ModuleFilter.ChannelWhitelist);
            Client.AddModule <TestModule>("Test", ModuleFilter.ServerWhitelist | ModuleFilter.ChannelWhitelist);
            Client.AddModule <InfoModule>("Information", ModuleFilter.ServerWhitelist | ModuleFilter.ChannelWhitelist | ModuleFilter.AlwaysAllowPrivate);
            Client.AddModule <ModulesModule>("Modules");
            Client.AddModule <ExecuteModule>("Execute", ModuleFilter.AlwaysAllowPrivate);
            Client.AddModule <TerrariaRelayModule>("Terraria Relay", ModuleFilter.ChannelWhitelist | ModuleFilter.ServerWhitelist);
            Client.AddModule <TwitchRelayModule>("Twitch Relay", ModuleFilter.ChannelWhitelist | ModuleFilter.ServerWhitelist);
            Client.AddModule <TwitchEmoteModule>("Twitch Emotes", ModuleFilter.ServerWhitelist | ModuleFilter.ChannelWhitelist);
            Client.AddModule <AnnouncementModule>("Announcements", ModuleFilter.ServerWhitelist);
            Client.AddModule <VermintideModule>("Vermintide", ModuleFilter.ServerWhitelist | ModuleFilter.ChannelWhitelist | ModuleFilter.AlwaysAllowPrivate);
            Client.AddModule <PersonalModule>("Personal", ModuleFilter.ServerWhitelist);
#if RELEASE
            await DiscordUtils.GenerateCommandMarkdown(Client);
#endif
            Client.Log.Message += (sender, args) =>
            {
                if (_ignoredLogs.Contains(args.Severity))
                {
                    return;
                }

                Logger.FormattedWrite($"{args.Severity} {args.Source}", $"{args.Message}", _colorMap[args.Severity]);

                if (args.Exception != null)
                {
                    Logger.Write($"Exception: {args.Exception}");
                }
            };

            Logger.Writeline("Loading data... ");
            io.Load();

            Client.SetGame("}help for commands");
            Config.Owner = Client.GetUser(Constants.UserOwner);

            Logger.Writeline($" -WE ARE LIVE-{Environment.NewLine}");
        }