public static ChannelPermissions CalculatePermissions(IGuild guild, IGuildChannel channel, IMember member, IEnumerable <IRole> roles)
            {
                if (channel == null)
                {
                    throw new ArgumentNullException(nameof(channel));
                }

                var guildPermissions = CalculatePermissions(guild, member, roles);

                if (guildPermissions.Administrator)
                {
                    return(ChannelPermissions.All);
                }

                var permissions = ChannelPermissions.Mask(guildPermissions, channel);

                foreach (var role in roles.OrderBy(x => x.Position))
                {
                    for (var i = 0; i < channel.Overwrites.Count; i++)
                    {
                        var overwrite = channel.Overwrites[i];
                        if (overwrite.TargetId != role.Id)
                        {
                            continue;
                        }

                        permissions -= overwrite.Permissions.Denied;
                        permissions += overwrite.Permissions.Allowed;
                    }
                }

                for (var i = 0; i < channel.Overwrites.Count; i++)
                {
                    var overwrite = channel.Overwrites[i];
                    if (overwrite.TargetId != member.Id)
                    {
                        continue;
                    }

                    permissions -= overwrite.Permissions.Denied;
                    permissions += overwrite.Permissions.Allowed;
                }

                if (!permissions.ViewChannel)
                {
                    return(ChannelPermissions.None);
                }

                if (channel is ITextChannel && !permissions.SendMessages)
                {
                    permissions -= Permission.AttachFiles |
                                   Permission.EmbedLinks |
                                   Permission.MentionEveryone |
                                   Permission.SendTtsMessages;
                }

                return(permissions);
            }
        public async Task SetGreetChannel(IGuildChannel channel)
        {
            using (var uow = DBHandler.UnitOfWork())
            {
                uow.Guild.SetGuildGreetChannel(Context.Guild.Id, channel.Id);
            }

            await Context.Channel.SendSuccessAsync($"Set guild's greeings channel to: {channel.Name}");
        }
Beispiel #3
0
        public void AssertChannelPermission(ChannelPermission permission, ulong channelId)
        {
            IGuildChannel channel = GetChannel(channelId);

            if (!HasChannelPermission(permission, channelId))
            {
                throw new MissingPermissionException($"Bot does not have channel {nameof (permission)} '{permission} in channel '{channel.Name}'");
            }
        }
Beispiel #4
0
        public static string Channel(IGuildChannel channel)
        {
            if (channel == null)
            {
                throw new ArgumentNullException(nameof(channel));
            }

            return(Channel(channel.Id));
        }
Beispiel #5
0
        private async Task MoveMemberAsync(SocketGuildUser guildUser, IGuildChannel channel)
        {
            await guildUser.ModifyAsync(props =>
            {
                props.ChannelId = channel.Id;
            });

            logger.LogInformation("Moved user {username}#{discriminator} to channel {channelName}", guildUser.Username, guildUser.Discriminator, channel.Name);
        }
        public async Task SetDeletedLogChannel(IGuildChannel channel)
        {
            using (var uow = DBHandler.UnitOfWork())
            {
                uow.Guild.SetGuildDelChannel(Context.Guild.Id, channel.Id);
            }

            await Context.Channel.SendSuccessAsync($"Set guild's delete log channel to: {channel.Name}");
        }
Beispiel #7
0
        public ByRoleTeamManager(IGuildChannel channel, string teamRolePrefix)
        {
            Verify.IsNotNull(channel, nameof(channel));

            this.Guild          = channel.Guild;
            this.Channel        = channel;
            this.TeamRolePrefix = teamRolePrefix;
            this.InitiailzeTeamIdToName();
        }
        public ChannelCreatedEventArgs(IGuildChannel channel)
        {
            if (channel == null)
            {
                throw new ArgumentNullException(nameof(channel));
            }

            Channel = channel;
        }
Beispiel #9
0
        public static Embed ShowWarns(IGuildChannel channel, SocketGuildUser user = null)
        {
            List <string> warns    = UserSettings.Warns.List(channel.Guild.Id);
            var           eBuilder = new EmbedBuilder()
                                     .WithDescription($"The following warns have been issued: \n\n{String.Join($"\n", warns.ToArray())}")
                                     .WithColor(new Color(0xD0021B));

            return(eBuilder.Build());
        }
