mini-syndicate-py/chat.py

71 lines
2.3 KiB
Python

import sys
import asyncio
import random
import threading
import syndicate.mini.core as S
Present = S.Record.makeConstructor('Present', 'who')
Says = S.Record.makeConstructor('Says', 'who what')
if len(sys.argv) == 1:
conn_url = 'ws://localhost:8000/#chat'
elif len(sys.argv) == 2:
conn_url = sys.argv[1]
else:
sys.stderr.write(
'Usage: chat.py [ tcp://HOST[:PORT]#SCOPE | ws://HOST[:PORT]#SCOPE | unix:PATH#SCOPE ]\n')
sys.exit(1)
conn = S.Connection.from_url(conn_url)
_print = print
def print(*items):
_print(*items)
sys.stdout.flush()
## Courtesy of http://listofrandomnames.com/ :-)
names = ['Daria', 'Kendra', 'Danny', 'Rufus', 'Diana', 'Arnetta', 'Dominick', 'Melonie', 'Regan',
'Glenda', 'Janet', 'Luci', 'Ronnie', 'Vita', 'Amie', 'Stefani', 'Catherine', 'Grady',
'Terrance', 'Rey', 'Fay', 'Shantae', 'Carlota', 'Judi', 'Crissy', 'Tasha', 'Jordan',
'Rolande', 'Buster', 'Diamond', 'Dallas', 'Lissa', 'Yang', 'Charlena', 'Brooke', 'Haydee',
'Griselda', 'Kasie', 'Clara', 'Claudie', 'Darell', 'Emery', 'Barbera', 'Chong', 'Karin',
'Veronica', 'Karly', 'Shaunda', 'Nigel', 'Cleo']
me = random.choice(names) + '_' + str(random.randint(10, 1000))
with conn.turn() as t:
with conn.actor().react(t) as facet:
facet.add(Present(me))
facet.add(S.Observe(Present(S.CAPTURE)),
on_add=lambda t, who: print(who, 'joined'),
on_del=lambda t, who: print(who, 'left'))
facet.add(S.Observe(Says(S.CAPTURE, S.CAPTURE)),
on_msg=lambda t, who, what: print(who, 'said', repr(what)))
async def on_connected():
print('-'*50, 'Connected')
async def on_disconnected(did_connect):
if did_connect:
print('-'*50, 'Disconnected')
else:
await asyncio.sleep(2)
return bool(conn)
def accept_input():
global conn
while True:
line = sys.stdin.readline()
if not line:
conn.destroy()
conn = None
break
with conn.turn() as t:
t.send(Says(me, line.strip()))
loop = asyncio.get_event_loop()
loop.set_debug(True)
threading.Thread(target=accept_input, daemon=True).start()
loop.run_until_complete(conn.reconnecting_main(loop, on_connected, on_disconnected))
loop.stop()
loop.run_forever()
loop.close()