"""
Серверное приложение для соединений, домашнее задание №2. Выполнил Владимир С
"""
import asyncio
from asyncio import transports


class ClientProtocol(asyncio.Protocol):
    login: str
    server: 'Server'
    transport: transports.Transport

    def __init__(self, server: 'Server'):
        self.server = server
        self.login = None

    def data_received(self, data: bytes):
        decoded = data.decode()
        print(decoded)

        if self.login is None:
            # login:User
            if decoded.startswith("login:"):
                tmp_login = decoded.replace("login:", "").replace("\r\n", "")
                if self.chk_login(tmp_login) or tmp_login == "":  # если уже такой существует или пустой
                    self.transport.write(
                        f"Логин <{tmp_login}> занят,выберите другой!".encode()
                    )
                    self.close_me()  # закрыть подключение
                else:
                    self.transport.write(
                        f"Привет, {tmp_login}!".encode()
                    )
                    self.login = tmp_login
                    self.send_history()
        else:
            self.send_message(decoded)

    def close_me(self):
        # тут в дальнейшем будут какие-то проверки перед закрытием
        self.transport.close()  # закрыть подключение, у сервера себя не удаляем, т.к. сработает connection_made() и там удалится

    def send_history(self):
        for msg in self.server.messages:
            self.transport.write(
                f"{msg}\r\n".encode()
            )

    def send_message(self, message):
        format_string = f"<{self.login}> {message}"
        encoded = format_string.encode()
        if len(self.server.messages) > 9:  # если сообщений больше чем нужно, удаляем одно перед добавлением
            self.server.messages.pop(0)

        self.server.messages.append(format_string)

        for client in self.server.clients:
            if client.login != self.login:
                client.transport.write(encoded)

    def connection_made(self, transport: transports.Transport):
        self.transport = transport
        self.server.clients.append(self)
        print("Соединение установлено")

    def connection_lost(self, exception):
        self.server.clients.remove(self)
        print("Соединение разорвано")

    def chk_login(self, new_login: str):  # проверяем есть ли уже такой логин
        for client in self.server.clients:
            if client.login == new_login:
                return 1
        return 0


class Server:
    clients: list
    messages: list  # тут будем хранить историю сообщений (10 шт)

    def __init__(self):
        self.clients = []
        self.messages = []

    def create_protocol(self):
        return ClientProtocol(self)

    async def start(self):
        loop = asyncio.get_running_loop()

        coroutine = await loop.create_server(
            self.create_protocol,
            "127.0.0.1",
            8888
        )

        print("Сервер запущен ...")

        await coroutine.serve_forever()


process = Server()
try:
    asyncio.run(process.start())
except KeyboardInterrupt:
    print("Сервер остановлен вручную")

477bd56a07bcdfcdddd8b5ce877c1170b19042bb
<mask token>


class ClientProtocol(asyncio.Protocol):
    login: str
    server: 'Server'
    transport: transports.Transport
    <mask token>
    <mask token>
    <mask token>
    <mask token>
    <mask token>
    <mask token>
    <mask token>
    <mask token>


class Server:
    clients: list
    messages: list

    def __init__(self):
        self.clients = []
        self.messages = []

    def create_protocol(self):
        return ClientProtocol(self)

    async def start(self):
        loop = asyncio.get_running_loop()
        coroutine = await loop.create_server(self.create_protocol,
            '127.0.0.1', 8888)
        print('Сервер запущен ...')
        await coroutine.serve_forever()


<mask token>

<mask token>


class ClientProtocol(asyncio.Protocol):
    login: str
    server: 'Server'
    transport: transports.Transport

    def __init__(self, server: 'Server'):
        self.server = server
        self.login = None
    <mask token>
    <mask token>

    def send_history(self):
        for msg in self.server.messages:
            self.transport.write(f'{msg}\r\n'.encode())
    <mask token>

    def connection_made(self, transport: transports.Transport):
        self.transport = transport
        self.server.clients.append(self)
        print('Соединение установлено')

    def connection_lost(self, exception):
        self.server.clients.remove(self)
        print('Соединение разорвано')
    <mask token>


class Server:
    clients: list
    messages: list

    def __init__(self):
        self.clients = []
        self.messages = []

    def create_protocol(self):
        return ClientProtocol(self)

    async def start(self):
        loop = asyncio.get_running_loop()
        coroutine = await loop.create_server(self.create_protocol,
            '127.0.0.1', 8888)
        print('Сервер запущен ...')
        await coroutine.serve_forever()


<mask token>

<mask token>


class ClientProtocol(asyncio.Protocol):
    login: str
    server: 'Server'
    transport: transports.Transport

    def __init__(self, server: 'Server'):
        self.server = server
        self.login = None

    def data_received(self, data: bytes):
        decoded = data.decode()
        print(decoded)
        if self.login is None:
            if decoded.startswith('login:'):
                tmp_login = decoded.replace('login:', '').replace('\r\n', '')
                if self.chk_login(tmp_login) or tmp_login == '':
                    self.transport.write(
                        f'Логин <{tmp_login}> занят,выберите другой!'.encode())
                    self.close_me()
                else:
                    self.transport.write(f'Привет, {tmp_login}!'.encode())
                    self.login = tmp_login
                    self.send_history()
        else:
            self.send_message(decoded)
    <mask token>

    def send_history(self):
        for msg in self.server.messages:
            self.transport.write(f'{msg}\r\n'.encode())
    <mask token>

    def connection_made(self, transport: transports.Transport):
        self.transport = transport
        self.server.clients.append(self)
        print('Соединение установлено')

    def connection_lost(self, exception):
        self.server.clients.remove(self)
        print('Соединение разорвано')

    def chk_login(self, new_login: str):
        for client in self.server.clients:
            if client.login == new_login:
                return 1
        return 0