Beispiel #10
0
        public static async Task <Model> ModifyAsync(IGuildChannel channel, BaseDiscordClient client,
                                                     Action <ModifyGuildChannelParams> func,
                                                     RequestOptions options)
        {
            var args = new ModifyGuildChannelParams();

            func(args);
            return(await client.ApiClient.ModifyGuildChannelAsync(channel.Id, args, options).ConfigureAwait(false));
        }
Beispiel #11
0
        public static bool IsVerificationChannel(IGuildChannel channel)
        {
            if (UserSettings.Verification.VerificationChannelId(channel.Guild.Id) == channel.Id)
            {
                return(true);
            }

            return(false);
        }
Beispiel #12
0
        public static bool IsMediaOnlyChannel(IGuildChannel channel)
        {
            if (UserSettings.Channels.MediaOnlyChannels(channel.Guild.Id).Any(c => c.Equals(channel.Id)))
            {
                return(true);
            }

            return(false);
        }
        /// <summary>
        /// Clears all channel permission overwrites from the given channel.
        /// </summary>
        /// <param name="channel">The channel.</param>
        /// <returns>A modification result which may or may not have succeeded.</returns>
        private async Task <ModifyEntityResult> ClearChannelPermissionOverwrites(IGuildChannel channel)
        {
            var guild = channel.Guild;

            foreach (var overwrite in channel.PermissionOverwrites)
            {
                switch (overwrite.TargetType)
                {
                case PermissionTarget.Role:
                {
                    var role = guild.GetRole(overwrite.TargetId);
                    if (role is null)
                    {
                        continue;
                    }

                    if (role.Id == guild.EveryoneRole.Id)
                    {
                        await channel.AddPermissionOverwriteAsync(role, OverwritePermissions.InheritAll);
                    }
                    else
                    {
                        await channel.RemovePermissionOverwriteAsync(role);
                    }

                    break;
                }

                case PermissionTarget.User:
                {
                    var user = await guild.GetUserAsync(overwrite.TargetId);

                    if (user is null)
                    {
                        continue;
                    }

                    if (user.IsMe(_client))
                    {
                        continue;
                    }

                    await channel.RemovePermissionOverwriteAsync(user);

                    break;
                }

                default:
                {
                    throw new ArgumentOutOfRangeException();
                }
                }
            }

            return(ModifyEntityResult.FromSuccess());
        }
Beispiel #14
0
        public async Task <ChannelConfig> GetOrCreateConfigAsync(IGuildChannel channel)
        {
            var config = await GetConfigAsync(channel);

            if (config != null)
            {
                return(config);
            }
            return(await CreateAsync(new ChannelConfig { Id = channel.Id, GuildId = channel.GuildId }));
        }
        public async Task SetScoreChannelAsync(IGuildChannel channel, [Remainder] string paramString)
        {
            if (IsAdmin())
            {
                var eventId = paramString.ParseArgs("eventId");

                if (string.IsNullOrEmpty(eventId))
                {
                    await ReplyAsync(embed : "Usage: `setScoreChannel #channel -eventId \"[event id]\"`\nTo find event ids, please run `listEvents`".ErrorEmbed());
                }
                else
                {
                    var server = ServerService.GetServer();
                    if (server == null)
                    {
                        await ReplyAsync(embed : "The Server is not running, so we can't can't add events to it".ErrorEmbed());
                    }
                    else
                    {
                        var knownPairs = await HostScraper.ScrapeHosts(server.State.KnownHosts, $"{server.CoreServer.Address}:{server.CoreServer.Port}", 0);

                        var targetPair = knownPairs.FirstOrDefault(x => x.Value.Events.Any(y => y.EventId.ToString() == eventId));

                        if (targetPair.Key != null)
                        {
                            var targetEvent = targetPair.Value.Events.First(x => x.EventId.ToString() == eventId);
                            targetEvent.InfoChannel = new Models.Discord.Channel
                            {
                                Id   = channel?.Id ?? 0,
                                Name = channel?.Name ?? ""
                            };

                            var response = await server.SendUpdateQualifierEvent(targetPair.Key, targetEvent);

                            if (response.Type == Response.ResponseType.Success)
                            {
                                await ReplyAsync(embed : response.Message.SuccessEmbed());
                            }
                            else if (response.Type == Response.ResponseType.Fail)
                            {
                                await ReplyAsync(embed : response.Message.ErrorEmbed());
                            }
                        }
                        else
                        {
                            await ReplyAsync(embed : "Could not find an event with that ID".ErrorEmbed());
                        }
                    }
                }
            }
            else
            {
                await ReplyAsync(embed : "You do not have sufficient permissions to use this command".ErrorEmbed());
            }
        }
