Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.66 KB | None | 0 0
  1. import asyncio
  2. from asyncio import transports
  3. from typing import Optional
  4.  
  5.  
  6. class ServerProtocol(asyncio.Protocol):
  7.     login: str = None
  8.     server: 'Server'
  9.     transport: transports.Transport
  10.  
  11.     def __init__(self, server: 'Server'):
  12.         self.server = server
  13.  
  14.     # base protocol overrides
  15.     def data_received(self, data: bytes):
  16.         content = data.decode()
  17.         print(content)
  18.  
  19.         if self.login is not None:
  20.             self.send_message(content)
  21.             self.server.msg_history.append(content)
  22.         else:
  23.             if content.startswith('login'):
  24.                 login = content.replace('login:', '').rstrip()
  25.  
  26.                 for user in self.server.clients:
  27.                     if user.login == login:
  28.                         self.transport.write('This login is already taken, try another one!'.encode())
  29.                         return
  30.  
  31.                 self.login = login
  32.                 self.server.clients.append(self)
  33.                 self.server.send_history(self)
  34.             else:
  35.                 self.transport.write('Invalid login message!\n'.encode())
  36.  
  37.     def connection_lost(self, exception):
  38.         self.server.clients.remove(self)
  39.         print('Client disconnected')
  40.  
  41.     def connection_made(self, transport: transports.Transport):
  42.         self.server.clients.append(self)
  43.         self.transport = transport
  44.         print(f'New connection established\n')
  45.  
  46.     def send_message(self, content: str):
  47.         message = f"{self.login}: {content.rstrip()}\n"
  48.  
  49.         for user in self.server.clients:
  50.             user.transport.write(message.encode())
  51.  
  52.  
  53. class Server:
  54.     clients: list
  55.     msg_history: list
  56.     protocol = ServerProtocol
  57.  
  58.     def __init__(self):
  59.         self.clients = []
  60.         self.msg_history = []
  61.  
  62.     def build_protocol(self):
  63.         return ServerProtocol(self)
  64.  
  65.     def send_history(self, client: ServerProtocol):
  66.         last_messages = self.msg_history[-10:]
  67.  
  68.         client.transport.write(f'Welcome, {client.login}!\n'.encode())
  69.  
  70.         for message in last_messages:
  71.             client.transport.write(message.encode())
  72.  
  73.  
  74.     async def start(self):
  75.         loop = asyncio.get_running_loop()
  76.  
  77.         subroutine = await loop.create_server(
  78.             protocol_factory=self.build_protocol,
  79.             host='127.0.0.1',
  80.             port=12234
  81.         )
  82.         print('Server started...')
  83.  
  84.         await subroutine.serve_forever()
  85.  
  86.  
  87. def main():
  88.  
  89.     process = Server()
  90.  
  91.     try:
  92.         asyncio.run(process.start())
  93.     except KeyboardInterrupt:
  94.         print('\nServer stopped manually (keyboard interrupted)')
  95.  
  96.  
  97. if __name__ == '__main__':
  98.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement