From 8d8e7e0eaffd0247067aafad86dc13a7e07356b0 Mon Sep 17 00:00:00 2001 From: berlintay <tay@aidot.org> Date: Sat, 25 May 2024 11:29:48 -0300 Subject: [PATCH] Created gem & image search cogs, left to do: video,web. and embed generator. --- .main.py.kate-swp | Bin 0 -> 801 bytes cogs/gem.py | 45 ++++++++++++++ cogs/imagesearch.py | 139 ++++++++++++++++++++++++++++++++++++++++++++ cogs/todo.md | 6 +- cogs/web.py | 0 5 files changed, 187 insertions(+), 3 deletions(-) create mode 100644 .main.py.kate-swp create mode 100644 cogs/imagesearch.py create mode 100644 cogs/web.py diff --git a/.main.py.kate-swp b/.main.py.kate-swp new file mode 100644 index 0000000000000000000000000000000000000000..700b968a12b92f0ccd9104ead8fcb7cdced041c3 GIT binary patch literal 801 zcmXZYNlF7j7>40mIV?m_QBcr!+z3V#QACUz2hfcMC1x@)=?t30B*x5U+~fdWz?~~E z;N{F)d=33l4}Wzvlrd)JI#zZaUo}>6E;3oy+1uGQ#>@>phtsQ-uZN$pwZC6)zV|&` z3H$CwlfmfaxdeT?H0B8OghkL5W<f{T1Z`m*w1i#I6edAKSORrn9@K;dP!;S?E5Zbm z4`B<G1-tECu&0#-mu*Gi1QZ1O&706-k{7l?PB;LsLIb=Aw;&_f)6&8elaz1<lEM{m z1rJCF#~>~&gP34%G%DCjd=fU;77^@?hJ}45A;AGb;S>afaquYI0Kee9A1wx?PkN+F zI;2fLNsBZ|gVaflR7r(=kTQ8EB~l~>@<#F`N3!IVypRk@lN3o3mn2A>Jd+rSk|z=& OVG<%i5+IMnfBp|kLsbI+ literal 0 HcmV?d00001 diff --git a/cogs/gem.py b/cogs/gem.py index 8b13789..2d7e949 100644 --- a/cogs/gem.py +++ b/cogs/gem.py @@ -1 +1,46 @@ +import discord +from discord.ext import commands +import asyncio +import configparser +import requests +import logging +config = configparser.ConfigParser() +config.read('config.ini') +GEMINI_API_KEY = config['GOOGLE']['GEMINI_API_KEY'] + + +class GemCog(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @commands.hybrid_command(name="gem", description="Ask a question to Gemini Pro") + async def ask_gemini_slash(self, ctx, question: str): + try: + headers = {'Authorization': f'Bearer {GEMINI_API_KEY}'} + response = requests.post( + 'https://api.gemini.com/v1/completions', + headers=headers, + json={'prompt': question} + ) + response.raise_for_status() + data = response.json() + + if 'choices' in data and len(data['choices']) > 0: + answer = data['choices'][0]['text'] + embed = discord.Embed( + title="Gem says:", description=answer) + await ctx.send(embed=embed) + else: + logging.error( + "The API response format for Gemini Pro has changed, Unable to extract response.") + await ctx.send("Unexpected response from gem <:SatisfiedCheems:1230175084912840734>") + except requests.exceptions.RequestException as e: + logging.error(f"404 from gem: {e}") + await ctx.send("An error returned while trying to communicate with Gemini Pro, Try again.") + except Exception as e: + logging.error(f"Random error in 'gem' command: {e}") + await ctx.send("Gem is not working at the moment.") + + async def setup(bot): + await bot.add_cog(GemCog(bot)) diff --git a/cogs/imagesearch.py b/cogs/imagesearch.py new file mode 100644 index 0000000..6854563 --- /dev/null +++ b/cogs/imagesearch.py @@ -0,0 +1,139 @@ +from discord.ext import commands +from google_images_search import GoogleImagesSearch +import logging +import asyncio + + +config = configparser.ConfigParser() +config.read('config.ini') +GCS_DEVELOPER_KEY = config['GOOGLE']['GCS_DEVELOPER_KEY'] +GCS_CX = config['GOOGLE']['GCS_CX'] + + +class ImageCog(commands.Cog): + def __init__(self, bot): + self.bot = bot + self.gis = GoogleImagesSearch(GCS_DEVELOPER_KEY, GCS_CX) + + @commands.hybrid_command(name='image', description="Search for images from Google.") + async def search_image(self, ctx, *, query): + try: + _search_params = { + 'q': query, + 'num': 5, + 'safe': 'off', + } + self.gis.async_search(search_params=_search_params) + + if not self.gis.results(): + await ctx.send("No images found for your search.") + return + + current_page = 0 + total_pages = (len(self.gis.results()) - 1) // 5 + + def create_embed(): + embed = discord.Embed(title=f"Image search Results for '{ + query}' ({current_page+1}/{total_pages+1})") + embed.set_image(url=self.gis.results()[current_page].url) + return embed + + message = await ctx.send(embed=embed) + await message.add_reaction('⬅ï¸') + await message.add_reaction('âž¡ï¸') + + def check(reaction, user): + return user == ctx.author and str(reaction.emoji) in ['⬅ï¸', 'âž¡ï¸'] and reaction.message == message + + while True: + try: + reaction, _ = await self.bot.wait_for('reaction_add', timeout=60.0, check=check) + + if str(reaction.emoji) == '⬅ï¸' and current_page > 0: + current_page -= 1 + elif str(reaction.emoji) == 'âž¡ï¸' and current_page < total_pages: + current_page += 1 + embed.set_image(url=self.gis.results() + [current_page * 5].url) + embed.title = f"Results for '{ + query}' ({current_page+1}/{total_pages+1})" + await message.edit(embed=embed) + await message.remove_reaction(reaction, ctx.author) + + except asyncio.TimeoutError: + await message.clear_reactions() + break + except Exception as e: + logging.error(f"Error during image search: {e}") + await ctx.send("An error occured while searching for '{query}'.") + + async def setup(bot): + await bot.add_cog(ImageCog(bot)) +import discord +from discord.ext import commands +from google_images_search import GoogleImagesSearch +import logging +import asyncio + + +config = configparser.ConfigParser() +config.read('config.ini') +GCS_DEVELOPER_KEY = config['GOOGLE']['GCS_DEVELOPER_KEY'] +GCS_CX = config['GOOGLE']['GCS_CX'] + + +class ImageCog(commands.Cog): + def __init__(self, bot): + self.bot = bot + self.gis = GoogleImagesSearch(GCS_DEVELOPER_KEY, GCS_CX) + + @commands.hybrid_command(name='image', description="Search for images from Google.") + async def search_image(self, ctx, *, query): + try: + _search_params = { + 'q': query, + 'num': 5, + 'safe': 'off', + } + self.gis.async_search(search_params=_search_params) + + if not self.gis.results(): + await ctx.send("No images found for your search.") + return + + current_page = 0 + total_pages = (len(self.gis.results()) - 1) // 5 + + def create_embed(): + embed = discord.Embed(title=f"Image search Results for '{query}' ({current_page+1}/{total_pages+1})") + embed.set_image(url=self.gis.results()[current_page].url) + return embed + + message = await ctx.send(embed=embed) + await message.add_reaction('⬅ï¸') + await message.add_reaction('âž¡ï¸') + + def check(reaction, user): + return user == ctx.author and str(reaction.emoji) in ['⬅ï¸', 'âž¡ï¸'] and + + while True: + try: + reaction, _ = await self.bot.wait_for('reaction_add', timeout=60.0, check=check) + + if str(reaction.emoji) == '⬅ï¸' and current_page > 0: + current_page -= 1 + elif str(reaction.emoji) == 'âž¡ï¸' and current_page < total_pages: + current_page += 1 + + await message.edit(embed=create_embed()) + await message.remove_reaction(reaction, ctx.author) + + except asyncio.TimeoutError: + await message.clear_reactions() + break + except Exception as e: + logging.error(f"Error during image search: {e}") + await ctx.send("An error occured while searching for '{query}'.") + + async def setup(bot): + await bot.add_cog(ImageCog(bot)) diff --git a/cogs/todo.md b/cogs/todo.md index 345d302..04d0a46 100644 --- a/cogs/todo.md +++ b/cogs/todo.md @@ -2,9 +2,9 @@ <h1>Cogs to add</h1> </div> <br> -- [ ] Gem +- [ x ] Gem - [ ] websearch -- [ ] imagesearch +- [ x ] imagesearch - [ ] videosearch -- [ ] embedcreato +- [ ] embedcreat diff --git a/cogs/web.py b/cogs/web.py new file mode 100644 index 0000000..e69de29 -- GitLab