plugins: add finger plugin
This commit is contained in:
parent
b884aed3a8
commit
8791d82cdd
|
@ -1,7 +1,5 @@
|
||||||
TODO
|
TODO
|
||||||
----------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
provide a plugin interface for schemes
|
|
||||||
finger
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -60,3 +58,5 @@ preferences per site
|
||||||
basic mouse support
|
basic mouse support
|
||||||
basic local browsing
|
basic local browsing
|
||||||
search in page
|
search in page
|
||||||
|
plugin interface for schemes
|
||||||
|
finger plugin
|
||||||
|
|
12
plugins/finger/README.md
Normal file
12
plugins/finger/README.md
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
Finger plugin for Bebop
|
||||||
|
=======================
|
||||||
|
|
||||||
|
This is a minimal Finger protocol plugin for [Bebop][bebop], refer to its docs
|
||||||
|
for details.
|
||||||
|
|
||||||
|
[bebop]: https://git.dece.space/Dece/Bebop
|
||||||
|
|
||||||
|
Requires:
|
||||||
|
|
||||||
|
* Bebop >= 0.2.0
|
||||||
|
* A `finger` command on your system
|
1
plugins/finger/bebop_finger/__init__.py
Normal file
1
plugins/finger/bebop_finger/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
from .plugin import plugin
|
53
plugins/finger/bebop_finger/plugin.py
Normal file
53
plugins/finger/bebop_finger/plugin.py
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
import subprocess
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
from bebop.browser.browser import Browser
|
||||||
|
from bebop.navigation import parse_url
|
||||||
|
from bebop.page import Page
|
||||||
|
from bebop.plugins import SchemePlugin
|
||||||
|
|
||||||
|
|
||||||
|
class FingerPlugin(SchemePlugin):
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
super().__init__("finger")
|
||||||
|
|
||||||
|
def open_url(self, browser: Browser, url: str) -> Optional[str]:
|
||||||
|
parts = parse_url(url, default_scheme="finger")
|
||||||
|
host = parts["netloc"]
|
||||||
|
user = parts["path"][1:] # Strip leading '/' from path.
|
||||||
|
if not host:
|
||||||
|
browser.set_status_error(f"Could not parse {url}.")
|
||||||
|
return None
|
||||||
|
|
||||||
|
raw_output = self.request(browser, host, user)
|
||||||
|
if raw_output is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
try:
|
||||||
|
output = raw_output.decode(errors="replace")
|
||||||
|
except ValueError:
|
||||||
|
browser.set_status_error("Failed to decode finger output.")
|
||||||
|
return None
|
||||||
|
|
||||||
|
browser.load_page(Page.from_text(output))
|
||||||
|
browser.current_url = url
|
||||||
|
return url
|
||||||
|
|
||||||
|
def request(self, browser: Browser, host: str, user: str):
|
||||||
|
target = f"{user}@{host}"
|
||||||
|
browser.set_status(f"Requesting {target}…")
|
||||||
|
command = ["finger", target]
|
||||||
|
try:
|
||||||
|
output = subprocess.check_output(command, stderr=subprocess.PIPE)
|
||||||
|
except FileNotFoundError:
|
||||||
|
browser.set_status_error("Finger program not found.")
|
||||||
|
except subprocess.CalledProcessError as exc:
|
||||||
|
finger_error = exc.stderr.decode(errors="replace").replace("\n", "")
|
||||||
|
error = f"Finger failed with code {exc.returncode}: {finger_error}"
|
||||||
|
browser.set_status_error(error)
|
||||||
|
else:
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
plugin = FingerPlugin()
|
18
plugins/finger/setup.cfg
Normal file
18
plugins/finger/setup.cfg
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
[metadata]
|
||||||
|
name = bebop-browser-finger
|
||||||
|
version = 0.1.0
|
||||||
|
description = Finger plugin for the Bebop terminal browser
|
||||||
|
long_description = file: README.md
|
||||||
|
license = GPLv3
|
||||||
|
author = dece
|
||||||
|
author-email = shgck@pistache.land
|
||||||
|
home-page = https://git.dece.space/Dece/Bebop
|
||||||
|
classifiers =
|
||||||
|
Environment :: Console
|
||||||
|
Programming Language :: Python :: 3
|
||||||
|
Programming Language :: Python :: 3.7
|
||||||
|
|
||||||
|
[options]
|
||||||
|
packages = bebop_finger
|
||||||
|
python_requires = >= 3.7
|
||||||
|
setup_requires = setuptools >= 38.3.0
|
Reference in a new issue