Continued with IRC management.

Thu, 29 Nov 2012 20:02:43 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 29 Nov 2012 20:02:43 +0100
changeset 2236
e30d5f978919
parent 2235
266800cbe7cc
child 2237
baddb671c326

Continued with IRC management.

Network/IRC/IrcNetworkEditDialog.py file | annotate | diff | comparison | revisions
Network/IRC/IrcNetworkEditDialog.ui file | annotate | diff | comparison | revisions
Network/IRC/IrcNetworkListDialog.py file | annotate | diff | comparison | revisions
Network/IRC/IrcNetworkManager.py file | annotate | diff | comparison | revisions
Network/IRC/IrcWidget.py file | annotate | diff | comparison | revisions
--- a/Network/IRC/IrcNetworkEditDialog.py	Wed Nov 28 20:11:46 2012 +0100
+++ b/Network/IRC/IrcNetworkEditDialog.py	Thu Nov 29 20:02:43 2012 +0100
@@ -12,6 +12,8 @@
 from PyQt4.QtCore import pyqtSlot
 from PyQt4.QtGui import QDialog, QDialogButtonBox, QTreeWidgetItem
 
+from E5Gui import E5MessageBox
+
 from .Ui_IrcNetworkEditDialog import Ui_IrcNetworkEditDialog
 
 from .IrcNetworkManager import IrcIdentity, IrcChannel
@@ -65,12 +67,7 @@
         self.identityCombo.setCurrentIndex(index)
         
         # servers
-        self.serverCombo.addItems(self.__manager.getServerNames())
-        server = self.__network.getServerName()
-        index = self.serverCombo.findText(server)
-        if index == -1:
-            index = 0
-        self.serverCombo.setCurrentIndex(index)
+        self.serverEdit.setText(self.__network.getServerNames()[0])
         
         # channels
         for channelName in sorted(self.__network.getChannelNames()):
@@ -90,7 +87,7 @@
         """
         enable = True
         enable &= self.networkEdit.text() != ""
-        enable &= self.serverCombo.currentText() != ""
+        enable &= self.serverEdit.text() != ""
         
         self.__okButton.setEnabled(enable)
     
@@ -111,15 +108,6 @@
         # TODO: not implemented yet
         raise NotImplementedError
     
-    @pyqtSlot(str)
-    def on_serverCombo_activated(self, txt):
-        """
-        Private slot to handle the selection of a server.
-        
-        @param txt selected server (string)
-        """
-        self.__updateOkButton()
-    
     @pyqtSlot()
     def on_editServersButton_clicked(self):
         """
@@ -131,10 +119,9 @@
     @pyqtSlot()
     def on_addChannelButton_clicked(self):
         """
-        Slot documentation goes here.
+        Private slot to add a channel.
         """
-        # TODO: not implemented yet
-        raise NotImplementedError
+        self.__editChannel(None)
     
     @pyqtSlot()
     def on_editChannelButton_clicked(self):
@@ -148,10 +135,20 @@
     @pyqtSlot()
     def on_deleteChannelButton_clicked(self):
         """
-        Slot documentation goes here.
+        Private slot to delete the selected channel.
         """
-        # TODO: not implemented yet
-        raise NotImplementedError
+        itm = self.channelList.selectedItems()[0]
+        if itm:
+            res = E5MessageBox.yesNo(self,
+                self.trUtf8("Delete Channel"),
+                self.trUtf8("""Do you really want to delete channel <b>{0}</b>?""")\
+                    .format(itm.text(0)))
+            if res:
+                self.__network.deleteChannel(itm.text(0))
+                
+                index = self.channelList.indexOfTopLevelItem(itm)
+                self.channelList.takeTopLevelItem(index)
+                del itm
     
     @pyqtSlot(QTreeWidgetItem, int)
     def on_channelList_itemActivated(self, item, column):
@@ -213,9 +210,9 @@
                 QTreeWidgetItem(self.channelList, [name, autoJoinTxt])
                 self.__network.addChannel(channel)
     
