--- old/irc.py.new.8	2005-07-02 03:47:44.000000000 +0200
+++ irc.py	2005-07-03 04:01:31.000000000 +0200
@@ -22,6 +22,8 @@
 from jep0133 import *
 import xmpp.commands
 import jep0133
+import jep0106
+from jep0106 import *
 
 #Global definitions
 True = 1
@@ -263,6 +265,8 @@
         self.irc.add_global_handler('whoisidle',self.irc_whoisidle)
         self.irc.add_global_handler('whoischannels',self.irc_whoischannels)
         self.irc.add_global_handler('endofwhois',self.irc_endofwhois)
+        self.irc.add_global_handler('list',self.irc_list)
+        self.irc.add_global_handler('listend',self.irc_listend)
         self.jabber.RegisterHandler('message',self.xmpp_message)
         self.jabber.RegisterHandler('presence',self.xmpp_presence)
         self.jabber.RegisterHandler('iq',self.xmpp_iq_vcard,typ = 'get', ns=NS_VCARD)
@@ -288,11 +292,44 @@
 
     # New Disco Handlers
     def xmpp_base_disco(self, con, event, type):
-        #Type is either 'info' or 'items'
-        if type == 'info':
-            return {'ids':[{'category':'conference','type':'irc','name':'IRC Transport'}],'features':[xmpp.NS_REGISTER,xmpp.NS_VERSION,NS_MUC,NS_COMMAND]}
-        if type == 'items':
-            return []
+        fromjid = str(event.getFrom())
+        to = event.getTo()
+        room = to.getNode().lower()
+        nick = to.getResource()
+        try:
+            channel, server = room.split('%')
+        except ValueError:
+            channel=''
+            server=room
+        channel = JIDDecode(channel)
+        if to == hostname:
+            #Type is either 'info' or 'items'
+            if type == 'info':
+                return {'ids':[{'category':'conference','type':'irc','name':'IRC Transport'}],'features':[xmpp.NS_REGISTER,xmpp.NS_VERSION,NS_MUC,NS_COMMAND]}
+            if type == 'items':
+                fromjid = str(event.getFrom())
+                list = [{'node':NS_COMMANDS,'name':'IRC Transport Commands','jid':hostname}]
+                if self.users.has_key(fromjid):
+                    for each in self.users[fromjid].keys():
+                        list.append({'name':each,'jid':'%s@%s' % (each, hostname)})
+                return list
+        elif channel == '':
+            if type == 'info':
+                return {'ids':[{'category':'conference','type':'irc','name':server}],'features':[NS_MUC]}
+            if type == 'items':
+                rep=event.buildReply('result')
+                q=rep.getTag('query')
+                self.users[fromjid][server].pendingoperations["list"] = rep
+                self.users[fromjid][server].list()
+                raise NodeProcessed
+        elif irclib.is_channel(channel):
+            if type == 'info':
+                return {'ids':[{'category':'conference','type':'irc','name':channel}],'features':[NS_MUC]}
+            if type == 'items':
+                return []
+        else:
+            self.jabber.send(Error(event,MALFORMED_JID))
+            raise NodeProcessed
 
     #XMPP Handlers
     def xmpp_presence(self, con, event):
@@ -311,8 +348,13 @@
         if irclib.is_channel(channel):
             if type == None:
                 if nick != '':
+                    x = event.getTag(name='x', namespace=NS_MUC)
+                    try:
+                        password = x.getTagData('password')
+                    except AttributeError:
+                        password = None
                     if not self.users.has_key(fromjid): # if a new user session
-                        c=self.irc_newconn(channel,server,nick,fromjid)
+                        c=self.irc_newconn(channel,server,nick,password,fromjid)
                         if c != None:
                             self.users[fromjid] = {server:c}
                     else:
@@ -323,7 +365,7 @@
                             elif self.users[fromjid].has_key(server): # if user already has a session open on same server
                                 self.irc_newroom(self.users[fromjid][server],channel)
                         else: # the other cases
-                            c=self.irc_newconn(channel,server,nick,fromjid)
+                            c=self.irc_newconn(channel,server,nick,password,fromjid)
                             if c != None:
                                 self.users[fromjid][server]=c
             elif type == 'unavailable':
@@ -509,7 +551,7 @@
         raise xmpp.NodeProcessed
 
     def xmpp_iq_browse(self, con, event):
-        m = Iq(to = event.getFrom(), frm = event.getTo(), typ = 'result', queryNS = NS_BROWSE)
+        m = event.buildReply('result')
         if event.getTo() == hostname:
             m.setTagAttr('query','catagory','conference')
             m.setTagAttr('query','name','xmpp IRC Transport')
@@ -827,15 +869,15 @@
             except:
                 self.irc_doquit(connection)
 
-    def irc_newconn(self,channel,server,nick,fromjid):
+    def irc_newconn(self,channel,server,nick,password,fromjid):
         try:
-            c=self.irc.server().connect(server,6667,nick,localaddress=localaddress)
+            c=self.irc.server().connect(server,6667,nick,password=password,localaddress=localaddress)
             c.fromjid = fromjid
             fromstripped = JID(fromjid).getStripped().encode('utf-8')
             c.joinchan = channel
             c.memberlist = {}
             c.chanmode = {}
-            c.pendingoperations = {} # this is ascii internally, because we need to map server replies
+            c.pendingoperations = {} # keys are ascii internally, because we need to map server replies
             if userfile.has_key(fromstripped):
                 c.charset = userfile[fromstripped]['charset']
             else:
@@ -1120,7 +1162,9 @@
     def irc_whoisuser(self,conn,event):
     	p = self.irc_whoisgetvcard(conn,event)
         p.setTagData(tag='FN', val=unicode(event.arguments()[4],conn.charset,'replace'))
-        p.setTagData(tag='NICKNAME', val=unicode(event.arguments()[1],conn.charset,'replace'))
+        p.setTagData(tag='NICKNAME', val=unicode(event.arguments()[0],conn.charset,'replace'))
+        e = p.addChild(name='EMAIL')
+        e.setTagData(tag='USERID', val=unicode(event.arguments()[1],conn.charset,'replace') + '@' + unicode(event.arguments()[2],conn.charset,'replace'))
     	
     def irc_whoisserver(self,conn,event):
     	p = self.irc_whoisgetvcard(conn,event)
@@ -1148,6 +1192,18 @@
         del conn.pendingoperations["whois:" + nick]
         self.jabber.send(m)
 
+    def irc_list(self,conn,event):
+    	chan = event.arguments()[0]
+    	if irclib.is_channel(chan):
+    	    rep = conn.pendingoperations["list"]
+            q=rep.getTag('query')
+            q.addChild('item',{'name':chan,'jid':'%s%%%s@%s' % (JIDEncode(chan), conn.server, hostname)})
+    	
+    def irc_listend(self,conn,event):
+    	rep = conn.pendingoperations["list"]
+        del conn.pendingoperations["list"]
+        self.jabber.send(rep)
+
     def irc_motdstart(self,conn,event):
         try:
             nick = unicode(irclib.nm_to_n(event.source()),conn.charset,'replace')
