--- /dev/null
+"""yourls url shortener for irssi"""
+import asyncio
+import cProfile
+import json
+import re
+import threading
+from urllib import request, parse
+
+import irssi
+
+DEBUG = False
+
+__version__ = "1.0.0"
+
+IRSSI = {
+ "authors": "terminaldweller",
+ "contact": "https://terminaldweller.com",
+ "name": "yourls",
+ "description": "uses yourls to shorten urls",
+ "license": "GPL3 or newer",
+ "url": "https://github.com/irssi/scripts.irssi.org",
+}
+
+
+def yourls_request(req, target: bytes, content: str) -> None:
+ """async wrapper for urllib.request.urlopen"""
+ timeout = irssi.settings_get_int(b"yourls_timeout")
+
+ with request.urlopen(req, timeout=timeout) as resp:
+ json_response = json.load(resp)
+ if DEBUG:
+ print(json_response)
+ short_url = json_response["shorturl"]
+ if DEBUG:
+ print(short_url)
+ url_pattern = r"(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))"
+ new_content = re.sub(url_pattern, short_url, content)
+ window = irssi.window_find_item(target)
+ window.prnt(new_content.encode("utf-8"))
+
+
+def yourls_command_handler(content: bytes, target: bytes) -> None:
+ """handle the command"""
+ yourls_url = irssi.settings_get_str(b"yourls_server_url").decode("utf-8")
+ yourls_token = irssi.settings_get_str(b"yourls_secret_sig_token").decode("utf-8")
+ yourls_min_length = irssi.settings_get_int(b"yourls_min_length")
+ yourls_format = irssi.settings_get_str(b"yourls_format").decode("utf-8")
+ yourls_action = irssi.settings_get_str(b"yourls_action").decode("utf-8")
+
+ url_pattern = r"(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))"
+
+ result = re.findall(url_pattern, content.decode("utf-8"))
+
+ if len(result) == 0:
+ return
+ if len(result[0][0]) < yourls_min_length:
+ return
+ form_fields = {
+ "url": result[0][0],
+ }
+
+ data = parse.urlencode(form_fields).encode("utf-8")
+ params = {
+ "signature": yourls_token,
+ "action": yourls_action,
+ "format": yourls_format,
+ "url": result[0][0],
+ }
+ url = yourls_url + "?" + parse.urlencode(params, doseq=True, safe=":/?&=")
+ if DEBUG:
+ print(url)
+
+ req = request.Request(url, method="POST")
+ # yourls_request(req, target, content.decode("utf-8"))
+ threading.Thread(
+ target=yourls_request(req, target, content.decode("utf-8"))
+ ).start()
+
+
+def yourls_signal_handler(*args, **kwargs) -> None:
+ """handle the message signal"""
+
+ server = args[0]
+ msg = args[1]
+ _ = args[2]
+ address = args[3]
+ target = args[4]
+
+ yourls_url = irssi.settings_get_str(b"yourls_server_url").decode("utf-8")
+ yourls_operation_mode = irssi.settings_get_str(b"yourls_operation_mode").decode(
+ "utf-8"
+ )
+ yourls_names = irssi.settings_get_str(b"yourls_name_list").decode("utf-8")
+ yourls_name_list = yourls_names.split(" ")
+ current = server.tag.decode("utf-8") + "/" + target.decode("utf-8")
+
+ if yourls_url == "":
+ return
+
+ for name in yourls_name_list:
+ if re.match(name, current):
+ if yourls_operation_mode == "whitelist":
+ break
+ elif yourls_operation_mode == "blacklist":
+ return
+ else:
+ print("invalid operation mode: must be whitelist or blacklist")
+ return
+
+ if DEBUG:
+ profiler = cProfile.Profile()
+ profiler.runctx("yourls_command_handler(msg, target)", globals(), locals())
+ profiler.print_stats()
+ else:
+ threading.Thread(target=yourls_command_handler(msg, target)).start()
+ yourls_command_handler(msg, target)
+
+
+def run_on_script_load() -> None:
+ """setup the script"""
+ irssi.settings_add_str(
+ b"misc",
+ b"yourls_server_url",
+ b"",
+ )
+ irssi.settings_add_str(
+ b"misc",
+ b"yourls_secret_sig_token",
+ b"",
+ )
+ irssi.settings_add_str(
+ b"misc",
+ b"yourls_format",
+ b"json",
+ )
+ irssi.settings_add_str(
+ b"misc",
+ b"yourls_action",
+ b"shorturl",
+ )
+ irssi.settings_add_str(
+ b"misc",
+ b"yourls_operation_mode",
+ b"whitelist",
+ )
+ irssi.settings_add_str(
+ b"misc",
+ b"yourls_name_list",
+ b"",
+ )
+ irssi.settings_add_int(
+ b"misc",
+ b"yourls_min_length",
+ 30,
+ )
+ irssi.settings_add_int(
+ b"misc",
+ b"yourls_timeout",
+ 15,
+ )
+
+ irssi.signal_add(b"message public", yourls_signal_handler)
+ irssi.signal_add(b"message private", yourls_signal_handler)
+
+
+run_on_script_load()