diff options
| author | 2021-04-19 21:16:02 +0100 | |
|---|---|---|
| committer | 2021-04-19 21:16:02 +0100 | |
| commit | e5f8ba0105bb642edac3bf0f5772eaa96786d847 (patch) | |
| tree | 14afca8575c24a1901a6222df9331f6143a8749c | |
| parent | Change type hint from duration to expiry (diff) | |
| parent | Merge pull request #1537 from python-discord/list-non-staff-with-stream-perms (diff) | |
Merge branch 'main' into main
| -rw-r--r-- | bot/exts/moderation/stream.py | 50 | 
1 files changed, 46 insertions, 4 deletions
| diff --git a/bot/exts/moderation/stream.py b/bot/exts/moderation/stream.py index 12e195172..1dbb2a46b 100644 --- a/bot/exts/moderation/stream.py +++ b/bot/exts/moderation/stream.py @@ -1,5 +1,6 @@  import logging  from datetime import timedelta, timezone +from operator import itemgetter  import arrow  import discord @@ -8,8 +9,9 @@ from async_rediscache import RedisCache  from discord.ext import commands  from bot.bot import Bot -from bot.constants import Colours, Emojis, Guild, Roles, STAFF_ROLES, VideoPermission +from bot.constants import Colours, Emojis, Guild, MODERATION_ROLES, Roles, STAFF_ROLES, VideoPermission  from bot.converters import Expiry +from bot.pagination import LinePaginator  from bot.utils.scheduling import Scheduler  from bot.utils.time import format_infraction_with_duration @@ -69,7 +71,7 @@ class Stream(commands.Cog):              )      @commands.command(aliases=("streaming",)) -    @commands.has_any_role(*STAFF_ROLES) +    @commands.has_any_role(*MODERATION_ROLES)      async def stream(self, ctx: commands.Context, member: discord.Member, duration: Expiry = None) -> None:          """          Temporarily grant streaming permissions to a member for a given duration. @@ -126,7 +128,7 @@ class Stream(commands.Cog):          log.debug(f"Successfully gave {member} ({member.id}) permission to stream until {revoke_time}.")      @commands.command(aliases=("pstream",)) -    @commands.has_any_role(*STAFF_ROLES) +    @commands.has_any_role(*MODERATION_ROLES)      async def permanentstream(self, ctx: commands.Context, member: discord.Member) -> None:          """Permanently grants the given member the permission to stream."""          log.trace(f"Attempting to give permanent streaming permission to {member} ({member.id}).") @@ -153,7 +155,7 @@ class Stream(commands.Cog):          log.debug(f"Successfully gave {member} ({member.id}) permanent streaming permission.")      @commands.command(aliases=("unstream", "rstream")) -    @commands.has_any_role(*STAFF_ROLES) +    @commands.has_any_role(*MODERATION_ROLES)      async def revokestream(self, ctx: commands.Context, member: discord.Member) -> None:          """Revoke the permission to stream from the given member."""          log.trace(f"Attempting to remove streaming permission from {member} ({member.id}).") @@ -173,6 +175,46 @@ class Stream(commands.Cog):          await ctx.send(f"{Emojis.cross_mark} This member doesn't have video permissions to remove!")          log.debug(f"{member} ({member.id}) didn't have the streaming permission to remove!") +    @commands.command(aliases=('lstream',)) +    @commands.has_any_role(*MODERATION_ROLES) +    async def liststream(self, ctx: commands.Context) -> None: +        """Lists all non-staff users who have permission to stream.""" +        non_staff_members_with_stream = [ +            member +            for member in ctx.guild.get_role(Roles.video).members +            if not any(role.id in STAFF_ROLES for role in member.roles) +        ] + +        # List of tuples (UtcPosixTimestamp, str) +        # So that the list can be sorted on the UtcPosixTimestamp before the message is passed to the paginator. +        streamer_info = [] +        for member in non_staff_members_with_stream: +            if revoke_time := await self.task_cache.get(member.id): +                # Member only has temporary streaming perms +                revoke_delta = Arrow.utcfromtimestamp(revoke_time).humanize() +                message = f"{member.mention} will have stream permissions revoked {revoke_delta}." +            else: +                message = f"{member.mention} has permanent streaming permissions." + +            # If revoke_time is None use max timestamp to force sort to put them at the end +            streamer_info.append( +                (revoke_time or Arrow.max.timestamp(), message) +            ) + +        if streamer_info: +            # Sort based on duration left of streaming perms +            streamer_info.sort(key=itemgetter(0)) + +            # Only output the message in the pagination +            lines = [line[1] for line in streamer_info] +            embed = discord.Embed( +                title=f"Members with streaming permission (`{len(lines)}` total)", +                colour=Colours.soft_green +            ) +            await LinePaginator.paginate(lines, ctx, embed, max_size=400, empty=False) +        else: +            await ctx.send("No members with stream permissions found.") +  def setup(bot: Bot) -> None:      """Loads the Stream cog.""" | 