Beispiel #16
0
        public async Task SetScoreChannelAsync(IGuildChannel channel, [Remainder] string paramString)
        {
            if (IsAdmin())
            {
                var eventId = paramString.ParseArgs("赛事");

                if (string.IsNullOrEmpty(eventId))
                {
                    await ReplyAsync(embed : "用法: `计分频道 #频道 -赛事 \"[赛事ID]\"`\n赛事ID可以通过`赛事列表`命令查找".ErrorEmbed());
                }
                else
                {
                    var server = ServerService.GetServer();
                    if (server == null)
                    {
                        await ReplyAsync(embed : "服务器不在线,所以不能创建赛事".ErrorEmbed());
                    }
                    else
                    {
                        var knownPairs = await HostScraper.ScrapeHosts(server.State.KnownHosts, $"{server.CoreServer.Address}:{server.CoreServer.Port}", 0);

                        var targetPair = knownPairs.FirstOrDefault(x => x.Value.Events.Any(y => y.EventId.ToString() == eventId));

                        if (targetPair.Key != null)
                        {
                            var targetEvent = targetPair.Value.Events.First(x => x.EventId.ToString() == eventId);
                            targetEvent.InfoChannel = new Models.Discord.Channel
                            {
                                Id   = channel?.Id ?? 0,
                                Name = channel?.Name ?? ""
                            };

                            var response = await server.SendUpdateQualifierEvent(targetPair.Key, targetEvent);

                            if (response.Type == Response.ResponseType.Success)
                            {
                                await ReplyAsync(embed : response.Message.SuccessEmbed());
                            }
                            else if (response.Type == Response.ResponseType.Fail)
                            {
                                await ReplyAsync(embed : response.Message.ErrorEmbed());
                            }
                        }
                        else
                        {
                            await ReplyAsync(embed : "Could not find an event with that ID".ErrorEmbed());
                        }
                    }
                }
            }
            else
            {
                await ReplyAsync(embed : "你没有足够的权限使用该命令".ErrorEmbed());
            }
        }