-    def getData(self):
+    def getNetwork(self):
         """
-        Public method to get the network data.
+        Public method to get the network object.
         
         @return edited network object (IrcNetwork)
         """
--- a/Network/IRC/IrcNetworkEditDialog.ui	Wed Nov 28 20:11:46 2012 +0100
+++ b/Network/IRC/IrcNetworkEditDialog.ui	Thu Nov 29 20:02:43 2012 +0100
@@ -62,13 +62,6 @@
      </property>
     </widget>
    </item>
-   <item row="2" column="1">
-    <widget class="QComboBox" name="serverCombo">
-     <property name="toolTip">
-      <string>Select the server to be used for the IRC network</string>
-     </property>
-    </widget>
-   </item>
    <item row="2" column="2">
     <widget class="QToolButton" name="editServersButton">
      <property name="toolTip">
@@ -172,13 +165,23 @@
      </property>
     </widget>
    </item>
+   <item row="2" column="1">
+    <widget class="QLineEdit" name="serverEdit">
+     <property name="toolTip">
+      <string>Shows the name of the server</string>
+     </property>
+     <property name="readOnly">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
   </layout>
  </widget>
  <tabstops>
   <tabstop>networkEdit</tabstop>
   <tabstop>identityCombo</tabstop>
   <tabstop>editIdentitiesButton</tabstop>
-  <tabstop>serverCombo</tabstop>
+  <tabstop>serverEdit</tabstop>
   <tabstop>editServersButton</tabstop>
   <tabstop>channelList</tabstop>
   <tabstop>addChannelButton</tabstop>
--- a/Network/IRC/IrcNetworkListDialog.py	Wed Nov 28 20:11:46 2012 +0100
+++ b/Network/IRC/IrcNetworkListDialog.py	Thu Nov 29 20:02:43 2012 +0100
@@ -38,7 +38,7 @@
         for networkName in networkNames:
             topitm = QTreeWidgetItem(self.networksList, [networkName])
             network = self.__manager.getNetwork(networkName)
-            server = self.__manager.getServer(network.getServerName())
+            server = network.getServer(network.getServerNames()[0])
             identityName = network.getIdentityName()
             if identityName == IrcIdentity.DefaultIdentityName:
                 identityName = IrcIdentity.DefaultIdentityDisplay
@@ -46,7 +46,7 @@
                 [self.trUtf8("Identity"), identityName])
             QTreeWidgetItem(topitm,
                 [self.trUtf8("Server"), "{0}:{1}".format(
-                 server.getServer(), server.getPort())])
+                 server.getName(), server.getPort())])
             QTreeWidgetItem(topitm,
                 [self.trUtf8("Channels"), ", ".join(network.getChannelNames())])
             topitm.setExpanded(True)
@@ -101,8 +101,7 @@
             networkName = itm.text(0)
             dlg = IrcNetworkEditDialog(self.__manager, networkName, self)
             if dlg.exec_() == QDialog.Accepted:
-                pass
-                # TODO: not implemented yet
+                self.__manager.setNetwork(dlg.getNetwork())
     
     @pyqtSlot()
     def on_deleteButton_clicked(self):
@@ -114,7 +113,7 @@
             networkName = itm.text(0)
             res = E5MessageBox.yesNo(self,
                 self.trUtf8("Delete Irc Network"),
-                self.trUtf8("""Do you really want to delete  IRC network <b>{0}</b>?""")\
+                self.trUtf8("""Do you really want to delete IRC network <b>{0}</b>?""")\
                     .format(networkName))
             if res:
                 index = self.networksList.indexOfTopLevelItem(itm)
