示例#1
0
async def ud(ctx, *, term):
    clients = UrbanClient()
    defs = clients.get_definition(term)
    i = -1
    j = -1
    temp = 0
    try:
        for d in defs:
            i += 1
            if d.upvotes > temp:
                j = i
                temp = d.upvotes

        i = 0
        for d in defs:
            if i == j:
                embed = discord.Embed(colour=discord.Colour.green())
                embed.set_footer(text=f"{d.upvotes} upvotes")
                # embed.set_author(name=f"{term}")
                embed.add_field(name=f"{term.upper()}",
                                value=f"{d.definition}",
                                inline=True)
                await ctx.send(embed=embed)
                return
            i = i + 1

        # error handling
        embed = discord.Embed(colour=discord.Colour.green())
        embed.set_footer(
            text=f"Something went wrong and I am extremely sorry\n┬─┬ ノ( ゜-゜ノ)"
        )
        embed.add_field(
            name=f"I DON'T F*****G KNOW!",
            value=f"Go google it yourself you lazy piece of bruh\n(╯°□°)╯︵ ┻━┻",
            inline=True,
        )
        await ctx.send(embed=embed)

    except:
        embed = discord.Embed(colour=discord.Colour.green())
        embed.set_footer(
            text=f"Something went wrong and I am extremely sorry\n┬─┬ ノ( ゜-゜ノ)"
        )
        embed.add_field(
            name=f"I DON'T F*****G KNOW!",
            value=f"Go google it yourself you lazy piece of bruh\n(╯°□°)╯︵ ┻━┻",
            inline=True,
        )
        await ctx.send(embed=embed)
示例#2
0
 def process(self, user_id: str, payload: Optional[str]) -> None:
     if not payload:
         self.__bot_controller.chat('Please provide a search query')
         return
     client = UrbanClient()
     dfns: List[UrbanDefinition] = cast(List[UrbanDefinition],
                                        client.get_definition(payload))
     if not dfns:
         self.__bot_controller.chat('No definition found for "%s"' %
                                    payload)
         return
     dfn = dfns[0]
     self.__bot_controller.chat([
         '%s: %s' % (dfn.word, dfn.definition), '', 'Example:', dfn.example
     ])
示例#3
0
async def urban(ctx, *, arg=None):

    if arg == None:
        embederror = discord.Embed()
        embederror.title = ":x: Invalid argument"
        embederror.description = "**Todo.urban [search]**"
        embederror.color = discord.Color.red()
        return await ctx.send(embed=embederror)
    try:
        urban = UrbanClient()

        defs = urban.get_definition(arg)

        def0 = defs[0]

        def1 = defs[1]

        def2 = defs[2]

        def3 = defs[3]

        def4 = defs[4]

        embeds = [
            discord.Embed(title=f"Urban Dictionary - {arg}",
                          description=def0.definition,
                          color=discord.Color.green()),
            discord.Embed(title=f"Urban Dictionary - {arg}",
                          description=def1.definition,
                          color=discord.Color.green()),
            discord.Embed(title=f"Urban Dictionary - {arg}",
                          description=def2.definition,
                          color=discord.Color.green()),
            discord.Embed(title=f"Urban Dictionary - {arg}",
                          description=def3.definition,
                          color=discord.Color.green()),
            discord.Embed(title=f"Urban Dictionary - {arg}",
                          description=def4.definition,
                          color=discord.Color.green())
        ]

        paginator = BotEmbedPaginator(ctx, embeds)

        await paginator.run()

    except Exception:

        await ctx.send(f"Can't find **{arg}** in Urban Dictionary.")
