-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuser_b.py
151 lines (126 loc) · 5.3 KB
/
user_b.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
import sys
import threading
import customtkinter
from customtkinter import END
from googletrans import Translator
import time
from autocorrect import Speller
import tkinter as tk
import deepl
import zmq
from PyQt5.QtWidgets import QMainWindow, QDialog, QApplication
import new_group_ui
from main_ui import Ui_MainWindow
dest = "EN-US"
auth_key = "fda59a42-7456-da4c-771c-36b1bab7595c:fx"
translator = deepl.Translator(auth_key)
"""
class Translation_Prototype:
def translate(self, dest, input_txt):
translator = Translator()
spell = Speller()
dest_lang = spell(dest)
input_tr = "french"
return translator.translate(spell(input_txt), src=input_tr, dest=dest_lang).text
"""
class ChatApp(QMainWindow, Ui_MainWindow):
def __init__(self, username, port, partner_ports):
super().__init__()
self.setupUi(self)
self.group_users = []
self.username = username
self.port = port
self.partner_ports = partner_ports
self.setWindowTitle(username)
self.listWidget.itemClicked.connect(self.is_clicked)
self.last_selected_item_text = ''
self.listWidgetItems = self.listWidget
self.action_newGroup.triggered.connect(self.add_item)
self.context = zmq.Context()
self.socket_send = self.context.socket(zmq.PUB)
self.socket_send.bind(f"tcp://*:{self.port}")
self.socket_receive = self.context.socket(zmq.SUB)
self.socket_receive.setsockopt_string(zmq.SUBSCRIBE, "")
for partner_port in self.partner_ports:
self.socket_receive.connect(f"tcp://127.0.0.1:{partner_port}")
self.send_button.clicked.connect(self.send_message)
self.receive_thread = threading.Thread(target=self.receive_messages)
self.receive_thread.daemon = True
self.receive_thread.start()
def add_item(self):
"""Open a dialog to create a new group and send group invitations."""
a = NewGroup()
a.exec_()
self.group_users = a.get_users()
self.listWidget.addItem('Group')
for user in self.group_users:
if user != self.username:
self.socket_send.send_string(f'group:{self.username}:{user}')
def is_clicked(self, item):
"""Handle item selection in the list of users/groups."""
selected_item_text = item.text()
if self.last_selected_item_text != selected_item_text:
self.textEdit_show_messages.clear()
self.last_selected_item_text = selected_item_text
def send_message(self):
message_text = self.input_text.toPlainText()
if not message_text:
return
message = f"{self.username}: {message_text}"
selected_users = self.get_selected_users()
if selected_users != self.username:
self.textEdit_show_messages.append(f'{message}')
self.socket_send.send_string(f"{selected_users}:{message}")
print(message, 'send')
self.input_text.clear()
def get_selected_users(self):
"""Get the selected user/group for sending messages."""
return self.corresponding_user.text()
def receive_messages(self):
while True:
try:
message = self.socket_receive.recv_string()
#message = trans.translate("English", message)
print(message)
recipient, sender, text = message.split(":", 2)
text = translator.translate_text(text, target_lang=dest )
if recipient == 'group' and text == self.username:
self.listWidget.addItem('Group')
if recipient == self.username and self.corresponding_user.text() == sender:
self.textEdit_show_messages.append(f"{sender}: {text}")
elif recipient == 'Group' and self.corresponding_user.text() == 'Group':
self.textEdit_show_messages.append(f'{sender}: {text}')
except zmq.ZMQError as zmq_error:
print(f"ZMQ Error: {zmq_error}")
except Exception as e:
print(f"Error occurred: {e}")
def closeEvent(self, event):
"""Close the application, closing sockets and terminating context."""
self.socket_send.close()
self.socket_receive.close()
self.context.term()
super().closeEvent(event)
class NewGroup(new_group_ui.Ui_Dialog, QDialog):
"""Initialize the dialog for creating a new group."""
def __init__(self):
super().__init__()
self.setupUi(self)
self.create_btn.clicked.connect(self.close_window)
def close_window(self):
"""Close the new group dialog."""
self.close()
def get_users(self):
"""Get the selected users for a new group."""
users = []
if self.user_a.isChecked():
users.append('User A')
if self.user_b.isChecked():
users.append('User B')
if self.user_c.isChecked():
users.append('User C')
return users
if __name__ == '__main__':
app = QApplication(sys.argv)
user_a = ChatApp(username='User B', port=5556, partner_ports=[5555, 5557])
user_a.show()
sys.exit(app.exec_())