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