238 self.trUtf8("""<p>Do you really want to disconnect from""" |
238 self.trUtf8("""<p>Do you really want to disconnect from""" |
239 """ <b>{0}</b>?</p><p>All channels will be""" |
239 """ <b>{0}</b>?</p><p>All channels will be""" |
240 """ closed.</p>""")\ |
240 """ closed.</p>""")\ |
241 .format(self.__server.getName())) |
241 .format(self.__server.getName())) |
242 if ok: |
242 if ok: |
243 self.networkWidget.addServerMessage(self.trUtf8("Info"), |
243 self.networkWidget.addServerMessage( |
|
244 self.trUtf8("Info"), |
244 self.trUtf8("Disconnecting from server {0}...").format( |
245 self.trUtf8("Disconnecting from server {0}...").format( |
245 self.__server.getName())) |
246 self.__server.getName())) |
246 self.__closeAllChannels() |
247 self.__closeAllChannels() |
247 self.__send("QUIT :" + self.__quitMessage) |
248 self.__send("QUIT :" + self.__quitMessage) |
248 self.__socket and self.__socket.flush() |
249 self.__socket and self.__socket.flush() |
435 |
436 |
436 def __hostFound(self): |
437 def __hostFound(self): |
437 """ |
438 """ |
438 Private slot to indicate the host was found. |
439 Private slot to indicate the host was found. |
439 """ |
440 """ |
440 self.networkWidget.addServerMessage(self.trUtf8("Info"), |
441 self.networkWidget.addServerMessage( |
|
442 self.trUtf8("Info"), |
441 self.trUtf8("Server found,connecting...")) |
443 self.trUtf8("Server found,connecting...")) |
442 |
444 |
443 def __hostConnected(self): |
445 def __hostConnected(self): |
444 """ |
446 """ |
445 Private slot to log in to the server after the connection was |
447 Private slot to log in to the server after the connection was |
446 established. |
448 established. |
447 """ |
449 """ |
448 self.networkWidget.addServerMessage(self.trUtf8("Info"), |
450 self.networkWidget.addServerMessage( |
|
451 self.trUtf8("Info"), |
449 self.trUtf8("Connected,logging in...")) |
452 self.trUtf8("Connected,logging in...")) |
450 self.networkWidget.setConnected(True) |
453 self.networkWidget.setConnected(True) |
451 |
454 |
452 self.__registering = True |
455 self.__registering = True |
453 serverPassword = self.__server.getPassword() |
456 serverPassword = self.__server.getPassword() |
476 """ |
479 """ |
477 Private slot to indicate the host was disconnected. |
480 Private slot to indicate the host was disconnected. |
478 """ |
481 """ |
479 if self.networkWidget.isConnected(): |
482 if self.networkWidget.isConnected(): |
480 self.__closeAllChannels() |
483 self.__closeAllChannels() |
481 self.networkWidget.addServerMessage(self.trUtf8("Info"), |
484 self.networkWidget.addServerMessage( |
|
485 self.trUtf8("Info"), |
482 self.trUtf8("Server disconnected.")) |
486 self.trUtf8("Server disconnected.")) |
483 self.networkWidget.setRegistered(False) |
487 self.networkWidget.setRegistered(False) |
484 self.networkWidget.setConnected(False) |
488 self.networkWidget.setConnected(False) |
485 self.__server = None |
489 self.__server = None |
486 self.__nickName = "" |
490 self.__nickName = "" |
496 def __readyRead(self): |
500 def __readyRead(self): |
497 """ |
501 """ |
498 Private slot to read data from the socket. |
502 Private slot to read data from the socket. |
499 """ |
503 """ |
500 if self.__socket: |
504 if self.__socket: |
501 self.__buffer += str(self.__socket.readAll(), |
505 self.__buffer += str( |
502 Preferences.getSystem("IOEncoding"), |
506 self.__socket.readAll(), |
503 'replace') |
507 Preferences.getSystem("IOEncoding"), |
|
508 'replace') |
504 if self.__buffer.endswith("\r\n"): |
509 if self.__buffer.endswith("\r\n"): |
505 for line in self.__buffer.splitlines(): |
510 for line in self.__buffer.splitlines(): |
506 line = line.strip() |
511 line = line.strip() |
507 if line: |
512 if line: |
508 logging.debug("<IRC> " + line) |
513 logging.debug("<IRC> " + line) |
660 message = self.trUtf8("Message of the day") |
665 message = self.trUtf8("Message of the day") |
661 elif code == 376: |
666 elif code == 376: |
662 message = self.trUtf8("End of message of the day") |
667 message = self.trUtf8("End of message of the day") |
663 elif code == 4: |
668 elif code == 4: |
664 parts = message.strip().split() |
669 parts = message.strip().split() |
665 message = self.trUtf8("Server {0} (Version {1}), User-Modes: {2}," |
670 message = self.trUtf8( |
|
671 "Server {0} (Version {1}), User-Modes: {2}," |
666 " Channel-Modes: {3}").format( |
672 " Channel-Modes: {3}").format( |
667 parts[1], parts[2], parts[3], parts[4]) |
673 parts[1], parts[2], parts[3], parts[4]) |
668 elif code == 265: |
674 elif code == 265: |
669 parts = message.strip().split() |
675 parts = message.strip().split() |
670 message = self.trUtf8( |
676 message = self.trUtf8( |
737 (QAbstractSocket.SocketError) |
743 (QAbstractSocket.SocketError) |
738 """ |
744 """ |
739 if error == QAbstractSocket.RemoteHostClosedError: |
745 if error == QAbstractSocket.RemoteHostClosedError: |
740 # ignore this one, it's a disconnect |
746 # ignore this one, it's a disconnect |
741 if self.__sslErrorLock: |
747 if self.__sslErrorLock: |
742 self.networkWidget.addErrorMessage(self.trUtf8("SSL Error"), |
748 self.networkWidget.addErrorMessage( |
|
749 self.trUtf8("SSL Error"), |
743 self.trUtf8( |
750 self.trUtf8( |
744 """Connection to server {0} (port {1}) lost while""" |
751 """Connection to server {0} (port {1}) lost while""" |
745 """ waiting for user response to an SSL error.""") |
752 """ waiting for user response to an SSL error.""") |
746 .format(self.__server.getName(), self.__server.getPort())) |
753 .format(self.__server.getName(), self.__server.getPort())) |
747 self.__connectionState = IrcWidget.ServerDisconnected |
754 self.__connectionState = IrcWidget.ServerDisconnected |
748 elif error == QAbstractSocket.HostNotFoundError: |
755 elif error == QAbstractSocket.HostNotFoundError: |
749 self.networkWidget.addErrorMessage(self.trUtf8("Socket Error"), |
756 self.networkWidget.addErrorMessage( |
|
757 self.trUtf8("Socket Error"), |
750 self.trUtf8( |
758 self.trUtf8( |
751 "The host was not found. Please check the host name" |
759 "The host was not found. Please check the host name" |
752 " and port settings.")) |
760 " and port settings.")) |
753 elif error == QAbstractSocket.ConnectionRefusedError: |
761 elif error == QAbstractSocket.ConnectionRefusedError: |
754 self.networkWidget.addErrorMessage(self.trUtf8("Socket Error"), |
762 self.networkWidget.addErrorMessage( |
|
763 self.trUtf8("Socket Error"), |
755 self.trUtf8( |
764 self.trUtf8( |
756 "The connection was refused by the peer. Please check the" |
765 "The connection was refused by the peer. Please check the" |
757 " host name and port settings.")) |
766 " host name and port settings.")) |
758 elif error == QAbstractSocket.SslHandshakeFailedError: |
767 elif error == QAbstractSocket.SslHandshakeFailedError: |
759 self.networkWidget.addErrorMessage(self.trUtf8("Socket Error"), |
768 self.networkWidget.addErrorMessage( |
|
769 self.trUtf8("Socket Error"), |
760 self.trUtf8("The SSL handshake failed.")) |
770 self.trUtf8("The SSL handshake failed.")) |
761 else: |
771 else: |
762 if self.__socket: |
772 if self.__socket: |
763 self.networkWidget.addErrorMessage(self.trUtf8("Socket Error"), |
773 self.networkWidget.addErrorMessage( |
|
774 self.trUtf8("Socket Error"), |
764 self.trUtf8( |
775 self.trUtf8( |
765 "The following network error occurred:<br/>{0}") |
776 "The following network error occurred:<br/>{0}") |
766 .format(self.__socket.errorString())) |
777 .format(self.__socket.errorString())) |
767 else: |
778 else: |
768 self.networkWidget.addErrorMessage(self.trUtf8("Socket Error"), |
779 self.networkWidget.addErrorMessage( |
|
780 self.trUtf8("Socket Error"), |
769 self.trUtf8("A network error occurred.")) |
781 self.trUtf8("A network error occurred.")) |
770 |
782 |
771 def __sslErrors(self, errors): |
783 def __sslErrors(self, errors): |
772 """ |
784 """ |
773 Private slot to handle SSL errors. |
785 Private slot to handle SSL errors. |
775 @param errors list of SSL errors (list of QSslError) |
787 @param errors list of SSL errors (list of QSslError) |
776 """ |
788 """ |
777 ignored, defaultChanged = self.__sslErrorHandler.sslErrors( |
789 ignored, defaultChanged = self.__sslErrorHandler.sslErrors( |
778 errors, self.__server.getName(), self.__server.getPort()) |
790 errors, self.__server.getName(), self.__server.getPort()) |
779 if ignored == E5SslErrorHandler.NotIgnored: |
791 if ignored == E5SslErrorHandler.NotIgnored: |
780 self.networkWidget.addErrorMessage(self.trUtf8("SSL Error"), |
792 self.networkWidget.addErrorMessage( |
|
793 self.trUtf8("SSL Error"), |
781 self.trUtf8( |
794 self.trUtf8( |
782 """Could not connect to {0} (port {1}) using an SSL""" |
795 """Could not connect to {0} (port {1}) using an SSL""" |
783 """ encrypted connection. Either the server does not""" |
796 """ encrypted connection. Either the server does not""" |
784 """ support SSL (did you use the correct port?) or""" |
797 """ support SSL (did you use the correct port?) or""" |
785 """ you rejected the certificate.""").format( |
798 """ you rejected the certificate.""").format( |
788 else: |
801 else: |
789 if defaultChanged: |
802 if defaultChanged: |
790 self.__socket.setSslConfiguration( |
803 self.__socket.setSslConfiguration( |
791 QSslConfiguration.defaultConfiguration()) |
804 QSslConfiguration.defaultConfiguration()) |
792 if ignored == E5SslErrorHandler.UserIgnored: |
805 if ignored == E5SslErrorHandler.UserIgnored: |
793 self.networkWidget.addErrorMessage(self.trUtf8("SSL Error"), |
806 self.networkWidget.addErrorMessage( |
|
807 self.trUtf8("SSL Error"), |
794 self.trUtf8( |
808 self.trUtf8( |
795 """The SSL certificate for the server {0} (port {1})""" |
809 """The SSL certificate for the server {0} (port {1})""" |
796 """ failed the authenticity check. SSL errors""" |
810 """ failed the authenticity check. SSL errors""" |
797 """ were accepted by you.""").format( |
811 """ were accepted by you.""").format( |
798 self.__server.getName(), self.__server.getPort())) |
812 self.__server.getName(), self.__server.getPort())) |
845 if Version.startswith("@@"): |
859 if Version.startswith("@@"): |
846 vers = "" |
860 vers = "" |
847 else: |
861 else: |
848 vers = " " + Version |
862 vers = " " + Version |
849 msg = "Eric IRC client{0}, {1}".format(vers, Copyright) |
863 msg = "Eric IRC client{0}, {1}".format(vers, Copyright) |
850 self.networkWidget.addServerMessage(self.trUtf8("CTCP"), |
864 self.networkWidget.addServerMessage( |
|
865 self.trUtf8("CTCP"), |
851 self.trUtf8("Received Version request from {0}.").format( |
866 self.trUtf8("Received Version request from {0}.").format( |
852 match.group(1))) |
867 match.group(1))) |
853 self.__sendCtcpReply(match.group(1), "VERSION " + msg) |
868 self.__sendCtcpReply(match.group(1), "VERSION " + msg) |
854 elif ctcpRequest == "ping": |
869 elif ctcpRequest == "ping": |
855 self.networkWidget.addServerMessage(self.trUtf8("CTCP"), |
870 self.networkWidget.addServerMessage( |
856 self.trUtf8("Received CTCP-PING request from {0}," |
871 self.trUtf8("CTCP"), |
857 " sending answer.").format(match.group(1))) |
872 self.trUtf8( |
|
873 "Received CTCP-PING request from {0}," |
|
874 " sending answer.").format(match.group(1))) |
858 self.__sendCtcpReply( |
875 self.__sendCtcpReply( |
859 match.group(1), "PING {0}".format(ctcpArg)) |
876 match.group(1), "PING {0}".format(ctcpArg)) |
860 elif ctcpRequest == "clientinfo": |
877 elif ctcpRequest == "clientinfo": |
861 self.networkWidget.addServerMessage(self.trUtf8("CTCP"), |
878 self.networkWidget.addServerMessage( |
862 self.trUtf8("Received CTCP-CLIENTINFO request from {0}," |
879 self.trUtf8("CTCP"), |
|
880 self.trUtf8( |
|
881 "Received CTCP-CLIENTINFO request from {0}," |
863 " sending answer.").format(match.group(1))) |
882 " sending answer.").format(match.group(1))) |
864 self.__sendCtcpReply(match.group(1), |
883 self.__sendCtcpReply( |
|
884 match.group(1), |
865 "CLIENTINFO CLIENTINFO PING VERSION") |
885 "CLIENTINFO CLIENTINFO PING VERSION") |
866 else: |
886 else: |
867 self.networkWidget.addServerMessage(self.trUtf8("CTCP"), |
887 self.networkWidget.addServerMessage( |
|
888 self.trUtf8("CTCP"), |
868 self.trUtf8( |
889 self.trUtf8( |
869 "Received unknown CTCP-{0} request from {1}.").format( |
890 "Received unknown CTCP-{0} request from {1}.").format( |
870 ctcpRequest, match.group(1))) |
891 ctcpRequest, match.group(1))) |
871 return True |
892 return True |
872 |
893 |
876 """ |
897 """ |
877 Private method to update the users count on the channel tabs. |
898 Private method to update the users count on the channel tabs. |
878 """ |
899 """ |
879 for channel in self.__channelList: |
900 for channel in self.__channelList: |
880 index = self.channelsWidget.indexOf(channel) |
901 index = self.channelsWidget.indexOf(channel) |
881 self.channelsWidget.setTabText(index, |
902 self.channelsWidget.setTabText( |
|
903 index, |
882 self.trUtf8("{0} ({1})", "channel name, users count").format( |
904 self.trUtf8("{0} ({1})", "channel name, users count").format( |
883 channel.name(), channel.getUsersCount())) |
905 channel.name(), channel.getUsersCount())) |
884 |
906 |
885 def __handleNickInUseLogin(self): |
907 def __handleNickInUseLogin(self): |
886 """ |
908 """ |
909 |
931 |
910 def __handleNickInUse(self): |
932 def __handleNickInUse(self): |
911 """ |
933 """ |
912 Private method to handle a 443 server error. |
934 Private method to handle a 443 server error. |
913 """ |
935 """ |
914 self.networkWidget.addServerMessage(self.trUtf8("Critical"), |
936 self.networkWidget.addServerMessage( |
|
937 self.trUtf8("Critical"), |
915 self.trUtf8("The given nickname is already in use.")) |
938 self.trUtf8("The given nickname is already in use.")) |
916 |
939 |
917 def __changeNick(self, nick): |
940 def __changeNick(self, nick): |
918 """ |
941 """ |
919 Private slot to use a new nick name. |
942 Private slot to use a new nick name. |