async def ban(self, ctx, userin, *, reason=None): user = formatting.get_from_in(self.bot, ctx, "use", userin) member = formatting.get_from_in(self.bot, ctx, "mem", userin) verified = ctx.guild.get_role(settings.VERIFIED_ROLE_ID) staff = ctx.guild.get_role(settings.STAFF_ROLE_ID) try: if staff not in ctx.author.roles and verified in member.roles: await ctx.send( content= 'Interviewers cannot target Verified users with this command' ) return except AttributeError: pass embed = discord.Embed(title='Server Ban', color=0xff6464) embed.set_author(name=f'{user.name}#{user.discriminator}', icon_url=user.avatar_url) embed.add_field(name='Target', value=user.mention, inline=True) embed.add_field(name='Moderator', value=ctx.author.mention, inline=True) embed.timestamp = ctx.message.created_at if reason: embed.add_field(name='Reason', value=reason, inline=False) await ctx.guild.ban(user, reason=reason, delete_message_days=0) else: embed.add_field(name='Reason', value='none', inline=False) await ctx.guild.ban(user, reason='none', delete_message_days=0) await ctx.send(embed=embed)
async def say(self, ctx, channel, *, msg): channel = formatting.get_from_in(self.bot, ctx, "cha", channel) log_channel = self.bot.get_channel(int(settings.SAY_LOG_ID)) if ctx.author.permissions_in(channel).send_messages: if len( ctx.message.role_mentions ) != 0 or '@everyone' in msg or '@here' in msg: #checking if there are any mentions in the message await ctx.send( content='You cannot mention roles with this command') return else: await log_channel.send( f'__{ctx.message.author.name}:__ {msg} **in** *{channel.name}*' ) await channel.send(f'{msg}') try: await ctx.message.delete() except discord.Forbidden: pass else: await ctx.send( f'You\'re only allowed to use this command in channels you may speak in! You can\'t speak in **{channel.name}**' )
async def cleanupgen(self, ctx, role): role = formatting.get_from_in(self.bot, ctx, "rol", role) member_list = role.members cleanup_file = open(settings.CLEANUP_PATH, 'w+') i = 0 with open(settings.CLEANUP_PATH, 'w+') as cleanup_file: cleanup_file.write('Member, Id, Joined, Last seen, Nitro\n') for member in member_list: db = TinyDB(settings.DB_PATH + str(member.id) + '.json') table = db.table('information') name = member.name.encode(encoding="ascii", errors="replace") member_id = member.id joined = member.joined_at try: last_seen = table.get(doc_id=1)['last_seen'] except: last_seen = 'N/A' nitro = member.premium_since cleanup_file.write( f'{name}, "{member_id}", {joined}, {last_seen}, {nitro}\n') await ctx.send( content= f'Please see the console. There were {len(member_list)} user(s)', file=discord.File(fp=settings.CLEANUP_PATH, filename=settings.CLEANUP_PATH))
async def createqueue(self, ctx, *, string): user_ids = [] id_build = '' string = string + '-' #can't add the final id without a space so we append some other symbol that we also check for instead for char in string: if char == ' ' or char == '-': user_ids.append(id_build) id_build = '' else: id_build = id_build + char self.queue = '```\nQueue--\n' self.queue_position = 1 for user in user_ids: user = formatting.get_from_in(self.bot, ctx, "use", user) self.queue = self.queue + f'{self.queue_position}. {user.name}#{user.discriminator}\n' self.queue_position = self.queue_position + 1 self.queue = self.queue + '```' await ctx.message.delete() await ctx.send(f'{self.queue}')
async def welcome(self, ctx, *, member): member = formatting.get_from_in(self.bot, ctx, "mem", member) unverified_role = ctx.guild.get_role(settings.UNVERIFIED_ROLE_ID) verified_role = ctx.guild.get_role(settings.VERIFIED_ROLE_ID) await member.remove_roles(unverified_role, reason='user verified') await member.add_roles(verified_role, reason='user verified') try: await member.create_dm() await member.dm_channel.send(settings.WELCOME1) await member.dm_channel.send(settings.WELCOME2) except discord.Forbidden: bot_commands = self.bot.get_channel(settings.BOT_COMMANDS_ID) await bot_commands.send( content=f'{member.mention}\n{settings.WELCOME1}') await bot_commands.send( content=f'{member.mention}\n{settings.WELCOME2}') general = self.bot.get_channel(settings.GENERAL_ID) embed = discord.Embed( description=f'Welcome to the server {member.mention}!', color=0x64b4ff) embed.set_author(name=f'{member.name}#{member.discriminator}', icon_url=member.avatar_url) embed.timestamp = ctx.message.created_at await general.send(content='@here', embed=embed)
async def avatar(self, ctx, user): user = formatting.get_from_in(self.bot, ctx, "use", user) embed = discord.Embed(title='Avatar', color=0x64b4ff) embed.set_author(name=f'{user.name}#{user.discriminator}', icon_url=user.avatar_url) embed.set_image(url=user.avatar_url_as(static_format='png')) embed.timestamp = ctx.message.created_at await ctx.send(embed=embed)
async def say_dm(self, ctx, user, *, message): user = formatting.get_from_in(self.bot, ctx, "use", user) await user.create_dm() try: await user.dm_channel.send(message) except discord.Forbidden: await ctx.send('I cannot send messages to this user') emote = self.bot.get_emoji(790040369400250388) await ctx.message.add_reaction(emote)
async def unban(self, ctx, user): user = formatting.get_from_in(self.bot, ctx, "use", user) embed = discord.Embed(title='Server Unban', color=0x64ff64) embed.set_author(name=f'{user.name}#{user.discriminator}', icon_url=user.avatar_url) embed.add_field(name='Target', value=user.mention, inline=True) embed.add_field(name='Moderator', value=ctx.author.mention, inline=True) embed.timestamp = ctx.message.created_at await ctx.guild.unban(user) await ctx.send(embed=embed)
async def pardon(self, ctx, member): member = formatting.get_from_in(self.bot, ctx, 'mem', member) try: self.warnings.remove(member.id) except ValueError: #They gotta be in one of the arrays if we're at this point in the code. pass embed = discord.Embed( description=f'**{member.mention} has had their warnings removed**', color=0x64ff64) embed.set_author(name=f'{member.name}#{member.discriminator}', icon_url=member.avatar_url) embed.set_thumbnail(url=member.avatar_url) embed.timestamp = ctx.message.created_at await ctx.send(embed=embed)
async def howmany(self, ctx, role): role = formatting.get_from_in(self.bot, ctx, "rol", role) i = 0 for member in role.members: i = i + 1 embed = discord.Embed(title='How Many', color=0x64b4ff) embed.set_author(name=f'{ctx.author.name}#{ctx.author.discriminator}', icon_url=f'{ctx.author.avatar_url}') embed.add_field(name='Role', value=f'{role.mention}') embed.add_field(name='Users', value=f'{i}') embed.timestamp = ctx.message.created_at await ctx.send(embed=embed)
async def whoin(self, ctx, role): role = formatting.get_from_in(self.bot, ctx, "rol", role) members = '' for member in role.members: members = members + f'{member.name}#{member.discriminator}, ' embed = discord.Embed(title='Who In', color=0x64b4ff) embed.set_author(name=f'{ctx.author.name}#{ctx.author.discriminator}', icon_url=f'{ctx.author.avatar_url}') embed.add_field(name='Role', value=f'{role.mention}', inline=False) embed.add_field(name='Users', value=f'{members[0:-1]}') embed.timestamp = ctx.message.created_at try: await ctx.send(embed=embed) except discord.HTTPException: await ctx.send( f'**Error:** Too many users (or none) have this role to send the message through discord. Consider using ,cleanupgen instead' )
async def timeout(self, ctx, user, duration): member = formatting.get_from_in(self.bot, ctx, 'mem', user) verified = ctx.guild.get_role(settings.VERIFIED_ROLE_ID) staff = ctx.guild.get_role(settings.STAFF_ROLE_ID) if staff not in ctx.author.roles and verified in member.roles: await ctx.send( content= 'Interviewers cannot target Verified users with this command') else: role = ctx.guild.get_role(settings.MUTED_ROLE_ID) mute_embed = discord.Embed( description= f'**{member.mention} was timed out for {duration} minute(s)**', color=0xff6464) mute_embed.set_author(name=f'{member.name}#{member.discriminator}', icon_url=member.avatar_url) mute_embed.set_thumbnail(url=member.avatar_url) mute_embed.timestamp = ctx.message.created_at await member.add_roles(role, reason='timeout command: timing out user', atomic=True) await ctx.send(embed=mute_embed) await asyncio.sleep(60 * int(duration)) unmute_embed = discord.Embed( description=f'**{member.mention} is no longer timed out**', color=0x64ff64) unmute_embed.set_author( name=f'{member.name}#{member.discriminator}', icon_url=member.avatar_url) unmute_embed.set_thumbnail(url=member.avatar_url) unmute_embed.timestamp = ctx.message.created_at await member.remove_roles( role, reason='timeout command: removing timeout', atomic=True) await ctx.send(embed=unmute_embed)
async def emote(self, ctx, emote): try: emote = formatting.get_from_in(self.bot, ctx, "emo", emote) except TypeError: await ctx.send(content='Please select an emote from this server') return path = settings.DB_PATH + str(ctx.author.id) + '.json' db = TinyDB(path) table = db.table('boost') member = Query() try: emote_id = table.get(member.emote_id != None)['emote_id'] except TypeError: #make the emote portion in the DB db = TinyDB(path) member = Query() table = db.table('boost') try: table.upsert({'emote_id': emote.id}, member.emote_id != None) except AttributeError: await ctx.send( content='Please select an emote from this server') return formatting.fancify(path) emote_id = table.get(member.emote_id != None)['emote_id'] try: if emote_id != emote.id: table.upsert({'emote_id': emote.id}, member.emote_id != None) except AttributeError: await ctx.send(content='Please select an emote from this server') return await ctx.send(content=f'{emote}\nHere\'s your new auto-react emote!')
async def kick(self, ctx, member, *, reason=None): member = formatting.get_from_in(self.bot, ctx, "mem", member) verified = ctx.guild.get_role(settings.VERIFIED_ROLE_ID) staff = ctx.guild.get_role(settings.STAFF_ROLE_ID) if staff not in ctx.author.roles and verified in member.roles: await ctx.send( content= 'Interviewers cannot target Verified users with this command') else: embed = discord.Embed(title='Server Kick', color=0xff6464) embed.set_author(name=f'{member.name}#{member.discriminator}', icon_url=member.avatar_url) embed.add_field(name='Target', value=member.mention, inline=True) embed.add_field(name='Moderator', value=ctx.author.mention, inline=True) embed.timestamp = ctx.message.created_at try: await member.create_dm() await member.dm_channel.send( content= f'You have been kicked from {ctx.guild.name} with reason: __{reason}__' ) except discord.Forbidden: embed.add_field(value='Unable to DM target', inline=True) if reason: embed.add_field(name='Reason', value=reason, inline=False) await member.kick(reason=reason) else: embed.add_field(name='Reason', value='none', inline=False) await member.kick(reason='none') await member.kick(reason=reason) await ctx.send(embed=embed)
async def mute(self, ctx, member): member = formatting.get_from_in(self.bot, ctx, "mem", member) verified = ctx.guild.get_role(settings.VERIFIED_ROLE_ID) staff = ctx.guild.get_role(settings.STAFF_ROLE_ID) if staff not in ctx.author.roles and verified in member.roles: await ctx.send( content='You cannot target Verified users with your permissions' ) else: muted = ctx.guild.get_role(settings.MUTED_ROLE_ID) await member.add_roles(muted) embed = discord.Embed( description=f'**{member.mention} has been muted**', color=0xff6464) embed.set_author(name=f'{member.name}#{member.discriminator}', icon_url=member.avatar_url) embed.set_thumbnail(url=member.avatar_url) embed.timestamp = ctx.message.created_at await ctx.send(embed=embed)
async def addqueue(self, ctx, *, string): self.queue = self.queue[0:len(self.queue) - 3] user_ids = [] id_build = '' string = string + '-' for char in string: if char == ' ' or char == '-': user_ids.append(id_build) id_build = '' else: id_build = id_build + char for user in user_ids: user = formatting.get_from_in(self.bot, ctx, "use", user) self.queue = self.queue + f'{self.queue_position}. {user.name}#{user.discriminator}\n' self.queue_position = self.queue_position + 1 self.queue = self.queue + '```' await ctx.message.delete() await ctx.send(f'{self.queue}')
async def ship(self, ctx, target1, target2=None): member2 = formatting.get_from_in(self.bot, ctx, "mem", target1) #checking to see if author is implied as a target if target2: member1 = formatting.get_from_in(self.bot, ctx, "mem", target2) else: member1 = ctx.author num1 = member1.id % 1000 #command user num2 = member2.id % 1000 #target comp_num = (num1 + num2 - 40) % 101 bars_ref = comp_num // 10 bars_on = bars_ref * '<a:baron:725816473704202242>' bars_off = (10 - bars_ref) * '<a:baroff:725816609176027635>' status = None #this seems sloppy, I think there's a better way to do this. Fixed by using if elif. while True: if comp_num == 100: status = 'You\'re made for eachother <a:true_love:725827494585827481>' if comp_num >= 90: status = 'True love :heart_eyes:' break if comp_num >= 80: status = 'Wew is it hot in here? :fire:' break if comp_num >= 70: status = 'Just 2 gals being pals :wink:' break if comp_num == 69: status = 'Nice <a:okhandspin:644684375287660564>' break if comp_num >= 60: status = 'Budding potential :heart:' break if comp_num >= 50: status = 'Besties :smile:' break if comp_num >= 40: status = 'Lets just be friends :eyes:' break if comp_num >= 30: status = 'It\'s not you it\'s me... :eyes:' break if comp_num >= 20: status = 'Prepare to get ghosted :ghost:' break if comp_num >= 10: status = 'Bitter rivals :angry:' break if comp_num >= 1: status = 'Sworn enemies :right_facing_fist::left_facing_fist: ' break else: status = 'She\'s practically your sister! :nauseated_face:' break embed = discord.Embed( description=f'**{comp_num}%** {bars_on}{bars_off} {status}', color=0xe484dc) await ctx.message.delete() await ctx.send( content= f'{member1.mention} and {member2.mention} sitting in a tree...', embed=embed)
async def rps(self, ctx, state, *, selection=None): if state.lower() == 'start' and self.rps_state == 0: self.rps2 = formatting.get_from_in(self.bot, ctx, "mem", selection) self.rps1 = ctx.message.author self.rps_state = 1 self.rps_channel = ctx.message.channel await ctx.send( content= 'Please send your choice to my dm using: \n> **,rps choose rock** **,rps choose paper** **,rps choose scissors**' ) for i in range(60): if self.rps_state == 0: return await asyncio.sleep(1) await self.rps_channel.send( content='No response, game has timed out') self.rps_state = 0 self.rps1 = None self.rps2 = None self.input1 = None self.input2 = None self.rps_channel = None if state.lower() == 'start' and self.rps_state == 1: await self.rps_channel.send( content= 'There\'s an ongoing game, please wait for them to finish!') if state.lower() == 'choose' and ctx.guild is None: if ctx.author == self.rps1: self.input1 = selection.lower() await ctx.send(content='Choice received') await self.rps_channel.send( f'Received from **{self.rps1.name}#{self.rps1.discriminator}**' ) if ctx.author == self.rps2: self.input2 = selection.lower() await ctx.send(content='Choice recieved') await self.rps_channel.send( f'Received from **{self.rps2.name}#{self.rps2.discriminator}**' ) if self.input1 != None and self.input2 != None: #I'm not positive how to do this other than comparing the if statements. Maybe assigning them to numbers... but the hierachy makes a circle so there's no value comparison that works winner = None if self.input1 == self.input2: winner = None elif self.input1 == 'rock' and self.input2 == 'paper': winner = self.rps2 elif self.input1 == 'rock' and self.input2 == 'scissors': winner = self.rps1 elif self.input1 == 'paper' and self.input2 == 'rock': winner = self.rps1 elif self.input1 == 'paper' and self.input2 == 'scissors': winner = self.rps2 elif self.input1 == 'scissors' and self.input2 == 'rock': winner = self.rps2 elif self.input1 == 'scissors' and self.input2 == 'paper': winner = self.rps1 else: await self.rps_channel.send( content= 'Someone gave an incorrect input. Please start a new game.' ) self.rps_state = 0 self.rps1 = None self.rps2 = None self.input1 = None self.input2 = None self.rps_channel = None return try: embed = discord.Embed( title='Rock! Paper! Scissors!', description=f'**{winner.mention} is the winner!**', color=0x64b4ff) except AttributeError: embed = discord.Embed(title='Rock! Paper! Scissors!', description=f'', color=0x64b4ff) if randint(1, 100) == 1 and winner is not None: loser = None if winner is self.rps1: loser = self.rps2 else: loser = self.rps1 embed.description = f'**{winner.mention} would have won but they cheated so __{loser.mention} wins!__**' if winner is None: embed.set_thumbnail(url='https://i.imgur.com/TIGi71f.png' ) #thumbnail for no winner embed.description = '**It\'s a tie!**' else: embed.set_thumbnail(url='https://i.imgur.com/GWKFyR9.png' ) #thumbnail for anyone winning embed.add_field(name=f'{self.rps1.name}#{self.rps1.discriminator}', value=f'{self.input1}', inline=False) embed.add_field(name=f'{self.rps2.name}#{self.rps2.discriminator}', value=f'{self.input2}', inline=False) embed.timestamp = ctx.message.created_at await self.rps_channel.send(embed=embed) self.rps_state = 0 self.rps1 = None self.rps2 = None self.input1 = None self.input2 = None self.rps_channel = None
async def test2(self, ctx): await ctx.send(formatting.get_from_in(self.bot, ctx, "use", ctx.author.id).name)
async def cleanuproles_message(self, ctx, channel, message): channel = formatting.get_from_in(self.bot, ctx, "cha", channel) await Admin.cleanUpBlock(self, ctx, message, channel)
async def cleanuproles_channel(self, ctx, channel, num): channel = formatting.get_from_in(self.bot, ctx, "cha", channel) async for message in channel.history(limit=int(num)): await Admin.cleanUpBlock(self, ctx, message.id, channel)
async def memberinfo(self, ctx, member): member = formatting.get_from_in(self.bot, ctx, "mem", member) now = datetime.utcnow() db = TinyDB(settings.DB_PATH + str(member.id) + '.json') table = db.table('information') last_seen = table.get(Query().last_seen != None)['last_seen'] last_seen = datetime.strptime(last_seen, "%Y-%m-%d") time_since_message = formatting.date_difference( last_seen, datetime.today()) roles = '' time_since_created = formatting.datetime_difference( member.created_at, now) time_since_joined = formatting.datetime_difference( member.joined_at, now) try: time_since_nitro = formatting.datetime_difference( member.premium_since, now) except TypeError: time_since_nitro = "None" for role in member.roles: roles = roles + f'{role.mention}, ' roles = roles[:-2] embed = discord.Embed(title='User info', description=member.mention, color=0x64b4ff) embed.set_author(name=f'{member.name}#{member.discriminator}', icon_url=member.avatar_url) embed.set_thumbnail(url=member.avatar_url) embed.add_field(name='User', value=f'**{member.name}#{member.discriminator}**', inline=True) embed.add_field(name='Nickname', value=member.display_name, inline=True) embed.add_field(name='ID', value=member.id, inline=True) try: i = str(member.activity.type).index('.') embed.add_field( name='Status', value= f'{str(member.activity.type)[i+1:]} **--** {member.activity.name}' ) except AttributeError: embed.add_field(name='Status', value='None') embed.add_field( name='Created', value=f'**__{time_since_created}__** - {member.created_at}', inline=False) embed.add_field( name='Joined', value=f'**__{time_since_joined}__** - {member.joined_at}', inline=False) embed.add_field( name='Last seen', value=f'**__{time_since_message}__** - {last_seen.date()}', inline=False) embed.add_field( name='Nitro', value=f'**__{time_since_nitro}__** - {member.premium_since}', inline=False) embed.add_field(name='Roles', value=roles, inline=False) await ctx.send(embed=embed)
async def battle(self, ctx, target1, target0=None): fighter1 = fighter_util.Fighter( formatting.get_from_in(self.bot, ctx, "mem", target1), 1) if target0: fighter0 = fighter_util.Fighter( formatting.get_from_in(self.bot, ctx, "mem", target0), 0) else: fighter0 = fighter_util.Fighter(ctx.author, 0) fighters = [fighter0, fighter1] users_set = {fighter0.user, fighter1.user} for fighter in fighters: if fighter.user.bot: choices = list(battle_util.weapon_choice.keys()) seed = randint(0, len(choices) - 1) fighter.set_weapon(choices[seed]) embed = discord.Embed( description=f'{fighters[0].user.name} 🆚 {fighters[1].user.name}', color=0x64b4ff) embed.add_field(name=fighters[0].name, value='?', inline=True) embed.add_field(name=fighters[1].name, value='?', inline=True) embed.add_field( name='Choose your weapon', value='If your weapon is not selected on reaction, please re-react', inline=False) message = await ctx.send(embed=embed) for emote in battle_util.weapon_choice.keys(): await message.add_reaction(emote) reaction_list = set() waiting = True def check(reaction, user): if reaction.message == message: reaction_list.add(user) for fighter in fighters: if user == fighter.user and not fighter.user.bot: fighter.set_weapon(reaction.emoji) #Something has to be returned or else it just hangs return True while not fighters[0].weapon or not fighters[1].weapon: await self.bot.wait_for('reaction_add', check=check, timeout=20.0) done = await self.bot.wait_for('reaction_add', check=check, timeout=20.0) if done is None: await ctx.send( '__**Error:**__\nThe pending game has timed out!') for fighter in fighters: try: embed.set_field_at( index=fighter.position, name=embed.fields[fighter.position].name, value=fighter.weapon.icon) except: embed.set_field_at( index=fighter.position, name=embed.fields[fighter.position].name, value='?') await message.edit(embed=embed) embed.clear_fields() embed.add_field( name=f'{fighters[0].name} - {fighters[0].weapon.icon}', value=f'{fighters[0].hp}/{fighters[0].hp_max} {fighters[0].heart}', inline=True) embed.add_field( name=f'{fighters[1].name} - {fighters[1].weapon.icon}', value=f'{fighters[1].hp}/{fighters[1].hp_max} {fighters[1].heart}', inline=True) await message.edit(embed=embed) attacker = randint(0, 1) description = '' turns = 2 while fighters[0].hp > 0 and fighters[1].hp > 0: attacked = attacker attacker = (attacked + 1) % 2 seed = randint(0, 1000) data = { 'seed': seed, 'turn': turns // 2, 'attacker': fighters[attacker], 'attacked': fighters[attacked], 'embed': embed, } results = fighters[attacker].attack(data) text = results.get('text').format(attacker=fighters[attacker].name, attacked=fighters[attacked].name) text = '{heart} '.format(heart=fighters[attacker].circle) + text description = battle_util.text_handler(self, text, description) embed.description = description field_name = embed.fields[fighters[attacked].position].name field_value = f'{max(0, fighters[attacked].hp)}/100 {fighters[attacked].heart}' embed.set_field_at(index=attacked, name=field_name, value=field_value) embed.color = fighters[attacker].color await message.edit(embed=embed) await asyncio.sleep(2) turns += 1 if fighters[0].hp < fighters[1].hp: winner = 1 else: winner = 0 text = f'👑 __**{fighters[winner].name}**__ has deafeated __{fighters[(winner + 1) % 2].name}__' embed.description = battle_util.text_handler(self, text, description) embed.add_field(name='Winner', value=fighters[winner].user.mention, inline=False) await message.edit(embed=embed)