コード例 #1
0
    def predicate(ctx):
        dj_role = GuildState(ctx.author.guild).dj_role
        
        if dj_role is None:
            return True

        for role in ctx.author.roles:
            if role.id == dj_role.id:
                return True
            
        return False
コード例 #2
0
async def determine_prefix(bot, message):
    if message.guild:
        state_prefix = GuildState(message.guild).prefix
        prefixes = []
        for i in range(len(state_prefix)):
            prefixes += gen.permu(state_prefix[i])
        if prefixes == []:
            return prefix
        else:
            return prefixes
    else:
        return prefix
コード例 #3
0
 async def on_message(self, message):
     state = GuildState(message.guild)
     jb_channel = state.jb_channel
     if jb_channel:
         if message.channel == jb_channel:
             if message.author != self.client.user:
                 ctx = await self.client.get_context(message)
                 await ctx.invoke(self.client.get_command("play"),
                                  query=message.content)
                 await message.delete()
             else:
                 if not self.reset_phase:
                     await message.delete()
コード例 #4
0
 async def auto_voice_handler(self):
     for guild in self.client.guilds:
         state = TempState(guild)
         voice = get(self.client.voice_clients, guild=guild)
         if voice:
             if self.disconnect_check(voice):
                 awoo_channel = GuildState(guild).voice_text_channel
                 if voice.is_playing():
                     state.voice_handler_time += 1
                     if state.voice_handler_time == int(GuildState(guild).auto_pause_time):
                         voice.pause()
                         if guild in gen.time_l:
                             gen.time_l.remove(guild)
                         self.log("Player AUTO paused")
                         state.paused_by_handler = True
                         if awoo_channel:
                             await awoo_channel.send(f"Everyone left `{voice.channel.name}`, player paused.")
                 elif voice.is_paused():
                     state.voice_handler_time += 1
                     if state.voice_handler_time == int(GuildState(guild).auto_disconnect_time):
                         state.queue = []
                         state.full_queue = []
                         state.queue_ct = []
                         state.full_queue_ct = []
                         await voice.disconnect()
                         self.log("Player AUTO Disconnected")
                         if awoo_channel:
                             await awoo_channel.send(f"player disconnected.")
             else:
                 if state.voice_handler_time > 0:
                     state.voice_handler_time = 0
                 if state.paused_by_handler:
                     state.voice_handler_time = 0
                     voice.resume()
                     if guild not in gen.time_l:
                         gen.time_l.append(guild)
                     state.paused_by_handler = False
コード例 #5
0
 async def give_exp(self):
     for guild in self.client.guilds:
         if GuildState(guild).exp_counting:
             for member in guild.members:
                 if member.bot:
                     continue
                 state = State(member).Member 
                 if state.active:
                     prev_des = state.role
                     state.xp += self.gen_xp()
                     state.active = False
                     new_des = state.role
                     
                     if not new_des == prev_des:
                         await member.remove_roles(prev_des)
                         await member.add_roles(new_des)
コード例 #6
0
    async def resetup(self, ctx):
        """Re-SetUp the juke box, idk why would you wanna do that but you can, so yay"""

        state = GuildState(ctx.guild)
        jb_channel = state.jb_channel
        if jb_channel == None:
            await ctx.send("F**k U person, Use Setup Command, U Sick F**k")
        else:
            try:
                self.reset_phase = True
                state.jb_embed_id = state.jb_queue_id = state.jb_image_id = state.jb_loading_id = None
                async for msg in jb_channel.history():
                    await msg.delete()

                #! IMAGE
                image_msg = await state.jb_channel.send(self.we_tube_bg_url)
                state.jb_image_id = image_msg.id

                #! EMBED
                reactions = {
                    "тПпя╕П": "play/pause",
                    "тП╣я╕П": "stop",
                    "тПоя╕П": "previous",
                    "тПня╕П": "forward",
                    "ЁЯФБ": "loop",
                    "ЁЯФА": "shuffle"
                }
                embed = discord.Embed(title="Not Playing Anything right now.",
                                      color=discord.Colour.from_rgb(
                                          0, 255, 255))
                embed.set_image(url=self.juke_box_url)

                embed_msg = await state.jb_channel.send(embed=embed)
                state.jb_embed_id = embed_msg.id
                for reaction in reactions:

                    await embed_msg.add_reaction(reaction)
                #! LOADING
                loading_msg = await state.jb_channel.send(
                    f"0:00/0:00 - {':black_large_square: '*10}")
                state.jb_loading_id = loading_msg.id

                #! QUEUE
                queue_msg = await state.jb_channel.send("__QUEUE LIST__")
                state.jb_queue_id = queue_msg.id

                await state.jb_channel.send("Done")
                self.reset_phase = False

            except:
                pass