--- a/Network/IRC/IrcNetworkManager.py	Wed Nov 28 20:11:46 2012 +0100
+++ b/Network/IRC/IrcNetworkManager.py	Thu Nov 29 20:02:43 2012 +0100
@@ -67,6 +67,20 @@
         """
         return self.__name
     
+    def getIdent(self):
+        """
+        Public method to get the real identity name.
+        
+        Note: This methdo takes care of converting the default
+        identity name to the user's user name.
+        
+        @return real identity name (string)
+        """
+        if self.__name == IrcIdentity.DefaultIdentityName:
+            return Utilities.getUserName()
+        else:
+            return self.__name
+    
     def setRealName(self, name):
         """
         Public method to set the real name of the identity.
@@ -130,6 +144,19 @@
         @return password (string)
         """
         return pwConvert(self.__password, encode=False)
+    
+    @classmethod
+    def createDefaultIdentity(cls):
+        """
+        Class method to create the default identity.
+        
+        @return default identity (IrcIdentity)
+        """
+        userName = Utilities.getUserName()
+        identity = IrcIdentity(IrcIdentity.DefaultIdentityName)
+        identity.setNickNames([userName, userName + "_", userName + "__"])
+        identity.setRealName(userName)
+        return identity
 
 
 class IrcServer(object):
@@ -172,7 +199,7 @@
         self.__ssl = Preferences.toBool(settings.value("SSL", False))
         self.__password = settings.value("Password", "")
     
-    def getServer(self):
+    def getName(self):
         """
         Public method to get the server name.
         
@@ -321,7 +348,7 @@
         
         self.__name = name
         self.__identity = ""
-        self.__server = ""
+        self.__servers = {}
         self.__channels = {}
     
     def save(self, settings):
@@ -332,7 +359,14 @@
         """
         # no need to save the network name because that is the group key
         settings.setValue("Identity", self.__identity)
-        settings.setValue("Server", self.__server)
+        
+        settings.beginGroup("Servers")
+        for key in self.__servers:
+            settings.beginGroup(key)
+            self.__servers[key].save(settings)
+            settings.endGroup()
+        settings.endGroup()
+        
         settings.beginGroup("Channels")
         for key in self.__channels:
             settings.beginGroup(key)
@@ -347,7 +381,15 @@
         @param settings reference to the settings object (QSettings)
         """
         self.__identity = settings.value("Identity", "")
-        self.__server = settings.value("Server", "")
+        
+        settings.beginGroup("Servers")
+        for key in settings.childKeys():
+            self.__servers[key] = IrcServer(key)
+            settings.beginGroup(key)
+            self.__servers[key].load(settings)
+            settings.endGroup()
+        settings.endGroup()
+        
         settings.beginGroup("Channels")
         for key in self.__channels:
             self.__channels[key] = IrcChannel(key)
@@ -380,21 +422,63 @@
         """
         return self.__identity
     
-    def setServerName(self, name):
+    def setServers(self, servers):
         """
-        Public method to set the server name.
+        Public method to set the list of servers.
         
-        @param name server name (string)
+        @param servers list of servers for the network (list of IrcServer)
+        """
+        self.__servers = {}
+        for server in servers:
+            self.__servers[server.getName()] = server
+    
+    def getServers(self):
         """
-        self.__server = name
+        Public method to get the servers.
+        
+        @return list of servers for the network (list of IrcServer)
+        """
+        return list(self.__servers.values())
+    
+    def getServerNames(self):
+        """
+        Public method to get a list of all known server names.
+        
+        @return list of server names (list of string)
+        """
+        return list(sorted(self.__servers.keys()))
     
-    def getServerName(self):
+    def getServer(self, name):
+        """
+        Public method to get a server object.
+        
+        @param name name of the server to get (string)
+        @return reference to the server (IrcServer)
         """
-        Public method to get the server name.
+        if name in self.__servers:
+            return self.__servers[name]
+        else:
+            return None
+    
+    def setServer(self, server):
+        """
+        Public method to set a server.
         
-        @return server name (string)
+        @param server server object to set (IrcServer)
+        """
+        serverName = server.getName()
+        if serverName in self.__servers:
+            self.__servers[serverName] = server
+    
+    def addServer(self, server):
         """