示例#4
0
class Utilities(commands.Cog):
	def __init__(self, bot: commands.Bot):
		self.bot = bot
		self.ytclient = bot.ytclient
		self.logchan = bot.logchan
		self.uclient = UrbanClient()
		self.animelistsync.start()
		self.rsscheck.start()

	@commands.Cog.listener()
	async def on_message_edit(self, before: discord.Message, after: discord.Message):
		if before.author.bot or before.content == after.content or before.guild.id != 569845300244774922:
			return
		channel = self.bot.get_channel(self.logchan)
		e = discord.Embed(title=before.author.name, color=0xff0000)
		e.add_field(name="Edited", value=f'"{before.content}" to "{after.content}"')
		await channel.send(embed=e)
	
	@commands.Cog.listener()
	async def on_message(self, message: discord.Message):
		if message.author.bot or message.content.startswith('?'):
			return
		if 'https://www.reddit.com/' in message.content and '/comments/' in message.content:
			link = ''
			for word in message.content.split():
				if word.startswith('https://www.reddit.com/'):
					link = word.split('?')[0].strip('/')
					break
			resp = requests.get(link+'.json', headers={'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}).json()
			if resp[0]['data']['children'][0]['data']['over_18'] and not message.channel.is_nsfw():
				return
			e = discord.Embed(title=resp[0]['data']['children'][0]['data']['title'], description=message.content, url=f"https://www.reddit.com{resp[0]['data']['children'][0]['data']['permalink']}")
			e.add_field(name='Upvotes',value=resp[0]['data']['children'][0]['data']['ups'])
			e.add_field(name='Author', value=resp[0]['data']['children'][0]['data']['author'])
			medialink = resp[0]['data']['children'][0]['data']['url_overridden_by_dest']
			vlink = None
			mediameta :dict = resp[0]['data']['children'][0]['data'].get('media_metadata')
			if medialink.startswith('https://i'):
				e.set_image(url=medialink)
			elif medialink.startswith('https://v'):
				vlink = resp[0]['data']['children'][0]['data']['secure_media']['reddit_video']['fallback_url']
			elif mediameta is not None:
				imgid = choice(list(mediameta))
				imgformat = mediameta[imgid]['m'].split('/')[-1]
				e.set_image(url=f'https://i.redd.it/{imgid}.{imgformat}')
				e.description+="\n*More images in the link*"
			hooks = await message.channel.webhooks()
			if hooks == []:
				hook = await message.channel.create_webhook(name='generic hook')
			else:
				hook = hooks[0]
			files = list()
			if message.attachments == []:
				files = None
			else:
				for file in message.attachments:
					await file.save(file.filename)
					files.append(discord.File(file.filename))
			await hook.send(embed=e, username=message.author.display_name, avatar_url=message.author.avatar_url, files=files)
			if vlink is not None:
				await hook.send(content=vlink, username=message.author.display_name, avatar_url=message.author.avatar_url)
			await message.delete()

	@tasks.loop(seconds=15.0)
	async def rsscheck(self):
		tobefedsoup = requests.get("https://nyaa.si/?page=rss").text
		feed = bs(tobefedsoup, features="xml")
		for entry in feed.find_all("item"):
			for anime in self.animelist:
				if entry.guid.text == self.guid:
					return
				regexshit = re.search(anime.lower().replace(" ", "[\w\s]+"), entry.title.text.lower())
				if regexshit is not None and entry.find("nyaa:categoryId").text in ("1_2", "3_1", "4_1"):
					t = discord.utils.escape_markdown(entry.title.text)
					e = discord.Embed(title=t, description=entry.find('nyaa:size').text)
					e.add_field(name="Jump", value=f"[Go to page!]({entry.guid.text})")
					date = dateparser.parse(entry.pubDate.text)
					e.timestamp = date
					e.set_footer(text=entry.find("nyaa:category").text)
					e.set_author(name="nyaa.si", url="https://nyaa.si")
					await self.rsschan.send(embed=e)
					self.guid = feed.find_all("item")[0].guid.text
					break

	@rsscheck.before_loop
	async def beforerss(self):
		await self.bot.wait_until_ready()
		self.rsschan: discord.TextChannel = self.bot.get_channel(802132987138801705)
		self.guid = None

	@tasks.loop(seconds=60.0)
	async def animelistsync(self):
		conn = psycopg2.connect(os.environ['DATABASE_URL'])
		cur = conn.cursor()
		cur.execute("SELECT * FROM animelist")
		self.animelist = [_[0] for _ in cur.fetchall()]

	@commands.command(aliases=['nword','nw'])
	async def nwordcount(self, ctx: commands.Context):
		'''counts your racism'''
		i=1
		n1counter = 0
		n2counter = 0
		keyword1 = 'NIGGER'
		keyword2 = 'N***A'
		mess = "stalking."
		mes = await ctx.send(content='stalking')
		while i <5: 
			await mes.edit(content=mess)
			mess = mess + "."
			await asyncio.sleep(1)
			i += 1
		async with ctx.channel.typing():
			async for message in ctx.channel.history(limit=5000):
				if message.author.id == ctx.message.author.id:
					message_text = message.content.upper()
					if keyword1 in message_text:
						n1counter += 1
					if keyword2 in message_text:
						n2counter += 1
		await mes.edit(content='Done!')
		await ctx.send(content='According to my stalking, %s have said the soft n-word %d times and the hard n-word %d times in the last 5000 messages' % (ctx.author.mention, n2counter, n1counter))

	@commands.command()
	async def dm(self, ctx: commands.Context, user: discord.User, *, msg: str):
		'''dms a person i guess'''
		await ctx.message.delete()
		await user.send(content=msg)
	
	@commands.command()
	async def say(self, ctx: commands.Context, *, msg: str):
		'''yes'''
		await ctx.message.delete()
		await ctx.send(content=msg, allowed_mentions=discord.AllowedMentions.none())
	
	@commands.command()
	async def tts(self, ctx: commands.Context, *, msg: str):
		'''yesser'''
		msga = await ctx.send(content=msg, tts=True)
		await msga.delete()
		await ctx.message.delete()
	
	@commands.command()
	async def calc(self, ctx: commands.Context, *, inp: str):
		'''It's a calculator'''
		result = eval(inp)
		await ctx.send(content=result)
	
	@commands.command(aliases=['yt'])
	async def youtube(self, ctx: commands.Context, *, words: str):
		'''Searches youtube vids'''
		results = self.ytclient.search_by_keywords(q=words,search_type='video',limit=1,count=1)
		link = f'https://youtu.be/{results.items[0].id.videoId}'
		e = await ctx.send(content=link)

	@commands.command()
	async def yeet(self, ctx: commands.Context, *emotes: discord.PartialEmoji):
		'''Posts the link to a custom emote'''
		for emote in emotes:
			await ctx.send(content=emote.url)
	
	@commands.command()
	async def pick(self, ctx: commands.Context, *arg: str):
		'''Chooses randomly from a list'''
		await ctx.send(content=choice(arg))

	@commands.command()
	async def mp3(self, ctx: commands.Context, langu: str, *, words: str):
		'''Generates an mp3 file of whatever you type'''
		if langu not in lang:
			words = langu + ' ' + words
			langu = 'en'
		tts = gTTS(words, lang=langu)
		tts.save('kiyo.mp3')
		await ctx.send(file=discord.File('kiyo.mp3'))
	
	@commands.command(aliases=['urbandictionary', 'ud'])
	async def urban(self, ctx: commands.Context, *, words: str):
		'''searches the urbandictionary'''
		try:
			udthing = self.uclient.get_definition(words)[0]
			e = discord.Embed(title=udthing.word, description=udthing.definition, color=0x441400)
			e.add_field(name='Example:', value=udthing.example)
			await ctx.send(embed=e)
		except IndexError:
			await ctx.send(content="Word doesn't exist.")
		except discord.HTTPException:
			await ctx.send(content='The definition is a f*****g essay.')

	@commands.command()
	async def ytdl(self, ctx: commands.Context, link: str, *, rest: str = None):
		'''ytdl, but has max limit of 8MB'''
		if not link.startswith('http'):
			link = 'ytsearch:' + link + ' ' + rest
		async with ctx.channel.typing():
			with youtube_dl.YoutubeDL({'format': 'mp4', 'outtmpl': 'vid.%(ext)s'}) as ydl:
				ydl.download([link])
			try:
				await ctx.send(file=discord.File(f'vid.mp4'))
			except discord.HTTPException:
				await ctx.send(content="File too large")
			finally:
				os.remove(f'vid.mp4')
	
	@commands.guild_only()
	@commands.command()
	async def clone(self, ctx: commands.Context, user: discord.Member, *, message: str):
		'''Copies people or sumn idk'''
		name = user.nick
		if name is None:
			name = user.name
		hook = await ctx.channel.create_webhook(name=name)
		await hook.send(content=message, username=name, avatar_url=user.avatar_url, allowed_mentions=discord.AllowedMentions(everyone=False, roles=False))
		await ctx.message.delete()
		await hook.delete()

	@commands.command()
	async def embed(self, ctx: commands.Context, *, words: str):
		'''Embeds whatever you say'''
		e = discord.Embed(title=ctx.author.name, description=words, color=0x523523)
		e.set_author(name=ctx.author.display_name, icon_url=ctx.author.avatar_url)
		await ctx.send(embed=e)
	
	@commands.command()
	async def poll(self, ctx: commands.Context, question: str, *choices: str):
		'''democracy'''
		if len(choices) > 9:
			await ctx.send(content="Choices can't be more than 9")
			return
		x = 0
		e = discord.Embed(title=question, color=0x2f3136)
		e.set_author(name=f'asked by {ctx.author.display_name}', icon_url=ctx.author.avatar_url)
		for choice in choices:
			x = x + 1
			e.add_field(name='Choice {}\N{variation selector-16}\N{combining enclosing keycap}'.format(x), value=choice)
		message = await ctx.send(embed=e)
		x = 0
		for choice in choices:
			x = x + 1
			await message.add_reaction('{}\N{variation selector-16}\N{combining enclosing keycap}'.format(x))

	def permcheck(ctx: commands.Context):
		return ctx.author.id in (230935510439297024, 550076298937237544)

	@commands.group(invoke_without_command=True)
	async def rss(self, ctx: commands.Context):
		'''shows help for rss functions'''
		if ctx.invoked_subcommand is not None:
			return
		await ctx.send_help(ctx.command)
	
	@rss.command()
	@commands.check(permcheck)
	async def add(self, ctx: commands.Context, *, title: str):
		'''adds a title to rss nyaa feed'''
		if title in self.animelist:
			return await ctx.send(content="Title already tracked")
		conn = psycopg2.connect(os.environ['DATABASE_URL'])
		cur = conn.cursor()
		cur.execute("INSERT INTO animelist(title) VALUES(%s);", (title,))
		cur.close()
		conn.commit()
		conn.close()
		await ctx.send(content=f"Added `{title}` into the rss filter\n(Changes may take up to a minute to take place)")

	@rss.command()
	@commands.check(permcheck)
	async def remove(self, ctx: commands.Context, *, title: str):
		'''removes a title from rss nyaa feed'''
		conn = psycopg2.connect(os.environ['DATABASE_URL'])
		cur = conn.cursor()
		cur.execute("DELETE FROM animelist WHERE title = %s;", (title,))
		delrows = cur.rowcount
		cur.close()
		conn.commit()
		conn.close()
		await ctx.send(content=f"{delrows} deleted entries\n(Changes may take up to a minute to take place)")

	@rss.command(name="list")
	async def tracklist(self, ctx: commands.Context):
		e = discord.Embed(title="nyaa.si rss filter")
		e.description = ""
		for i, anime in enumerate(self.animelist):
			e.description+=f'{i+1}. {anime}\n'
		await ctx.send(embed=e)
示例#5
0
class UrbanDicto(commands.Cog):
    """
    Urban dictionary lookup script. Use with command !ud <word or phrase>
    """

    uClient = None

    def __init__(self, bot):
        """
        Cog initialization

        Args:
            bot (discord.ext.commands.Bot): Instance of the bot

        """
        self.bot = bot
        Config().load_config()
        self.uClient = UrbanClient()

    # Events
    @commands.Cog.listener()
    async def on_message(self, message):
        """on_message executes whenever a message is posted"""
        if message.content.startswith("!ud"):
            msg_parts = message.content.split(" ", 1)
            if len(msg_parts) > 1:
                await self.lookup_and_send(message.channel,
                                           msg_parts[1].strip())

    async def lookup_and_send(self, channel, usr_input):
        defs = self.uClient.get_definition(usr_input)
        if len(defs) > 0:
            single_def = None
            for d in defs:
                # pick an object that has less than N symbols in text
                if (len(d.definition) <= 300) and (len(d.example) <= 300):
                    single_def = d
                    break
            if single_def is not None:
                single_def.definition = single_def.definition.strip()
                single_def.definition = re.sub("[\[\]]", "",
                                               single_def.definition)
                single_def.example = single_def.example.strip()
                single_def.example = re.sub("[\[\]]", "", single_def.example)
                single_def.example = re.sub("\r\n", "\n", single_def.example)
                single_def.example = re.sub("\n+", "\n> ", single_def.example)
                if single_def.example != "":
                    await channel.send(
                        f"**{single_def.word}**:\n{single_def.definition}\n> {single_def.example}\n\n"
                        f":arrow_up:: {single_def.upvotes}  :arrow_down:: {single_def.downvotes}"
                    )
                else:
                    await channel.send(
                        f"**{single_def.word}**:\n{single_def.definition}\n\n:arrow_up:: {single_def.upvotes}"
                        f"  :arrow_down:: {single_def.downvotes}")
            else:
                await channel.send("No definition found for **%s**" %
                                   (usr_input, ))
        else:
            await channel.send("No definition found for **%s**" % (usr_input, )
                               )
示例#6
0
class Utilities(commands.Cog):
	def __init__(self, bot: commands.Bot):
		self.bot = bot
		self.logchan = bot.logchan
		self.uclient = UrbanClient()
		self.trans = googletrans.Translator()
		#self.pixapi = pixivpy3.AppPixivAPI()
		#self.pixapi.login(os.environ['PIXIV_USER'], os.environ['PIXIV_PASS'])
		self.animelistsync.start()
		self.rsscheck.start()

	@commands.Cog.listener()
	async def on_message_edit(self, before: discord.Message, after: discord.Message):
		if before.author.bot or before.content == after.content or before.guild.id != 569845300244774922:
			return
		channel = self.bot.get_channel(self.logchan)
		e = discord.Embed(title=before.author.name, color=0xff0000)
		e.add_field(name="Edited", value=f'"{before.content}" to "{after.content}"')
		await channel.send(embed=e)
	
	@commands.Cog.listener()
	async def on_message(self, message: discord.Message):
		if message.author.bot or message.content.startswith('?'):
			return
		if 'https://www.reddit.com/' in message.content and '/comments/' in message.content:
			await self.redditConverter(message)
		#if "https://" in message.content and "pixiv" in message.content and "artworks" in message.content:
		#	await self.pixivConverter(message)
		
	async def redditConverter(self, message: discord.Message):
			link = ''
			for word in message.content.split():
				if word.startswith('https://www.reddit.com/'):
					link = word.split('?')[0].strip('/')
					break
			resp = requests.get(link+'.json', headers={'user-agent': 'kiyohime:kiyo-api:v1.9.0 (by medjed#8988)'}).json()
			data = resp[0]['data']['children'][0]['data']
			if data['over_18'] and not message.channel.is_nsfw():
				return
			e = discord.Embed(title=data['title'], description=message.content, url=f"https://www.reddit.com{data['permalink']}")
			e.add_field(name='Upvotes',value=data['ups'])
			e.add_field(name='Author', value=data['author'])
			medialink = data['url_overridden_by_dest']
			vlink = None
			mediameta :dict = data.get('media_metadata')
			if medialink.startswith('https://i'):
				e.set_image(url=medialink)
			elif medialink.startswith('https://v'):
				vlink = data['secure_media']['reddit_video']['fallback_url']
			elif mediameta is not None:
				imgid = data['gallery_data']['items'][0]['media_id']
				imgformat = mediameta[imgid]['m'].split('/')[-1]
				e.set_image(url=f'https://i.redd.it/{imgid}.{imgformat}')
				e.description+="\n*More images in the link*"
			hooks = await message.channel.webhooks()
			for hook in hooks:
				if hook.token:
					break
				hook = None
			if not hook:
				hook = await message.channel.create_webhook(name='generic hook')
			files = list()
			if message.attachments == []:
				files = None
			else:
				for file in message.attachments:
					await file.save(file.filename)
					files.append(discord.File(file.filename))
			await self.redditSender(hook, e, message.author, message, files, data, vlink)

	async def redditSender(self, hook: discord.Webhook, embed: discord.Embed, author: discord.Member, message: discord.Message, files: list, reddata: dict = None, video: str = None):
		hookmsg: discord.WebhookMessage = await hook.send(embed=embed, username=author.display_name, avatar_url=author.avatar_url, files=files, wait=True)
		def r_check(r, u):
			return r.message.id == hookmsg.id and not u.bot
		await hookmsg.add_reaction("🚮")
		await message.delete()
		if video:
			vidmsg = await hook.send(content=video, username=author.display_name, avatar_url=author.avatar_url, wait=True)
		if reddata.get("media_metadata"):
			gallery_order = reddata['gallery_data']['items']
			metadata = reddata['media_metadata']
			await hookmsg.add_reaction("◀")
			await hookmsg.add_reaction("▶")
			await hookmsg.add_reaction("❌")
			embed = hookmsg.embeds[0]
			embed.set_footer(text=f'1/{len(gallery_order)}')
			await hookmsg.edit(embed=embed)
		not_timeout = True
		while not_timeout:
			add = self.bot.wait_for('reaction_add', check=r_check)
			less = self.bot.wait_for('reaction_remove', check=r_check)
			done, pending = await asyncio.wait([add, less], timeout=600.0, return_when=asyncio.FIRST_COMPLETED)
			for p in pending:
				p.cancel()
			if done:
				response, user = done.pop().result()
				if reddata.get("media_metadata"):
					embed = response.message.embeds[0]
					image_url: str = embed.image.url
					image_id = image_url.strip('/').split('/')[-1].split('.')[0]
					for i, item in enumerate(gallery_order):
						if image_id == item['media_id']:
							current_index = i
							break
				if response.emoji == "◀" and reddata.get("media_metadata"):
					i = current_index - 1
					if i == -1:
						i = len(gallery_order) - 1
				elif response.emoji == "▶" and reddata.get("media_metadata"):
					i = current_index + 1
					if i == len(metadata):
						i = 0
				elif response.emoji == "🚮" and user.id == author.id:
					if video:
						await vidmsg.delete()
					return await hookmsg.delete()
				elif response.emoji == "❌" and reddata.get("media_metadata"):
					break
				else:
					continue
				new_image = gallery_order[i]['media_id']
				new_format = metadata[new_image]['m'].split('/')[-1]
				embed.set_image(url=f'https://i.redd.it/{new_image}.{new_format}')
				embed.set_footer(text=f'{i+1}/{len(gallery_order)}')
				await hookmsg.edit(embed=embed)
				continue
			else:
				break
		await hookmsg.clear_reactions()

	async def pixivConverter(self, message: discord.Message):
		art_id = int()
		for word in message.content.split():
			if word.startswith("https://") and "pixiv" in word and "artworks" in word:
				art_id = int(word.split("/")[-1])
				break
		illu = self.pixapi.illust_detail(art_id)
		e = discord.Embed(title=illu.title, description=message.content)
		e.set_author(name=illu['illust']['user']['name'])
		ext = os.path.splitext(illu['illust']['image_urls']['large'])[1]
		self.pixapi.download(illu['illust']['image_urls']['large'], name=f"piximg{ext}")
		e.set_image(url=f"attachment://piximg{ext}")
		hooks = await message.channel.webhooks()
		for hook in hooks:
			if hook.token:
				break
			hook = None
		if not hook:
			hook = await message.channel.create_webhook(name='generic hook')
		await hook.send(embed=e, file=discord.File(f"piximg{ext}"), username=message.author.display_name, avatar_url=message.author.avatar_url)
		files = list()
		if message.attachments == []:
			files = None
		else:
			for file in message.attachments:
				await file.save(file.filename)
				files.append(discord.File(file.filename))
			await hook.send(files=files)
		await message.delete()
		os.remove(f"piximg{ext}")

	@tasks.loop(seconds=15.0)
	async def rsscheck(self):
		tobefedsoup = requests.get("https://nyaa.si/?page=rss").text
		feed = bs(tobefedsoup, features="xml")
		for entry in feed.find_all("item"):
			for anime in self.animelist:
				if entry.guid.text == self.guid:
					return
				regexshit = re.search(anime.lower().replace(" ", "[\w\s]+"), entry.title.text.lower())
				if regexshit is not None and entry.find("nyaa:categoryId").text in ("1_2", "3_1", "4_1"):
					t = discord.utils.escape_markdown(entry.title.text)
					e = discord.Embed(title=t, description=entry.find('nyaa:size').text)
					e.add_field(name="Jump", value=f"[Go to page!]({entry.guid.text})")
					date = dateparser.parse(entry.pubDate.text)
					e.timestamp = date
					e.set_footer(text=entry.find("nyaa:category").text)
					e.set_author(name="nyaa.si", url="https://nyaa.si")
					await self.rsschan.send(embed=e)
					self.guid = feed.find_all("item")[0].guid.text
					break

	@rsscheck.before_loop
	async def beforerss(self):
		await self.bot.wait_until_ready()
		self.rsschan: discord.TextChannel = self.bot.get_channel(802132987138801705)
		self.guid = None

	@tasks.loop(seconds=60.0)
	async def animelistsync(self):
		conn = psycopg2.connect(os.environ['DATABASE_URL'])
		cur = conn.cursor()
		cur.execute("SELECT * FROM animelist")
		self.animelist = [_[0] for _ in cur.fetchall()]
		cur.close()
		conn.commit()
		conn.close()

	@commands.command(aliases=['nword','nw'])
	async def nwordcount(self, ctx: commands.Context):
		'''counts your racism'''
		i=1
		n1counter = 0
		n2counter = 0
		keyword1 = 'NIGGER'
		keyword2 = 'N***A'
		mess = "stalking."
		mes = await ctx.send(content='stalking')
		while i <5: 
			await mes.edit(content=mess)
			mess = mess + "."
			await asyncio.sleep(1)
			i += 1
		async with ctx.channel.typing():
			async for message in ctx.channel.history(limit=5000):
				if message.author.id == ctx.message.author.id:
					message_text = message.content.upper()
					if keyword1 in message_text:
						n1counter += 1
					if keyword2 in message_text:
						n2counter += 1
		await mes.edit(content='Done!')
		await ctx.send(content='According to my stalking, %s have said the soft n-word %d times and the hard n-word %d times in the last 5000 messages' % (ctx.author.mention, n2counter, n1counter))

	@commands.command()
	async def dm(self, ctx: commands.Context, user: discord.User, *, msg: str):
		'''dms a person i guess'''
		await ctx.message.delete()
		await user.send(content=msg)
	
	@commands.command()
	async def say(self, ctx: commands.Context, *, msg: str):
		'''yes'''
		await ctx.message.delete()
		await ctx.send(content=msg)
	
	@commands.command()
	async def tts(self, ctx: commands.Context, *, msg: str):
		'''yesser'''
		msga = await ctx.send(content=msg, tts=True)
		await msga.delete()
		await ctx.message.delete()
	
	@commands.command()
	async def calc(self, ctx: commands.Context, *, inp: str):
		'''It's a calculator'''
		await self.bot.get_cog('Google').calculate(ctx=ctx, query=inp)
	
	@commands.command(aliases=['yt'])
	async def youtube(self, ctx: commands.Context = None, *, words: str):
		'''Searches youtube vids'''
		with youtube_dl.YoutubeDL() as ydl:
			results = ydl.extract_info(f'ytsearch: {words}', download=False)
		link = f'https://youtu.be/{results["entries"][0]["id"]}'
		if ctx == None:
			return link
		e = await ctx.send(content=link)

	@commands.command()
	async def yeet(self, ctx: commands.Context, *emotes: discord.PartialEmoji):
		'''Posts the link to a custom emote'''
		for emote in emotes:
			await ctx.send(content=emote.url)
	
	@commands.command()
	async def pick(self, ctx: commands.Context, *arg: str):
		'''Chooses randomly from a list'''
		await ctx.send(content=choice(arg))

	@commands.command()
	async def mp3(self, ctx: commands.Context, langu: str, *, words: str):
		'''Generates an mp3 file of whatever you type'''
		if langu not in lang:
			words = langu + ' ' + words
			langu = 'en'
		tts = gTTS(words, lang=langu)
		tts.save('kiyo.mp3')
		await ctx.send(file=discord.File('kiyo.mp3'))
	
	@commands.command(aliases=['urbandictionary', 'ud'])
	async def urban(self, ctx: commands.Context, *, words: str):
		'''searches the urbandictionary'''
		try:
			udthing = self.uclient.get_definition(words)[0]
			e = discord.Embed(title=udthing.word, description=udthing.definition, color=0x441400)
			e.add_field(name='Example:', value=udthing.example)
			await ctx.send(embed=e)
		except IndexError:
			await ctx.send(content="Word doesn't exist.")
		except discord.HTTPException:
			await ctx.send(content='The definition is a f*****g essay.')

	@commands.command()
	async def ytdl(self, ctx: commands.Context, link: str, *, rest: str = ''):
		'''ytdl, but has max limit of 8MB'''
		if not link.startswith('http') and not link.startswith('<'):
			link = 'ytsearch:' + link + ' ' + rest
		elif link.startswith('<http') and link.endswith('>'):
			link = link.strip('<>')
		async with ctx.channel.typing():
			with youtube_dl.YoutubeDL({'format': 'mp4', 'outtmpl': 'vid.mp4'}) as ydl:
				ydl.download([link])
			try:
				await ctx.send(file=discord.File('vid.mp4'))
			except discord.HTTPException:
				if link.startswith('ytsearch:'):
					with youtube_dl.YoutubeDL() as ydl:
						results = ydl.extract_info(link, download=False)
					link = f'https://youtu.be/{results["entries"][0]["id"]}'
				await ctx.send(content=f"File too large, download from https://kiyo-api.herokuapp.com/ytdl?link={quote(link)} instead")
			os.remove('vid.mp4')

	@commands.guild_only()
	@commands.command()
	async def clone(self, ctx: commands.Context, user: discord.Member, *, message: str = None):
		'''Copies people or sumn idk'''
		name = user.nick
		if name is None:
			name = user.name
		files = list()
		if ctx.message.attachments:
			for att in ctx.message.attachments:
				await att.save(att.filename)
				files.append(discord.File(att.filename))
		else:
			files = None
		if ctx.message.reference:
			quote: discord.Message = ctx.message.reference.resolved
			q_author = quote.author
			q_content = quote.content.splitlines()
			new_q = list()
			for line in q_content:
				new_q.append(f"> {line}")
			new_q = '\n'.join(new_q)
			message = f"{new_q}\n{message}"
			if q_author in ctx.message.mentions:
				message = f"{q_author.mention}\n{message}"
		hooks = await ctx.channel.webhooks()
		for hook in hooks:
			if hook.token:
				break
			hook = None
		if not hook:
			hook = await message.channel.create_webhook(name='generic hook')
		try:
			await hook.send(content=message, username=name, avatar_url=user.avatar_url, files=files)
		except discord.HTTPException:
			await ctx.send(content="you have to set either files or message to send")
		await ctx.message.delete()

	@commands.command()
	async def embed(self, ctx: commands.Context, *, words: str):
		'''Embeds whatever you say'''
		e = discord.Embed(title=ctx.author.name, description=words, color=0x523523)
		e.set_author(name=ctx.author.display_name, icon_url=ctx.author.avatar_url)
		msg: discord.Message = await ctx.send(embed=e)
		await msg.add_reaction('🚮')
		def check(reaction, user):
			return reaction.emoji == '🚮' and user == ctx.author
		try:
			await self.bot.wait_for('reaction_add', check=check, timeout=600.0)
			await msg.delete()
		except asyncio.TimeoutError:
			await msg.clear_reactions()

	@commands.command()
	async def poll(self, ctx: commands.Context, question: str, *choices: str):
		'''democracy'''
		if len(choices) > 9:
			await ctx.send(content="Choices can't be more than 9")
			return
		x = 0
		e = discord.Embed(title=question, color=0x2f3136)
		e.set_author(name=f'asked by {ctx.author.display_name}', icon_url=ctx.author.avatar_url)
		for choice in choices:
			x = x + 1
			e.add_field(name='Choice {}\N{variation selector-16}\N{combining enclosing keycap}'.format(x), value=choice)
		message = await ctx.send(embed=e)
		x = 0
		for choice in choices:
			x = x + 1
			await message.add_reaction('{}\N{variation selector-16}\N{combining enclosing keycap}'.format(x))
		await message.add_reaction('🚮')
		def check(reaction, user):
			return reaction.emoji == '🚮' and user == ctx.author
		try:
			await self.bot.wait_for('reaction_add', check=check, timeout=600.0)
			await message.delete()
		except asyncio.TimeoutError:
			await message.clear_reactions()

	def permcheck(ctx: commands.Context):
		return ctx.author.id in (230935510439297024, 550076298937237544)

	@commands.group(invoke_without_command=True)
	async def rss(self, ctx: commands.Context):
		'''shows help for rss functions'''
		if ctx.invoked_subcommand is not None:
			return
		await ctx.send_help(ctx.command)
	
	@rss.command()
	@commands.check(permcheck)
	async def add(self, ctx: commands.Context, *, title: str):
		'''adds a title to rss nyaa feed'''
		if title in self.animelist:
			return await ctx.send(content="Title already tracked")
		conn = psycopg2.connect(os.environ['DATABASE_URL'])
		cur = conn.cursor()
		cur.execute("INSERT INTO animelist(title) VALUES(%s);", (title,))
		cur.close()
		conn.commit()
		conn.close()
		await ctx.send(content=f"Added `{title}` into the rss filter\n(Changes may take up to a minute to take place)")

	@rss.command()
	@commands.check(permcheck)
	async def remove(self, ctx: commands.Context, *, title: str):
		'''removes a title from rss nyaa feed'''
		conn = psycopg2.connect(os.environ['DATABASE_URL'])
		cur = conn.cursor()
		cur.execute("DELETE FROM animelist WHERE title = %s;", (title,))
		delrows = cur.rowcount
		cur.close()
		conn.commit()
		conn.close()
		await ctx.send(content=f"{delrows} deleted entries\n(Changes may take up to a minute to take place)")

	@rss.command(name="list")
	async def tracklist(self, ctx: commands.Context):
		e = discord.Embed(title="nyaa.si rss filter")
		e.description = ""
		for i, anime in enumerate(self.animelist):
			e.description+=f'{i+1}. {anime}\n'
		await ctx.send(embed=e)
	
	@commands.command(aliases=['trans'])
	async def translate(self, ctx: commands.Context, query: str, destination: str = 'en', source: str = 'auto'):
		try:
			res = self.trans.translate(query, destination, source)
		except ValueError:
			langlist = "\n".join(lang)
			return await ctx.send(content=f'Language choice must be one of these:\n```\n{langlist}```')
		e = discord.Embed(title="Translator", color=0x36393F)
		e.add_field(name=f"Translated from {res.src} to {res.dest}", value=res.text)
		await ctx.send(embed=e)
	
	@commands.command(hidden=True)
	async def clean(self, ctx: commands.Context, amount: int = 10):
		def is_me(m: discord.Message):
			return m.author == self.bot.user
		delmsglist = await ctx.channel.purge(limit=amount, check=is_me, bulk=False)
		delmsg: discord.Message = await ctx.send(content=f'Deleted {len(delmsglist)} responses(s)')
		await delmsg.delete(delay=5)

	@commands.command()
	async def click(self, ctx: commands.Context, link: str):
		'''saves you a click'''
		header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
		async with aiohttp.ClientSession() as sess:
			async with sess.get(link, headers=header) as req:
				r = await req.text()
		soup = bs(r, 'html.parser')
		text = str()
		for p in soup.find('div').find_all('p'):
			text += p.text + '\n'
		with open('clicked.txt', 'w', encoding='utf-8') as f:
			f.write(text)
		await ctx.send(file=discord.File('clicked.txt'))