diff --git a/garfmain.py b/garfmain.py index 4b900a0..e45462a 100644 --- a/garfmain.py +++ b/garfmain.py @@ -1,10 +1,9 @@ import config import asyncio import discord -import subprocess from garfpy import( - logger, is_private, + logger, IPUtils, aod_message, generate_qr, Kroger, GarfAI, GarfbotRespond) @@ -22,9 +21,11 @@ garfbot = discord.Client(intents=intents) garf_respond = GarfbotRespond() garfield = GarfAI() +iputils = IPUtils() kroger = Kroger() + @garfbot.event async def on_ready(): try: @@ -37,28 +38,18 @@ async def on_ready(): @garfbot.event async def on_message(message): - - content = message.content.strip() - lower = content.lower() - user = message.author.name - guild = message.guild.name if message.guild else "Direct Message" - guild_id = message.guild.id - - # Chats & pics if message.author == garfbot.user: return + + content = message.content.strip() + lower = content.lower() + user_name = message.author.name + guild_id = message.guild.id + guild_name = message.guild.name if message.guild else "Direct Message" - if lower.startswith("hey garfield") or isinstance(message.channel, discord.DMChannel): - prompt = content[12:] if lower.startswith("hey garfield") else message.content - answer = await garfield.generate_chat(prompt) - logger.info(f"Chat Request - User: {user}, Server: {guild}, Prompt: {prompt}") - await message.channel.send(answer) - - if lower.startswith('garfpic '): - prompt = content[8:] - logger.info(f"Image Request - User: {user}, Server: {guild}, Prompt: {prompt}") - await message.channel.send(f"`Please wait... image generation queued: {prompt}`") - await garfield.garfpic(message, prompt) + # IP utils + if message.guild and lower.startswith(("garfping ", "garfdns ", "garfhack ")): + await iputils.scan(message, user_name, guild_name, lower) # Wikipedia if lower.startswith('garfwiki '): @@ -80,47 +71,6 @@ async def on_message(message): logger.error(e) await message.channel.send(e) - # IP utils - query = message.content.split() - target = query[-1] - - if lower.startswith("garfping "): - try: - logger.info(f"Ping Request - User: {user}, Server: {guild}, Target: {target}") - if is_private(target): - rejection = await garfield.generate_chat("Hey Garfield, explain to me why I am dumb for trying to hack your private computer network.") - await message.channel.send(rejection) - else: - result = subprocess.run(['ping', '-c', '4', target], capture_output=True, text=True) - await message.channel.send(f"`Ping result for {target}:`\n```\n{result.stdout}\n```") - except Exception as e: - await message.channel.send(f"`GarfBot Error: {str(e)}`") - - if lower.startswith("garfdns "): - try: - logger.info(f"NSLookup Request - User: {user}, Server: {guild}, Target: {target}") - if is_private(target): - rejection = await garfield.generate_chat("Hey Garfield, explain to me why I am dumb for trying to hack your private computer network.") - await message.channel.send(rejection) - else: - result = subprocess.run(['nslookup', target], capture_output=True, text=True) - await message.channel.send(f"`NSLookup result for {target}:`\n```\n{result.stdout}\n```") - except Exception as e: - await message.channel.send(f"`GarfBot Error: {str(e)}`") - - if lower.startswith("garfhack "): - try: - logger.info(f"Nmap Request - User: {user}, Server: {guild}, Target: {target}") - if is_private(target): - rejection = await garfield.generate_chat("Hey Garfield, explain to me why I am dumb for trying to hack your private computer network.") - await message.channel.send(rejection) - else: - await message.channel.send(f"`Scanning {target}...`") - result = subprocess.run(['nmap', '-Pn', '-O', '-v', target], capture_output=True, text=True) - await message.channel.send(f"`Ping result for {target}:`\n```\n{result.stdout}\n```") - except Exception as e: - await message.channel.send(f"`GarfBot Error: {str(e)}`") - # Kroger Shopping if lower.startswith("garfshop "): try: @@ -147,6 +97,20 @@ async def on_message(message): await message.channel.send(response) break + # Chats & pics + elif lower.startswith("hey garfield") or isinstance(message.channel, discord.DMChannel): + prompt = content[12:] if lower.startswith("hey garfield") else message.content + answer = await garfield.generate_chat(prompt) + logger.info(f"Chat Request - User: {user_name}, Server: {guild_name}, Prompt: {prompt}") + await message.channel.send(answer) + + elif lower.startswith('garfpic '): + prompt = content[8:] + logger.info(f"Image Request - User: {user_name}, Server: {guild_name}, Prompt: {prompt}") + await message.channel.send(f"`Please wait... image generation queued: {prompt}`") + await garfield.garfpic(message, prompt) + + # Run Garfbot async def garfbot_connect(): while True: diff --git a/garfpy/__init__.py b/garfpy/__init__.py index ce62920..0234976 100644 --- a/garfpy/__init__.py +++ b/garfpy/__init__.py @@ -2,9 +2,10 @@ from .log import logger from .kroger import Kroger -from .iputils import is_private -from .aod import aod_message -from .qr import generate_qr +# from .iputils import scan from .kroger import Kroger from .garfai import GarfAI -from .respond import GarfbotRespond \ No newline at end of file +from .respond import GarfbotRespond +from .aod import aod_message +from .qr import generate_qr +from .iputils import IPUtils \ No newline at end of file diff --git a/garfpy/iputils.py b/garfpy/iputils.py index 4f7d1d5..551734d 100644 --- a/garfpy/iputils.py +++ b/garfpy/iputils.py @@ -1,19 +1,64 @@ +import discord import ipaddress +import subprocess +from garfpy import logger -def is_private(target): - try: - ip_obj = ipaddress.ip_address(target) - if ip_obj.is_private: - return True - except ValueError: - if "crate.lan" in target.lower(): - return True - if "crate.zip" in target.lower(): - return True - if "memtec.org" in target.lower(): - return True - if "crateit.net" in target.lower(): - return True - if "garfbot.art" in target.lower(): - return True - return False + +class IPUtils: + def is_private(self, target): + try: + ip_obj = ipaddress.ip_address(target) + if ip_obj.is_private: + return True + except ValueError: + if "crate.lan" in target.lower(): + return True + if "crate.zip" in target.lower(): + return True + if "memtec.org" in target.lower(): + return True + if "crateit.net" in target.lower(): + return True + if "garfbot.art" in target.lower(): + return True + return False + + async def scan(self, message, user, guild, query): + split = query.split() + target = split[-1] + if self.is_private(target): + return + + if query.startswith("garfping "): + try: + logger.info(f"Ping Request - User: {user}, Server: {guild}, Target: {target}") + await message.channel.send(f"`Pinging {target}...`") + result = subprocess.run(['ping', '-c', '4', target], capture_output=True, text=True) + embed = discord.Embed(title=f"Ping result:", color=0x4d4d4d) + embed.add_field(name=target, value=f"```{result.stdout}```") + await message.channel.send(embed=embed) + except Exception as e: + await message.channel.send(f"`GarfBot Error: {str(e)}`") + + if query.startswith("garfdns "): + try: + logger.info(f"NSLookup Request - User: {user}, Server: {guild}, Target: {target}") + await message.channel.send(f"`Requesting {target}...`") + result = subprocess.run(['nslookup', target], capture_output=True, text=True) + embed = discord.Embed(title=f"NSLookup result:", color=0x4d4d4d) + embed.add_field(name=target, value=f"```{result.stdout}```") + await message.channel.send(embed=embed) + except Exception as e: + await message.channel.send(f"`GarfBot Error: {str(e)}`") + + if query.startswith("garfhack "): + try: + logger.info(f"Nmap Request - User: {user}, Server: {guild}, Target: {target}") + await message.channel.send(f"`Scanning {target}...`") + result = subprocess.run(['nmap', '-Pn', '-O', '-v', target], capture_output=True, text=True) + embed = discord.Embed(title=f"Nmap scan result:", color=0x4d4d4d) + embed.add_field(name=target, value=f"```{result.stdout}```") + embed.set_footer(text="https://nmap.org/") + await message.channel.send(embed=embed) + except Exception as e: + await message.channel.send(f"`GarfBot Error: {str(e)}`") \ No newline at end of file