-        return self.__server
+        Public method to add a server.
+        
+        @param server server object to add (IrcServer)
+        """
+        serverName = server.getName()
+        if serverName not in self.__servers:
+            self.__servers[serverName] = server
     
     def setChannels(self, channels):
         """
@@ -453,6 +537,40 @@
         channelName = channel.getName()
         if channelName not in self.__channels:
             self.__channels[channelName] = channel
+    
+    def deleteChannel(self, channelName):
+        """
+        Public method to delete the given channel.
+        
+        @param channelName name of the channel to be deleted (string)
+        """
+        if channelName in self.__channels:
+            del self.__channels[channelName]
+    
+    @classmethod
+    def createDefaultNetwork(cls):
+        """
+        Class method to create the default network.
+        
+        @return default network object (IrcNetwork)
+        """
+        # network
+        networkName = "Freenode"
+        network = IrcNetwork(networkName)
+        network.setIdentityName(IrcIdentity.DefaultIdentityName)
+        
+        # server
+        serverName = "chat.freenode.net"
+        server = IrcServer(serverName)
+        server.setPort(8001)
+        network.addServer(server)
+        
+        # channel
+        channel = IrcChannel("#eric-ide")
+        channel.setAutoJoin(False)
+        network.addChannel(channel)
+        
+        return network
 
 
 class IrcNetworkManager(QObject):
@@ -480,7 +598,6 @@
         
         self.__networks = {}
         self.__identities = {}
-        self.__servers = {}
         
         self.dataChanged.connect(self.__saveTimer.changeOccurred)
     
@@ -508,14 +625,6 @@
             self.__settings.endGroup()
         self.__settings.endGroup()
         
-        # servers
-        self.__settings.beginGroup("Servers")
-        for key in self.__servers:
-            self.__settings.beginGroup(key)
-            self.__servers[key].save(self.__settings)
-            self.__settings.endGroup()
-        self.__settings.endGroup()
-        
         # networks
         self.__settings.beginGroup("Networks")
         for key in self.__networks:
@@ -545,15 +654,6 @@
             self.__settings.endGroup()
         self.__settings.endGroup()
         
-        # servers
-        self.__settings.beginGroup("Servers")
-        for key in self.__settings.childKeys():
-            self.__servers[key] = IrcServer(key)
-            self.__settings.beginGroup(key)
-            self.__servers[key].load(self.__settings)
-            self.__settings.endGroup()
-        self.__settings.endGroup()
-        
         # networks
         self.__settings.beginGroup("Networks")
         for key in self.__settings.childKeys():
@@ -589,30 +689,19 @@
             self.__servers = {}
         
         # identity
-        userName = Utilities.getUserName()
-        identity = IrcIdentity(IrcIdentity.DefaultIdentityName)
-        identity.setNickNames([userName, userName + "_", userName + "__"])
-        self.__identities[IrcIdentity.DefaultIdentityName] = identity
+        identity = IrcIdentity.createDefaultIdentity()
+        self.__identities[identity.getName()] = identity
         
         if not identityOnly:
-            # server
-            serverName = "chat.freenode.net"
-            server = IrcServer(serverName)
-            server.setPort(8001)
-            self.__servers[serverName] = server
-            
-            # network
-            networkName = "Freenode"
-            network = IrcNetwork(networkName)
-            network.setIdentityName(IrcIdentity.DefaultIdentityName)
-            network.setServerName(serverName)
-            channel = IrcChannel("#eric-ide")
-            channel.setAutoJoin(False)
-            network.addChannel(channel)
-            self.__networks[networkName] = network
+            network = IrcNetwork.createDefaultNetwork()
+            self.__networks[network.getName()] = network
         
         self.dataChanged.emit()
     
+    ##################################################################
+    ## Identity related methods below
+    ##################################################################
+    
     def getIdentity(self, name, create=False):
         """
         Public method to get an identity object.
@@ -691,50 +780,9 @@
         """
         self.dataChanged.emit()
     