Beispiel #17
0
        public async Task AddTwitter(string twitterName, IGuildChannel guildChannel)
        {
            var userResponse = await _twitterService.GetUserFromHandle(twitterName);


            if (userResponse?.Id is null)
            {
                await ReplyAsync("User Not Found");

                return;
            }

            var user = await _botContext.TwitterUsers.Include(x => x.TwitterAlertSubscriptions)
                       .FirstOrDefaultAsync(x => x.Id == userResponse.Id);

            if (user is null)
            {
                user = new TwitterUser
                {
                    Id   = userResponse.Id.Value,
                    Name = userResponse.Name,
                    TwitterAlertSubscriptions = new List <TwitterAlertSubscription>(),
                    ScreenName = userResponse.ScreenName
                };
                _botContext.TwitterUsers.Add(user);
                JobManager.AddJob(
                    () => new TwitterMonitoringJob(user.Id, _twitterService,
                                                   _provider.GetService <JakeBotContext>(), Context.Client).Execute(),
                    s => s.WithName($"Twitter: {userResponse.ScreenName}").ToRunEvery(30).Seconds());
            }

            if (user.TwitterAlertSubscriptions.Any(x => x.DiscordChannelId == (long)guildChannel.Id))
            {
                await ReplyAsync($"You already subscribed to {user.ScreenName} in {guildChannel.Name}");

                return;
            }

            user.TwitterAlertSubscriptions.Add(new TwitterAlertSubscription
            {
                DiscordChannelId = (long)guildChannel.Id,
                TwitterUserId    = user.Id
            });

            var changes = _botContext.SaveChanges();

            if (changes > 0)
            {
                await ReplyAsync($"Alert for {user.ScreenName} added to {guildChannel.Name}");
            }
            else
            {
                await ReplyAsync($"Unable to create Alert for {user.ScreenName}");
            }
        }
        public async Task Unlock(IGuildChannel channel, IGuildUser agent)
        {
            try
            {
                IRole role       = channel.Guild.EveryoneRole;
                var   permission = channel.GetPermissionOverwrite(role);
                if (permission.HasValue && permission.Value.ViewChannel == PermValue.Deny)
                {
                    await channel.AddPermissionOverwriteAsync(role, new OverwritePermissions(viewChannel : PermValue.Allow));

                    {
                        var eb = new EmbedBuilder()
                        {
                            Author = new EmbedAuthorBuilder()
                            {
                                IconUrl = $"{agent.GetAvatarUrl()}",
                                Name    = $"Channel unlocked"
                            },
                            Description = $"{agent.Username}#{agent.Discriminator} ({agent.Mention}) unlocked a channel!",
                            Fields      =
                            {
                                new EmbedFieldBuilder()
                                {
                                    Name     = "Perpetrator",
                                    Value    = $"• **Agent:** {agent.Username}#{agent.Discriminator}\n• **Agent ID:** {agent.Id}",
                                    IsInline = false
                                },
                                new EmbedFieldBuilder()
                                {
                                    Name     = "Source",
                                    Value    = $"• **Server:** {agent.Guild.Name}\n• **Channel:** <#{channel.Id}>",
                                    IsInline = false
                                }
                            },
                            Footer = new EmbedFooterBuilder()
                            {
                                Text = $"{DateTime.Now}",
                            },
                        };
                        eb.WithColor(Color.Blue);
                        DiscordReply("", eb);
                        await Utils.LogChannel.SendMessageAsync("", false, eb.Build());
                    }
                }
                else
                {
                    DiscordReply("This channel is already unlocked.");
                }
            }
            catch
            {
                Console.WriteLine($"Error while trying to set or remove lockdown on channel.");
                DiscordReply("Unable to lock this channel down");
            }
        }
        public async Task LockModule()
        {
            IGuildChannel channel = (IGuildChannel)Context.Channel;

            PermValue permission        = channel.GetPermissionOverwrite(Context.Guild.EveryoneRole)?.SendMessages ?? PermValue.Allow;
            PermValue flippedPermission = permission == PermValue.Allow ? PermValue.Deny : PermValue.Allow;

            await ReplyAsync(flippedPermission == PermValue.Allow? "> Channel Has Been Unlocked" : "> Channel Has Been Locked");

            await channel.AddPermissionOverwriteAsync(Context.Guild.EveryoneRole, new OverwritePermissions(sendMessages : flippedPermission));
        }
Beispiel #20
0
        public async Task LockChannel(IGuildChannel chn, [Remainder] string reason)
        {
            await Context.Message.DeleteAsync();

            string Message = "Command **!lockchannel** requested by " + Context.User.Mention + Environment.NewLine +
                             "in channel <#" + Context.Channel.Id + "> " + "Channel: " + chn.Id + " Lock reason: " + reason;
            string IMessage = "Command **!lockchannel** requested by " + Context.User.Mention + Environment.NewLine +
                              "in channel <#" + Context.Channel.Id + "> " + "Channel: " + chn.Id + " Lock reason: " + reason;

            await Helper.LoggingAsync(new LogMessage (LogSeverity.Verbose, "Module", Message));
        }
