# ==================================== #
# WinDog multi-purpose chatbot #
# Licensed under AGPLv3 by OctoSpacc #
# ==================================== #
""" # windog config start # """
MicrosoftBingSettings = {}
""" # end windog config # """
from urlextract import URLExtract
from urllib import parse as urlparse
from urllib.request import urlopen, Request
def RandomHexString(length:int) -> str:
return ''.join([randchoice('0123456789abcdef') for i in range(length)])
def HttpReq(url:str, method:str|None=None, *, body:bytes=None, headers:dict[str, str]={"User-Agent": WebUserAgent}):
return urlopen(Request(url, method=method, data=body, headers=headers))
def cEmbedded(context:EventContext, data:InputMessageData):
language = data.user.settings.language
if len(data.command.tokens) >= 2:
# Find links in command body
text = (data.text_markdown + ' ' + data.text_plain)
elif (quoted := data.quoted) and (quoted.text_plain or quoted.text_markdown or quoted.text_html):
# Find links in quoted message
text = ((quoted.text_markdown or '') + ' ' + (quoted.text_plain or '') + ' ' + (quoted.text_html or ''))
else:
return send_status_400(context, language)
urls = URLExtract().find_urls(text)
if len(urls) > 0:
proto = 'https://'
url = urls[0]
urlLow = url.lower()
if urlLow.startswith('http://') or urlLow.startswith('https://'):
proto = url.split('://')[0] + '://'
url = '://'.join(url.split('://')[1:])
urlLow = '://'.join(urlLow.split('://')[1:])
urlDomain = urlLow.split('/')[0]
if urlDomain in ("facebook.com", "www.facebook.com", "m.facebook.com", "mbasic.facebook.com"):
url = "https://hlb0.octt.eu.org/cors-main.php/https://" + url
proto = ''
else:
if urlDomain in ("instagram.com", "www.instagram.com"):
urlDomain = "ddinstagram.com"
elif urlDomain in ("twitter.com", "x.com"):
urlDomain = "fxtwitter.com"
elif urlDomain == "vm.tiktok.com":
urlDomain = "vm.vxtiktok.com"
url = (urlDomain + '/' + '/'.join(url.split('/')[1:]))
return send_message(context, {"text_plain": f"{{{proto}{url}}}"})
return send_message(context, {"text_plain": "No links found."})
def cWeb(context:EventContext, data:InputMessageData):
language = data.user.settings.language
if not (query := data.command.body):
return send_status_400(context, language)
try:
query_url = urlparse.quote(query)
request = HttpReq(f'https://html.duckduckgo.com/html?q={query_url}')
caption = f'🦆🔎 "{query}": https://duckduckgo.com/?q={query_url}\n\n'
index = 0
for line in request.read().decode().replace('\t', ' ').splitlines():
if ' class="result__a" ' in line and ' href="//duckduckgo.com/l/?uddg=' in line:
index += 1
link = urlparse.unquote(line.split(' href="//duckduckgo.com/l/?uddg=')[1].split('&rut=')[0])
title = line.strip().split('')[0].strip().split('')[-1].strip().split('>')
if len(title) > 1:
title = html_unescape(title[1].strip())
caption += f'[{index}] {title} : {{{link}}}\n\n'
else:
continue
return send_message(context, {"text_plain": f'{caption}...'})
except Exception:
return send_status_error(context, language)
def cImages(context:EventContext, data:InputMessageData):
pass
def cNews(context:EventContext, data:InputMessageData):
pass
def cTranslate(context:EventContext, data:InputMessageData):
language = data.user.settings.language
instances = ["lingva.ml", "lingva.lunar.icu"]
language_to = data.command.arguments.language_to
text_input = (data.command.body or (data.quoted and data.quoted.text_plain))
if not (text_input and language_to):
return send_status_400(context, language)
try:
result = json.loads(HttpReq(f'https://{randchoice(instances)}/api/v1/auto/{language_to}/{urlparse.quote(text_input)}').read())
return send_message(context, {"text_plain": f"[{result['info']['detectedSource']} (auto) -> {language_to}]\n\n{result['translation']}"})
except Exception:
return send_status_error(context, language)
# unsplash source appears to be deprecated! {img_id}]\n
{img_url}", media={"url": img_url})) else: return send_status_400(context, language) except Exception: return send_status_error(context, language) RegisterModule(name="Internet", endpoints=[ SafeNamespace(names=["embedded"], handler=cEmbedded, body=False, quoted=False), SafeNamespace(names=["web"], handler=cWeb, body=True), SafeNamespace(names=["translate"], handler=cTranslate, body=False, quoted=False, arguments={ "language_to": True, "language_from": False, }), #SafeNamespace(names=["unsplash"], summary="Sends a picture sourced from Unsplash.", handler=cUnsplash), SafeNamespace(names=["safebooru"], handler=cSafebooru, body=False), ])