<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>Database/Constraints.py</filename>
    </added>
    <added>
      <filename>Database/Fields.py</filename>
    </added>
    <added>
      <filename>Database/Matches.py</filename>
    </added>
    <added>
      <filename>Database/__init__.py</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,10 +1,17 @@
 # -*- coding: utf-8 -*-
-from Pointything.Database import *
+import Database
+
+class UserTable(Database.Table):
+    def __init__(self):
+        Database.Table.__init__(self, &quot;users&quot;)
+        self.addField(Database.Fields.Integer(&quot;user_id&quot;).addConstraint(Database.Constraints.PrimaryKey()).addConstraint(Database.Constraints.AutoIncrement()))
+        self.addField(Database.Fields.Text(&quot;login&quot;))
+        self.addField(Database.Fields.Text(&quot;password&quot;))
 
 class User:
     def __init__(self, id):
-        db = Database();
-        u = db.find(&quot;users&quot;, &quot;user_id&quot;, id)
+        tbl = UserTable()
+        u = tbl.select(tbl.fields(), (Database.Matches.Equals(tbl[&quot;user_id&quot;], id),))
         data = u.fetchone()
         self.data = {}
         for idx, cell in enumerate(u.description):
@@ -19,8 +26,8 @@ class User:
     
     @staticmethod
     def login(login, password):
-        db = Database();
-        u = db.query(&quot;select user_id from users where login = ? and password = ?&quot;, (login, password))
+        tbl = UserTable()
+        u = tbl.select((tbl[&quot;user_id&quot;],), (Database.Matches.Equals(tbl[&quot;login&quot;], login), Database.Matches.Equals(tbl[&quot;password&quot;], password)))
         u = u.fetchone()
         if u == None:
             return User(0)</diff>
      <filename>Pointything/Auth.py</filename>
    </modified>
    <modified>
      <diff>@@ -21,6 +21,9 @@ class Extension:
             if hasattr(m,'action_name'):
                 ret.append(m)
         return ret
+    
+    def unloaded(self):
+        pass
 
 def Action(name=None):
     if type(name)==str:</diff>
      <filename>Pointything/Extensions.py</filename>
    </modified>
    <modified>
      <diff>@@ -5,11 +5,10 @@ import sys
 import select
 import logging
 import __builtin__
-import Database
 import traceback
 
 class ExtensionControl(Extension):
-    '''Extension to control the extensions'''
+    '''Extension to control the extensions. Thats deep, man.'''
     extension_name = &quot;extensionControl&quot;
     def __init__(self, bot):
         Extension.__init__(self, bot)
@@ -113,12 +112,20 @@ class Pointything:
                         out = traceback.format_exception(exceptionType, exceptionValue, exceptionTraceback)
                         for line in out:
                             self.log.error(line.strip())
+        self.log.info(&quot;Exiting main loop.&quot;)
+        self.cleanup()
+    
+    def cleanup(self):
+        self.log.debug(&quot;Cleaning up modules...&quot;)
+        extList = self.extensions.copy()
+        for m in extList:
+            self.unloadExtension(self.extensions[m])
 
     def extendWith(self, ext):
         log = logging.getLogger(&quot;Pointything.extensions&quot;)
         log.info(&quot;Loading extension %s&quot;, ext.extension_name)
-        self.unloadExtension(ext)
         extInstance = ext(self)
+        #self.unloadExtension(ext)
         self.extensions[ext.extension_name]=extInstance
         for cmd in extInstance.userMethods():
                 self.commands[ext.extension_name+&quot;.&quot;+cmd.action_name] = cmd
@@ -142,4 +149,5 @@ class Pointything:
             del self.extensions[ext.extension_name]
         if ext in self.inputs:
             log.info(&quot;Detatching input %s&quot;, ext.extension_name)
-            self.inputs.remove(ext)
\ No newline at end of file
+            self.inputs.remove(ext)
+        ext.unloaded()
\ No newline at end of file</diff>
      <filename>Pointything/__init__.py</filename>
    </modified>
    <modified>
      <diff>@@ -1,32 +1,58 @@
 # -*- coding: utf-8 -*-
 from Pointything.Extensions import *
