#!/usr/bin/env python3.7 import Server class ClientConnection(object): """ Client connection object """ def __init__(self, server: Server, conn, addr, buffSize=4096, encoding='utf8'): self.server = server self.conn = conn self.addr = '{}:{}'.format(addr[0], addr[1]) self.name = '' self.buffSize = buffSize self.encoding = encoding def nameFormat(self): return '[{}({})]'.format(self.name, self.addr) def serve(self) -> None: """ Serve this connection and start listening for incoming message """ self.send( '[system] You are logged in as [{}({})]\n'.format(self.name, self.addr) + '[system] Type \'/quit\' to quit this conversation\n' + '[system] Type \'/name \' to change your name') while True: msg = self.recv() if len(msg) > 0: if msg[0] == '/': cmd = msg[1:5] if cmd == 'quit': self.send('[system] :goodbye:') break elif cmd == 'name': tmp = msg.split() if len(tmp) == 2: self.server.sendToAll( self, "changed name to {}".format(tmp[1])) self.name = tmp[1] else: self.send('[system] whitespace are not allowed') else: self.send('[system] unrecognised command') else: self.server.sendToAll(self, msg) else: break self.kill() def send(self, msg: str, end='') -> None: """ Wrapper method for socker.send and encode the message to set encoding """ self.conn.send(bytes(msg + end, self.encoding)) def recv(self) -> str: """ Wrapper method for socket.recv and decode the message from set encoding """ return self.conn.recv(self.buffSize).decode(self.encoding).split('\n')[0] def kill(self) -> None: """ Close this connection and remove it from server """ self.conn.close() self.server.removeClient(self)