コード例 #7
0
    async def predicate(ctx: commands.Context):
        async def reactions_add(message, reactions):
            for reaction in reactions:
                await message.add_reaction(reaction)
        
        if ctx.voice_client is None:
            return True
        
        dj_role = GuildState(ctx.author.guild).dj_role
        
        if dj_role is None:
            return True
        
        if dj_role.id in [role.id for role in ctx.author.roles]:
            return True

        members = ctx.guild.voice_client.channel.members
        
        if len(members) == 2:
            return True

        already_voted = []
        reactions = {"yes": yes_emoji, "no": no_emoji, "admin": admin_emoji}

        def check(reaction: discord.Reaction, user):
            return user in members and reaction.message.id == msg.id and str(reaction) in reactions.values() and not user == ctx.bot.user

        msg = await ctx.send(content=f">>> {vote_msg}")
        msg: discord.Message

        ctx.bot.loop.create_task(reactions_add(msg, reactions.values()))

        while True:
            try:
                reaction, user = await ctx.bot.wait_for('reaction_add', timeout=vote_duration,
                                                        check=check)
                
                if str(reaction) == reactions["admin"] and user.top_role.permissions.administrator:
                    await msg.clear_reactions()
                    await msg.edit(content=">>> Admin abooz, pls demote!")
                    await msg.edit(content="Admin power excercised: " + yes_msg)
                    
                    return True        
                        
                else:
                    if user.id not in already_voted:
                        already_voted.append(user.id)

                        if len(already_voted) == len(members) - 1:
                            raise asyncio.TimeoutError
                    else:
                        await msg.remove_reaction(str(reaction), user)
                        
            except asyncio.TimeoutError:
                yes = no = 0
                new_message: discord.Message = await ctx.channel.fetch_message(msg.id)
                
                for reaction in new_message.reactions:
                    if str(reaction) == reactions["yes"]:
                        yes = reaction.count - 1
                    elif str(reaction) == reactions["no"]:
                    	no = reaction.count - 1

                total = yes + no
                result = (yes / total) >= votes_required

                if result:
                    await msg.edit(content=yes_msg + f"\n{reactions['yes']}: *{yes}* \t\t {reactions['no']}: *{no}*")
                if not result:
                    await msg.edit(content=no_msg + f"\n{reactions['yes']}: {yes}{reactions['no']}: {no}")

                await new_message.clear_reactions()
                
                return result
コード例 #8
0
    async def juke_update(self):
        for guild in self.client.guilds:
            state = GuildState(guild)
            voice = get(self.client.voice_clients, guild=guild)
            if state.jb_channel and voice:
                tstate = TempState(guild)
                queue = [x for x in tstate.queue if type(x) != str]
                if state.jb_embed_id:
                    embed_msg = await state.jb_channel.fetch_message(
                        state.jb_embed_id)
                    if embed_msg:
                        if tstate.old_queue_embed != tstate.queue:
                            tstate.old_queue_embed = tstate.queue
                            if queue == []:
                                embed = discord.Embed(
                                    title="Not Playing Anything right now.",
                                    color=discord.Colour.from_rgb(0, 255, 255))
                                embed.set_image(url=self.juke_box_url)
                                await embed_msg.edit(embed=embed)
                            else:
                                vid = queue[0]
                                embed = discord.Embed(
                                    title=vid.title,
                                    color=discord.Colour.from_rgb(0, 255, 255))
                                embed.set_image(url=vid.thumbnail)

                                await embed_msg.edit(embed=embed)
                    else:
                        state.jb_embed_id = None

                if state.jb_queue_id:
                    queue_msg = await state.jb_channel.fetch_message(
                        state.jb_queue_id)
                    if queue_msg:
                        if tstate.old_queue_queue != tstate.queue:
                            tstate.old_queue_queue = tstate.queue
                            if queue == []:

                                await queue_msg.edit(content="__QUEUE LIST__")
                            else:
                                string = "__QUEUE__\n"
                                for index in range(len(tstate.queue)):
                                    i = tstate.queue[index]
                                    ostring = string[:]
                                    string += f"{index+1}. {i.title} ({i.duration}) - Requested by `{i.requester}`\n"
                                    if len(string) > 2000:
                                        string = ostring
                                        break

                                await queue_msg.edit(content=string)
                    else:
                        state.jb_queue_id = None

                if state.jb_loading_id:
                    loading_msg = await state.jb_channel.fetch_message(
                        state.jb_loading_id)
                    if loading_msg:
                        if voice.is_playing():
                            if queue != []:
                                vid = queue[0]

                                def two_dig(number):
                                    if number < 10:
                                        return f"0{number}"
                                    else:
                                        return str(number)

                                if vid.duration.count(":") == 1:
                                    ntime = f"{tstate.time//60}:{two_dig(tstate.time%60)}"
                                else:
                                    ntime = f"{tstate.time//3600}:{two_dig(tstate.time%3600//60)}:{two_dig(tstate.time//60)}"

                                ntime = str(timedelta(seconds=tstate.time))

                                amt = int(tstate.time / vid.seconds *
                                          10) if vid.seconds != 0 else 0

                                ntime = ntime.split(":")
                                for i in range(3 -
                                               len(vid.duration.split(":"))):
                                    ntime.pop(i)
                                ntime = ":".join(ntime)

                                await loading_msg.edit(
                                    content=
                                    f"{ntime}/{vid.duration} {':black_square_button:'*amt +':black_large_square:'*(10-amt)}"
                                )

                            else:
                                await loading_msg.edit(
                                    content=
                                    f"0:00/0:00 - {':black_large_square:'*10}")

                    else:
                        state.jb_loading_id = None
