Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions config/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,27 @@
},
"URLFilter": {
"level": 0
},
"MyInstantsSearch": {
"level": 2,
"Cooldown": 10,
"triggers": [
{
"command": "!mi"
},
{
"command": "!mis"
}
],
"parameters": {
"keywords_banned": [
"earrape",
"rape",
"porn",
"algorithm",
"loud"
]
}
}
}
}
4 changes: 3 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ dependencies = [
"lxml",
"python-magic",
"yt-dlp @ git+https://github.com/yt-dlp/yt-dlp@master#egg=yt-dlp",
"translatepy"
"translatepy",
"requests"
]

[project.scripts]
Expand All @@ -43,6 +44,7 @@ version = {file = "VERSION"}
[project.optional-dependencies]
dev = [
"memory_profiler",
"types-requests",
Comment thread
Dolly132 marked this conversation as resolved.
"mypy",
"ruff",
]
Expand Down
2 changes: 2 additions & 0 deletions requirements-dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ yt-dlp @ git+https://github.com/yt-dlp/yt-dlp@5ff7a43623e3a92270f66a7e37b5fc53d7
# via
# -c requirements.txt
# torchlight (pyproject.toml)
types-requests
# via requests
translatepy==2.3
# via
# -c requirements.txt
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,4 @@ yt-dlp @ git+https://github.com/yt-dlp/yt-dlp@5ff7a43623e3a92270f66a7e37b5fc53d7
translatepy==2.3
# via torchlight (pyproject.toml)
langdetect==1.0.9
# via translatepy
# via translatepy
67 changes: 67 additions & 0 deletions src/torchlight/Commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from torchlight.AccessManager import AccessManager
from torchlight.AudioManager import AudioManager
from torchlight.Config import Config
from torchlight.MyInstants import myinstants_get_random_sound
from torchlight.Player import Player
from torchlight.PlayerManager import PlayerManager
from torchlight.Torchlight import Torchlight
Expand Down Expand Up @@ -1405,3 +1406,69 @@ async def _func(self, message: list[str], player: Player) -> int:
return 1
self.torchlight.SayChat(str(resp))
return 0


class MyInstantsSearch(BaseCommand):
async def _func(self, message: list[str], player: Player) -> int:
self.logger.debug(sys._getframe().f_code.co_name + " " + str(message))

if self.check_disabled(player):
return -1

current_time = self.torchlight.loop.time()
if player.myinstants_cooldown > current_time:
left = player.myinstants_cooldown - current_time
self.torchlight.SayPrivate(
player,
f"{{darkred}}[MyInstants] {{default}}You are currently on cooldown for the next {left:.1f} seconds",
)
return 1

search = message[1]
if search:
search = search.lower()

command_config = self.get_config()

keywords_banned: list[str] = []

if search and "parameters" in command_config and "keywords_banned" in command_config["parameters"]:
keywords_banned = command_config["parameters"]["keywords_banned"]

normalized_search = search.lower() if search else ""
for keyword_banned in keywords_banned:
pattern = re.compile(rf"\b{re.escape(keyword_banned.lower())}\b")
if pattern.search(normalized_search):
self.torchlight.SayPrivate(
player,
f"{{darkred}}[MyInstants] {{default}}Cannot play sounds for {search}",
)
return 1

# Default cooldown
cooldown = 10.0

if "Cooldown" in command_config:
cooldown = command_config["Cooldown"] * 1.0

player.myinstants_cooldown = current_time + cooldown

proxy = None
if self.torchlight.config["VoiceServer"]["Proxy"]:
proxy = self.torchlight.config["VoiceServer"]["Proxy"]

url = await asyncio.to_thread(myinstants_get_random_sound, search, proxy)

if url is None:
if search:
self.torchlight.SayPrivate(player, f"{{darkred}}[MyInstants]{{default}} No sound found for {search}")
else:
self.torchlight.SayPrivate(player, "{{darkred}}[MyInstants]{{default}} No sounds found")
return 1

audio_clip = self.audio_manager.AudioClip(player, url)
if not audio_clip:
return 1

self.torchlight.last_url = url
return audio_clip.Play()
Comment thread
Dolly132 marked this conversation as resolved.
52 changes: 52 additions & 0 deletions src/torchlight/MyInstants.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import re
import secrets
from urllib.parse import urljoin

import requests
from bs4 import BeautifulSoup

MYINSTANTS_URL = "https://www.myinstants.com"

HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}


def myinstants_get_random_sound(query: str | None, proxy: str | None) -> str | None:
if not query:
search_url = f"{MYINSTANTS_URL}/en/index/us/"
else:
search_url = f"{MYINSTANTS_URL}/en/search/"

proxies = None
if proxy:
proxies = {
"http": proxy,
"https": proxy,
}

try:
r = requests.get(
search_url, headers=HEADERS, params={"name": query} if query else None, timeout=10, proxies=proxies
)
except requests.RequestException:
return None

if r.status_code != 200:
return None

soup = BeautifulSoup(r.text, "html.parser")

buttons = soup.find_all("button", onclick=True)
mp3_paths = []

for btn in buttons:
onclick_value = btn["onclick"]
if "play(" in onclick_value:
match = re.search(r"play\('(.+?\.mp3)'", onclick_value)
if match:
mp3_paths.append(match.group(1))

if not mp3_paths:
return None

mp3_url = urljoin(MYINSTANTS_URL, secrets.choice(mp3_paths))
return mp3_url
Comment thread
Dolly132 marked this conversation as resolved.
1 change: 1 addition & 0 deletions src/torchlight/Player.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ def __init__(
self.storage: dict = {}
self.active = False
self.chat_cooldown = 0
self.myinstants_cooldown: float = 0.0

def OnConnect(self) -> None:
if "Audio" not in self.storage:
Expand Down
2 changes: 1 addition & 1 deletion src/torchlight/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "1.4.0"
__version__ = "1.5.0"