64 |
64 |
65 self.__leaveButton = QToolButton(self) |
65 self.__leaveButton = QToolButton(self) |
66 self.__leaveButton.setIcon( |
66 self.__leaveButton.setIcon( |
67 UI.PixmapCache.getIcon("ircCloseChannel.png")) |
67 UI.PixmapCache.getIcon("ircCloseChannel.png")) |
68 self.__leaveButton.setToolTip( |
68 self.__leaveButton.setToolTip( |
69 self.trUtf8("Press to leave the current channel")) |
69 self.tr("Press to leave the current channel")) |
70 self.__leaveButton.clicked[()].connect(self.__leaveChannel) |
70 self.__leaveButton.clicked.connect(self.__leaveChannel) |
71 self.__leaveButton.setEnabled(False) |
71 self.__leaveButton.setEnabled(False) |
72 self.channelsWidget.setCornerWidget( |
72 self.channelsWidget.setCornerWidget( |
73 self.__leaveButton, Qt.BottomRightCorner) |
73 self.__leaveButton, Qt.BottomRightCorner) |
74 self.channelsWidget.setTabsClosable(False) |
74 self.channelsWidget.setTabsClosable(False) |
75 if not isMacPlatform(): |
75 if not isMacPlatform(): |
216 self.__socket.error.connect(self.__tcpError) |
216 self.__socket.error.connect(self.__tcpError) |
217 |
217 |
218 self.__connectionState = IrcWidget.ServerConnecting |
218 self.__connectionState = IrcWidget.ServerConnecting |
219 if useSSL: |
219 if useSSL: |
220 self.networkWidget.addServerMessage( |
220 self.networkWidget.addServerMessage( |
221 self.trUtf8("Info"), |
221 self.tr("Info"), |
222 self.trUtf8("Looking for server {0} (port {1})" |
222 self.tr("Looking for server {0} (port {1})" |
223 " using an SSL encrypted connection" |
223 " using an SSL encrypted connection" |
224 "...").format(self.__server.getName(), |
224 "...").format(self.__server.getName(), |
225 self.__server.getPort())) |
225 self.__server.getPort())) |
226 self.__socket.connectToHostEncrypted( |
226 self.__socket.connectToHostEncrypted( |
227 self.__server.getName(), self.__server.getPort()) |
227 self.__server.getName(), self.__server.getPort()) |
228 else: |
228 else: |
229 self.networkWidget.addServerMessage( |
229 self.networkWidget.addServerMessage( |
230 self.trUtf8("Info"), |
230 self.tr("Info"), |
231 self.trUtf8( |
231 self.tr( |
232 "Looking for server {0} (port {1})...").format( |
232 "Looking for server {0} (port {1})...").format( |
233 self.__server.getName(), |
233 self.__server.getName(), |
234 self.__server.getPort())) |
234 self.__server.getPort())) |
235 self.__socket.connectToHost(self.__server.getName(), |
235 self.__socket.connectToHost(self.__server.getName(), |
236 self.__server.getPort()) |
236 self.__server.getPort()) |
238 if silent: |
238 if silent: |
239 ok = True |
239 ok = True |
240 else: |
240 else: |
241 ok = E5MessageBox.yesNo( |
241 ok = E5MessageBox.yesNo( |
242 self, |
242 self, |
243 self.trUtf8("Disconnect from Server"), |
243 self.tr("Disconnect from Server"), |
244 self.trUtf8("""<p>Do you really want to disconnect from""" |
244 self.tr("""<p>Do you really want to disconnect from""" |
245 """ <b>{0}</b>?</p><p>All channels will be""" |
245 """ <b>{0}</b>?</p><p>All channels will be""" |
246 """ closed.</p>""") |
246 """ closed.</p>""") |
247 .format(self.__server.getName())) |
247 .format(self.__server.getName())) |
248 if ok: |
248 if ok: |
249 self.networkWidget.addServerMessage( |
249 self.networkWidget.addServerMessage( |
250 self.trUtf8("Info"), |
250 self.tr("Info"), |
251 self.trUtf8("Disconnecting from server {0}...").format( |
251 self.tr("Disconnecting from server {0}...").format( |
252 self.__server.getName())) |
252 self.__server.getName())) |
253 self.__closeAllChannels() |
253 self.__closeAllChannels() |
254 self.__send("QUIT :" + self.__quitMessage) |
254 self.__send("QUIT :" + self.__quitMessage) |
255 self.__socket and self.__socket.flush() |
255 self.__socket and self.__socket.flush() |
256 self.__socket and self.__socket.close() |
256 self.__socket and self.__socket.close() |
443 def __hostFound(self): |
443 def __hostFound(self): |
444 """ |
444 """ |
445 Private slot to indicate the host was found. |
445 Private slot to indicate the host was found. |
446 """ |
446 """ |
447 self.networkWidget.addServerMessage( |
447 self.networkWidget.addServerMessage( |
448 self.trUtf8("Info"), |
448 self.tr("Info"), |
449 self.trUtf8("Server found,connecting...")) |
449 self.tr("Server found,connecting...")) |
450 |
450 |
451 def __hostConnected(self): |
451 def __hostConnected(self): |
452 """ |
452 """ |
453 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 |
454 established. |
454 established. |
455 """ |
455 """ |
456 self.networkWidget.addServerMessage( |
456 self.networkWidget.addServerMessage( |
457 self.trUtf8("Info"), |
457 self.tr("Info"), |
458 self.trUtf8("Connected,logging in...")) |
458 self.tr("Connected,logging in...")) |
459 self.networkWidget.setConnected(True) |
459 self.networkWidget.setConnected(True) |
460 |
460 |
461 self.__registering = True |
461 self.__registering = True |
462 serverPassword = self.__server.getPassword() |
462 serverPassword = self.__server.getPassword() |
463 if serverPassword: |
463 if serverPassword: |
555 except IndexError: |
555 except IndexError: |
556 msg = match.group(3) |
556 msg = match.group(3) |
557 if "!" in match.group(1): |
557 if "!" in match.group(1): |
558 name = match.group(1).split("!", 1)[0] |
558 name = match.group(1).split("!", 1)[0] |
559 msg = "-{0}- {1}".format(name, msg) |
559 msg = "-{0}- {1}".format(name, msg) |
560 self.networkWidget.addServerMessage(self.trUtf8("Notice"), msg) |
560 self.networkWidget.addServerMessage(self.tr("Notice"), msg) |
561 return True |
561 return True |
562 elif name == "MODE": |
562 elif name == "MODE": |
563 self.__registering = False |
563 self.__registering = False |
564 if ":" in match.group(3): |
564 if ":" in match.group(3): |
565 # :detlev_ MODE detlev_ :+i |
565 # :detlev_ MODE detlev_ :+i |
566 name, modes = match.group(3).split(" :") |
566 name, modes = match.group(3).split(" :") |
567 sourceNick = match.group(1) |
567 sourceNick = match.group(1) |
568 if not self.isChannelName(name): |
568 if not self.isChannelName(name): |
569 if name == self.__nickName: |
569 if name == self.__nickName: |
570 if sourceNick == self.__nickName: |
570 if sourceNick == self.__nickName: |
571 msg = self.trUtf8( |
571 msg = self.tr( |
572 "You have set your personal modes to" |
572 "You have set your personal modes to" |
573 " <b>[{0}]</b>.").format(modes) |
573 " <b>[{0}]</b>.").format(modes) |
574 else: |
574 else: |
575 msg = self.trUtf8( |
575 msg = self.tr( |
576 "{0} has changed your personal modes to" |
576 "{0} has changed your personal modes to" |
577 " <b>[{1}]</b>.").format(sourceNick, modes) |
577 " <b>[{1}]</b>.").format(sourceNick, modes) |
578 self.networkWidget.addServerMessage( |
578 self.networkWidget.addServerMessage( |
579 self.trUtf8("Mode"), msg, filterMsg=False) |
579 self.tr("Mode"), msg, filterMsg=False) |
580 return True |
580 return True |
581 elif name == "PART": |
581 elif name == "PART": |
582 nick = match.group(1).split("!", 1)[0] |
582 nick = match.group(1).split("!", 1)[0] |
583 if nick == self.__nickName: |
583 if nick == self.__nickName: |
584 channel = match.group(3).split(None, 1)[0] |
584 channel = match.group(3).split(None, 1)[0] |
585 self.networkWidget.addMessage( |
585 self.networkWidget.addMessage( |
586 self.trUtf8("You have left channel {0}.").format(channel)) |
586 self.tr("You have left channel {0}.").format(channel)) |
587 return True |
587 return True |
588 elif name == "QUIT": |
588 elif name == "QUIT": |
589 # don't do anything with it here |
589 # don't do anything with it here |
590 return True |
590 return True |
591 elif name == "NICK": |
591 elif name == "NICK": |
592 # :foo_!n=foo@foohost.bar.net NICK :newnick |
592 # :foo_!n=foo@foohost.bar.net NICK :newnick |
593 oldNick = match.group(1).split("!", 1)[0] |
593 oldNick = match.group(1).split("!", 1)[0] |
594 newNick = match.group(3).split(":", 1)[1] |
594 newNick = match.group(3).split(":", 1)[1] |
595 if oldNick == self.__nickName: |
595 if oldNick == self.__nickName: |
596 self.networkWidget.addMessage( |
596 self.networkWidget.addMessage( |
597 self.trUtf8("You are now known as {0}.").format(newNick)) |
597 self.tr("You are now known as {0}.").format(newNick)) |
598 self.__nickName = newNick |
598 self.__nickName = newNick |
599 self.networkWidget.setNickName(newNick) |
599 self.networkWidget.setNickName(newNick) |
600 else: |
600 else: |
601 self.networkWidget.addMessage( |
601 self.networkWidget.addMessage( |
602 self.trUtf8("User {0} is now known as {1}.").format( |
602 self.tr("User {0} is now known as {1}.").format( |
603 oldNick, newNick)) |
603 oldNick, newNick)) |
604 return True |
604 return True |
605 elif name == "ERROR": |
605 elif name == "ERROR": |
606 self.networkWidget.addErrorMessage( |
606 self.networkWidget.addErrorMessage( |
607 self.trUtf8("Server Error"), match.group(3).split(":", 1)[1]) |
607 self.tr("Server Error"), match.group(3).split(":", 1)[1]) |
608 return True |
608 return True |
609 |
609 |
610 return False |
610 return False |
611 |
611 |
612 def __handleNumericMessage(self, match): |
612 def __handleNumericMessage(self, match): |
652 @param message message sent by the server (string) |
652 @param message message sent by the server (string) |
653 @return flag indicating, if the message was handled (boolean) |
653 @return flag indicating, if the message was handled (boolean) |
654 """ |
654 """ |
655 # determine message type |
655 # determine message type |
656 if code in [1, 2, 3, 4]: |
656 if code in [1, 2, 3, 4]: |
657 msgType = self.trUtf8("Welcome") |
657 msgType = self.tr("Welcome") |
658 elif code == 5: |
658 elif code == 5: |
659 msgType = self.trUtf8("Support") |
659 msgType = self.tr("Support") |
660 elif code in [250, 251, 252, 253, 254, 255, 265, 266]: |
660 elif code in [250, 251, 252, 253, 254, 255, 265, 266]: |
661 msgType = self.trUtf8("User") |
661 msgType = self.tr("User") |
662 elif code in [372, 375, 376]: |
662 elif code in [372, 375, 376]: |
663 msgType = self.trUtf8("MOTD") |
663 msgType = self.tr("MOTD") |
664 elif code in [305, 306]: |
664 elif code in [305, 306]: |
665 msgType = self.trUtf8("Away") |
665 msgType = self.tr("Away") |
666 else: |
666 else: |
667 msgType = self.trUtf8("Info ({0})").format(code) |
667 msgType = self.tr("Info ({0})").format(code) |
668 |
668 |
669 # special treatment for some messages |
669 # special treatment for some messages |
670 if code == 375: |
670 if code == 375: |
671 message = self.trUtf8("Message of the day") |
671 message = self.tr("Message of the day") |
672 elif code == 376: |
672 elif code == 376: |
673 message = self.trUtf8("End of message of the day") |
673 message = self.tr("End of message of the day") |
674 elif code == 4: |
674 elif code == 4: |
675 parts = message.strip().split() |
675 parts = message.strip().split() |
676 message = self.trUtf8( |
676 message = self.tr( |
677 "Server {0} (Version {1}), User-Modes: {2}," |
677 "Server {0} (Version {1}), User-Modes: {2}," |
678 " Channel-Modes: {3}")\ |
678 " Channel-Modes: {3}")\ |
679 .format(parts[1], parts[2], parts[3], parts[4]) |
679 .format(parts[1], parts[2], parts[3], parts[4]) |
680 elif code == 265: |
680 elif code == 265: |
681 parts = message.strip().split() |
681 parts = message.strip().split() |
682 message = self.trUtf8( |
682 message = self.tr( |
683 "Current users on {0}: {1}, max. {2}").format( |
683 "Current users on {0}: {1}, max. {2}").format( |
684 server, parts[1], parts[2]) |
684 server, parts[1], parts[2]) |
685 elif code == 266: |
685 elif code == 266: |
686 parts = message.strip().split() |
686 parts = message.strip().split() |
687 message = self.trUtf8( |
687 message = self.tr( |
688 "Current users on the network: {0}, max. {1}").format( |
688 "Current users on the network: {0}, max. {1}").format( |
689 parts[1], parts[2]) |
689 parts[1], parts[2]) |
690 elif code == 305: |
690 elif code == 305: |
691 message = self.trUtf8("You are no longer marked as being away.") |
691 message = self.tr("You are no longer marked as being away.") |
692 elif code == 306: |
692 elif code == 306: |
693 message = self.trUtf8("You have been marked as being away.") |
693 message = self.tr("You have been marked as being away.") |
694 else: |
694 else: |
695 first, message = message.split(None, 1) |
695 first, message = message.split(None, 1) |
696 if message.startswith(":"): |
696 if message.startswith(":"): |
697 message = message[1:] |
697 message = message[1:] |
698 else: |
698 else: |
750 """ |
750 """ |
751 if error == QAbstractSocket.RemoteHostClosedError: |
751 if error == QAbstractSocket.RemoteHostClosedError: |
752 # ignore this one, it's a disconnect |
752 # ignore this one, it's a disconnect |
753 if self.__sslErrorLock: |
753 if self.__sslErrorLock: |
754 self.networkWidget.addErrorMessage( |
754 self.networkWidget.addErrorMessage( |
755 self.trUtf8("SSL Error"), |
755 self.tr("SSL Error"), |
756 self.trUtf8( |
756 self.tr( |
757 """Connection to server {0} (port {1}) lost while""" |
757 """Connection to server {0} (port {1}) lost while""" |
758 """ waiting for user response to an SSL error.""") |
758 """ waiting for user response to an SSL error.""") |
759 .format(self.__server.getName(), self.__server.getPort())) |
759 .format(self.__server.getName(), self.__server.getPort())) |
760 self.__connectionState = IrcWidget.ServerDisconnected |
760 self.__connectionState = IrcWidget.ServerDisconnected |
761 elif error == QAbstractSocket.HostNotFoundError: |
761 elif error == QAbstractSocket.HostNotFoundError: |
762 self.networkWidget.addErrorMessage( |
762 self.networkWidget.addErrorMessage( |
763 self.trUtf8("Socket Error"), |
763 self.tr("Socket Error"), |
764 self.trUtf8( |
764 self.tr( |
765 "The host was not found. Please check the host name" |
765 "The host was not found. Please check the host name" |
766 " and port settings.")) |
766 " and port settings.")) |
767 elif error == QAbstractSocket.ConnectionRefusedError: |
767 elif error == QAbstractSocket.ConnectionRefusedError: |
768 self.networkWidget.addErrorMessage( |
768 self.networkWidget.addErrorMessage( |
769 self.trUtf8("Socket Error"), |
769 self.tr("Socket Error"), |
770 self.trUtf8( |
770 self.tr( |
771 "The connection was refused by the peer. Please check the" |
771 "The connection was refused by the peer. Please check the" |
772 " host name and port settings.")) |
772 " host name and port settings.")) |
773 elif error == QAbstractSocket.SslHandshakeFailedError: |
773 elif error == QAbstractSocket.SslHandshakeFailedError: |
774 self.networkWidget.addErrorMessage( |
774 self.networkWidget.addErrorMessage( |
775 self.trUtf8("Socket Error"), |
775 self.tr("Socket Error"), |
776 self.trUtf8("The SSL handshake failed.")) |
776 self.tr("The SSL handshake failed.")) |
777 else: |
777 else: |
778 if self.__socket: |
778 if self.__socket: |
779 self.networkWidget.addErrorMessage( |
779 self.networkWidget.addErrorMessage( |
780 self.trUtf8("Socket Error"), |
780 self.tr("Socket Error"), |
781 self.trUtf8( |
781 self.tr( |
782 "The following network error occurred:<br/>{0}") |
782 "The following network error occurred:<br/>{0}") |
783 .format(self.__socket.errorString())) |
783 .format(self.__socket.errorString())) |
784 else: |
784 else: |
785 self.networkWidget.addErrorMessage( |
785 self.networkWidget.addErrorMessage( |
786 self.trUtf8("Socket Error"), |
786 self.tr("Socket Error"), |
787 self.trUtf8("A network error occurred.")) |
787 self.tr("A network error occurred.")) |
788 |
788 |
789 def __sslErrors(self, errors): |
789 def __sslErrors(self, errors): |
790 """ |
790 """ |
791 Private slot to handle SSL errors. |
791 Private slot to handle SSL errors. |
792 |
792 |
794 """ |
794 """ |
795 ignored, defaultChanged = self.__sslErrorHandler.sslErrors( |
795 ignored, defaultChanged = self.__sslErrorHandler.sslErrors( |
796 errors, self.__server.getName(), self.__server.getPort()) |
796 errors, self.__server.getName(), self.__server.getPort()) |
797 if ignored == E5SslErrorHandler.NotIgnored: |
797 if ignored == E5SslErrorHandler.NotIgnored: |
798 self.networkWidget.addErrorMessage( |
798 self.networkWidget.addErrorMessage( |
799 self.trUtf8("SSL Error"), |
799 self.tr("SSL Error"), |
800 self.trUtf8( |
800 self.tr( |
801 """Could not connect to {0} (port {1}) using an SSL""" |
801 """Could not connect to {0} (port {1}) using an SSL""" |
802 """ encrypted connection. Either the server does not""" |
802 """ encrypted connection. Either the server does not""" |
803 """ support SSL (did you use the correct port?) or""" |
803 """ support SSL (did you use the correct port?) or""" |
804 """ you rejected the certificate.""") |
804 """ you rejected the certificate.""") |
805 .format(self.__server.getName(), self.__server.getPort())) |
805 .format(self.__server.getName(), self.__server.getPort())) |
808 if defaultChanged: |
808 if defaultChanged: |
809 self.__socket.setSslConfiguration( |
809 self.__socket.setSslConfiguration( |
810 QSslConfiguration.defaultConfiguration()) |
810 QSslConfiguration.defaultConfiguration()) |
811 if ignored == E5SslErrorHandler.UserIgnored: |
811 if ignored == E5SslErrorHandler.UserIgnored: |
812 self.networkWidget.addErrorMessage( |
812 self.networkWidget.addErrorMessage( |
813 self.trUtf8("SSL Error"), |
813 self.tr("SSL Error"), |
814 self.trUtf8( |
814 self.tr( |
815 """The SSL certificate for the server {0} (port {1})""" |
815 """The SSL certificate for the server {0} (port {1})""" |
816 """ failed the authenticity check. SSL errors""" |
816 """ failed the authenticity check. SSL errors""" |
817 """ were accepted by you.""") |
817 """ were accepted by you.""") |
818 .format(self.__server.getName(), self.__server.getPort())) |
818 .format(self.__server.getName(), self.__server.getPort())) |
819 if self.__connectionState == IrcWidget.ServerConnecting: |
819 if self.__connectionState == IrcWidget.ServerConnecting: |
866 vers = "" |
866 vers = "" |
867 else: |
867 else: |
868 vers = " " + Version |
868 vers = " " + Version |
869 msg = "Eric IRC client{0}, {1}".format(vers, Copyright) |
869 msg = "Eric IRC client{0}, {1}".format(vers, Copyright) |
870 self.networkWidget.addServerMessage( |
870 self.networkWidget.addServerMessage( |
871 self.trUtf8("CTCP"), |
871 self.tr("CTCP"), |
872 self.trUtf8("Received Version request from {0}.").format( |
872 self.tr("Received Version request from {0}.").format( |
873 match.group(1))) |
873 match.group(1))) |
874 self.__sendCtcpReply(match.group(1), "VERSION " + msg) |
874 self.__sendCtcpReply(match.group(1), "VERSION " + msg) |
875 elif ctcpRequest == "ping": |
875 elif ctcpRequest == "ping": |
876 self.networkWidget.addServerMessage( |
876 self.networkWidget.addServerMessage( |
877 self.trUtf8("CTCP"), |
877 self.tr("CTCP"), |
878 self.trUtf8( |
878 self.tr( |
879 "Received CTCP-PING request from {0}," |
879 "Received CTCP-PING request from {0}," |
880 " sending answer.").format(match.group(1))) |
880 " sending answer.").format(match.group(1))) |
881 self.__sendCtcpReply( |
881 self.__sendCtcpReply( |
882 match.group(1), "PING {0}".format(ctcpArg)) |
882 match.group(1), "PING {0}".format(ctcpArg)) |
883 elif ctcpRequest == "clientinfo": |
883 elif ctcpRequest == "clientinfo": |
884 self.networkWidget.addServerMessage( |
884 self.networkWidget.addServerMessage( |
885 self.trUtf8("CTCP"), |
885 self.tr("CTCP"), |
886 self.trUtf8( |
886 self.tr( |
887 "Received CTCP-CLIENTINFO request from {0}," |
887 "Received CTCP-CLIENTINFO request from {0}," |
888 " sending answer.").format(match.group(1))) |
888 " sending answer.").format(match.group(1))) |
889 self.__sendCtcpReply( |
889 self.__sendCtcpReply( |
890 match.group(1), |
890 match.group(1), |
891 "CLIENTINFO CLIENTINFO PING VERSION") |
891 "CLIENTINFO CLIENTINFO PING VERSION") |
892 else: |
892 else: |
893 self.networkWidget.addServerMessage( |
893 self.networkWidget.addServerMessage( |
894 self.trUtf8("CTCP"), |
894 self.tr("CTCP"), |
895 self.trUtf8( |
895 self.tr( |
896 "Received unknown CTCP-{0} request from {1}.") |
896 "Received unknown CTCP-{0} request from {1}.") |
897 .format(ctcpRequest, match.group(1))) |
897 .format(ctcpRequest, match.group(1))) |
898 return True |
898 return True |
899 |
899 |
900 return False |
900 return False |
919 nick = self.__ircNetworkManager.getIdentity(self.__identityName)\ |
919 nick = self.__ircNetworkManager.getIdentity(self.__identityName)\ |
920 .getNickNames()[self.__nickIndex] |
920 .getNickNames()[self.__nickIndex] |
921 self.__nickName = nick |
921 self.__nickName = nick |
922 except IndexError: |
922 except IndexError: |
923 self.networkWidget.addServerMessage( |
923 self.networkWidget.addServerMessage( |
924 self.trUtf8("Critical"), |
924 self.tr("Critical"), |
925 self.trUtf8( |
925 self.tr( |
926 "No nickname acceptable to the server configured" |
926 "No nickname acceptable to the server configured" |
927 " for <b>{0}</b>. Disconnecting...") |
927 " for <b>{0}</b>. Disconnecting...") |
928 .format(self.__userName), |
928 .format(self.__userName), |
929 filterMsg=False) |
929 filterMsg=False) |
930 self.__connectNetwork("", False, silent=True) |
930 self.__connectNetwork("", False, silent=True) |