Oh boy, here we go...
Finally getting back to poking at this. Apparently my Common Lisp has gotten
better in the past six months because good lord this code looks bad now.
Anyway, a few changes:
* Make it run on CCL by working around a usocket bug.
* Remove the workaround hacks. It's never gonna work with Fireplace anyway.
* Make the socket stream once instead of on every read/write so the GC doesn't hate us.
author |
Steve Losh <steve@stevelosh.com> |
date |
Sat, 09 Apr 2016 20:42:34 +0000 |
parents |
42c1b2d3d75c |
children |
(none) |
# coding=utf-8
from __future__ import print_function
import bencode
import socket
import sys
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import TerminalFormatter
from pprint import pformat
ADDRESS = 'localhost'
PORT = int(sys.argv[1])
def build_eval(data):
return {"op": "eval", "code": data.strip()}
def build_doc(data):
return {"op": "documentation", "symbol": data.strip()}
def pprint(obj):
# ...........………………_„-,-~''~''':::'':::':::::''::::''~
# ………._,-'':::::::::::::::::::::::::::::::::::::::::::''-„
# ………..,-':::::::::::::::::::::::::::::::::::::::::::::::
# ………,-'::::::::::::::::::::::::::„:„„-~-~--'~-'~--~-~--~-
# ……..,'::::::::::,~'': : : : : : : : : : : : : : : : '-|
# ……..|::::::::,-': : : : : : : : - -~''''¯¯''-„: : : : :\
# ……..|:::::::: : : : : : : : : _„„--~'''''~-„: : : : '|
# ……..'|:::::::,': : : : : : :_„„-: : : : : : : : ~--„_: |'
# ………|:::::: : : „--~~'''~~''''''''-„…_..„~''''''''''''¯|
# ………|:::::,':_„„-|: : :_„---~: : ''¯¯''''|: ~---„_: ||
# ……..,~-,_/'': : : |: _ o__): : |: :: : : : _o__): \..|
# ……../,'-,: : : : : ''-,_______,-'': : : : ''-„_____|
# ……..\: : : : : : : : : : : : : : :„: : : : :-,: : :\
# ………',:': : : : : : : : : : : : :,-'__: : : :_', ;: ,'
# ……….'-,-': : : : : :___„-: : :'': : ¯''~~'': ': : ~--|'
# ………….|: ,: : : : : : : : : : : : : : : : : : : :: :
# ………….'|: \: : : : : : : : -,„_„„-~~--~--„_: :: : : |
# …………..|: \: : : : : : : : : : : :-------~: : : : : |
# …………..|: :''-,: : : : : : : : : : : : : : : : : :
# …………..',: : :''-, : : : : : : : : : : : : : :: ,'
# ……………| : : : : : : : : :_ : : : : : : : : : : ,-'
# ……………|: : : : : : : : : : '''~----------~''
# …………._|: : : : : : : : : : : : : : : : : : :
# ……….„-''. '-,_: : : : : : : : : : : : : : : : : ,'
# ……,-''. . . . . '''~-„_: : : : : : : : : : : : :,-'''-„
# █▀█░█▀█░█▀█░█░█▄░█░▀█▀░
# █▀▀░█▀▀░█▀▄░█░█▀██░░█░░
# ▀░░░▀░░░▀░▀░▀░▀░░▀░░▀░░
print(highlight(pformat(obj), PythonLexer(), TerminalFormatter()))
def parse_fucked_bencode_data(data):
# im so sorry about this
while data:
for i in xrange(1, len(data)+1):
try:
yield bencode.bdecode(data[:i])
break
except:
continue
data = data[i:]
def repl():
sock = socket.socket()
sock.connect((ADDRESS, PORT))
sock.settimeout(0.5)
while True:
data = raw_input("> ")
if data.strip():
if data == 'quit':
return
if data.startswith('\\d'):
sock.send(bencode.bencode(build_doc(data[2:])))
elif data.startswith('\\'):
sock.send(bencode.bencode(eval(data[1:])))
else:
sock.send(bencode.bencode(build_eval(data)))
try:
incoming = sock.recv(1024*1024) # one megabyte ought to be enough for anybody
if incoming:
print("Message(s):")
print(incoming)
try:
pprint(bencode.bdecode(incoming))
except bencode.BTL.BTFailure:
for m in parse_fucked_bencode_data(incoming):
pprint(m)
print()
except socket.timeout:
pass
if __name__ == '__main__':
repl()