コード例 #9
0
    async def on_reaction_add(self, reaction, user):
        state = GuildState(user.guild)
        voice = get(self.client.voice_clients, guild=reaction.message.guild)
        if state.jb_channel and voice:
            if state.jb_embed_id:
                embed_msg = await state.jb_channel.fetch_message(
                    state.jb_embed_id)
                if not embed_msg:
                    state.jb_embed_id = None
                else:
                    dj_flag = False
                    dj_role = GuildState(user.guild).dj_role

                    if dj_role is None:
                        dj_flag = True

                    else:
                        for role in user.roles:
                            if role.id == dj_role.id:
                                dj_flag = True

                    if user != self.client.user and reaction.message.id == int(
                            state.jb_embed_id) and dj_flag:
                        reactions = {
                            "тПпя╕П": "play/pause",
                            "тП╣я╕П": "stop",
                            "тПоя╕П": "previous",
                            "тПня╕П": "forward",
                            "ЁЯФБ": "loop",
                            "ЁЯФА": "shuffle"
                        }

                        if str(reaction.emoji) in reactions:
                            ctx = await self.client.get_context(
                                reaction.message)
                            if reactions[str(reaction.emoji)] == "play/pause":
                                if voice.is_playing():
                                    await ctx.invoke(
                                        self.client.get_command("pause"))
                                elif voice.is_paused():
                                    await ctx.invoke(
                                        self.client.get_command("resume"))

                            elif reactions[str(reaction.emoji)] == "stop":
                                await ctx.invoke(
                                    self.client.get_command("stop"))

                            elif reactions[str(reaction.emoji)] == "forward":
                                await ctx.invoke(
                                    self.client.get_command("skip"))

                            elif reactions[str(reaction.emoji)] == "loop":
                                await ctx.invoke(
                                    self.client.get_command("loop"))

                            elif reactions[str(reaction.emoji)] == "previous":
                                await ctx.invoke(
                                    self.client.get_command("back"))

                            elif reactions[str(reaction.emoji)] == "shuffle":
                                await ctx.invoke(
                                    self.client.get_command("shuffle"))

                        await reaction.remove(user)
コード例 #10
0
    async def a_meme(self):
        limit = 5
        reddit = gen.reddit
        for sr in gen.subreddits:
            #! GETS MEMES AND CHECK IF SHOWN

            subreddit = reddit.subreddit(sr)
            hot_memes = subreddit.hot(limit=limit)
            meme_info = gen.db_receive("meme")

            if sr in meme_info:
                sub_info = meme_info[sr]
            else:
                meme_info[sr] = {"total": [], "unshowed": []}
                sub_info = meme_info[sr]

            for submission in hot_memes:
                if not submission.stickied:

                    if str(submission) not in sub_info["total"]:

                        sub_info["total"].append(str(submission))
                        sub_info["unshowed"].append(str(submission))

            gen.db_update("meme", meme_info)

        #! MAKE SUBMISSION EMBED
        meme_info = gen.db_receive("meme")

        for sub_name in meme_info:
            sub_info = meme_info[sub_name]
            for submissions in sub_info["unshowed"]:
                subr = reddit.subreddit(sub_name)
                submissions = reddit.submission(submissions)
                meh = discord.Embed(title=submissions.title,
                                    url=submissions.shortlink,
                                    colour=discord.Colour.orange())
                meh.set_image(url=submissions.url)
                meh.set_author(name=f"u/{submissions.author}",
                               icon_url=submissions.author.icon_img)
                meh.add_field(name='~~Spanks~~ Updoots',
                              value=f"{round(submissions.ups/1000,1)}k",
                              inline=True)
                meh.add_field(name='Subreddit',
                              value=f"r/{sub_name}",
                              inline=True)

                meh.set_thumbnail(url=subr.icon_img)

                for guild in self.client.guilds:
                    channel = GuildState(guild).auto_meme_channel
                    if channel is None:
                        continue
                    await channel.send(embed=meh)

        #! CLEARING UNSHOWED

        for sub_info in meme_info:
            sub_info = meme_info[sub_info]
            sub_info["unshowed"].clear()

        gen.db_update("meme", meme_info)
        #! CLEANING MEMES
        for sub_info in meme_info:
            sub_info = meme_info[sub_info]
            tot = len(sub_info["total"])
            req = limit * 10
            if tot > req:
                for i in range(req, tot):
                    sub_info["total"].pop(0)
                gen.db_update("meme", meme_info)