class Server:
    clients: list
    messages: list

    def __init__(self):
        self.clients = []
        self.messages = []

    def create_protocol(self):
        return ClientProtocol(self)

    async def start(self):
        loop = asyncio.get_running_loop()
        coroutine = await loop.create_server(self.create_protocol,
            '127.0.0.1', 8888)
        print('Сервер запущен ...')
        await coroutine.serve_forever()


<mask token>

<mask token>
import asyncio
from asyncio import transports


class ClientProtocol(asyncio.Protocol):
    login: str
    server: 'Server'
    transport: transports.Transport

    def __init__(self, server: 'Server'):
        self.server = server
        self.login = None

    def data_received(self, data: bytes):
        decoded = data.decode()
        print(decoded)
        if self.login is None:
            if decoded.startswith('login:'):
                tmp_login = decoded.replace('login:', '').replace('\r\n', '')
                if self.chk_login(tmp_login) or tmp_login == '':
                    self.transport.write(
                        f'Логин <{tmp_login}> занят,выберите другой!'.encode())
                    self.close_me()
                else:
                    self.transport.write(f'Привет, {tmp_login}!'.encode())
                    self.login = tmp_login
                    self.send_history()
        else:
            self.send_message(decoded)

    def close_me(self):
        self.transport.close()

    def send_history(self):
        for msg in self.server.messages:
            self.transport.write(f'{msg}\r\n'.encode())

    def send_message(self, message):
        format_string = f'<{self.login}> {message}'
        encoded = format_string.encode()
        if len(self.server.messages) > 9:
            self.server.messages.pop(0)
        self.server.messages.append(format_string)
        for client in self.server.clients:
            if client.login != self.login:
                client.transport.write(encoded)

    def connection_made(self, transport: transports.Transport):
        self.transport = transport
        self.server.clients.append(self)
        print('Соединение установлено')

    def connection_lost(self, exception):
        self.server.clients.remove(self)
        print('Соединение разорвано')

    def chk_login(self, new_login: str):
        for client in self.server.clients:
            if client.login == new_login:
                return 1
        return 0


class Server:
    clients: list
    messages: list

    def __init__(self):
        self.clients = []
        self.messages = []

    def create_protocol(self):
        return ClientProtocol(self)

    async def start(self):
        loop = asyncio.get_running_loop()
        coroutine = await loop.create_server(self.create_protocol,
            '127.0.0.1', 8888)
        print('Сервер запущен ...')
        await coroutine.serve_forever()


process = Server()
try:
    asyncio.run(process.start())
except KeyboardInterrupt:
    print('Сервер остановлен вручную')

"""
Серверное приложение для соединений, домашнее задание №2. Выполнил Владимир С
"""
import asyncio
from asyncio import transports


class ClientProtocol(asyncio.Protocol):
    login: str
    server: 'Server'
    transport: transports.Transport

    def __init__(self, server: 'Server'):
        self.server = server
        self.login = None

    def data_received(self, data: bytes):
        decoded = data.decode()
        print(decoded)

        if self.login is None:
            # login:User
            if decoded.startswith("login:"):
                tmp_login = decoded.replace("login:", "").replace("\r\n", "")
                if self.chk_login(tmp_login) or tmp_login == "":  # если уже такой существует или пустой
                    self.transport.write(
                        f"Логин <{tmp_login}> занят,выберите другой!".encode()
                    )
                    self.close_me()  # закрыть подключение
                else:
                    self.transport.write(
                        f"Привет, {tmp_login}!".encode()
                    )
                    self.login = tmp_login
                    self.send_history()
        else:
            self.send_message(decoded)

    def close_me(self):
        # тут в дальнейшем будут какие-то проверки перед закрытием
        self.transport.close()  # закрыть подключение, у сервера себя не удаляем, т.к. сработает connection_made() и там удалится

    def send_history(self):
        for msg in self.server.messages:
            self.transport.write(
                f"{msg}\r\n".encode()
            )

    def send_message(self, message):
        format_string = f"<{self.login}> {message}"
        encoded = format_string.encode()
        if len(self.server.messages) > 9:  # если сообщений больше чем нужно, удаляем одно перед добавлением
            self.server.messages.pop(0)

        self.server.messages.append(format_string)

        for client in self.server.clients:
            if client.login != self.login:
                client.transport.write(encoded)

    def connection_made(self, transport: transports.Transport):
        self.transport = transport
        self.server.clients.append(self)
        print("Соединение установлено")

    def connection_lost(self, exception):
        self.server.clients.remove(self)
        print("Соединение разорвано")

    def chk_login(self, new_login: str):  # проверяем есть ли уже такой логин
        for client in self.server.clients:
            if client.login == new_login:
                return 1
        return 0


class Server:
    clients: list
    messages: list  # тут будем хранить историю сообщений (10 шт)

    def __init__(self):
        self.clients = []
        self.messages = []

    def create_protocol(self):
        return ClientProtocol(self)

    async def start(self):
        loop = asyncio.get_running_loop()

        coroutine = await loop.create_server(
            self.create_protocol,
            "127.0.0.1",
            8888
        )

        print("Сервер запущен ...")

        await coroutine.serve_forever()


process = Server()
try:
    asyncio.run(process.start())
except KeyboardInterrupt:
    print("Сервер остановлен вручную")
