import sys
import os.path
import curses
import curses.textpad
from threading import Thread
from optparse import OptionParser
from random import randint
import pynorm
from pynorm.extra.manager import Manager, StopManager
USAGE = 'usage: %s [options] name' % sys.argv[0]
DEFAULT_ADDR = '224.1.2.3'
DEFAULT_PORT = 6003
def get_option_parser():
parser = OptionParser(usage=USAGE)
parser.set_defaults(address=DEFAULT_ADDR, port=DEFAULT_PORT)
parser.add_option('-a', '--address',
help='The IP address to bind to (default %s)' % DEFAULT_ADDR)
parser.add_option('-p', '--port', type=int,
help='The port number to listen on (default %i)' % DEFAULT_PORT)
parser.add_option('-i', '--iface',
help='The inteface to transmit multicast on.')
return parser
def main(argv):
(opts, args) = get_option_parser().parse_args(argv)
if len(args) != 2:
print get_option_parser().get_usage()
return 1
instance = pynorm.Instance()
session = instance.createSession(opts.address, opts.port)
if opts.iface:
session.setMulticastInterface(opts.iface)
session.startReceiver(1024*1024)
session.startSender(randint(0, 1000), 1024**2, 1400, 64, 16)
stream = session.streamOpen(1024*1024)
gui = Gui(stream, args[1])
manager = Manager(instance)
manager.register(pynorm.NORM_RX_OBJECT_UPDATED,
lambda e: gui.showText(e.object.streamRead(1024)[1]))
manager.start()
try:
curses.wrapper(gui)
except KeyboardInterrupt:
pass
print 'Exiting...'
stream.streamClose(True)
instance.stop()
manager.join()
return 0
class Gui(object):
def __init__(self, stream, name):
self.stream = stream
self.name = name
self.curline = 0
def __call__(self, stdscr):
self.stdscr = stdscr
maxy, maxx = stdscr.getmaxyx()
self.chatwin = curses.newwin(maxy - 2, maxx, 0, 0)
self.chatwin.scrollok(True)
typewin = curses.newwin(1, maxx, maxy-1, 0)
textbox = curses.textpad.Textbox(typewin)
while True:
self.send(textbox.edit())
typewin.erase()
def send(self, text):
msg = '%s: %s' % (self.name, text)
self.stream.streamWrite(msg)
self.stream.streamFlush(True)
self.showText(msg)
def showText(self, msg):
maxy, maxx = self.stdscr.getmaxyx()
if self.curline >= maxy:
self.curline = maxy - 1
self.chatwin.addstr(self.curline, 0, msg)
self.curline += 1
self.chatwin.refresh()
if __name__ == '__main__':
sys.exit(main(sys.argv))