-    # TODO: move server to network because it belongs there
-    def getServer(self, name, create=False):
-        """
-        Public method to get a server object.
-        
-        @param name name of the server to get (string)
-        @param create flag indicating to create a new object,
-            if none exists (boolean)
-        @return reference to the server (IrcServer)
-        """
-        if not name:
-            return None
-        
-        if not self.__loaded:
-            self.__load()
-        
-        if name in self.__servers:
-            return self.__servers[name]
-        elif create:
-            server = IrcServer(name)
-            self.__servers[name] = server
-            
-            self.dataChanged.emit()
-            
-            return server
-        else:
-            return None
-    
-    def serverChanged(self):
-        """
-        Public method to indicate a change of a server object.
-        """
-        self.dataChanged.emit()
-    
-    def getServerNames(self):
-        """
-        Public method to get a list of all known server names.
-        
-        @return list of server names (list of string)
-        """
-        if not self.__loaded:
-            self.__load()
-        
-        return list(sorted(self.__servers.keys()))
+    ##################################################################
+    ## Network related methods below
+    ##################################################################
     
     def getNetwork(self, name):
         """
@@ -751,37 +799,47 @@
         else:
             return None
     
-    # TODO: check, if this method is needed
-    def createNetwork(self, name, identity, server, channels=None):
+    def setNetwork(self, network):
         """
-        Public method to create a new network object.
-        
-        @param name name of the network (string)
-        @param identity reference to an identity object to associate with
-            this network (IrcIdentity)
-        @param server reference to a server object to associate with this
-            network (IrcServer)
-        @param channels list of channels for the network (list of IrcChannel)
-        @return reference to the created network object (IrcNetwork)
-        """
-        if not self.__loaded:
-            self.__load()
+        Public method to set a network.
         
+        @param network network object to set (IrcNetwork)
+        """
+        name = network.getName()
         if name in self.__networks:
-            return None
-        
-        network = IrcNetwork(name)
-        network.setIdentityName(identity.getName())
-        network.setServerName(server.getServer())
-        # TODO: change this
-        network.setChannels(channels[:])
-##        network.setAutoJoinChannels(autoJoinChannels)
-        self.__networks[name] = network
-        
-        self.networkChanged()
-        
-        return network
+            self.__networks[name] = network
+            self.networkChanged()
     