Beispiel #21
0
        public static Embed ShowColors(IGuildChannel channel, List <string> colorRoleNames, ulong guildId)
        {
            var eBuilder = new EmbedBuilder()
                           .WithDescription($"You can assign yourself the following color roles using " +
                                            $"``{UserSettings.BotOptions.CommandPrefix(guildId)}give color roleName``, " +
                                            $"or add your own using ``{UserSettings.BotOptions.CommandPrefix(guildId)}create color #hexValue roleName``: " +
                                            $"\n{String.Join(Environment.NewLine, colorRoleNames.ToArray())}")
                           .WithColor(new Color(0xF5DA23));

            return(eBuilder.Build());
        }
        private async Task <ModifyEntityResult> ConfigureDefaultUserRolePermissions
        (
            IGuild guild,
            IGuildChannel dedicatedChannel
        )
        {
            var getServer = await _servers.GetOrRegisterServerAsync(guild);

            if (!getServer.IsSuccess)
            {
                return(ModifyEntityResult.FromError(getServer));
            }

            var server      = getServer.Entity;
            var getSettings = await _serverSettings.GetOrCreateServerRoleplaySettingsAsync(server);

            if (!getSettings.IsSuccess)
            {
                return(ModifyEntityResult.FromError(getSettings));
            }

            var settings = getSettings.Entity;

            var denyView = OverwritePermissions.InheritAll.Modify
                           (
                viewChannel: PermValue.Deny,
                sendMessages: PermValue.Deny,
                addReactions: PermValue.Deny
                           );

            // Configure visibility for everyone
            // viewChannel starts off as deny, since starting or stopping the RP will set the correct permissions.
            IRole defaultUserRole;

            if (settings.DefaultUserRole.HasValue)
            {
                var defaultRole = guild.GetRole((ulong)settings.DefaultUserRole.Value);
                defaultUserRole = defaultRole ?? guild.EveryoneRole;
            }
            else
            {
                defaultUserRole = guild.EveryoneRole;
            }

            await dedicatedChannel.AddPermissionOverwriteAsync(defaultUserRole, denyView);

            if (defaultUserRole != guild.EveryoneRole)
            {
                // Also override @everyone so it can't see anything
                await dedicatedChannel.AddPermissionOverwriteAsync(guild.EveryoneRole, denyView);
            }

            return(ModifyEntityResult.FromSuccess());
        }
Beispiel #23
0
        public Channel GetChannel(IGuildChannel ichannel)
        {
            var channel = FindChannel(ichannel);

            if (channel == null)
            {
                channel = new Channel(ichannel);
                Channels.Add(channel);
            }
            return(channel);
        }
Beispiel #24
0
        public bool RemoveChannel(IGuildChannel ichannel)
        {
            var channel = FindChannel(ichannel);

            if (channel == null)
            {
                return(false);
            }
            Channels.Remove(channel);
            return(true);
        }
Beispiel #25
0
 private MultiRoleEntry GetEntry(IGuildChannel channel, ulong msgId)
 {
     foreach (MultiRoleEntry entry in Entries)
     {
         if (entry.ChannelId == channel.Id && entry.GuildId == channel.GuildId && entry.MessageId == msgId)
         {
             return(entry);
         }
     }
     return(null);
 }
Beispiel #26
0
 int GetIndex(IGuildChannel channel)
 {
     foreach (var c in plugin.Config.Channels)
     {
         if (c.Guild == channel.GuildId && c.Channel == channel.Id)
         {
             return(plugin.Config.Channels.IndexOf(c));
         }
     }
     return(-1);
 }
Beispiel #27
0
        public static bool IsPublic(this IGuildChannel channel)
        {
            if (channel?.Guild is IGuild guild)
            {
                var permissions = channel.GetPermissionOverwrite(guild.EveryoneRole);

                return(!permissions.HasValue || permissions.Value.ViewChannel != PermValue.Deny);
            }

            return(false);
        }
Beispiel #28
0
        private bool CommandAllowedInChannel(CommandInfo command, STDTContext db, IGuildChannel channel)
        {
            List <long> AllowedChannelIDs = db.CommandChannelPermissions.ToList().Where(x => x.CommandName.ToLower() == command.Name.ToLower()).Select(x => x.ChannelID).ToList();

            if (AllowedChannelIDs.Count == 0)
            {
                return(true);
            }

            return(AllowedChannelIDs.Contains((long)channel.Id));
        }
