def get_nickname_client(connection): # provavelmente cada user deve ser único is_valid_user = False nickname_client = None while not is_valid_user: try: connection.send( util.message_serialize("-", "-", "Digite um nickname válido:")) nameInfo = util.message_parser(read_socket_data(connection)) if nameInfo is None: break nickname_client = nameInfo.get("data", "") is_valid_user = not nickname_client in clients.values() if (is_valid_user): return nickname_client connection.send( util.message_serialize( "-", "-", "Um usuário com esse nickname já existe.")) except: return None
def handle_private_message(connection, nickname_client, nickname_recipient, message): recipient_connection = get_key_by_value(clients, nickname_recipient) if recipient_connection: private_message = f"[PRIVADO] {nickname_client} escreveu: {message}" recipient_connection.send( util.message_serialize(nickname_recipient, "privado", private_message)) else: user_not_exist_message = f"O servidor escreveu: o usuário {nickname_recipient} não existe." connection.send( util.message_serialize(nickname_client, "-", user_not_exist_message))
def perform_action_by_command(connection, clients, nickname_client, message_information): try: command = message_information.get("command", "") nickname_recipient = message_information.get("nickname", "") payload = message_information.get("data", "") if nickname_recipient == "*" and command == "-": broadcast_chat_message(clients, payload, nickname_client) elif nickname_recipient == ">" and command == "sair": raise ClientDisconnection("Cliente executou comando de saída") elif nickname_recipient == ">" and command == "lista": connection.send( util.message_serialize(nickname_client, "lista", get_client_list(clients))) elif (nickname_recipient != "*" or nickname_recipient == ">") and command == "privado": handle_private_message(connection, nickname_client, nickname_recipient, payload) else: print( f"O cliente *{nickname_client}* enviou um comando não reconhecido." ) except: handle_client_exit_command(connection, clients, nickname_client)
def broadcast_chat_message(clients, message, nickname=""): formated_message = f"[SALA] {nickname} escreveu: {message}" print(formated_message) for connection in clients.copy(): try: connection.send(util.message_serialize("*", "", formated_message)) except: del clients[connection]
def send_messages(connection, stop_event): keyboard_input = input() try: while not stop_event.is_set(): if (keyboard_input == "sair()"): connection.send(util.message_serialize('>', 'sair', '')) handle_disconnection(connection, stop_event) break elif (keyboard_input == "lista()"): connection.send(util.message_serialize('>', 'lista', '')) else: PRIVATE_CHAT_REGEX = r"^privado\((.{1,16})\)\s(.*)$" groups_values = re.findall(PRIVATE_CHAT_REGEX, keyboard_input) if len(groups_values): nickname, data = groups_values[0] connection.send( util.message_serialize(nickname, 'privado', data)) else: connection.send( util.message_serialize('*', '-', keyboard_input)) keyboard_input = input() except: handle_disconnection(connection, stop_event)
def send_welcome_to_new_user(connection, nickname_client): msg_welcome = f"Seja bem vindo {nickname_client}!\n" + \ "Para listar usuários, digite lista(); \n" + \ "Para sair do chat, digite sair();" connection.send(util.message_serialize(nickname_client, "", msg_welcome)) return nickname_client