async def wikilang(self, ctx): global serverSettings if ctx.author.id not in serverSettings[ctx.guild.id]['blacklist']: Log.appendToLog(ctx, 'wikilang') await WikipediaSearch(bot, ctx, "en").lang() return
async def sudo(self, ctx, *args): global serverSettings args = list(args) if Sudo.isSudoer(bot, ctx, serverSettings) == False: await ctx.send(f"{ctx.author} is not in the sudoers file. This incident will be reported.") Log.appendToLog(ctx, 'sudo', 'unauthorised') else: Log.appendToLog(ctx, "sudo", ' '.join(args).strip()) command = Sudo(bot, ctx, serverSettings) await command.sudo(args) with open('serverSettings.json', 'r') as data: serverSettings = json.load(data, object_hook=lambda d: {int(k) if k.isdigit() else k: v for k, v in d.items()}) return
async def search(self): try: msg = [] await asyncio.sleep(random.uniform(0, 2)) result = ytsearch(self.searchQuery, max_results=10).to_dict() resultTitles = [video['title'] for video in result] Log.appendToLog(self.ctx, "ytsearch", self.searchQuery) embed = discord.Embed( title=f"Titles matching '{self.searchQuery}':", description=''.join([ f'[{index}]: {value}\n' for index, value in enumerate(resultTitles) ])) embed.set_footer(text=f"Requested by {self.ctx.author}") msg.append(await self.ctx.send(embed=embed)) msg.append(await self.ctx.send('Please choose option [0-9]')) while True: input = await self.bot.wait_for( 'message', check=lambda m: m.author == self.ctx.author, timeout=30) await input.delete() if input.content == 'cancel': raise UserCancel elif input.content not in [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ]: await msg[-1].delete() del msg[-1] msg.append(await self.ctx.send( 'Invalid response. Please choose option [0-9]')) continue else: result = result[int(input.content)] Log.appendToLog(self.ctx, "ytsearch", result['title']) for message in msg: await message.delete() embed = discord.Embed( title=result['title'], description=result['long_desc'] if 'long_desc' in result.keys() else 'None', url=f"https://www.youtube.com{result['url_suffix']}") embed.add_field(name="Channel", value=result['channel'], inline=True) embed.add_field(name="Duration", value=result['duration'], inline=True) embed.add_field(name="Views", value=result['views'], inline=True) embed.add_field(name="Publish Time", value=result['publish_time'], inline=True) embed.set_thumbnail(url=result['thumbnails'][0]) embed.set_footer(text=f"Requested by {self.ctx.author}") searchresult = await self.ctx.send(embed=embed) def check(reaction, user): return user == self.ctx.author and str( reaction.emoji) in ["🗑️"] try: await searchresult.add_reaction('🗑️') reaction, user = await self.bot.wait_for( "reaction_add", check=check, timeout=60) if str(reaction.emoji) == '🗑️': await searchresult.delete() except asyncio.TimeoutError as e: await searchresult.clear_reactions() except Exception as e: await searchresult.delete() except UserCancel as e: await self.ctx.send(f"Cancelled") return except asyncio.TimeoutError: await self.ctx.send(f"Search timed out. Aborting") return except Exception as e: await ErrorHandler(self.bot, self.ctx, e, 'youtube', self.searchQuery) finally: return
async def search(self): try: msg = [ await self.ctx.send( f'{LoadingMessage()} <a:loading:829119343580545074>') ] await asyncio.sleep(random.uniform(0, 1)) search = AnimeSearch(self.searchQuery) Log.appendToLog(self.ctx, "animesearch", self.searchQuery) while True: result = [ [anime for anime in search.results][x:x + 10] for x in range(0, len([anime for anime in search.results]), 10) ] pages = len(result) cur_page = 1 if len(result) != 1: embed = discord.Embed( title= f"Titles matching '{self.searchQuery}'\n Page {cur_page}/{pages}:", description=''.join([ f'[{index}]: {value.title}\n' for index, value in enumerate(result[cur_page - 1]) ])) embed.set_footer(text=f"Requested by {self.ctx.author}") await msg[0].edit(content=None, embed=embed) await self.bot.wait_until_ready() await msg[-1].add_reaction('◀️') await msg[-1].add_reaction('▶️') msg.append(await self.ctx.send("Please choose option or cancel")) else: embed = discord.Embed( title=f"Titles matching '{self.searchQuery}':", description=''.join([ f'[{index}]: {value.title}\n' for index, value in enumerate(result[0]) ])) embed.set_footer(text=f"Requested by {self.ctx.author}") msg.append(await self.ctx.send(embed=embed)) msg.append(await self.ctx.send("Please choose option or cancel")) def check(reaction, user): return user == self.ctx.author and str( reaction.emoji) in ["◀️", "▶️", "🗑️"] while True: try: #checks for user input or reaction input. emojitask = asyncio.create_task( self.bot.wait_for("reaction_add", check=check, timeout=30)) responsetask = asyncio.create_task( self.bot.wait_for( 'message', check=lambda m: m.author == self.ctx.author, timeout=30)) waiting = [emojitask, responsetask] done, waiting = await asyncio.wait( waiting, return_when=asyncio.FIRST_COMPLETED ) # 30 seconds wait either reply or react if emojitask in done: # if reaction input, change page reaction, user = emojitask.result() if str(reaction.emoji ) == "▶️" and cur_page != pages: cur_page += 1 embed = discord.Embed( title= f"Titles matching '{self.searchQuery}'\nPage {cur_page}/{pages}:", description=''.join([ f'[{index}]: {value}\n' for index, value in enumerate(result[ cur_page - 1]) ])) embed.set_footer( text=f"Requested by {self.ctx.author}") await msg[-2].edit(embed=embed) await msg[-2].remove_reaction(reaction, user) elif str(reaction.emoji) == "◀️" and cur_page > 1: cur_page -= 1 embed = discord.Embed( title= f"Titles matching '{self.searchQuery}'\n Page {cur_page}/{pages}:", description=''.join([ f'[{index}]: {value}\n' for index, value in enumerate(result[ cur_page - 1]) ])) embed.set_footer( text=f"Requested by {self.ctx.author}") await msg[-2].edit(embed=embed) await msg[-2].remove_reaction(reaction, user) else: await msg[-2].remove_reaction(reaction, user) # removes reactions if the user tries to go forward on the last page or # backwards on the first page elif responsetask in done: emojitask.cancel() input = responsetask.result() await input.delete() if input.content == 'cancel': raise UserCancel elif input.content not in [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ]: continue input = int(input.content) animeItem = result[cur_page - 1][input] embed = discord.Embed( title=f'{animeItem.title}', description=animeItem.synopsis, url=animeItem.url) #Myanimelist data embed.add_field(name="MyAnimeListID", value=animeItem.mal_id, inline=True) embed.add_field(name="Rating", value=animeItem.score, inline=True) embed.add_field(name="Episodes", value=animeItem.episodes, inline=True) embed.set_thumbnail(url=animeItem.image_url) embed.set_footer( text=f"Requested by {self.ctx.author}") searchresult = await self.ctx.send(embed=embed) Log.appendToLog(self.ctx, "animesearch result", animeItem.title) for message in msg: await message.delete() try: await searchresult.add_reaction('🗑️') reaction, user = await self.bot.wait_for( "reaction_add", check=check, timeout=60) if str(reaction.emoji) == '🗑️': await searchresult.delete() except asyncio.TimeoutError as e: await searchresult.clear_reactions() finally: return except UserCancel as e: Log.appendToLog(self.ctx, "animesearch cancel") for message in msg: await message.delete() except asyncio.TimeoutError: for message in msg: await message.delete() Log.appendToLog(self.ctx, "animesearch timeout") await self.ctx.send(f"Search timed out. Aborting") except Exception as e: for message in msg: await message.delete() finally: return except Exception as e: await ErrorHandler(self.bot, self.ctx, e, 'anime', self.searchQuery) finally: return
async def search(self): try: await asyncio.sleep(random.uniform(0,2)) if 'author' in self.args: result = next(scholarly.search_author(self.searchQuery)) elif 'cite' in self.args: result = scholarly.search_pubs(self.searchQuery) result = scholarly.bibtex(next(result)) else: result = next(scholarly.search_pubs(self.searchQuery)) Log.appendToLog(self.ctx, "scholar", self.searchQuery) def check(reaction, user): return user == self.ctx.author and str(reaction.emoji) in ["🗑️"] if not result: await self.ctx.send(f"Sorry, no results were found for {self.searchQuery}") elif 'cite' in self.args: searchresult = await self.ctx.send(f"""``` {result} ```""") Log.appendToLog(self.ctx, "scholar result", 'citation') try: await searchresult.add_reaction('🗑️') reaction, user = await self.bot.wait_for("reaction_add", check=check, timeout=60) if str(reaction.emoji) == '🗑️': await searchresult.delete() except asyncio.TimeoutError as e: await searchresult.clear_reactions() except Exception as e: await searchresult.delete() elif result['container_type'] == 'Author': embed=discord.Embed(title=result['name']) embed.add_field(name="Scholar ID", value=result['scholar_id'], inline=True) embed.add_field(name="Affiliation", value=result['affiliation'], inline=True) embed.add_field(name="Email Domain", value=result['email_domain'] if 'email_domain' in result.keys() else 'None', inline=True) embed.add_field(name="Cited By", value=result['cited_by'] if 'cited_by' in result.keys() else 'None', inline=True) embed.add_field(name="Interests", value=', '.join(result['interests']).strip() if 'interests' in result.keys() else 'None') embed.set_thumbnail(url=result['url_picture']) embed.set_footer(text=f"Requested by {self.ctx.author}") searchresult = await self.ctx.send(embed=embed) Log.appendToLog(self.ctx, "scholar result", result['name']) try: await searchresult.add_reaction('🗑️') reaction, user = await self.bot.wait_for("reaction_add", check=check, timeout=60) if str(reaction.emoji) == '🗑️': await searchresult.delete() except asyncio.TimeoutError as e: await searchresult.clear_reactions() except Exception as e: await searchresult.delete() elif result['container_type'] == 'Publication': embed=discord.Embed(title=result['bib']['title'], description=result['bib']['abstract'], url=result['eprint_url'] if 'eprint_url' in result.keys() else result['pub_url']) embed.add_field(name="Authors", value=', '.join(result['bib']['author']).strip(), inline=True) embed.add_field(name="Publisher", value=result['bib']['venue'], inline=True) embed.add_field(name="Publication Year", value=result['bib']['pub_year'], inline=True) embed.add_field(name="Cited By", value=result['num_citations'] if 'num_citations' in result.keys() else '0', inline=True) embed.add_field(name="Related Articles", value=f'https://scholar.google.com{result["url_related_articles"]}', inline=True) embed.set_footer(text=f"Requested by {self.ctx.author}") searchresult = await self.ctx.send(embed=embed) Log.appendToLog(self.ctx, "scholar result", result['bib']['title']) try: await searchresult.add_reaction('🗑️') reaction, user = await self.bot.wait_for("reaction_add", check=check, timeout=60) if str(reaction.emoji) == '🗑️': await searchresult.delete() except asyncio.TimeoutError as e: await searchresult.clear_reactions() except Exception as e: await searchresult.delete() except Exception as e: await ErrorHandler(self.bot, self.ctx, e, 'scholar', self.searchQuery) finally: return
async def search(self): try: msg = [ await self.ctx.send( f'{LoadingMessage()} <a:loading:829119343580545074>') ] await asyncio.sleep(random.uniform(0, 2)) result = wikipedia.search(self.searchQuery) Log.appendToLog(self.ctx, "wikisearch", self.searchQuery) while True: result = [result[x:x + 10] for x in range(0, len(result), 10)] pages = len(result) cur_page = 1 if len(result) != 1: embed = discord.Embed( title= f"Titles matching '{self.searchQuery}'\n Page {cur_page}/{pages}:", description=''.join([ f'[{index}]: {value}\n' for index, value in enumerate(result[cur_page - 1]) ])) embed.set_footer(text=f"Requested by {self.ctx.author}") await msg[0].edit(content=None, embed=embed) await self.bot.wait_until_ready() await msg[-1].add_reaction('◀️') await msg[-1].add_reaction('▶️') msg.append(await self.ctx.send("Please choose option or cancel")) else: embed = discord.Embed( title=f"Titles matching '{self.searchQuery}':", description=''.join([ f'[{index}]: {value}\n' for index, value in enumerate(result[0]) ])) embed.set_footer(text=f"Requested by {self.ctx.author}") await msg[0].edit(content=None, embed=embed) msg.append(await self.ctx.send("Please choose option or cancel")) def check(reaction, user): return user == self.ctx.author and str( reaction.emoji) in ["◀️", "▶️", "🗑️"] while True: try: #checks for user input or reaction input. emojitask = asyncio.create_task( self.bot.wait_for("reaction_add", check=check, timeout=30)) responsetask = asyncio.create_task( self.bot.wait_for( 'message', check=lambda m: m.author == self.ctx.author, timeout=30)) waiting = [emojitask, responsetask] done, waiting = await asyncio.wait( waiting, return_when=asyncio.FIRST_COMPLETED ) # 30 seconds wait either reply or react if emojitask in done: # if reaction input, change page reaction, user = emojitask.result() if str(reaction.emoji ) == "▶️" and cur_page != pages: cur_page += 1 embed = discord.Embed( title= f"Titles matching '{self.searchQuery}'\nPage {cur_page}/{pages}:", description=''.join([ f'[{index}]: {value}\n' for index, value in enumerate(result[ cur_page - 1]) ])) embed.set_footer( text=f"Requested by {self.ctx.author}") await msg[-2].edit(embed=embed) await msg[-2].remove_reaction(reaction, user) elif str(reaction.emoji) == "◀️" and cur_page > 1: cur_page -= 1 embed = discord.Embed( title= f"Titles matching '{self.searchQuery}'\n Page {cur_page}/{pages}:", description=''.join([ f'[{index}]: {value}\n' for index, value in enumerate(result[ cur_page - 1]) ])) embed.set_footer( text=f"Requested by {self.ctx.author}") await msg[-2].edit(embed=embed) await msg[-2].remove_reaction(reaction, user) else: await msg[-2].remove_reaction(reaction, user) # removes reactions if the user tries to go forward on the last page or # backwards on the first page elif responsetask in done: emojitask.cancel() input = responsetask.result() await input.delete() if input.content == 'cancel': raise UserCancel elif input.content not in [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ]: continue input = int(input.content) try: self.searchQuery = result[cur_page - 1][input] page = wikipedia.WikipediaPage( title=self.searchQuery) summary = page.summary[:page.summary. find('. ') + 1] embed = discord.Embed( title= f'Wikipedia Article: {page.original_title}', description=summary, url=page.url) #outputs wikipedia article embed.set_footer( text=f"Requested by {self.ctx.author}") searchresult = await self.ctx.send(embed=embed) Log.appendToLog(self.ctx, "wikisearch result", f"{page.original_title}") try: for message in msg: await message.delete() except: pass try: await searchresult.add_reaction('🗑️') reaction, user = await self.bot.wait_for( "reaction_add", check=check, timeout=60) if str(reaction.emoji) == '🗑️': await searchresult.delete() return except asyncio.TimeoutError: await searchresult.clear_reactions() except wikipedia.DisambiguationError as e: result = str(e).split('\n') result.pop(0) for index, message in enumerate(msg): await message.delete() msg.pop(index) break except UserCancel as e: Log.appendToLog(self.ctx, "wikisearch cancel") for message in msg: await message.delete() except asyncio.TimeoutError: for message in msg: await message.delete() Log.appendToLog(self.ctx, "wikisearch timeout") await self.ctx.send(f"Search timed out. Aborting") except Exception as e: for message in msg: await message.delete() finally: return except Exception as e: await ErrorHandler(self.bot, self.ctx, e, 'wiki', self.searchQuery) finally: return
async def search(bot, ctx, serverSettings, message, searchQuery=None): try: def check(reaction, user): return user == ctx.author and str( reaction.emoji) in ["🔍", "🗑️"] def linkUnicodeParse(link: str): return re.sub(r"%(.{2})", lambda m: chr(int(m.group(1), 16)), link) Log.appendToLog(ctx, "googlesearch", searchQuery) if bool(re.search('^translate', searchQuery.lower())): query = searchQuery.lower().split(' ') if len(query) > 1: del query[0] if "to" in query: destLanguage = Languages.get( name=query[query.index('to') + 1].lower().capitalize()).alpha2 del query[query.index('to') + 1] del query[query.index('to')] else: destLanguage = 'en' if "from" in query: srcLanguage = Languages.get( name=query[query.index('from') + 1].lower().capitalize()).alpha2 del query[query.index('from') + 1] del query[query.index('from')] else: srcLanguage = None query = ' '.join(query) translator = google_translator() result = translator.translate( query, lang_src= f'{srcLanguage if srcLanguage != None else "auto"}', lang_tgt=destLanguage) if type(result) == list: result = '\n'.join(result) try: embed = discord.Embed( title= f"{Languages.get(alpha2=srcLanguage).name if srcLanguage != None else translator.detect(query)[1].capitalize()} " + f"to {Languages.get(part1=destLanguage).name} Translation", description=result + '\n\nReact with 🔍 to search Google') embed.set_footer(text=f"Requested by {ctx.author}") await message.edit(content=None, embed=embed) await message.add_reaction('🗑️') await message.add_reaction('🔍') reaction, user = await bot.wait_for("reaction_add", check=check, timeout=60) if str(reaction.emoji) == '🗑️': await message.delete() elif str(reaction.emoji) == '🔍': await message.delete() pass except asyncio.TimeoutError: pass except Exception as e: await message.delete() await ErrorHandler(bot, ctx, e, 'google', searchQuery) finally: return await asyncio.sleep(random.uniform(0, 2)) http = urllib3.PoolManager() url = ( "https://google.com/search?pws=0&q=" + searchQuery.replace(" ", "+") + "+-stock+-pinterest" f"&uule=w+CAIQICI5TW91bnRhaW4gVmlldyxTYW50YSBDbGFyYSBDb3VudHksQ2FsaWZvcm5pYSxVbml0ZWQgU3RhdGVz&num=5{'&safe=active' if serverSettings[ctx.guild.id]['safesearch'] == True else ''}" ) response = http.request('GET', url) soup = BeautifulSoup(response.data, features="lxml") result_number = 3 foundImage = True google_snippet_result = soup.find("div", {"id": "main"}) if google_snippet_result is not None: google_snippet_result = google_snippet_result.contents[ result_number] breaklines = ["People also search for", "Episodes"] wrong_first_results = [ "Did you mean: ", "Showing results for ", "Tip: ", "See results about", "Including results for ", "Related searches", "Top stories", 'People also ask' ] Log.appendToLog(ctx, "googlesearch results", url) if bool(re.search('^image', searchQuery.lower())): while 'Images' not in google_snippet_result.strings: result_number += 1 google_snippet_result = soup.find( "div", { "id": "main" }).contents[result_number] if result_number < len( soup.find("div", { "id": "main" }).contents) - 1: result_number = 3 foundImage = False break while any( map( lambda wrong_first_result: wrong_first_result in google_snippet_result.strings, wrong_first_results)): result_number += 1 google_snippet_result = soup.find("div", { "id": "main" }).contents[result_number] printstring = "" for div in [ d for d in google_snippet_result.findAll('div') if not d.find('div') ]: # makes the text portion of the message by finding all strings in the snippet + formatting linestring = "" for string in div.stripped_strings: linestring += string + " " if linestring == "View all ": # clean this part up linestring = "" if len(printstring + linestring + "\n") < 2000 and not any( map(lambda breakline: breakline in linestring, breaklines)): printstring += linestring + "\n" else: break embed = discord.Embed( title= f'Search results for: {searchQuery[:233]}{"..." if len(searchQuery) > 233 else ""}', description="{}".format( '' if foundImage else 'No image found. Defaulting to first result:\n\n') + re.sub("\n\n+", "\n\n", printstring)) print(ctx.author.name + " searched for: " + searchQuery[:233]) image = google_snippet_result.find( "img" ) # can also be done for full html (soup) with about same result. # tries to add an image to the embed if image is not None: try: imgurl = linkUnicodeParse( re.findall("(?<=imgurl=).*(?=&imgrefurl)", image.parent.parent["href"])[0]) if "encrypted" in imgurl: imgurl = re.findall( "(?<=imgurl=).*(?=&imgrefurl)", google_snippet_result.findAll("img") [1].parent.parent["href"])[0] # imgurl = re.findall("(?<=\=).*(?=&imgrefurl)", image["href"])[0] print(" image: " + imgurl) if "Images" in google_snippet_result.strings: embed.set_image(url=imgurl) else: embed.set_thumbnail(url=imgurl) except: foundImage = False # tries to add a link to the embed link_list = [ a for a in google_snippet_result.findAll("a", href_="") if not a.find("img") ] if len(link_list) != 0: try: link = linkUnicodeParse( re.findall("(?<=url\?q=).*(?=&sa)", link_list[0]["href"])[0]) embed.add_field(name="Relevant Link", value=link) print(" link: " + link) except: print("adding link failed") embed.url = url else: embed = discord.Embed( title= f'Search results for: {searchQuery[:233]}{"..." if len(searchQuery) > 233 else ""}', description='No results found') embed.set_footer(text=f"Requested by {ctx.author}") await message.edit(content=None, embed=embed) try: await message.add_reaction('🗑️') reaction, user = await bot.wait_for("reaction_add", check=check, timeout=60) if str(reaction.emoji) == '🗑️': await message.delete() except asyncio.TimeoutError as e: pass except asyncio.CancelledError: pass except Exception as e: await message.delete() await ErrorHandler(bot, ctx, e, 'google', searchQuery) finally: return
async def search(bot, ctx, searchQuery): def check(reaction, user): return user == ctx.author and str(reaction.emoji) in ["🗑️"] Log.appendToLog(ctx, "xkcd", searchQuery) message = await ctx.send( f'{LoadingMessage()} <a:loading:829119343580545074>') errorCount = 0 while errorCount <= 1: try: x = xkcd(searchQuery) embed = discord.Embed(title=x.title, description=x.alt, timestamp=x.date) embed.url = x.url embed.set_image(url=x.img_url) embed.set_footer(text=f"Requested by {ctx.author}") await message.edit(content=None, embed=embed) Log.appendToLog(ctx, "xkcd", x.url) await message.add_reaction('🗑️') reaction, user = await bot.wait_for("reaction_add", check=check, timeout=60) if str(reaction.emoji) == '🗑️': await message.delete() return except UserCancel as e: await ctx.send(f"Cancelled") return except ValueError: errorMsg = await ctx.send( "Invalid input, an XKCD comic number is needed. Please edit your search or try again." ) messageEdit = asyncio.create_task( bot.wait_for('message_edit', check=lambda var, m: m.author == ctx.author, timeout=60)) reply = asyncio.create_task( bot.wait_for('message', check=lambda m: m.author == ctx.author, timeout=60)) waiting = [messageEdit, reply] done, waiting = await asyncio.wait( waiting, return_when=asyncio.FIRST_COMPLETED ) # 30 seconds wait either reply or react if messageEdit in done: reply.cancel() messageEdit = messageEdit.result() searchQuery = ''.join([ li for li in difflib.ndiff(messageEdit[0].content, messageEdit[1].content) if '+' in li ]).replace('+ ', '') elif reply in done: messageEdit.cancel() reply = reply.result() await reply.delete() if reply.content == "cancel": messageEdit.cancel() reply.cancel() break else: searchQuery = reply.content await errorMsg.delete() errorCount += 1 continue except asyncio.TimeoutError: return except Exception as e: await ErrorHandler(bot, ctx, e, 'youtube', searchQuery) return
async def search(self): try: Log.appendToLog(self.ctx, "imagesearch", self.searchQuery) headers = { 'Host': 'www.google.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0', 'Accept': '*/*', 'Accept-Language': 'en-US,en;q=0.5', 'Accept-Encoding': 'identity', 'Referer': 'https://www.google.com/', 'Origin': 'https://www.google.com', 'Connection': 'keep-alive', 'Content-Length': '0', 'TE': 'Trailers' } r = requests.get( #initial search f"https://www.google.com/searchbyimage?image_url={self.searchQuery}", headers=headers) if r.status_code == 200: soup = BeautifulSoup(r.text, "lxml") a = soup.find("a", text="All sizes") await asyncio.sleep(random.uniform(0, 1)) #prevent captcha. if a: r = requests.get( #similar images f"https://www.google.com/{a['href']}", headers=headers) soup = BeautifulSoup(r.text, "lxml") div = soup.find("div", attrs={'id': 'is-results'}) children = div.findChildren("img", recursive=True) urls = [] for child in children[:5]: urls.append( child.parent.parent.nextSibling.attrs["href"]) embed = discord.Embed(title=f"Google Reverse Image Search", description=''.join( [f"{i} \n" for i in urls])) embed.set_footer(text=f"Requested by {self.ctx.author}") embed.set_thumbnail(url=self.searchQuery) result = await self.ctx.send(embed=embed) Log.appendToLog(self.ctx, "imagesearch result", f"{self.searchQuery}") def check(reaction, user): return user == self.ctx.author and str( reaction.emoji) in ["🗑️"] try: await result.add_reaction('🗑️') reaction, user = await self.bot.wait_for( "reaction_add", check=check, timeout=60) if str(reaction.emoji) == '🗑️': await result.delete() except asyncio.TimeoutError as e: await result.clear_reactions() else: embed = discord.Embed( title=f"Google Reverse Image Search", description="No similar images found") embed.set_footer(text=f"Requested by {self.ctx.author}") embed.set_thumbnail(url=self.searchQuery) result = await self.ctx.send(embed=embed) Log.appendToLog(self.ctx, "imagesearch result", f"no similar images") def check(reaction, user): return user == self.ctx.author and str( reaction.emoji) in ["🗑️"] try: await result.add_reaction('🗑️') reaction, user = await self.bot.wait_for( "reaction_add", check=check, timeout=60) if str(reaction.emoji) == '🗑️': await result.delete() except asyncio.TimeoutError as e: await result.clear_reactions() else: await self.ctx.send( "Google is currently blocking searches. Please try again later" ) except Exception as e: await ErrorHandler(self.bot, self.ctx, e, 'image', self.searchQuery) finally: return
async def logging(self, ctx): Log.appendToLog(ctx, 'log') await Log.logRequest(bot, ctx, serverSettings) return