├── PyPhone.py ├── README.md ├── _config.yml ├── config.cnf ├── icons ├── backspace.png ├── cil-window-minimize.png ├── cil-x.png ├── mic.png ├── mute.png ├── pause-button.png ├── phone.png ├── telephone.png └── telephonex.png ├── images ├── Image ├── Image1.png ├── Image2.png └── Image3.png ├── modules └── Initiator.py ├── ngrok.yml └── sounds ├── ringback_tone.mp3 └── ringtone.mp3 /PyPhone.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from PyQt5 import QtCore, QtGui, QtWidgets 4 | from PyQt5.QtCore import QPoint 5 | from PyQt5.QtCore import QThread,pyqtSignal 6 | from PyQt5.QtGui import QCursor 7 | from PyQt5.QtCore import Qt 8 | from PyQt5.QtWidgets import QApplication 9 | from PyQt5.QtWidgets import QWidget 10 | import mysql.connector 11 | import json 12 | import playsound 13 | import requests 14 | from modules import Initiator 15 | import pyaudio 16 | import threading 17 | import socket 18 | import re 19 | import time 20 | import sys 21 | 22 | with open("ngrok.yml",'r') as NGROKFILE: 23 | NGROK=NGROKFILE.read() 24 | NGROK=NGROK.split(': ') 25 | Initiator.initiateServer(NGROK[1]) 26 | 27 | NumberDialed="" 28 | with open("config.cnf",'r') as CONF: 29 | CONFDATA=CONF.read() 30 | CONFDATA=CONFDATA.split(" | ") 31 | PHONENO=CONFDATA[0] 32 | print(PHONENO) 33 | conn=mysql.connector.connect( 34 | host=CONFDATA[1], 35 | user=CONFDATA[2], 36 | passwd=CONFDATA[3], 37 | database=CONFDATA[4] 38 | ) 39 | c=conn.cursor(buffered=True) 40 | CALLSTAT=False 41 | ACK='' 42 | FIRST=True 43 | RECEIVECALL="wait" 44 | CONNRECV,CONNSEND='','' 45 | MUTE,SPK=False,False 46 | CIP="" 47 | SOCK="" 48 | NotPicked=True 49 | Ringing=True 50 | class ServerThread(QThread): 51 | IncommingCall=pyqtSignal(int) 52 | OngoingCall=pyqtSignal(int) 53 | CallEnded=pyqtSignal(int) 54 | def run(self): 55 | global CALLSTAT,ACK,MUTE,SPK,CIP 56 | IP=socket.gethostbyname(socket.gethostname()) 57 | IP="127.0.0.1" 58 | PORT=6595 59 | SOCK=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 60 | def runNgrok(): 61 | Initiator.runServer(PORT) 62 | threading.Thread(target=runNgrok).start() 63 | SOCK.bind((IP,PORT)) 64 | SOCK.listen(2) 65 | CHUNK_SIZE = 1024 # 512 66 | AUDIO_FORMAT = pyaudio.paInt16 67 | CHANNELS = 1 68 | RATE = 20000 69 | AUDIO = pyaudio.PyAudio() 70 | PLAY_STREAM = AUDIO.open(format=AUDIO_FORMAT, channels=CHANNELS, rate=RATE, output=True, frames_per_buffer=CHUNK_SIZE) 71 | RECORD_STREAM = AUDIO.open(format=AUDIO_FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK_SIZE) 72 | 73 | def CLIENTCONN(CIP,CADDR): 74 | print(CADDR) 75 | global ACK, RECEIVECALL,CALLSTAT 76 | def RINGTONE(): 77 | while Ringing: 78 | playsound.playsound("sounds\\ringtone.mp3") 79 | def SEND(): 80 | while CALLSTAT==False: 81 | try: 82 | if MUTE==False: 83 | DATA=RECORD_STREAM.read(1024) 84 | CIP.send(DATA) 85 | except Exception as ERROR: 86 | print("Error1: ", ERROR) 87 | CIP.close() 88 | self.CallEnded.emit(1) 89 | break 90 | CIP.close() 91 | def RECV(): 92 | while CALLSTAT==False: 93 | try: 94 | DATA=CIP.recv(1024) 95 | if SPK==False: 96 | PLAY_STREAM.write(DATA) 97 | except Exception as ERROR: 98 | print("Error2: ", ERROR) 99 | CIP.close() 100 | self.CallEnded.emit(1) 101 | break 102 | CIP.close() 103 | try: 104 | ACK=CIP.recv(27).decode() 105 | print(re.match("PID\:[1-9]{10} ACK\:Complete",ACK)) 106 | if re.match("PID\:[1-9]{10} ACK\:Complete",ACK)!=None: 107 | self.IncommingCall.emit(1) 108 | Ringing=True 109 | threading.Thread(target=RINGTONE).start() 110 | while True: 111 | if RECEIVECALL == "OK": 112 | CIP.send("ACK:Complete".encode("UTF-8")) 113 | Ringing=False 114 | self.OngoingCall.emit(1) 115 | CONNSEND=threading.Thread(target=SEND) 116 | CONNRECV=threading.Thread(target=RECV) 117 | CONNSEND.start() 118 | CONNRECV.start() 119 | RECEIVECALL="wait" 120 | break 121 | elif RECEIVECALL == "REJECT": 122 | CIP.send("ACK:Reject".encode("UTF-8")) 123 | Ringing=False 124 | RECEIVECALL="wait" 125 | CIP.close() 126 | break 127 | else: 128 | pass 129 | else: 130 | print("ABORT") 131 | CIP.close() 132 | except Exception as ERROR: 133 | print("Errored: ", ERROR) 134 | 135 | time.sleep(3) 136 | OPT=requests.get("http://localhost:4040/api/tunnels").text 137 | OPT=json.loads(OPT) 138 | OPT=OPT['tunnels'][0]['public_url'] 139 | OPT=OPT.split(":") 140 | print(OPT) 141 | c.execute("update data set Port=%s where Phoneno=%s"%(OPT[2],PHONENO)) 142 | conn.commit() 143 | while True: 144 | CIP,CADDR=SOCK.accept() 145 | threading.Thread(target=CLIENTCONN,args=(CIP,CADDR)).start() 146 | 147 | class ClientThread(QThread): 148 | CallEnded=pyqtSignal(int) 149 | CallRinging=pyqtSignal(int) 150 | CallPicked=pyqtSignal(int) 151 | def run(self): 152 | global NumberDialed,CALLSTAT,MUTE,SPK 153 | IP="0.tcp.in.ngrok.io" 154 | CHUNK_SIZE = 1024 # 512 155 | AUDIO_FORMAT = pyaudio.paInt16 156 | CHANNELS = 1 157 | RATE = 20000 158 | AUDIO = pyaudio.PyAudio() 159 | PLAY_STREAM = AUDIO.open(format=AUDIO_FORMAT, channels=CHANNELS, rate=RATE, output=True, frames_per_buffer=CHUNK_SIZE) 160 | RECORD_STREAM = AUDIO.open(format=AUDIO_FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK_SIZE) 161 | def CLIENTCONN(SOCK): 162 | 163 | def RINGBACK(): 164 | while NotPicked: 165 | playsound.playsound("sounds\\ringback_tone.mp3") 166 | def SEND(): 167 | while CALLSTAT==False: 168 | try: 169 | if MUTE==False: 170 | DATA=RECORD_STREAM.read(1024) 171 | SOCK.sendall(DATA) 172 | except Exception as ERROR: 173 | print("Error1: ", ERROR) 174 | SOCK.close() 175 | self.CallEnded.emit(1) 176 | break 177 | def RECV(): 178 | while CALLSTAT==False: 179 | try: 180 | if SPK==False: 181 | DATA=SOCK.recv(1024) 182 | PLAY_STREAM.write(DATA) 183 | except Exception as ERROR: 184 | print("Error2: ", ERROR) 185 | SOCK.close() 186 | self.CallEnded.emit(1) 187 | break 188 | try: 189 | NotPicked=True 190 | threading.Thread(target=RINGBACK).start() 191 | SOCK.send(f"PID:{PHONENO} ACK:Complete".encode()) 192 | RUT=SOCK.recv(12).decode() 193 | if RUT=="ACK:Complete": 194 | NotPicked=False 195 | self.CallPicked.emit(1) 196 | threading.Thread(target=SEND).start() 197 | threading.Thread(target=RECV).start() 198 | else: 199 | print("ABORT, No ACK Received!") 200 | NotPicked=False 201 | except Exception as ERROR: 202 | print("ERRORED: ", ERROR) 203 | def GETPORT(): 204 | global SOCK 205 | print("Dialer") 206 | Phoneno=NumberDialed 207 | c.execute("Select * from data where Phoneno=%s"%Phoneno) 208 | GETDATA=c.fetchone() 209 | try: 210 | PORT=int(GETDATA[1]) 211 | SOCK=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 212 | SOCK.connect((IP,PORT)) 213 | CLIENTCONN(SOCK) 214 | except: 215 | pass 216 | GETPORT() 217 | 218 | class Ui_MainWindow(QWidget): 219 | def setupUi(self, MainWindow): 220 | MainWindow.setObjectName("MainWindow") 221 | MainWindow.setWindowIcon(QtGui.QIcon("icons/phone.png")) 222 | MainWindow.resize(331, 560) 223 | MainWindow.setMinimumSize(QtCore.QSize(331, 560)) 224 | MainWindow.setMaximumSize(QtCore.QSize(331, 560)) 225 | MainWindow.setStyleSheet("") 226 | self.centralwidget = QtWidgets.QWidget(MainWindow) 227 | self.centralwidget.setObjectName("centralwidget") 228 | self.DIALER = QtWidgets.QWidget(self.centralwidget) 229 | self.DIALER.setGeometry(QtCore.QRect(0, 29, 331, 531)) 230 | self.DIALER.setStyleSheet("QWidget{\n" 231 | " background-color: rgb(18, 18, 18);\n" 232 | "}") 233 | self.DIALER.setObjectName("DIALER") 234 | self.KEY5 = QtWidgets.QPushButton(self.DIALER) 235 | self.KEY5.setGeometry(QtCore.QRect(130, 210, 61, 61)) 236 | font = QtGui.QFont() 237 | font.setPointSize(25) 238 | self.KEY5.setFont(font) 239 | self.KEY5.setStyleSheet("QPushButton{\n" 240 | "border:2px solid;\n" 241 | "border-radius:20px;\n" 242 | "color: rgb(141, 141, 141);\n" 243 | "border-color: rgb(139, 139, 139);\n" 244 | "background-color:rgb(39, 39, 53);\n" 245 | "}\n" 246 | "QPushButton:hover{\n" 247 | "border:2px solid;\n" 248 | "border-radius:20px;\n" 249 | "color: rgb(141, 141, 141);\n" 250 | "border-color: rgb(139, 139, 139);\n" 251 | "background-color: rgb(35, 35, 48);\n" 252 | "}\n" 253 | "QPushButton:pressed{\n" 254 | "border:2px solid;\n" 255 | "border-radius:20px;\n" 256 | "color: rgb(141, 141, 141);\n" 257 | "border-color: rgb(139, 139, 139);\n" 258 | "background-color: rgb(26, 26, 36);\n" 259 | "}") 260 | self.KEY5.setObjectName("KEY5") 261 | self.KEY4 = QtWidgets.QPushButton(self.DIALER) 262 | self.KEY4.setGeometry(QtCore.QRect(60, 210, 61, 61)) 263 | font = QtGui.QFont() 264 | font.setPointSize(25) 265 | self.KEY4.setFont(font) 266 | self.KEY4.setStyleSheet("QPushButton{\n" 267 | "border:2px solid;\n" 268 | "border-radius:20px;\n" 269 | "color: rgb(141, 141, 141);\n" 270 | "border-color: rgb(139, 139, 139);\n" 271 | "background-color:rgb(39, 39, 53);\n" 272 | "}\n" 273 | "QPushButton:hover{\n" 274 | "border:2px solid;\n" 275 | "border-radius:20px;\n" 276 | "color: rgb(141, 141, 141);\n" 277 | "border-color: rgb(139, 139, 139);\n" 278 | "background-color: rgb(35, 35, 48);\n" 279 | "}\n" 280 | "QPushButton:pressed{\n" 281 | "border:2px solid;\n" 282 | "border-radius:20px;\n" 283 | "color: rgb(141, 141, 141);\n" 284 | "border-color: rgb(139, 139, 139);\n" 285 | "background-color: rgb(26, 26, 36);\n" 286 | "}") 287 | self.KEY4.setObjectName("KEY4") 288 | self.KEY8 = QtWidgets.QPushButton(self.DIALER) 289 | self.KEY8.setGeometry(QtCore.QRect(130, 280, 61, 61)) 290 | font = QtGui.QFont() 291 | font.setPointSize(25) 292 | self.KEY8.setFont(font) 293 | self.KEY8.setStyleSheet("QPushButton{\n" 294 | "border:2px solid;\n" 295 | "border-radius:20px;\n" 296 | "color: rgb(141, 141, 141);\n" 297 | "border-color: rgb(139, 139, 139);\n" 298 | "background-color:rgb(39, 39, 53);\n" 299 | "}\n" 300 | "QPushButton:hover{\n" 301 | "border:2px solid;\n" 302 | "border-radius:20px;\n" 303 | "color: rgb(141, 141, 141);\n" 304 | "border-color: rgb(139, 139, 139);\n" 305 | "background-color: rgb(35, 35, 48);\n" 306 | "}\n" 307 | "QPushButton:pressed{\n" 308 | "border:2px solid;\n" 309 | "border-radius:20px;\n" 310 | "color: rgb(141, 141, 141);\n" 311 | "border-color: rgb(139, 139, 139);\n" 312 | "background-color: rgb(26, 26, 36);\n" 313 | "}") 314 | self.KEY8.setObjectName("KEY8") 315 | self.KEYCALL = QtWidgets.QPushButton(self.DIALER) 316 | self.KEYCALL.setGeometry(QtCore.QRect(90, 430, 75, 51)) 317 | self.KEYCALL.setStyleSheet("QPushButton{\n" 318 | "border:2px solid;\n" 319 | "border-radius:20px;\n" 320 | "color: rgb(141, 141, 141);\n" 321 | "border-color: rgb(139, 139, 139);\n" 322 | "background-color:rgb(39, 39, 53);\n" 323 | "}\n" 324 | "QPushButton:hover{\n" 325 | "border:2px solid;\n" 326 | "border-radius:20px;\n" 327 | "color: rgb(141, 141, 141);\n" 328 | "border-color: rgb(139, 139, 139);\n" 329 | "background-color: rgb(35, 35, 48);\n" 330 | "}\n" 331 | "QPushButton:pressed{\n" 332 | "border:2px solid;\n" 333 | "border-radius:20px;\n" 334 | "color: rgb(141, 141, 141);\n" 335 | "border-color: rgb(139, 139, 139);\n" 336 | "background-color: rgb(26, 26, 36);\n" 337 | "}") 338 | self.KEYCALL.setText("") 339 | icon = QtGui.QIcon() 340 | icon.addPixmap(QtGui.QPixmap("icons/telephone.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 341 | self.KEYCALL.setIcon(icon) 342 | self.KEYCALL.setIconSize(QtCore.QSize(35, 35)) 343 | self.KEYCALL.setObjectName("KEYCALL") 344 | self.KEYHASH = QtWidgets.QPushButton(self.DIALER) 345 | self.KEYHASH.setGeometry(QtCore.QRect(200, 350, 61, 61)) 346 | font = QtGui.QFont() 347 | font.setPointSize(25) 348 | self.KEYHASH.setFont(font) 349 | self.KEYHASH.setStyleSheet("QPushButton{\n" 350 | "border:2px solid;\n" 351 | "border-radius:20px;\n" 352 | "color: rgb(141, 141, 141);\n" 353 | "border-color: rgb(139, 139, 139);\n" 354 | "background-color:rgb(39, 39, 53);\n" 355 | "}\n" 356 | "QPushButton:hover{\n" 357 | "border:2px solid;\n" 358 | "border-radius:20px;\n" 359 | "color: rgb(141, 141, 141);\n" 360 | "border-color: rgb(139, 139, 139);\n" 361 | "background-color: rgb(35, 35, 48);\n" 362 | "}\n" 363 | "QPushButton:pressed{\n" 364 | "border:2px solid;\n" 365 | "border-radius:20px;\n" 366 | "color: rgb(141, 141, 141);\n" 367 | "border-color: rgb(139, 139, 139);\n" 368 | "background-color: rgb(26, 26, 36);\n" 369 | "}") 370 | self.KEYHASH.setObjectName("KEYHASH") 371 | self.KEY2 = QtWidgets.QPushButton(self.DIALER) 372 | self.KEY2.setGeometry(QtCore.QRect(130, 140, 61, 61)) 373 | font = QtGui.QFont() 374 | font.setPointSize(25) 375 | self.KEY2.setFont(font) 376 | self.KEY2.setStyleSheet("QPushButton{\n" 377 | "border:2px solid;\n" 378 | "border-radius:20px;\n" 379 | "color: rgb(141, 141, 141);\n" 380 | "border-color: rgb(139, 139, 139);\n" 381 | "background-color:rgb(39, 39, 53);\n" 382 | "}\n" 383 | "QPushButton:hover{\n" 384 | "border:2px solid;\n" 385 | "border-radius:20px;\n" 386 | "color: rgb(141, 141, 141);\n" 387 | "border-color: rgb(139, 139, 139);\n" 388 | "background-color: rgb(35, 35, 48);\n" 389 | "}\n" 390 | "QPushButton:pressed{\n" 391 | "border:2px solid;\n" 392 | "border-radius:20px;\n" 393 | "color: rgb(141, 141, 141);\n" 394 | "border-color: rgb(139, 139, 139);\n" 395 | "background-color: rgb(26, 26, 36);\n" 396 | "}") 397 | self.KEY2.setObjectName("KEY2") 398 | self.KEY0 = QtWidgets.QPushButton(self.DIALER) 399 | self.KEY0.setGeometry(QtCore.QRect(130, 350, 61, 61)) 400 | font = QtGui.QFont() 401 | font.setPointSize(25) 402 | self.KEY0.setFont(font) 403 | self.KEY0.setStyleSheet("QPushButton{\n" 404 | "border:2px solid;\n" 405 | "border-radius:20px;\n" 406 | "color: rgb(141, 141, 141);\n" 407 | "border-color: rgb(139, 139, 139);\n" 408 | "background-color:rgb(39, 39, 53);\n" 409 | "}\n" 410 | "QPushButton:hover{\n" 411 | "border:2px solid;\n" 412 | "border-radius:20px;\n" 413 | "color: rgb(141, 141, 141);\n" 414 | "border-color: rgb(139, 139, 139);\n" 415 | "background-color: rgb(35, 35, 48);\n" 416 | "}\n" 417 | "QPushButton:pressed{\n" 418 | "border:2px solid;\n" 419 | "border-radius:20px;\n" 420 | "color: rgb(141, 141, 141);\n" 421 | "border-color: rgb(139, 139, 139);\n" 422 | "background-color: rgb(26, 26, 36);\n" 423 | "}") 424 | self.KEY0.setObjectName("KEY0") 425 | self.KEY9 = QtWidgets.QPushButton(self.DIALER) 426 | self.KEY9.setGeometry(QtCore.QRect(200, 280, 61, 61)) 427 | font = QtGui.QFont() 428 | font.setPointSize(25) 429 | self.KEY9.setFont(font) 430 | self.KEY9.setStyleSheet("QPushButton{\n" 431 | "border:2px solid;\n" 432 | "border-radius:20px;\n" 433 | "color: rgb(141, 141, 141);\n" 434 | "border-color: rgb(139, 139, 139);\n" 435 | "background-color:rgb(39, 39, 53);\n" 436 | "}\n" 437 | "QPushButton:hover{\n" 438 | "border:2px solid;\n" 439 | "border-radius:20px;\n" 440 | "color: rgb(141, 141, 141);\n" 441 | "border-color: rgb(139, 139, 139);\n" 442 | "background-color: rgb(35, 35, 48);\n" 443 | "}\n" 444 | "QPushButton:pressed{\n" 445 | "border:2px solid;\n" 446 | "border-radius:20px;\n" 447 | "color: rgb(141, 141, 141);\n" 448 | "border-color: rgb(139, 139, 139);\n" 449 | "background-color: rgb(26, 26, 36);\n" 450 | "}") 451 | self.KEY9.setObjectName("KEY9") 452 | self.KEY7 = QtWidgets.QPushButton(self.DIALER) 453 | self.KEY7.setGeometry(QtCore.QRect(60, 280, 61, 61)) 454 | font = QtGui.QFont() 455 | font.setPointSize(25) 456 | self.KEY7.setFont(font) 457 | self.KEY7.setStyleSheet("QPushButton{\n" 458 | "border:2px solid;\n" 459 | "border-radius:20px;\n" 460 | "color: rgb(141, 141, 141);\n" 461 | "border-color: rgb(139, 139, 139);\n" 462 | "background-color:rgb(39, 39, 53);\n" 463 | "}\n" 464 | "QPushButton:hover{\n" 465 | "border:2px solid;\n" 466 | "border-radius:20px;\n" 467 | "color: rgb(141, 141, 141);\n" 468 | "border-color: rgb(139, 139, 139);\n" 469 | "background-color: rgb(35, 35, 48);\n" 470 | "}\n" 471 | "QPushButton:pressed{\n" 472 | "border:2px solid;\n" 473 | "border-radius:20px;\n" 474 | "color: rgb(141, 141, 141);\n" 475 | "border-color: rgb(139, 139, 139);\n" 476 | "background-color: rgb(26, 26, 36);\n" 477 | "}") 478 | self.KEY7.setObjectName("KEY7") 479 | self.KEY6 = QtWidgets.QPushButton(self.DIALER) 480 | self.KEY6.setGeometry(QtCore.QRect(200, 210, 61, 61)) 481 | font = QtGui.QFont() 482 | font.setPointSize(25) 483 | self.KEY6.setFont(font) 484 | self.KEY6.setStyleSheet("QPushButton{\n" 485 | "border:2px solid;\n" 486 | "border-radius:20px;\n" 487 | "color: rgb(141, 141, 141);\n" 488 | "border-color: rgb(139, 139, 139);\n" 489 | "background-color:rgb(39, 39, 53);\n" 490 | "}\n" 491 | "QPushButton:hover{\n" 492 | "border:2px solid;\n" 493 | "border-radius:20px;\n" 494 | "color: rgb(141, 141, 141);\n" 495 | "border-color: rgb(139, 139, 139);\n" 496 | "background-color: rgb(35, 35, 48);\n" 497 | "}\n" 498 | "QPushButton:pressed{\n" 499 | "border:2px solid;\n" 500 | "border-radius:20px;\n" 501 | "color: rgb(141, 141, 141);\n" 502 | "border-color: rgb(139, 139, 139);\n" 503 | "background-color: rgb(26, 26, 36);\n" 504 | "}") 505 | self.KEY6.setObjectName("KEY6") 506 | self.KEY3 = QtWidgets.QPushButton(self.DIALER) 507 | self.KEY3.setGeometry(QtCore.QRect(200, 140, 61, 61)) 508 | font = QtGui.QFont() 509 | font.setPointSize(25) 510 | self.KEY3.setFont(font) 511 | self.KEY3.setStyleSheet("QPushButton{\n" 512 | "border:2px solid;\n" 513 | "border-radius:20px;\n" 514 | "color: rgb(141, 141, 141);\n" 515 | "border-color: rgb(139, 139, 139);\n" 516 | "background-color:rgb(39, 39, 53);\n" 517 | "}\n" 518 | "QPushButton:hover{\n" 519 | "border:2px solid;\n" 520 | "border-radius:20px;\n" 521 | "color: rgb(141, 141, 141);\n" 522 | "border-color: rgb(139, 139, 139);\n" 523 | "background-color: rgb(35, 35, 48);\n" 524 | "}\n" 525 | "QPushButton:pressed{\n" 526 | "border:2px solid;\n" 527 | "border-radius:20px;\n" 528 | "color: rgb(141, 141, 141);\n" 529 | "border-color: rgb(139, 139, 139);\n" 530 | "background-color: rgb(26, 26, 36);\n" 531 | "}") 532 | self.KEY3.setObjectName("KEY3") 533 | self.KEY1 = QtWidgets.QPushButton(self.DIALER) 534 | self.KEY1.setGeometry(QtCore.QRect(60, 140, 61, 61)) 535 | font = QtGui.QFont() 536 | font.setPointSize(25) 537 | self.KEY1.setFont(font) 538 | self.KEY1.setStyleSheet("QPushButton{\n" 539 | "border:2px solid;\n" 540 | "border-radius:20px;\n" 541 | "color: rgb(141, 141, 141);\n" 542 | "border-color: rgb(139, 139, 139);\n" 543 | "background-color:rgb(39, 39, 53);\n" 544 | "}\n" 545 | "QPushButton:hover{\n" 546 | "border:2px solid;\n" 547 | "border-radius:20px;\n" 548 | "color: rgb(141, 141, 141);\n" 549 | "border-color: rgb(139, 139, 139);\n" 550 | "background-color: rgb(35, 35, 48);\n" 551 | "}\n" 552 | "QPushButton:pressed{\n" 553 | "border:2px solid;\n" 554 | "border-radius:20px;\n" 555 | "color: rgb(141, 141, 141);\n" 556 | "border-color: rgb(139, 139, 139);\n" 557 | "background-color: rgb(26, 26, 36);\n" 558 | "}") 559 | self.KEY1.setObjectName("KEY1") 560 | self.KEYSTAR = QtWidgets.QPushButton(self.DIALER) 561 | self.KEYSTAR.setGeometry(QtCore.QRect(60, 350, 61, 61)) 562 | font = QtGui.QFont() 563 | font.setPointSize(25) 564 | self.KEYSTAR.setFont(font) 565 | self.KEYSTAR.setStyleSheet("QPushButton{\n" 566 | "border:2px solid;\n" 567 | "border-radius:20px;\n" 568 | "color: rgb(141, 141, 141);\n" 569 | "border-color: rgb(139, 139, 139);\n" 570 | "background-color:rgb(39, 39, 53);\n" 571 | "}\n" 572 | "QPushButton:hover{\n" 573 | "border:2px solid;\n" 574 | "border-radius:20px;\n" 575 | "color: rgb(141, 141, 141);\n" 576 | "border-color: rgb(139, 139, 139);\n" 577 | "background-color: rgb(35, 35, 48);\n" 578 | "}\n" 579 | "QPushButton:pressed{\n" 580 | "border:2px solid;\n" 581 | "border-radius:20px;\n" 582 | "color: rgb(141, 141, 141);\n" 583 | "border-color: rgb(139, 139, 139);\n" 584 | "background-color: rgb(26, 26, 36);\n" 585 | "}") 586 | self.KEYSTAR.setObjectName("KEYSTAR") 587 | self.NumberLab = QtWidgets.QLabel(self.DIALER) 588 | self.NumberLab.setGeometry(QtCore.QRect(10, 40, 311, 61)) 589 | font = QtGui.QFont() 590 | font.setPointSize(30) 591 | self.NumberLab.setFont(font) 592 | self.NumberLab.setStyleSheet("QLabel{\n" 593 | "border:2px solid;\n" 594 | "border-radius:20px;\n" 595 | "color: rgb(141, 141, 141);\n" 596 | "border-color: rgb(139, 139, 139);\n" 597 | "background-color:rgb(39, 39, 53);\n" 598 | "}\n" 599 | "QLabel:hover{\n" 600 | "border:2px solid;\n" 601 | "border-radius:20px;\n" 602 | "color: rgb(141, 141, 141);\n" 603 | "border-color: rgb(139, 139, 139);\n" 604 | "background-color: rgb(31, 31, 45);\n" 605 | "}") 606 | self.NumberLab.setInputMethodHints(QtCore.Qt.ImhDigitsOnly) 607 | self.NumberLab.setFrameShape(QtWidgets.QFrame.Box) 608 | self.NumberLab.setFrameShadow(QtWidgets.QFrame.Plain) 609 | self.NumberLab.setText("") 610 | self.NumberLab.setScaledContents(True) 611 | self.NumberLab.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) 612 | self.NumberLab.setObjectName("NumberLab") 613 | self.CALLER = QtWidgets.QWidget(self.DIALER) 614 | self.CALLER.setGeometry(QtCore.QRect(0, 0, 0, 531)) 615 | self.CALLER.setStyleSheet("QWidget{\n" 616 | " background-color: rgb(18, 18, 18);\n" 617 | "}") 618 | self.CALLER.setObjectName("CALLER") 619 | self.KEYMUTE = QtWidgets.QPushButton(self.CALLER) 620 | self.KEYMUTE.setGeometry(QtCore.QRect(30, 430, 75, 51)) 621 | self.KEYMUTE.setStyleSheet("QPushButton{\n" 622 | "border:2px solid;\n" 623 | "border-radius:20px;\n" 624 | "color: rgb(141, 141, 141);\n" 625 | "border-color: rgb(139, 139, 139);\n" 626 | "background-color:rgb(39, 39, 53);\n" 627 | "}\n" 628 | "QPushButton:hover{\n" 629 | "border:2px solid;\n" 630 | "border-radius:20px;\n" 631 | "color: rgb(141, 141, 141);\n" 632 | "border-color: rgb(139, 139, 139);\n" 633 | "background-color: rgb(35, 35, 48);\n" 634 | "}\n" 635 | "QPushButton:pressed{\n" 636 | "border:2px solid;\n" 637 | "border-radius:20px;\n" 638 | "color: rgb(141, 141, 141);\n" 639 | "border-color: rgb(139, 139, 139);\n" 640 | "background-color: rgb(26, 26, 36);\n" 641 | "}") 642 | self.KEYMUTE.setText("") 643 | icon1 = QtGui.QIcon() 644 | icon1.addPixmap(QtGui.QPixmap("icons/mute.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 645 | self.KEYMUTE.setIcon(icon1) 646 | self.KEYMUTE.setIconSize(QtCore.QSize(35, 35)) 647 | self.KEYMUTE.setObjectName("KEYMUTE") 648 | self.KEYEND = QtWidgets.QPushButton(self.CALLER) 649 | self.KEYEND.setGeometry(QtCore.QRect(130, 430, 75, 51)) 650 | self.KEYEND.setStyleSheet("QPushButton{\n" 651 | "border:2px solid;\n" 652 | "border-radius:20px;\n" 653 | "color: rgb(141, 141, 141);\n" 654 | "border-color: rgb(139, 139, 139);\n" 655 | "background-color:rgb(39, 39, 53);\n" 656 | "}\n" 657 | "QPushButton:hover{\n" 658 | "border:2px solid;\n" 659 | "border-radius:20px;\n" 660 | "color: rgb(141, 141, 141);\n" 661 | "border-color: rgb(139, 139, 139);\n" 662 | "background-color: rgb(35, 35, 48);\n" 663 | "}\n" 664 | "QPushButton:pressed{\n" 665 | "border:2px solid;\n" 666 | "border-radius:20px;\n" 667 | "color: rgb(141, 141, 141);\n" 668 | "border-color: rgb(139, 139, 139);\n" 669 | "background-color: rgb(26, 26, 36);\n" 670 | "}") 671 | self.KEYEND.setText("") 672 | icon2 = QtGui.QIcon() 673 | icon2.addPixmap(QtGui.QPixmap("icons/telephonex.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 674 | self.KEYEND.setIcon(icon2) 675 | self.KEYEND.setIconSize(QtCore.QSize(35, 35)) 676 | self.KEYEND.setObjectName("KEYEND") 677 | self.KEYHOLD = QtWidgets.QPushButton(self.CALLER) 678 | self.KEYHOLD.setGeometry(QtCore.QRect(130, 360, 75, 51)) 679 | self.KEYHOLD.setStyleSheet("QPushButton{\n" 680 | "border:2px solid;\n" 681 | "border-radius:20px;\n" 682 | "color: rgb(141, 141, 141);\n" 683 | "border-color: rgb(139, 139, 139);\n" 684 | "background-color:rgb(39, 39, 53);\n" 685 | "}\n" 686 | "QPushButton:hover{\n" 687 | "border:2px solid;\n" 688 | "border-radius:20px;\n" 689 | "color: rgb(141, 141, 141);\n" 690 | "border-color: rgb(139, 139, 139);\n" 691 | "background-color: rgb(35, 35, 48);\n" 692 | "}\n" 693 | "QPushButton:pressed{\n" 694 | "border:2px solid;\n" 695 | "border-radius:20px;\n" 696 | "color: rgb(141, 141, 141);\n" 697 | "border-color: rgb(139, 139, 139);\n" 698 | "background-color: rgb(26, 26, 36);\n" 699 | "}") 700 | self.KEYHOLD.setText("") 701 | icon3 = QtGui.QIcon() 702 | icon3.addPixmap(QtGui.QPixmap("icons/pause-button.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 703 | self.KEYHOLD.setIcon(icon3) 704 | self.KEYHOLD.setIconSize(QtCore.QSize(35, 35)) 705 | self.KEYHOLD.setObjectName("KEYHOLD") 706 | self.KEYMIC = QtWidgets.QPushButton(self.CALLER) 707 | self.KEYMIC.setGeometry(QtCore.QRect(230, 430, 75, 51)) 708 | self.KEYMIC.setStyleSheet("QPushButton{\n" 709 | "border:2px solid;\n" 710 | "border-radius:20px;\n" 711 | "color: rgb(141, 141, 141);\n" 712 | "border-color: rgb(139, 139, 139);\n" 713 | "background-color:rgb(39, 39, 53);\n" 714 | "}\n" 715 | "QPushButton:hover{\n" 716 | "border:2px solid;\n" 717 | "border-radius:20px;\n" 718 | "color: rgb(141, 141, 141);\n" 719 | "border-color: rgb(139, 139, 139);\n" 720 | "background-color: rgb(35, 35, 48);\n" 721 | "}\n" 722 | "QPushButton:pressed{\n" 723 | "border:2px solid;\n" 724 | "border-radius:20px;\n" 725 | "color: rgb(141, 141, 141);\n" 726 | "border-color: rgb(139, 139, 139);\n" 727 | "background-color: rgb(26, 26, 36);\n" 728 | "}") 729 | self.KEYMIC.setText("") 730 | icon4 = QtGui.QIcon() 731 | icon4.addPixmap(QtGui.QPixmap("icons/mic.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 732 | self.KEYMIC.setIcon(icon4) 733 | self.KEYMIC.setIconSize(QtCore.QSize(35, 35)) 734 | self.KEYMIC.setObjectName("KEYMIC") 735 | self.InfoText = QtWidgets.QTextBrowser(self.CALLER) 736 | self.InfoText.setGeometry(QtCore.QRect(10, 41, 311, 281)) 737 | self.InfoText.setStyleSheet("QTextBrowser{\n" 738 | "border:2px solid;\n" 739 | "border-radius:20px;\n" 740 | "color: rgb(141, 141, 141);\n" 741 | "border-color: rgb(139, 139, 139);\n" 742 | "background-color:rgb(39, 39, 53);\n" 743 | "}\n" 744 | "QTextBrowser:hover{\n" 745 | "border:2px solid;\n" 746 | "border-radius:20px;\n" 747 | "color: rgb(141, 141, 141);\n" 748 | "border-color: rgb(139, 139, 139);\n" 749 | "background-color: rgb(31, 31, 45);\n" 750 | "}") 751 | self.InfoText.setObjectName("InfoText") 752 | self.KEYCANCEL = QtWidgets.QPushButton(self.DIALER) 753 | self.KEYCANCEL.setGeometry(QtCore.QRect(180, 430, 61, 51)) 754 | font = QtGui.QFont() 755 | font.setPointSize(25) 756 | self.KEYCANCEL.setFont(font) 757 | self.KEYCANCEL.setStyleSheet("QPushButton{\n" 758 | "border:2px solid;\n" 759 | "border-radius:20px;\n" 760 | "color: rgb(141, 141, 141);\n" 761 | "border-color: rgb(139, 139, 139);\n" 762 | "background-color:rgb(39, 39, 53);\n" 763 | "}\n" 764 | "QPushButton:hover{\n" 765 | "border:2px solid;\n" 766 | "border-radius:20px;\n" 767 | "color: rgb(141, 141, 141);\n" 768 | "border-color: rgb(139, 139, 139);\n" 769 | "background-color: rgb(35, 35, 48);\n" 770 | "}\n" 771 | "QPushButton:pressed{\n" 772 | "border:2px solid;\n" 773 | "border-radius:20px;\n" 774 | "color: rgb(141, 141, 141);\n" 775 | "border-color: rgb(139, 139, 139);\n" 776 | "background-color: rgb(26, 26, 36);\n" 777 | "}") 778 | self.KEYCANCEL.setText("") 779 | icon5 = QtGui.QIcon() 780 | icon5.addPixmap(QtGui.QPixmap("icons/backspace.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 781 | self.KEYCANCEL.setIcon(icon5) 782 | self.KEYCANCEL.setIconSize(QtCore.QSize(30, 30)) 783 | self.KEYCANCEL.setObjectName("KEYCANCEL") 784 | self.ATTENDER = QtWidgets.QWidget(self.DIALER) 785 | self.ATTENDER.setGeometry(QtCore.QRect(0, 0, 0, 531)) 786 | self.ATTENDER.setStyleSheet("QWidget{\n" 787 | " background-color: rgb(18, 18, 18);\n" 788 | "}") 789 | self.ATTENDER.setObjectName("ATTENDER") 790 | self.KEYACC = QtWidgets.QPushButton(self.ATTENDER) 791 | self.KEYACC.setGeometry(QtCore.QRect(60, 420, 75, 51)) 792 | self.KEYACC.setStyleSheet("QPushButton{\n" 793 | "border:2px solid;\n" 794 | "border-radius:20px;\n" 795 | "color: rgb(141, 141, 141);\n" 796 | "border-color: rgb(139, 139, 139);\n" 797 | "background-color:rgb(39, 39, 53);\n" 798 | "}\n" 799 | "QPushButton:hover{\n" 800 | "border:2px solid;\n" 801 | "border-radius:20px;\n" 802 | "color: rgb(141, 141, 141);\n" 803 | "border-color: rgb(139, 139, 139);\n" 804 | "background-color: rgb(35, 35, 48);\n" 805 | "}\n" 806 | "QPushButton:pressed{\n" 807 | "border:2px solid;\n" 808 | "border-radius:20px;\n" 809 | "color: rgb(141, 141, 141);\n" 810 | "border-color: rgb(139, 139, 139);\n" 811 | "background-color: rgb(26, 26, 36);\n" 812 | "}") 813 | self.KEYACC.setText("") 814 | self.KEYACC.setIcon(icon) 815 | self.KEYACC.setIconSize(QtCore.QSize(35, 35)) 816 | self.KEYACC.setObjectName("KEYACC") 817 | self.KEYREJ = QtWidgets.QPushButton(self.ATTENDER) 818 | self.KEYREJ.setGeometry(QtCore.QRect(190, 420, 75, 51)) 819 | self.KEYREJ.setStyleSheet("QPushButton{\n" 820 | "border:2px solid;\n" 821 | "border-radius:20px;\n" 822 | "color: rgb(141, 141, 141);\n" 823 | "border-color: rgb(139, 139, 139);\n" 824 | "background-color:rgb(39, 39, 53);\n" 825 | "}\n" 826 | "QPushButton:hover{\n" 827 | "border:2px solid;\n" 828 | "border-radius:20px;\n" 829 | "color: rgb(141, 141, 141);\n" 830 | "border-color: rgb(139, 139, 139);\n" 831 | "background-color: rgb(35, 35, 48);\n" 832 | "}\n" 833 | "QPushButton:pressed{\n" 834 | "border:2px solid;\n" 835 | "border-radius:20px;\n" 836 | "color: rgb(141, 141, 141);\n" 837 | "border-color: rgb(139, 139, 139);\n" 838 | "background-color: rgb(26, 26, 36);\n" 839 | "}") 840 | self.KEYREJ.setText("") 841 | self.KEYREJ.setIcon(icon2) 842 | self.KEYREJ.setIconSize(QtCore.QSize(35, 35)) 843 | self.KEYREJ.setObjectName("KEYREJ") 844 | self.CallerInfo = QtWidgets.QTextBrowser(self.ATTENDER) 845 | self.CallerInfo.setGeometry(QtCore.QRect(10, 71, 311, 131)) 846 | font = QtGui.QFont() 847 | font.setPointSize(24) 848 | self.CallerInfo.setFont(font) 849 | self.CallerInfo.setStyleSheet("QTextBrowser{\n" 850 | "border:2px solid;\n" 851 | "border-radius:20px;\n" 852 | "color: rgb(141, 141, 141);\n" 853 | "border-color: rgb(139, 139, 139);\n" 854 | "background-color:rgb(39, 39, 53);\n" 855 | "}\n" 856 | "QTextBrowser:hover{\n" 857 | "border:2px solid;\n" 858 | "border-radius:20px;\n" 859 | "color: rgb(141, 141, 141);\n" 860 | "border-color: rgb(139, 139, 139);\n" 861 | "background-color: rgb(31, 31, 45);\n" 862 | "}") 863 | self.CallerInfo.setObjectName("CallerInfo") 864 | self.KEYCANCEL.raise_() 865 | self.KEY5.raise_() 866 | self.KEY4.raise_() 867 | self.KEY8.raise_() 868 | self.KEYCALL.raise_() 869 | self.KEYHASH.raise_() 870 | self.KEY2.raise_() 871 | self.KEY0.raise_() 872 | self.KEY9.raise_() 873 | self.KEY7.raise_() 874 | self.KEY6.raise_() 875 | self.KEY3.raise_() 876 | self.KEY1.raise_() 877 | self.KEYSTAR.raise_() 878 | self.NumberLab.raise_() 879 | self.CALLER.raise_() 880 | self.ATTENDER.raise_() 881 | self.TopBar = QtWidgets.QLabel(self.centralwidget) 882 | self.TopBar.setGeometry(QtCore.QRect(0, 0, 331, 31)) 883 | self.TopBar.setStyleSheet("QWidget{\n" 884 | "background-color:rgb(50, 50, 63);\n" 885 | "color: rgb(193, 193, 193);\n" 886 | "}") 887 | self.TopBar.setText(" PyPhone") 888 | font = QtGui.QFont() 889 | font.setPointSize(9) 890 | self.TopBar.setFont(font) 891 | self.TopBar.setObjectName("TopBar") 892 | self.Exit = QtWidgets.QPushButton(self.centralwidget) 893 | self.Exit.setGeometry(QtCore.QRect(300, 0, 31, 31)) 894 | self.Exit.setStyleSheet("QPushButton{\n" 895 | "background-color:rgb(50, 50, 63);\n" 896 | "border:0px;\n" 897 | "}\n" 898 | "QPushButton:hover{\n" 899 | " background-color: rgb(42, 42, 53);\n" 900 | "}\n" 901 | "QPushButton:pressed{\n" 902 | " background-color: rgb(200, 0, 0);\n" 903 | "}") 904 | self.Exit.setText("") 905 | icon6 = QtGui.QIcon() 906 | icon6.addPixmap(QtGui.QPixmap("icons/cil-x.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 907 | self.Exit.setIcon(icon6) 908 | self.Exit.setFlat(False) 909 | self.Exit.setObjectName("Exit") 910 | self.MinimizeButton = QtWidgets.QPushButton(self.centralwidget) 911 | self.MinimizeButton.setGeometry(QtCore.QRect(270, 0, 31, 31)) 912 | self.MinimizeButton.setStyleSheet("QPushButton{\n" 913 | "background-color:rgb(50, 50, 63);\n" 914 | "border:0px;\n" 915 | "}\n" 916 | "QPushButton:hover{\n" 917 | " background-color: rgb(42, 42, 53);\n" 918 | "}\n" 919 | "QPushButton:pressed{\n" 920 | " background-color: rgb(39, 39, 49);\n" 921 | "}") 922 | self.MinimizeButton.setText("") 923 | icon7 = QtGui.QIcon() 924 | icon7.addPixmap(QtGui.QPixmap("icons/cil-window-minimize.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 925 | self.MinimizeButton.setIcon(icon7) 926 | self.MinimizeButton.setFlat(False) 927 | self.MinimizeButton.setObjectName("MinimizeButton") 928 | self.LogoInfo = QtWidgets.QPushButton(self.centralwidget) 929 | self.LogoInfo.setGeometry(QtCore.QRect(0, 0, 31, 31)) 930 | self.LogoInfo.setStyleSheet("QPushButton{\n" 931 | "background-color:rgb(50, 50, 63);\n" 932 | "border:0px;\n" 933 | "}\n" 934 | "QPushButton:hover{\n" 935 | " background-color: rgb(42, 42, 53);\n" 936 | "}\n" 937 | "QPushButton:pressed{\n" 938 | " background-color: rgb(39, 39, 49);\n" 939 | "}") 940 | self.LogoInfo.setText("") 941 | icon8 = QtGui.QIcon() 942 | icon8.addPixmap(QtGui.QPixmap("icons/phone.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 943 | self.LogoInfo.setIcon(icon8) 944 | self.LogoInfo.setFlat(False) 945 | self.LogoInfo.setObjectName("LogoInfo") 946 | MainWindow.setCentralWidget(self.centralwidget) 947 | self.KEY0.clicked.connect(lambda:self.KEYPRESSED("0")) 948 | self.KEY1.clicked.connect(lambda:self.KEYPRESSED("1")) 949 | self.KEY2.clicked.connect(lambda:self.KEYPRESSED("2")) 950 | self.KEY3.clicked.connect(lambda:self.KEYPRESSED("3")) 951 | self.KEY4.clicked.connect(lambda:self.KEYPRESSED("4")) 952 | self.KEY5.clicked.connect(lambda:self.KEYPRESSED("5")) 953 | self.KEY6.clicked.connect(lambda:self.KEYPRESSED("6")) 954 | self.KEY7.clicked.connect(lambda:self.KEYPRESSED("7")) 955 | self.KEY8.clicked.connect(lambda:self.KEYPRESSED("8")) 956 | self.KEY9.clicked.connect(lambda:self.KEYPRESSED("9")) 957 | self.KEYSTAR.clicked.connect(lambda:self.KEYPRESSED("*")) 958 | self.KEYHASH.clicked.connect(lambda:self.KEYPRESSED("#")) 959 | self.KEYCANCEL.clicked.connect(lambda:self.KEYPRESSED("bksp")) 960 | self.KEYCALL.clicked.connect(lambda:self.CALL()) 961 | self.KEYMIC.setCheckable(True) 962 | self.KEYMUTE.setCheckable(True) 963 | self.KEYHOLD.setCheckable(True) 964 | self.KEYEND.clicked.connect(lambda:self.ENDCALL()) 965 | self.KEYMIC.clicked.connect(lambda:self.MAKEMUTE()) 966 | self.KEYMUTE.clicked.connect(lambda:self.MAKEDEAF()) 967 | self.KEYHOLD.clicked.connect(lambda:self.MAKEHOLD()) 968 | 969 | self.MinimizeButton.clicked.connect(lambda:MainWindow.showMinimized()) 970 | 971 | self.retranslateUi(MainWindow) 972 | QtCore.QMetaObject.connectSlotsByName(MainWindow) 973 | 974 | 975 | def moveWindow(event): 976 | if event.buttons() == Qt.LeftButton: 977 | MainWindow.move(MainWindow.pos() + event.globalPos() - self.dragPos) 978 | self.dragPos = event.globalPos() 979 | event.accept() 980 | 981 | def pressWindow(event): 982 | # MOVE WINDOW 983 | self.dragPos = event.globalPos() 984 | 985 | 986 | #if event.buttons() == Qt.LeftButton: 987 | # self.move(self.pos() + event.globalPos() - self.dragPos) 988 | # self.dragPos = event.globalPos() 989 | # event.accept() 990 | 991 | def releasedWindow(event): 992 | # MOVE WINDOW 993 | pass 994 | self.TopBar.mouseMoveEvent=moveWindow 995 | self.TopBar.mousePressEvent=pressWindow 996 | self.TopBar.mouseReleaseEvent=releasedWindow 997 | 998 | self.Exit.clicked.connect(lambda:sys.exit()) 999 | global FIRST,CALLSTAT,NumberDialed 1000 | self.SERVERTHREADRUNNER=ServerThread() 1001 | CALLSTAT=False 1002 | if FIRST==True: 1003 | self.SERVERTHREADRUNNER.start() 1004 | FIRST=False 1005 | self.SERVERTHREADRUNNER.IncommingCall.connect(lambda:self.PICKUPCALL()) 1006 | self.SERVERTHREADRUNNER.OngoingCall.connect(lambda:self.POSTPICKUPCALL()) 1007 | self.SERVERTHREADRUNNER.CallEnded.connect(lambda:self.ENDCALL()) 1008 | NumberDialed="" 1009 | 1010 | def ENDCALL(self): 1011 | global CALLSTAT,CIP 1012 | CALLSTAT=True 1013 | try: 1014 | CIP.close() 1015 | except: 1016 | pass 1017 | self.setupUi(MainWindow) 1018 | 1019 | def PICKUPCALL(self): 1020 | global CALLSTAT,RECEIVECALL,ACK 1021 | _translate = QtCore.QCoreApplication.translate 1022 | self.CALLER.setGeometry(QtCore.QRect(0, 0, 0, 531)) 1023 | self.ATTENDER.setGeometry(QtCore.QRect(0, 0, 331, 531)) 1024 | self.CallerInfo.setHtml(_translate("MainWindow", "\n" 1025 | "
\n" 1028 | "Incomming Call from
%s
"%ACK[4:14])) 1029 | self.KEYACC.clicked.connect(lambda:self.PICKEDUP()) 1030 | self.KEYREJ.clicked.connect(lambda:self.NOTPICKEDUP()) 1031 | 1032 | def MAKEHOLD(self): 1033 | global SPK,MUTE 1034 | if self.KEYHOLD.isChecked(): 1035 | MUTE,SPK=True,True 1036 | else: 1037 | MUTE,SPK=False,False 1038 | 1039 | def MAKEMUTE(self): 1040 | global MUTE 1041 | if self.KEYMIC.isChecked(): 1042 | MUTE=True 1043 | else: 1044 | MUTE=False 1045 | 1046 | def MAKEDEAF(self): 1047 | global SPK 1048 | if self.KEYMUTE.isChecked(): 1049 | SPK=True 1050 | else: 1051 | SPK=False 1052 | 1053 | def POSTPICKUPCALL(self): 1054 | global ACK 1055 | _translate = QtCore.QCoreApplication.translate 1056 | self.CALLER.setGeometry(QtCore.QRect(0, 0, 331, 531)) 1057 | self.ATTENDER.setGeometry(QtCore.QRect(0, 0, 0, 531)) 1058 | self.InfoText.setHtml(_translate("MainWindow", "\n" 1059 | "\n" 1062 | "You are in a call with
%s
"%ACK[4:14])) 1063 | 1064 | def PICKEDUP(self): 1065 | global RECEIVECALL 1066 | RECEIVECALL="OK" 1067 | 1068 | def NOTPICKEDUP(self): 1069 | global RECEIVECALL 1070 | RECEIVECALL="REJECT" 1071 | self.setupUi(MainWindow) 1072 | 1073 | def CALLENDED(self): 1074 | global SOCK 1075 | CALLSTAT=True 1076 | SOCK.close() 1077 | self.CLIENTTHREADRUNNER.wait() 1078 | self.setupUi(MainWindow) 1079 | 1080 | def CALLINIT(self): 1081 | global NumberDialed 1082 | _translate = QtCore.QCoreApplication.translate 1083 | self.CALLER.setGeometry(QtCore.QRect(0, 0, 331, 531)) 1084 | self.CLIENTTHREADRUNNER=ClientThread() 1085 | self.CLIENTTHREADRUNNER.start() 1086 | self.CLIENTTHREADRUNNER.CallEnded.connect(lambda:self.CALLENDED()) 1087 | self.InfoText.setHtml(_translate("MainWindow", "\n" 1088 | "\n" 1091 | "You are in a call with
%s
"%NumberDialed)) 1092 | 1093 | 1094 | def CALL(self): 1095 | global NumberDialed 1096 | MATCHSTR='[1-9][0-9]{9}' 1097 | if re.match(MATCHSTR,NumberDialed)!=None: 1098 | self.CALLINIT() 1099 | else: 1100 | print("Invalid Number") 1101 | 1102 | def KEYPRESSED(self,val): 1103 | global NumberDialed 1104 | if val!='bksp': 1105 | NumberDialed+=str(val) 1106 | else: 1107 | NumberDialed=NumberDialed[:len(NumberDialed)-1] 1108 | self.NumberLab.setText(NumberDialed) 1109 | 1110 | 1111 | def retranslateUi(self, MainWindow): 1112 | _translate = QtCore.QCoreApplication.translate 1113 | MainWindow.setWindowTitle(_translate("MainWindow", "PyPhone")) 1114 | self.KEY5.setText(_translate("MainWindow", "5")) 1115 | self.KEY4.setText(_translate("MainWindow", "4")) 1116 | self.KEY8.setText(_translate("MainWindow", "8")) 1117 | self.KEYHASH.setText(_translate("MainWindow", "#")) 1118 | self.KEY2.setText(_translate("MainWindow", "2")) 1119 | self.KEY0.setText(_translate("MainWindow", "0")) 1120 | self.KEY9.setText(_translate("MainWindow", "9")) 1121 | self.KEY7.setText(_translate("MainWindow", "7")) 1122 | self.KEY6.setText(_translate("MainWindow", "6")) 1123 | self.KEY3.setText(_translate("MainWindow", "3")) 1124 | self.KEY1.setText(_translate("MainWindow", "1")) 1125 | self.KEYSTAR.setText(_translate("MainWindow", "*")) 1126 | self.CallerInfo.setHtml(_translate("MainWindow", "\n" 1127 | "\n" 1130 | "Incomming Call from
")) 1131 | 1132 | if __name__ == "__main__": 1133 | app = QtWidgets.QApplication(sys.argv) 1134 | app.setStyleSheet('QMainWindow{background-color: darkgray;border: 1px solid black;}') 1135 | MainWindow = QtWidgets.QMainWindow() 1136 | ui = Ui_MainWindow() 1137 | ui.setMouseTracking(True) 1138 | MainWindow.setWindowFlags(QtCore.Qt.FramelessWindowHint) 1139 | ui.setupUi(MainWindow) 1140 | MainWindow.show() 1141 | sys.exit(app.exec_()) 1142 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PyPhone 2 | Python Based VoIP GUI Calling App 3 | 4 | ## What is PyPhone? 5 | 6 | PyPhone is a fully Open Sourced Python Based GUI VoIP Calling App which enables Calling over the Internet Free of cost. PyPhone currently uses ngrok for port forwarding enabling call from anywhere around the world, with minor changes can be used as an off-grid Calling Service within LAN. It uses PyQt5 for its GUI. 7 | 8 |