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
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
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()
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
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)
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
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
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
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)
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)