-from Pointything.Database import *
 from Pointything.Auth import *
 import socket
 import threading
 import traceback
 import sys
+import atexit
+
+class TelnetListener(threading.Thread):
+    def __init__(self, handler):
+        threading.Thread.__init__(self)
+        self.running = False
+        self.handler = handler
+        self.daemon = True
+        self.handler.log.info(&quot;Listening on *:16161&quot;)
+        self.server = socket.socket()
+        self.server.bind((&quot;0.0.0.0&quot;, 16161))
+        self.server.listen(1)
+    
+    def run(self):
+        self.handler.log.debug(&quot;Starting listener thread&quot;)
+        self.running = True
+        self.server.settimeout(3)
+        while self.running == True:
+            try:
+                (sock, addr) = self.server.accept()
+                self.handler.clients.append(sock)
+                self.handler.buffers[sock] = &quot;&quot;
+                self.handler.log.info(&quot;Accepted client %s&quot;,addr)
+            except socket.timeout:
+                pass
+        self.server.close()
+    
+    def kill(self):
+        self.running = False
 
 class TelnetInput(InputHandler):
     extension_name=&quot;Telnet&quot;
     def __init__(self, bot):
         InputHandler.__init__(self, bot)
-        self.log.info(&quot;Listening on *:16161&quot;)
-        self.server = socket.socket()
-        self.server.bind((&quot;0.0.0.0&quot;, 16161))
-        self.server.listen(1)
         self.clients = []
         self.buffers = {}
-        self.listenThread = threading.Thread(target=self.acceptLoop)
-        self.log.debug(&quot;Starting listener thread&quot;)
+        self.listenThread = TelnetListener(self)
         self.listenThread.start()
+        
+    def unloaded(self):
+        self.stopListener();
+        for s in self.clients:
+            s.close()
     
-    def acceptLoop(self):
-        while True:
-            (sock, addr) = self.server.accept()
-            self.clients.append(sock)
-            self.buffers[sock] = &quot;&quot;
-            self.log.info(&quot;Accepted client %s&quot;,addr)
+    def stopListener(self):
+        self.log.info(&quot;Shutting down listener thread...&quot;)
+        self.listenThread.kill()
+        self.listenThread.join()
     
     def parse(self, bot, stream):
         lineBuffer = self.buffers[stream]</diff>
      <filename>Pointything/modules/Telnet.py</filename>
    </modified>
    <modified>
      <diff>@@ -8,5 +8,7 @@ if __name__ == &quot;__main__&quot;:
     logging.basicConfig(level=logging.DEBUG)
     pthang = Pointything.Pointything()
     pthang.do(&quot;loadModule&quot;, &quot;Telnet&quot;)
-    #pthang.extendWith(TelnetInput)
-    pthang.run()
\ No newline at end of file
+    try:
+        pthang.run()
+    except KeyboardInterrupt:
+        pthang.cleanup()
\ No newline at end of file</diff>
      <filename>main.py</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>Pointything/Database.py</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>7737ca98d0edf20fd977b5c8b15adad038278261</id>
    </parent>
  </parents>
  <author>
    <name>Trever Fischer</name>
    <email>wm161@wm161.net</email>
  </author>
  <url>http://github.com/workman161/pointything/commit/1d331a8b2bf5740f9ef47b0ef95cb86fc70ff72e</url>
  <id>1d331a8b2bf5740f9ef47b0ef95cb86fc70ff72e</id>
  <committed-date>2008-12-08T18:12:09-08:00</committed-date>
  <authored-date>2008-12-08T18:12:09-08:00</authored-date>
  <message>The Telnet module exits the listener thread when the main thread exits
The database system was rewritten. Now, schema is coded right into the system.</message>
  <tree>121ade5a50b1207fcb76a2b8193725bcf2a023ee</tree>
  <committer>
    <name>Trever Fischer</name>
    <email>wm161@wm161.net</email>
  </committer>
</commit>