+    # TODO: check, if this method is needed
+##    def createNetwork(self, name, identity, server, channels=None):
+##        """
+##        Public method to create a new network object.
+##        
+##        @param name name of the network (string)
+##        @param identity reference to an identity object to associate with
+##            this network (IrcIdentity)
+##        @param server reference to a server object to associate with this
+##            network (IrcServer)
+##        @param channels list of channels for the network (list of IrcChannel)
+##        @return reference to the created network object (IrcNetwork)
+##        """
+##        if not self.__loaded:
+##            self.__load()
+##        
+##        if name in self.__networks:
+##            return None
+##        
+##        network = IrcNetwork(name)
+##        network.setIdentityName(identity.getName())
+####        network.setServerName(server.getServer())
+####        network.setChannels(channels[:])
+####        network.setAutoJoinChannels(autoJoinChannels)
+##        self.__networks[name] = network
+##        
+##        self.networkChanged()
+##        
+##        return network
+##    
     def deleteNetwork(self, name):
         """
         Public method to delete the given network.
--- a/Network/IRC/IrcWidget.py	Wed Nov 28 20:11:46 2012 +0100
+++ b/Network/IRC/IrcWidget.py	Thu Nov 29 20:02:43 2012 +0100
@@ -58,6 +58,7 @@
         self.__channelList = []
         self.__channelTypePrefixes = ""
         self.__userName = ""
+        self.__identityName = ""
         self.__nickIndex = -1
         self.__nickName = ""
         self.__server = None
@@ -103,7 +104,7 @@
                 self.trUtf8("Disconnect from Server"),
                 self.trUtf8("""<p>Do you really want to disconnect from"""
                             """ <b>{0}</b>?</p><p>All channels will be closed.</p>""")\
-                    .format(self.__server.getServer()))
+                    .format(self.__server.getName()))
             if ok:
                 self.__socket.blockSignals(True)
                 
@@ -127,25 +128,26 @@
         if connect:
             network = self.__ircNetworkManager.getNetwork(name)
             if network:
-                self.__server = self.__ircNetworkManager.getServer(
-                    network.getServerName())
-                self.__userName = network.getIdentityName()
+                self.__server = network.getServer(network.getServerNames()[0])
+                self.__identityName = network.getIdentityName()
+                identity = self.__ircNetworkManager.getIdentity(self.__identityName)
+                self.__userName = identity.getIdent()
                 if self.__server:
                     self.networkWidget.addServerMessage(self.trUtf8("Info"),
                         self.trUtf8("Looking for server {0} (port {1})...").format(
-                            self.__server.getServer(), self.__server.getPort()))
-                    self.__socket.connectToHost(self.__server.getServer(),
+                            self.__server.getName(), self.__server.getPort()))
+                    self.__socket.connectToHost(self.__server.getName(),
                                                 self.__server.getPort())
         else:
             ok = E5MessageBox.yesNo(self,
                 self.trUtf8("Disconnect from Server"),
                 self.trUtf8("""<p>Do you really want to disconnect from"""
                             """ <b>{0}</b>?</p><p>All channels will be closed.</p>""")\
-                    .format(self.__server.getServer()))
+                    .format(self.__server.getName()))
             if ok:
                 self.networkWidget.addServerMessage(self.trUtf8("Info"),
                     self.trUtf8("Disconnecting from server {0}...").format(
-                        self.__server.getServer()))
+                        self.__server.getName()))
                 while self.__channelList:
                     channel = self.__channelList.pop()
                     self.channelsWidget.removeTab(self.channelsWidget.indexOf(channel))
@@ -153,6 +155,8 @@
                     channel = None
                 self.__send("QUIT :" + self.trUtf8("IRC for eric IDE"))
                 self.__socket.close()
+                self.__userName = ""
+                self.__identityName = ""
     
     def __editNetwork(self, name):
         """
@@ -160,7 +164,6 @@
         
         @param name name of the network to edit (string)
         """
-        # TODO: implement this
         dlg = IrcNetworkListDialog(self.__ircNetworkManager, self)
         dlg.exec_()
     
@@ -264,7 +267,7 @@
         if not nick:
             self.__nickIndex = 0
             try:
-                nick = self.__ircNetworkManager.getIdentity(self.__userName)\
+                nick = self.__ircNetworkManager.getIdentity(self.__identityName)\
                     .getNickNames()[self.__nickIndex]
             except IndexError:
                 nick = ""
@@ -272,8 +275,11 @@
             nick = self.__userName
         self.__nickName = nick
         self.networkWidget.setNickName(nick)
+        realName = self.__ircNetworkManager.getIdentity(self.__identityName).getRealName()
+        if not realName:
+            realName = "eric IDE chat"
         self.__send("NICK " + nick)
-        self.__send("USER " + self.__userName + " 0 * :eric IDE chat")
+        self.__send("USER " + self.__userName + " 0 * :" + realName)
     
     def __hostDisconnected(self):
         """
@@ -484,7 +490,7 @@
         """
         Private method to register to services.
         """
-        identity = self.__ircNetworkManager.getIdentity(self.__userName)
+        identity = self.__ircNetworkManager.getIdentity(self.__identityName)
         service = identity.getName()
         password = identity.getPassword()
         if service and password:
@@ -563,7 +569,7 @@
         """
         self.__nickIndex += 1
         try:
-            nick = self.__ircNetworkManager.getIdentity(self.__userName)\
+            nick = self.__ircNetworkManager.getIdentity(self.__identityName)\
                 .getNickNames()[self.__nickIndex]
             self.__nickName = nick
         except IndexError:

eric ide

mercurial