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