sender.py @ 743c0a981785

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()