Limnoria/src/twistedDrivers.py
2003-04-19 23:51:26 +00:00

99 lines
2.7 KiB
Python

#!/usr/bin/env python
from fix import *
import time
import conf
import debug
import ircdb
import drivers
import ircmsgs
from twisted.internet import reactor
from twisted.manhole.telnet import Shell, ShellFactory
from twisted.protocols.basic import LineReceiver
from twisted.internet.protocol import ReconnectingClientFactory
class TwistedRunnerDriver(drivers.IrcDriver):
def run(self):
try:
reactor.iterate(conf.poll)
except:
debug.msg('Except caught outside reactor.', 'normal')
debug.recoverableException()
class SupyIrcProtocol(LineReceiver):
delimiter = '\n'
MAX_LENGTH = 1024
def __init__(self):
self.mostRecentCall = reactor.callLater(1, self.checkIrcForMsgs)
def lineReceived(self, line):
start = time.time()
msg = ircmsgs.IrcMsg(line)
debug.msg('Time to parse IrcMsg: %s' % (time.time()-start), 'verbose')
try:
self.factory.irc.feedMsg(msg)
except:
debug.msg('Exception caught outside Irc object.', 'normal')
debug.recoverableException()
def checkIrcForMsgs(self):
if self.connected:
msg = self.factory.irc.takeMsg()
if msg:
self.transport.write(str(msg))
self.mostRecentCall = reactor.callLater(1, self.checkIrcForMsgs)
def connectionLost(self):
self.mostRecentCall.cancel()
def connectionMade(self):
self.factory.irc.driver = self
self.factory.irc.reset()
#self.mostRecentCall = reactor.callLater(1, self.checkIrcForMsgs)
def die(self):
self.transport.loseConnection()
class SupyReconnectingFactory(ReconnectingClientFactory):
maxDelay = 600
protocol = SupyIrcProtocol
def __init__(self, (server, port), irc):
self.irc = irc
self.server = (server, port)
reactor.connectTCP(server, port, self)
class MyShell(Shell):
def checkUserAndPass(self, username, password):
debug.printf(repr(username))
debug.printf(repr(password))
try:
u = ircdb.users.getUser(username)
debug.printf(u)
if u.checkPassword(password) and u.checkCapability('owner'):
debug.printf('returning True')
return True
else:
return False
except KeyError:
return False
class MyShellFactory(ShellFactory):
protocol = MyShell
if conf.telnetEnable and __name__ != '__main__':
reactor.listenTCP(conf.telnetPort, MyShellFactory())
Driver = SupyReconnectingFactory
try:
ignore(poller)
except NameError:
poller = TwistedRunnerDriver()
# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: