Network/IRC/IrcWidget.py

branch
Py2 comp.
changeset 3058
0a02c433f52d
parent 3057
10516539f238
parent 3022
57179e4cdadd
child 3060
5883ce99ee12
equal deleted inserted replaced
3057:10516539f238 3058:0a02c433f52d
139 139
140 @return flag indicating successful shutdown (boolean) 140 @return flag indicating successful shutdown (boolean)
141 """ 141 """
142 if self.__server: 142 if self.__server:
143 if Preferences.getIrc("AskOnShutdown"): 143 if Preferences.getIrc("AskOnShutdown"):
144 ok = E5MessageBox.yesNo(self, 144 ok = E5MessageBox.yesNo(
145 self,
145 self.trUtf8("Disconnect from Server"), 146 self.trUtf8("Disconnect from Server"),
146 self.trUtf8( 147 self.trUtf8(
147 """<p>Do you really want to disconnect from""" 148 """<p>Do you really want to disconnect from"""
148 """ <b>{0}</b>?</p><p>All channels will be closed.""" 149 """ <b>{0}</b>?</p><p>All channels will be closed."""
149 """</p>""").format(self.__server.getName())) 150 """</p>""").format(self.__server.getName()))
188 self.__userName = identity.getIdent() 189 self.__userName = identity.getIdent()
189 self.__quitMessage = identity.getQuitMessage() 190 self.__quitMessage = identity.getQuitMessage()
190 if self.__server: 191 if self.__server:
191 useSSL = self.__server.useSSL() 192 useSSL = self.__server.useSSL()
192 if useSSL and not SSL_AVAILABLE: 193 if useSSL and not SSL_AVAILABLE:
193 E5MessageBox.critical(self, 194 E5MessageBox.critical(
195 self,
194 self.trUtf8("SSL Connection"), 196 self.trUtf8("SSL Connection"),
195 self.trUtf8( 197 self.trUtf8(
196 """An encrypted connection to the IRC""" 198 """An encrypted connection to the IRC"""
197 """ network was requested but SSL is not""" 199 """ network was requested but SSL is not"""
198 """ available. Please change the server""" 200 """ available. Please change the server"""
234 self.__server.getPort()) 236 self.__server.getPort())
235 else: 237 else:
236 if silent: 238 if silent:
237 ok = True 239 ok = True
238 else: 240 else:
239 ok = E5MessageBox.yesNo(self, 241 ok = E5MessageBox.yesNo(
242 self,
240 self.trUtf8("Disconnect from Server"), 243 self.trUtf8("Disconnect from Server"),
241 self.trUtf8("""<p>Do you really want to disconnect from""" 244 self.trUtf8("""<p>Do you really want to disconnect from"""
242 """ <b>{0}</b>?</p><p>All channels will be""" 245 """ <b>{0}</b>?</p><p>All channels will be"""
243 """ closed.</p>""")\ 246 """ closed.</p>""")\
244 .format(self.__server.getName())) 247 .format(self.__server.getName()))
245 if ok: 248 if ok:
246 self.networkWidget.addServerMessage(self.trUtf8("Info"), 249 self.networkWidget.addServerMessage(
250 self.trUtf8("Info"),
247 self.trUtf8("Disconnecting from server {0}...").format( 251 self.trUtf8("Disconnecting from server {0}...").format(
248 self.__server.getName())) 252 self.__server.getName()))
249 self.__closeAllChannels() 253 self.__closeAllChannels()
250 self.__send("QUIT :" + self.__quitMessage) 254 self.__send("QUIT :" + self.__quitMessage)
251 self.__socket and self.__socket.flush() 255 self.__socket and self.__socket.flush()
438 442
439 def __hostFound(self): 443 def __hostFound(self):
440 """ 444 """
441 Private slot to indicate the host was found. 445 Private slot to indicate the host was found.
442 """ 446 """
443 self.networkWidget.addServerMessage(self.trUtf8("Info"), 447 self.networkWidget.addServerMessage(
448 self.trUtf8("Info"),
444 self.trUtf8("Server found,connecting...")) 449 self.trUtf8("Server found,connecting..."))
445 450
446 def __hostConnected(self): 451 def __hostConnected(self):
447 """ 452 """
448 Private slot to log in to the server after the connection was 453 Private slot to log in to the server after the connection was
449 established. 454 established.
450 """ 455 """
451 self.networkWidget.addServerMessage(self.trUtf8("Info"), 456 self.networkWidget.addServerMessage(
457 self.trUtf8("Info"),
452 self.trUtf8("Connected,logging in...")) 458 self.trUtf8("Connected,logging in..."))
453 self.networkWidget.setConnected(True) 459 self.networkWidget.setConnected(True)
454 460
455 self.__registering = True 461 self.__registering = True
456 serverPassword = self.__server.getPassword() 462 serverPassword = self.__server.getPassword()
479 """ 485 """
480 Private slot to indicate the host was disconnected. 486 Private slot to indicate the host was disconnected.
481 """ 487 """
482 if self.networkWidget.isConnected(): 488 if self.networkWidget.isConnected():
483 self.__closeAllChannels() 489 self.__closeAllChannels()
484 self.networkWidget.addServerMessage(self.trUtf8("Info"), 490 self.networkWidget.addServerMessage(
491 self.trUtf8("Info"),
485 self.trUtf8("Server disconnected.")) 492 self.trUtf8("Server disconnected."))
486 self.networkWidget.setRegistered(False) 493 self.networkWidget.setRegistered(False)
487 self.networkWidget.setConnected(False) 494 self.networkWidget.setConnected(False)
488 self.__server = None 495 self.__server = None
489 self.__nickName = "" 496 self.__nickName = ""
499 def __readyRead(self): 506 def __readyRead(self):
500 """ 507 """
501 Private slot to read data from the socket. 508 Private slot to read data from the socket.
502 """ 509 """
503 if self.__socket: 510 if self.__socket:
504 self.__buffer += str(self.__socket.readAll(), 511 self.__buffer += str(
505 Preferences.getSystem("IOEncoding"), 512 self.__socket.readAll(),
506 'replace') 513 Preferences.getSystem("IOEncoding"),
514 'replace')
507 if self.__buffer.endswith("\r\n"): 515 if self.__buffer.endswith("\r\n"):
508 for line in self.__buffer.splitlines(): 516 for line in self.__buffer.splitlines():
509 line = line.strip() 517 line = line.strip()
510 if line: 518 if line:
511 logging.debug("<IRC> " + line) 519 logging.debug("<IRC> " + line)
663 message = self.trUtf8("Message of the day") 671 message = self.trUtf8("Message of the day")
664 elif code == 376: 672 elif code == 376:
665 message = self.trUtf8("End of message of the day") 673 message = self.trUtf8("End of message of the day")
666 elif code == 4: 674 elif code == 4:
667 parts = message.strip().split() 675 parts = message.strip().split()
668 message = self.trUtf8("Server {0} (Version {1}), User-Modes: {2}," 676 message = self.trUtf8(
677 "Server {0} (Version {1}), User-Modes: {2},"
669 " Channel-Modes: {3}").format( 678 " Channel-Modes: {3}").format(
670 parts[1], parts[2], parts[3], parts[4]) 679 parts[1], parts[2], parts[3], parts[4])
671 elif code == 265: 680 elif code == 265:
672 parts = message.strip().split() 681 parts = message.strip().split()
673 message = self.trUtf8( 682 message = self.trUtf8(
740 (QAbstractSocket.SocketError) 749 (QAbstractSocket.SocketError)
741 """ 750 """
742 if error == QAbstractSocket.RemoteHostClosedError: 751 if error == QAbstractSocket.RemoteHostClosedError:
743 # ignore this one, it's a disconnect 752 # ignore this one, it's a disconnect
744 if self.__sslErrorLock: 753 if self.__sslErrorLock:
745 self.networkWidget.addErrorMessage(self.trUtf8("SSL Error"), 754 self.networkWidget.addErrorMessage(
755 self.trUtf8("SSL Error"),
746 self.trUtf8( 756 self.trUtf8(
747 """Connection to server {0} (port {1}) lost while""" 757 """Connection to server {0} (port {1}) lost while"""
748 """ waiting for user response to an SSL error.""") 758 """ waiting for user response to an SSL error.""")
749 .format(self.__server.getName(), self.__server.getPort())) 759 .format(self.__server.getName(), self.__server.getPort()))
750 self.__connectionState = IrcWidget.ServerDisconnected 760 self.__connectionState = IrcWidget.ServerDisconnected
751 elif error == QAbstractSocket.HostNotFoundError: 761 elif error == QAbstractSocket.HostNotFoundError:
752 self.networkWidget.addErrorMessage(self.trUtf8("Socket Error"), 762 self.networkWidget.addErrorMessage(
763 self.trUtf8("Socket Error"),
753 self.trUtf8( 764 self.trUtf8(
754 "The host was not found. Please check the host name" 765 "The host was not found. Please check the host name"
755 " and port settings.")) 766 " and port settings."))
756 elif error == QAbstractSocket.ConnectionRefusedError: 767 elif error == QAbstractSocket.ConnectionRefusedError:
757 self.networkWidget.addErrorMessage(self.trUtf8("Socket Error"), 768 self.networkWidget.addErrorMessage(
769 self.trUtf8("Socket Error"),
758 self.trUtf8( 770 self.trUtf8(
759 "The connection was refused by the peer. Please check the" 771 "The connection was refused by the peer. Please check the"
760 " host name and port settings.")) 772 " host name and port settings."))
761 elif error == QAbstractSocket.SslHandshakeFailedError: 773 elif error == QAbstractSocket.SslHandshakeFailedError:
762 self.networkWidget.addErrorMessage(self.trUtf8("Socket Error"), 774 self.networkWidget.addErrorMessage(
775 self.trUtf8("Socket Error"),
763 self.trUtf8("The SSL handshake failed.")) 776 self.trUtf8("The SSL handshake failed."))
764 else: 777 else:
765 if self.__socket: 778 if self.__socket:
766 self.networkWidget.addErrorMessage(self.trUtf8("Socket Error"), 779 self.networkWidget.addErrorMessage(
780 self.trUtf8("Socket Error"),
767 self.trUtf8( 781 self.trUtf8(
768 "The following network error occurred:<br/>{0}") 782 "The following network error occurred:<br/>{0}")
769 .format(self.__socket.errorString())) 783 .format(self.__socket.errorString()))
770 else: 784 else:
771 self.networkWidget.addErrorMessage(self.trUtf8("Socket Error"), 785 self.networkWidget.addErrorMessage(
786 self.trUtf8("Socket Error"),
772 self.trUtf8("A network error occurred.")) 787 self.trUtf8("A network error occurred."))
773 788
774 def __sslErrors(self, errors): 789 def __sslErrors(self, errors):
775 """ 790 """
776 Private slot to handle SSL errors. 791 Private slot to handle SSL errors.
778 @param errors list of SSL errors (list of QSslError) 793 @param errors list of SSL errors (list of QSslError)
779 """ 794 """
780 ignored, defaultChanged = self.__sslErrorHandler.sslErrors( 795 ignored, defaultChanged = self.__sslErrorHandler.sslErrors(
781 errors, self.__server.getName(), self.__server.getPort()) 796 errors, self.__server.getName(), self.__server.getPort())
782 if ignored == E5SslErrorHandler.NotIgnored: 797 if ignored == E5SslErrorHandler.NotIgnored:
783 self.networkWidget.addErrorMessage(self.trUtf8("SSL Error"), 798 self.networkWidget.addErrorMessage(
799 self.trUtf8("SSL Error"),
784 self.trUtf8( 800 self.trUtf8(
785 """Could not connect to {0} (port {1}) using an SSL""" 801 """Could not connect to {0} (port {1}) using an SSL"""
786 """ encrypted connection. Either the server does not""" 802 """ encrypted connection. Either the server does not"""
787 """ support SSL (did you use the correct port?) or""" 803 """ support SSL (did you use the correct port?) or"""
788 """ you rejected the certificate.""").format( 804 """ you rejected the certificate.""").format(
791 else: 807 else:
792 if defaultChanged: 808 if defaultChanged:
793 self.__socket.setSslConfiguration( 809 self.__socket.setSslConfiguration(
794 QSslConfiguration.defaultConfiguration()) 810 QSslConfiguration.defaultConfiguration())
795 if ignored == E5SslErrorHandler.UserIgnored: 811 if ignored == E5SslErrorHandler.UserIgnored:
796 self.networkWidget.addErrorMessage(self.trUtf8("SSL Error"), 812 self.networkWidget.addErrorMessage(
813 self.trUtf8("SSL Error"),
797 self.trUtf8( 814 self.trUtf8(
798 """The SSL certificate for the server {0} (port {1})""" 815 """The SSL certificate for the server {0} (port {1})"""
799 """ failed the authenticity check. SSL errors""" 816 """ failed the authenticity check. SSL errors"""
800 """ were accepted by you.""").format( 817 """ were accepted by you.""").format(
801 self.__server.getName(), self.__server.getPort())) 818 self.__server.getName(), self.__server.getPort()))
848 if Version.startswith("@@"): 865 if Version.startswith("@@"):
849 vers = "" 866 vers = ""
850 else: 867 else:
851 vers = " " + Version 868 vers = " " + Version
852 msg = "Eric IRC client{0}, {1}".format(vers, Copyright) 869 msg = "Eric IRC client{0}, {1}".format(vers, Copyright)
853 self.networkWidget.addServerMessage(self.trUtf8("CTCP"), 870 self.networkWidget.addServerMessage(
871 self.trUtf8("CTCP"),
854 self.trUtf8("Received Version request from {0}.").format( 872 self.trUtf8("Received Version request from {0}.").format(
855 match.group(1))) 873 match.group(1)))
856 self.__sendCtcpReply(match.group(1), "VERSION " + msg) 874 self.__sendCtcpReply(match.group(1), "VERSION " + msg)
857 elif ctcpRequest == "ping": 875 elif ctcpRequest == "ping":
858 self.networkWidget.addServerMessage(self.trUtf8("CTCP"), 876 self.networkWidget.addServerMessage(
859 self.trUtf8("Received CTCP-PING request from {0}," 877 self.trUtf8("CTCP"),
860 " sending answer.").format(match.group(1))) 878 self.trUtf8(
879 "Received CTCP-PING request from {0},"
880 " sending answer.").format(match.group(1)))
861 self.__sendCtcpReply( 881 self.__sendCtcpReply(
862 match.group(1), "PING {0}".format(ctcpArg)) 882 match.group(1), "PING {0}".format(ctcpArg))
863 elif ctcpRequest == "clientinfo": 883 elif ctcpRequest == "clientinfo":
864 self.networkWidget.addServerMessage(self.trUtf8("CTCP"), 884 self.networkWidget.addServerMessage(
865 self.trUtf8("Received CTCP-CLIENTINFO request from {0}," 885 self.trUtf8("CTCP"),
886 self.trUtf8(
887 "Received CTCP-CLIENTINFO request from {0},"
866 " sending answer.").format(match.group(1))) 888 " sending answer.").format(match.group(1)))
867 self.__sendCtcpReply(match.group(1), 889 self.__sendCtcpReply(
890 match.group(1),
868 "CLIENTINFO CLIENTINFO PING VERSION") 891 "CLIENTINFO CLIENTINFO PING VERSION")
869 else: 892 else:
870 self.networkWidget.addServerMessage(self.trUtf8("CTCP"), 893 self.networkWidget.addServerMessage(
894 self.trUtf8("CTCP"),
871 self.trUtf8( 895 self.trUtf8(
872 "Received unknown CTCP-{0} request from {1}.").format( 896 "Received unknown CTCP-{0} request from {1}.").format(
873 ctcpRequest, match.group(1))) 897 ctcpRequest, match.group(1)))
874 return True 898 return True
875 899
879 """ 903 """
880 Private method to update the users count on the channel tabs. 904 Private method to update the users count on the channel tabs.
881 """ 905 """
882 for channel in self.__channelList: 906 for channel in self.__channelList:
883 index = self.channelsWidget.indexOf(channel) 907 index = self.channelsWidget.indexOf(channel)
884 self.channelsWidget.setTabText(index, 908 self.channelsWidget.setTabText(
909 index,
885 self.trUtf8("{0} ({1})", "channel name, users count").format( 910 self.trUtf8("{0} ({1})", "channel name, users count").format(
886 channel.name(), channel.getUsersCount())) 911 channel.name(), channel.getUsersCount()))
887 912
888 def __handleNickInUseLogin(self): 913 def __handleNickInUseLogin(self):
889 """ 914 """
912 937
913 def __handleNickInUse(self): 938 def __handleNickInUse(self):
914 """ 939 """
915 Private method to handle a 443 server error. 940 Private method to handle a 443 server error.
916 """ 941 """
917 self.networkWidget.addServerMessage(self.trUtf8("Critical"), 942 self.networkWidget.addServerMessage(
943 self.trUtf8("Critical"),
918 self.trUtf8("The given nickname is already in use.")) 944 self.trUtf8("The given nickname is already in use."))
919 945
920 def __changeNick(self, nick): 946 def __changeNick(self, nick):
921 """ 947 """
922 Private slot to use a new nick name. 948 Private slot to use a new nick name.

eric ide

mercurial