Beispiel #29
0
        public async Task AddTwitch(string twitchName, IGuildChannel guildChannel, string streamMessage)
        {
            var userResponse = await _twitchService.GetUserByNameAsync(twitchName);

            if (userResponse is null)
            {
                await ReplyAsync("User Not Found");

                return;
            }

            var user = await _botContext.TwitchStreamers.Include(x => x.TwitchAlertSubscriptions)
                       .FirstOrDefaultAsync(x => x.Id == long.Parse(userResponse.Id));

            if (user is null)
            {
                user = new TwitchStreamer
                {
                    Id   = long.Parse(userResponse.Id),
                    Name = userResponse.DisplayName,
                    TwitchAlertSubscriptions = new List <TwitchAlertSubscription>()
                };
                _botContext.TwitchStreamers.Add(user);
                JobManager.AddJob(
                    () => new TwitchMonitoringJob(user.Id, _twitchService,
                                                  _provider.GetService <SteveBotContext>(), Context.Client).Execute(),
                    s => s.WithName(userResponse.DisplayName).ToRunEvery(60).Seconds());
            }

            if (user.TwitchAlertSubscriptions.Any(x => x.DiscordChannelId == (long)guildChannel.Id))
            {
                await ReplyAsync($"You already subscribed to {user.Name} in {guildChannel.Name}");

                return;
            }

            user.TwitchAlertSubscriptions.Add(new TwitchAlertSubscription
            {
                DiscordChannelId = (long)guildChannel.Id,
                StreamMessage    = streamMessage,
                TwitchStreamerId = user.Id
            });

            var changes = _botContext.SaveChanges();

            if (changes > 0)
            {
                await ReplyAsync($"Alert for {user.Name} added to {guildChannel.Name}");
            }
            else
            {
                await ReplyAsync($"Unable to create Alert for {user.Name}");
            }
        }
Beispiel #30
0
        /*public static ulong ResolveChannel(IGuildUser user, IGuildChannel channel)
         * {
         *  return ResolveChannel(user, channel, ResolveGuild(user));
         * }*/
        public static ulong ResolveChannel(IGuildUser user, IGuildChannel channel, ulong guildPermissions)
        {
            ulong resolvedPermissions = 0;

            ulong mask = ChannelPermissions.All(channel).RawValue;

            if (/*user.Id == user.Guild.OwnerId || */ GetValue(guildPermissions, GuildPermission.Administrator))
            {
                resolvedPermissions = mask; //Owners and administrators always have all permissions
            }
            else
            {
                //Start with this user's guild permissions
                resolvedPermissions = guildPermissions;

                OverwritePermissions?perms;
                var roles = user.Roles;
                if (roles.Count > 0)
                {
                    ulong deniedPermissions = 0UL, allowedPermissions = 0UL;
                    foreach (var role in roles)
                    {
                        perms = channel.GetPermissionOverwrite(role);
                        if (perms != null)
                        {
                            deniedPermissions  |= perms.Value.DenyValue;
                            allowedPermissions |= perms.Value.AllowValue;
                        }
                    }
                    resolvedPermissions = (resolvedPermissions & ~deniedPermissions) | allowedPermissions;
                }
                perms = channel.GetPermissionOverwrite(user);
                if (perms != null)
                {
                    resolvedPermissions = (resolvedPermissions & ~perms.Value.DenyValue) | perms.Value.AllowValue;
                }

                //TODO: C#7 Typeswitch candidate
                var textChannel  = channel as ITextChannel;
                var voiceChannel = channel as IVoiceChannel;
                if (textChannel != null && !GetValue(resolvedPermissions, ChannelPermission.ReadMessages))
                {
                    resolvedPermissions = 0; //No read permission on a text channel removes all other permissions
                }
                else if (voiceChannel != null && !GetValue(resolvedPermissions, ChannelPermission.Connect))
                {
                    resolvedPermissions = 0; //No connect permission on a voice channel removes all other permissions
                }
                resolvedPermissions &= mask; //Ensure we didnt get any permissions this channel doesnt support (from guildPerms, for example)
            }

            return(resolvedPermissions);
        }