示例#1
0
    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
示例#2
0
    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
示例#3
0
    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
示例#4
0
    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
示例#5
0
    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
示例#6
0
    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
示例#7
0
    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
示例#8
0
文件: xkcd.py 项目: Nanu00/searchio
    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
示例#9
0
    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
示例#10
0
 async def logging(self, ctx): 
     Log.appendToLog(ctx, 'log')
     await Log.logRequest(bot, ctx, serverSettings)
     return