mirror of
https://github.com/nexy7574/LCC-bot.git
synced 2024-09-19 18:16:34 +01:00
Add screenshot command to jimmy
This commit is contained in:
parent
723a805cd4
commit
0a8d0d2eef
3 changed files with 102 additions and 6 deletions
|
@ -2,7 +2,6 @@ import random
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Optional, Tuple
|
from typing import Optional, Tuple
|
||||||
from datetime import datetime, time, timedelta
|
from datetime import datetime, time, timedelta
|
||||||
|
|
||||||
import discord
|
import discord
|
||||||
from discord.ext import commands, tasks
|
from discord.ext import commands, tasks
|
||||||
from utils import Student, get_or_none, console
|
from utils import Student, get_or_none, console
|
||||||
|
@ -153,6 +152,7 @@ class Events(commands.Cog):
|
||||||
G_EMOJI = "\U0001f3f3\U0000fe0f\U0000200d\U0001f308"
|
G_EMOJI = "\U0001f3f3\U0000fe0f\U0000200d\U0001f308"
|
||||||
N_EMOJI = "\U0001f922"
|
N_EMOJI = "\U0001f922"
|
||||||
C_EMOJI = "\U0000271d\U0000fe0f"
|
C_EMOJI = "\U0000271d\U0000fe0f"
|
||||||
|
# if is_naus or re.match(rf"(trans(gender)?|{T_EMOJI}|femboy)\b", message.content.lower()):
|
||||||
if any((x in message.content.lower() for x in ("trans", T_EMOJI, "femboy"))) or is_naus:
|
if any((x in message.content.lower() for x in ("trans", T_EMOJI, "femboy"))) or is_naus:
|
||||||
try:
|
try:
|
||||||
await message.add_reaction(N_EMOJI)
|
await message.add_reaction(N_EMOJI)
|
||||||
|
|
104
cogs/other.py
104
cogs/other.py
|
@ -1,14 +1,24 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
import io
|
import io
|
||||||
import os
|
import os
|
||||||
import psutil
|
|
||||||
from typing import Tuple, Optional, Dict
|
|
||||||
|
|
||||||
import discord
|
|
||||||
import aiohttp
|
|
||||||
import random
|
import random
|
||||||
|
import re
|
||||||
|
from time import sleep as time_sleep
|
||||||
|
from typing import Literal
|
||||||
|
from typing import Tuple, Optional, Dict
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import aiohttp
|
||||||
|
import discord
|
||||||
|
import psutil
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from rich.tree import Tree
|
from rich.tree import Tree
|
||||||
|
from selenium import webdriver
|
||||||
|
from selenium.webdriver.chrome.options import Options as ChromeOptions
|
||||||
|
from selenium.webdriver.chrome.service import Service as ChromeService
|
||||||
|
from selenium.webdriver.firefox.options import Options as FirefoxOptions
|
||||||
|
from selenium.webdriver.firefox.service import Service as FirefoxService
|
||||||
|
|
||||||
from utils import console
|
from utils import console
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,6 +27,54 @@ class OtherCog(commands.Cog):
|
||||||
def __init__(self, bot):
|
def __init__(self, bot):
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def screenshot_website(website: str, driver: Literal['chrome', 'firefox'], render_time: int = 10) -> discord.File:
|
||||||
|
if not Path("/usr/bin/firefox").exists():
|
||||||
|
driver = 'chrome'
|
||||||
|
if not Path("/usr/bin/geckodriver").exists():
|
||||||
|
driver = 'chrome'
|
||||||
|
|
||||||
|
if driver == 'chrome':
|
||||||
|
options = ChromeOptions()
|
||||||
|
options.add_argument("--headless")
|
||||||
|
options.add_argument("--no-sandbox")
|
||||||
|
options.add_argument("--disable-dev-shm-usage")
|
||||||
|
options.add_argument("--disable-gpu")
|
||||||
|
options.add_argument("--window-size=1920x1080")
|
||||||
|
options.add_argument("--disable-extensions")
|
||||||
|
options.add_argument("--incognito")
|
||||||
|
for opt in ("chrome", "chromium"):
|
||||||
|
if Path(f"/usr/bin/{opt}").exists():
|
||||||
|
options.binary_location = f"/usr/bin/{opt}"
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
options.binary_location = "/usr/bin/chromium"
|
||||||
|
service = ChromeService("/usr/bin/chromedriver")
|
||||||
|
driver = webdriver.Chrome(service=service, options=options)
|
||||||
|
else:
|
||||||
|
options = FirefoxOptions()
|
||||||
|
options.add_argument('--headless')
|
||||||
|
options.add_argument("--private-window")
|
||||||
|
options.add_argument("--safe-mode")
|
||||||
|
options.add_argument("--new-instance")
|
||||||
|
for opt in ("firefox", "firefox-esr"):
|
||||||
|
if Path(f"/usr/bin/{opt}").exists():
|
||||||
|
options.binary_location = f"/usr/bin/{opt}"
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
options.binary_location = "/usr/bin/firefox"
|
||||||
|
service = FirefoxService("/usr/bin/geckodriver")
|
||||||
|
driver = webdriver.Firefox(service=service, options=options)
|
||||||
|
|
||||||
|
driver.get(website)
|
||||||
|
time_sleep(render_time)
|
||||||
|
domain = re.sub(r"https?://", "", website)
|
||||||
|
_io = io.BytesIO()
|
||||||
|
_io.write(driver.get_screenshot_as_png())
|
||||||
|
_io.seek(0)
|
||||||
|
driver.quit()
|
||||||
|
return discord.File(_io, f"{domain}.png")
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
async def get_interface_ip_addresses() -> Dict[str, list[Dict[str, str | bool | int]]]:
|
async def get_interface_ip_addresses() -> Dict[str, list[Dict[str, str | bool | int]]]:
|
||||||
addresses = await asyncio.to_thread(psutil.net_if_addrs)
|
addresses = await asyncio.to_thread(psutil.net_if_addrs)
|
||||||
|
@ -277,5 +335,41 @@ class OtherCog(commands.Cog):
|
||||||
for page in paginator.pages:
|
for page in paginator.pages:
|
||||||
await ctx.respond(page, ephemeral=secure)
|
await ctx.respond(page, ephemeral=secure)
|
||||||
|
|
||||||
|
@commands.slash_command()
|
||||||
|
async def screenshot(
|
||||||
|
self,
|
||||||
|
ctx: discord.ApplicationContext,
|
||||||
|
url: str,
|
||||||
|
browser: discord.Option(
|
||||||
|
str,
|
||||||
|
description="Browser to use",
|
||||||
|
choices=[
|
||||||
|
"chrome",
|
||||||
|
"firefox"
|
||||||
|
],
|
||||||
|
default="chrome"
|
||||||
|
),
|
||||||
|
render_timeout: int = 10
|
||||||
|
):
|
||||||
|
"""Takes a screenshot of a URL"""
|
||||||
|
await ctx.defer()
|
||||||
|
if ctx.user.id == 1019233057519177778:
|
||||||
|
if getattr(self.bot, "ALLOW_MATTHEW", False) is False:
|
||||||
|
return await ctx.respond("No.")
|
||||||
|
|
||||||
|
await ctx.respond("Taking screenshot...")
|
||||||
|
try:
|
||||||
|
screenshot = await asyncio.to_thread(
|
||||||
|
self.screenshot_website,
|
||||||
|
url,
|
||||||
|
browser,
|
||||||
|
render_timeout
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
console.log(f"Error taking screenshot: {e}")
|
||||||
|
return await ctx.edit(content=f"Error: {e}")
|
||||||
|
else:
|
||||||
|
await ctx.edit(content="Here's your screenshot!", file=screenshot)
|
||||||
|
|
||||||
def setup(bot):
|
def setup(bot):
|
||||||
bot.add_cog(OtherCog(bot))
|
bot.add_cog(OtherCog(bot))
|
||||||
|
|
|
@ -6,3 +6,5 @@ jishkucord==2.5.2
|
||||||
rich==12.5.1
|
rich==12.5.1
|
||||||
nltk==3.7
|
nltk==3.7
|
||||||
psutil==5.9.4
|
psutil==5.9.4
|
||||||
|
selenium==4.7.2
|
||||||
|
chromedriver==2.24.1
|
||||||
|
|
Loading…
Reference in a new issue