示例#1
0
def echo_client():
    print('Hello. This is chat app. Please use next command:')
    print('1. ch_receiver - for changing interlocutor name')
    print('2. add_contact - for adding new existing contact to contact list')
    print('3. get_contacts - for printing contact list')
    print('4. del_contact - for deleting certain contact from contact list')
    print('5. exit - for closing app')
    print('Start your conversation:')

    user_name = input('Enter your nickname: ')

    # TODO: Rewrite - user must enter password
    user_password = '******'

    user_friend = change_receiver()

    chat_client = ChatClient('localhost', 5335, user_name)
    # Create TCP socket
    with socket(AF_INET, SOCK_STREAM) as sock:
        # Create connection with server
        chat_client.connect(sock)
        get_thread = GetMessagesThread(chat_client)

        # TODO: Rewrite - add registration for user
        if chat_client.check_presence() is True and chat_client.authenticate(user_password) is True:
            get_thread.start()
            while True:
                msg = input()
                if msg == 'exit':
                    break
                elif msg == 'ch_receiver':
                    user_friend = change_receiver()
                elif msg == 'get_contacts':
                    print(chat_client.get_contacts())
                elif msg == 'add_contact':
                    contact = input('Enter contact: ')
                    chat_client.add_contact(contact)
                elif msg == 'del_contact':
                    contact = input('Enter contact for deleting: ')
                    chat_client.del_contact(contact)
                else:
                    chat_client.send_jim_message(VALUE_MESSAGE, msg, user_friend)
            get_thread.stop()
            chat_client.disconnect()
示例#2
0
class MyWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None, user_name=None):
        QtWidgets.QWidget.__init__(self, parent)
        uic.loadUi('chat_gui.ui', self)
        self.pushButton.clicked.connect(QtWidgets.qApp.quit)
        self.setWindowTitle('Chat client: ' + user_name)

        self.sock = None
        self.chat_client = None
        self.get_thread = None

        self.chats = {}
        self.previous_contact_item = None

        self.pushButtonConnect.clicked.connect(self.on_button_connect_clicked)
        self.pushButtonSend.clicked.connect(self.on_button_send_clicked)
        self.pushButtonAddContact.clicked.connect(
            self.on_button_add_contact_clicked)
        self.pushButtonDeleteContact.clicked.connect(
            self.on_button_delete_contact_clicked)

        self.listWidgetContacts.currentItemChanged.connect(
            self.contacts_current_item_changed)

    def finished(self):
        self.get_thread.stop()
        self.sock.close()
        self.setGuiConnected(False)

    def on_button_connect_clicked(self):
        client_name = self.userName.displayText()
        self.setWindowTitle('Chat client: ' + client_name)

        # TODO: Rewrite - user must enter password
        user_password = '******'

        self.chat_client = ChatClient('localhost', 5335, client_name)
        # Create TCP socket
        self.sock = socket(AF_INET, SOCK_STREAM)
        # Create connection with server
        self.chat_client.connect(self.sock)
        self.get_thread = GetMessagesThread(self.chat_client)
        # connect message_recieved signal with highlight_contact slot
        self.get_thread.message_received.connect(self.highlight_contact)
        if self.chat_client.check_presence(
        ) is True and self.chat_client.authenticate(user_password) is True:
            self.get_thread.start()
            contacts = self.chat_client.get_contacts()
            self.listWidgetContacts.addItems(contacts)
            for item in contacts:
                # first item should be 2 for skipping first item in contacts_current_item_changed function
                self.chats[item] = [(2, 0, '')]
        # set current item in contacts list
        items = self.listWidgetContacts.findItems(contacts[0], Qt.MatchExactly)
        if len(items) > 0:
            for item in items:
                self.listWidgetContacts.setCurrentItem(item)
                break

    def on_button_send_clicked(self):
        message_text = self.lineEditMessage.displayText()
        if message_text != '':
            user_to = self.listWidgetContacts.currentItem().text()
            message_time = self.chat_client.send_jim_message(msg=message_text,
                                                             user_to=user_to)
            final_message = str(message_time) + ' ' + message_text
            self.listWidgetMessages.addItem(final_message)
            self.lineEditMessage.setText('')
            # write message to history list, first parameter 0 - local user, 1 - user_to
            if user_to in window.chats:
                logging.info('Message {} wrote to {} '.format(
                    message_text, user_to))
                window.chats[user_to].append((0, message_time, message_text))
            else:
                # Received first message from user_from
                window.chats[user_to] = ((0, message_time, message_text), )

    def on_button_add_contact_clicked(self):
        contact_name = self.addContactName.displayText()
        if contact_name != '':
            result = self.chat_client.add_contact(contact_name)
            if result is True:
                self.listWidgetContacts.addItem(contact_name)
                # create history for this contact
                self.chats[contact_name] = [(2, 0, '')]
            else:
                logging.info('Add contact return False')
            self.addContactName.clear()

    def on_button_delete_contact_clicked(self):
        contact_name = self.listWidgetContacts.currentItem().text()
        if contact_name != '':
            result = self.chat_client.del_contact(contact_name)
            if result is True:
                self.listWidgetContacts.takeItem(
                    self.listWidgetContacts.row(
                        self.listWidgetContacts.currentItem()))
            else:
                logging.info('Delete contact return False')
        pass

    def contacts_current_item_changed(self):
        user_to = self.listWidgetContacts.currentItem().text()
        logging.info('current item: {}'.format(user_to))
        if self.previous_contact_item and self.previous_contact_item != user_to:
            self.listWidgetMessages.clear()
            for item in self.chats[user_to]:
                if item[0] is 0:
                    final_message = str(item[1]) + ' ' + item[2]
                else:
                    final_message = str(
                        item[1]) + ' ' + user_to + ' > ' + item[2]
                if item[0] != 2:
                    self.listWidgetMessages.addItem(final_message)
                logging.info(item)
            normal_font = QtGui.QFont()
            normal_font.setBold(False)
            self.listWidgetContacts.currentItem().setFont(normal_font)

        self.previous_contact_item = user_to

    def highlight_contact(self, user_from):
        """
        Finds item by name in contact list and highlights it.
        Use this method for new messages.
        :param user_from: Contact name
        :return:
        """
        logging.info('change background in list')
        items = self.listWidgetContacts.findItems(user_from, Qt.MatchExactly)
        if len(items) > 0:
            for item in items:
                # item.setBackground(QtGui.QColor(UNREAD_COLOR))
                bold_font = QtGui.QFont()
                bold_font.setBold(True)
                item.setFont(bold_font)