112 lines
3.9 KiB
Python
112 lines
3.9 KiB
Python
from core.module import Module
|
|
|
|
|
|
class SearchModule(Module):
|
|
name = "search"
|
|
version = "0.1.0"
|
|
description = "Search commands"
|
|
|
|
async def on_load(self) -> None:
|
|
builder = self.commands
|
|
|
|
@builder.command(
|
|
name="google",
|
|
description="Stub web search",
|
|
category="search",
|
|
usage=".google <query>",
|
|
example=".google overub",
|
|
)
|
|
async def google_cmd(event, args):
|
|
query = " ".join(args)
|
|
if not query:
|
|
await event.reply("Query required")
|
|
return
|
|
url = f"https://api.duckduckgo.com/?q={query}&format=json&no_redirect=1"
|
|
data = await self.app.http.get_json(url)
|
|
if not data:
|
|
await event.reply("Search unavailable")
|
|
return
|
|
text = data.get("AbstractText") or data.get("Heading") or "No result"
|
|
await event.reply(text)
|
|
|
|
@builder.command(
|
|
name="wiki",
|
|
description="Stub wiki search",
|
|
category="search",
|
|
usage=".wiki <query>",
|
|
)
|
|
async def wiki_cmd(event, args):
|
|
query = " ".join(args)
|
|
if not query:
|
|
await event.reply("Query required")
|
|
return
|
|
url = f"https://en.wikipedia.org/api/rest_v1/page/summary/{query}"
|
|
data = await self.app.http.get_json(url)
|
|
if not data:
|
|
await event.reply("Wiki unavailable")
|
|
return
|
|
extract = data.get("extract")
|
|
await event.reply(extract or "No result")
|
|
|
|
@builder.command(
|
|
name="yt",
|
|
description="Stub YouTube search",
|
|
category="search",
|
|
usage=".yt <query>",
|
|
)
|
|
async def yt_cmd(event, args):
|
|
query = " ".join(args)
|
|
key = self.app.config.get().get("services", {}).get("youtube_api_key")
|
|
if not key:
|
|
await event.reply("YouTube API key missing")
|
|
return
|
|
url = (
|
|
"https://www.googleapis.com/youtube/v3/search"
|
|
f"?part=snippet&q={query}&maxResults=1&key={key}"
|
|
)
|
|
data = await self.app.http.get_json(url)
|
|
if not data or not data.get("items"):
|
|
await event.reply("No results")
|
|
return
|
|
item = data["items"][0]
|
|
title = item["snippet"]["title"]
|
|
await event.reply(title)
|
|
|
|
@builder.command(
|
|
name="translate",
|
|
description="Stub translation",
|
|
category="search",
|
|
usage=".translate <text>",
|
|
)
|
|
async def translate_cmd(event, args):
|
|
text = " ".join(args)
|
|
url = self.app.config.get().get("services", {}).get("translate_url")
|
|
if not url:
|
|
await event.reply("Translate URL missing")
|
|
return
|
|
payload_url = f"{url}?q={text}"
|
|
data = await self.app.http.get_json(payload_url)
|
|
if not data:
|
|
await event.reply("Translation unavailable")
|
|
return
|
|
await event.reply(str(data))
|
|
|
|
@builder.command(
|
|
name="define",
|
|
description="Stub dictionary",
|
|
category="search",
|
|
usage=".define <word>",
|
|
)
|
|
async def define_cmd(event, args):
|
|
word = args[0] if args else ""
|
|
if not word:
|
|
await event.reply("Word required")
|
|
return
|
|
url = f"https://api.dictionaryapi.dev/api/v2/entries/en/{word}"
|
|
data = await self.app.http.get_json(url)
|
|
if not data or isinstance(data, dict) and data.get("title"):
|
|
await event.reply("Definition not found")
|
|
return
|
|
meaning = data[0]["meanings"][0]["definitions"][0]["definition"]
|
|
await event.reply(meaning)
|