#!/usr/bin/env python3 import json import sys import webbrowser from urllib.parse import urlencode, quote_plus DDG_URL="https://duckduckgo.com/" def lookup(query): resp = requests.get(DDG_URL, params={"q":query, "format": "json", "no_html": "1"}) print(resp.text) def send(event, obj=None): if obj is None: obj = {} obj["event"] = event json.dump(obj, sys.stdout) sys.stdout.write("\n") sys.stdout.flush() def recv(): for line in sys.stdin: if len(line.strip()) == 0: continue req = json.loads(line) if not isinstance(req, dict): send("noop", {"error": "invalid json"}) continue event = req.get("event", None) if not isinstance(event, str): send("noop", {"error": "invalid event type"}) continue yield event, req query = "" go_url = "" for event, req in recv(): if event == "complete": send("noop") elif event == "query": query = req.get("value", "") if query.startswith("ddg "): query = query[4:] elif query.startswith("ddg"): query = query[3:] if len(query) > 0 and query != "!": go_url = DDG_URL + "?" + urlencode({"q": query}, quote_via=quote_plus) send("queried", { "selections": [ { "id": 0, "name": f"search {query} on duckduckgo", "description": go_url, # "icon": "meow", # "content_type": "meow" } ] }) else: go_url = "" send("queried", {"selections": []}) elif event == "submit": send("close") if len(go_url) > 0: webbrowser.open(go_url) elif event == "quit": sys.exit(0) else: send("noop", {"error": "invalid event"})