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. |