mirror of
https://github.com/Mikaela/Limnoria.git
synced 2025-06-13 02:07:22 +02:00
Refactored Irc/Driver interaction.
This commit is contained in:
parent
26995a7017
commit
2b32ccdc7d
@ -51,7 +51,7 @@ import schedule
|
|||||||
|
|
||||||
class AsyncoreRunnerDriver(drivers.IrcDriver):
|
class AsyncoreRunnerDriver(drivers.IrcDriver):
|
||||||
def run(self):
|
def run(self):
|
||||||
log.printf(repr(asyncore.socket_map))
|
log.debug(repr(asyncore.socket_map))
|
||||||
try:
|
try:
|
||||||
asyncore.poll(conf.poll)
|
asyncore.poll(conf.poll)
|
||||||
except:
|
except:
|
||||||
@ -101,7 +101,7 @@ class AsyncoreDriver(asynchat.async_chat, object):
|
|||||||
def found_terminator(self):
|
def found_terminator(self):
|
||||||
start = time.time()
|
start = time.time()
|
||||||
msg = ircmsgs.IrcMsg(self.buffer)
|
msg = ircmsgs.IrcMsg(self.buffer)
|
||||||
log.verbose('Time to parse IrcMsg: %s', time.time()-start)
|
log.debug('Time to parse IrcMsg: %s', time.time()-start)
|
||||||
self.buffer = ''
|
self.buffer = ''
|
||||||
try:
|
try:
|
||||||
self.irc.feedMsg(msg)
|
self.irc.feedMsg(msg)
|
||||||
|
@ -36,7 +36,7 @@ import fix
|
|||||||
import copy
|
import copy
|
||||||
import sets
|
import sets
|
||||||
import time
|
import time
|
||||||
from itertools import imap, chain
|
from itertools import imap, chain, cycle
|
||||||
|
|
||||||
import log
|
import log
|
||||||
import conf
|
import conf
|
||||||
@ -106,7 +106,7 @@ class IrcCallback(IrcCommandDispatcher):
|
|||||||
log.exception(s)
|
log.exception(s)
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
"""Resets the callback. Called when reconnected to the server."""
|
"""Resets the callback. Called when reconnecting to the server."""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def die(self):
|
def die(self):
|
||||||
@ -407,6 +407,7 @@ class Irc(IrcCommandDispatcher):
|
|||||||
world.ircs.append(self)
|
world.ircs.append(self)
|
||||||
self.originalNick = intern(nick)
|
self.originalNick = intern(nick)
|
||||||
self.nick = self.originalNick
|
self.nick = self.originalNick
|
||||||
|
self.nickmods = cycle(conf.nickmods)
|
||||||
self.password = password
|
self.password = password
|
||||||
self.user = intern(user or nick) # Default to nick
|
self.user = intern(user or nick) # Default to nick
|
||||||
self.ident = intern(ident or nick) # Ditto.
|
self.ident = intern(ident or nick) # Ditto.
|
||||||
@ -417,7 +418,6 @@ class Irc(IrcCommandDispatcher):
|
|||||||
self.callbacks = callbacks
|
self.callbacks = callbacks
|
||||||
self.state = IrcState()
|
self.state = IrcState()
|
||||||
self.queue = IrcMsgQueue()
|
self.queue = IrcMsgQueue()
|
||||||
self._nickmods = copy.copy(conf.nickmods)
|
|
||||||
self.lastTake = 0
|
self.lastTake = 0
|
||||||
self.server = None
|
self.server = None
|
||||||
self.afterConnect = False
|
self.afterConnect = False
|
||||||
@ -431,7 +431,7 @@ class Irc(IrcCommandDispatcher):
|
|||||||
self.queue.enqueue(ircmsgs.user(self.ident, self.user))
|
self.queue.enqueue(ircmsgs.user(self.ident, self.user))
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
"""Resets the Irc object. Useful for handling reconnects."""
|
"""Resets the Irc object. Called when the driver reconnects."""
|
||||||
self.nick = self.originalNick
|
self.nick = self.originalNick
|
||||||
self.prefix = '%s!%s@%s' % (self.nick, self.ident, 'unset.domain')
|
self.prefix = '%s!%s@%s' % (self.nick, self.ident, 'unset.domain')
|
||||||
self.state.reset()
|
self.state.reset()
|
||||||
@ -540,9 +540,14 @@ class Irc(IrcCommandDispatcher):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
def do001(self, msg):
|
def do001(self, msg):
|
||||||
"""Prints some logging."""
|
"""Does some logging."""
|
||||||
log.info('Received 001 from the server.')
|
log.info('Received 001 from the server.')
|
||||||
log.info('Hostmasks of user 0: %r' % ircdb.users.getUser(0).hostmasks)
|
log.info('Hostmasks of user 0: %r', ircdb.users.getUser(0).hostmasks)
|
||||||
|
|
||||||
|
def do002(self, msg):
|
||||||
|
"""Logs the ircd version."""
|
||||||
|
(beginning, version) = rsplit(msg.args[0], maxsplit=1)
|
||||||
|
log.info('Server %s has version %s', self.server, version)
|
||||||
|
|
||||||
def doPing(self, msg):
|
def doPing(self, msg):
|
||||||
"""Handles PING messages."""
|
"""Handles PING messages."""
|
||||||
@ -558,22 +563,15 @@ class Irc(IrcCommandDispatcher):
|
|||||||
|
|
||||||
def do433(self, msg):
|
def do433(self, msg):
|
||||||
"""Handles 'nickname already in use' messages."""
|
"""Handles 'nickname already in use' messages."""
|
||||||
if not self._nickmods:
|
self.sendMsg(ircmsgs.nick(self.nickmods.next() % self.originalNick))
|
||||||
self._nickmods = conf.nickmods[:]
|
|
||||||
self.sendMsg(ircmsgs.nick(self._nickmods.pop(0) % self.originalNick))
|
|
||||||
do432 = do433
|
do432 = do433
|
||||||
|
|
||||||
def doError(self, msg):
|
def doError(self, msg):
|
||||||
"""Handles ERROR messages."""
|
"""Handles ERROR messages."""
|
||||||
if msg.args[0].startswith('Closing Link'):
|
if msg.args[0].startswith('Closing Link'):
|
||||||
if hasattr(self.driver, 'scheduleReconnect'):
|
self.driver.reconnect()
|
||||||
self.driver.scheduleReconnect()
|
|
||||||
self.driver.die()
|
|
||||||
elif 'too fast' in msg.args[0]:
|
elif 'too fast' in msg.args[0]:
|
||||||
if hasattr(self.driver, 'reconnectWaitsIndex'):
|
self.driver.reconnect(wait=True)
|
||||||
newIndex = len(self.driver.reconnectWaits)-1
|
|
||||||
self.driver.reconnectWaitsIndex = newIndex
|
|
||||||
self.driver.die()
|
|
||||||
|
|
||||||
def doNick(self, msg):
|
def doNick(self, msg):
|
||||||
"""Handles NICK messages."""
|
"""Handles NICK messages."""
|
||||||
@ -594,6 +592,8 @@ class Irc(IrcCommandDispatcher):
|
|||||||
self.prefix = intern(self.prefix)
|
self.prefix = intern(self.prefix)
|
||||||
log.info('Changing user 0 hostmask to %r' % self.prefix)
|
log.info('Changing user 0 hostmask to %r' % self.prefix)
|
||||||
elif conf.followIdentificationThroughNickChanges:
|
elif conf.followIdentificationThroughNickChanges:
|
||||||
|
# We use elif here because this means it's someone else's nick
|
||||||
|
# change, not our own.
|
||||||
try:
|
try:
|
||||||
id = ircdb.users.getUserId(msg.prefix)
|
id = ircdb.users.getUserId(msg.prefix)
|
||||||
u = ircdb.users.getUser(id)
|
u = ircdb.users.getUser(id)
|
||||||
@ -670,8 +670,6 @@ class Irc(IrcCommandDispatcher):
|
|||||||
log.info('Irc object for %s dying.' % self.server)
|
log.info('Irc object for %s dying.' % self.server)
|
||||||
for callback in self.callbacks:
|
for callback in self.callbacks:
|
||||||
callback.die()
|
callback.die()
|
||||||
if self.driver is not None:
|
|
||||||
self.driver.die()
|
|
||||||
if self in world.ircs:
|
if self in world.ircs:
|
||||||
world.ircs.remove(self)
|
world.ircs.remove(self)
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ class SocketDriver(drivers.IrcDriver):
|
|||||||
for line in lines:
|
for line in lines:
|
||||||
start = time.time()
|
start = time.time()
|
||||||
msg = ircmsgs.IrcMsg(line)
|
msg = ircmsgs.IrcMsg(line)
|
||||||
log.verbose('Time to parse IrcMsg: %s', time.time()-start)
|
log.debug('Time to parse IrcMsg: %s', time.time()-start)
|
||||||
try:
|
try:
|
||||||
self.irc.feedMsg(msg)
|
self.irc.feedMsg(msg)
|
||||||
except:
|
except:
|
||||||
@ -113,7 +113,11 @@ class SocketDriver(drivers.IrcDriver):
|
|||||||
return
|
return
|
||||||
self._sendIfMsgs()
|
self._sendIfMsgs()
|
||||||
|
|
||||||
def reconnect(self):
|
def reconnect(self, wait=False):
|
||||||
|
self.conn.close()
|
||||||
|
if wait:
|
||||||
|
self._scheduleReconnect()
|
||||||
|
return
|
||||||
self.conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
self.conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
self.conn.settimeout(conf.poll*10) # Allow more time for connect.
|
self.conn.settimeout(conf.poll*10) # Allow more time for connect.
|
||||||
if self.reconnectWaitsIndex < len(self.reconnectWaits)-1:
|
if self.reconnectWaitsIndex < len(self.reconnectWaits)-1:
|
||||||
@ -124,14 +128,15 @@ class SocketDriver(drivers.IrcDriver):
|
|||||||
except socket.error, e:
|
except socket.error, e:
|
||||||
if e.args[0] != 115:
|
if e.args[0] != 115:
|
||||||
log.warning('Error connecting to %s: %s', self.server, e)
|
log.warning('Error connecting to %s: %s', self.server, e)
|
||||||
self.die()
|
self.reconnect(wait=True)
|
||||||
self.connected = True
|
self.connected = True
|
||||||
self.reconnectWaitPeriodsIndex = 0
|
self.reconnectWaitPeriodsIndex = 0
|
||||||
|
|
||||||
|
|
||||||
def die(self):
|
def die(self):
|
||||||
|
self.irc.die()
|
||||||
|
|
||||||
|
def _scheduleReconnect(self):
|
||||||
self.irc.reset()
|
self.irc.reset()
|
||||||
self.conn.close()
|
|
||||||
self.connected = False
|
self.connected = False
|
||||||
when = time.time() + self.reconnectWaits[self.reconnectWaitsIndex]
|
when = time.time() + self.reconnectWaits[self.reconnectWaitsIndex]
|
||||||
whenS = time.strftime(conf.logTimestampFormat, time.localtime(when))
|
whenS = time.strftime(conf.logTimestampFormat, time.localtime(when))
|
||||||
|
@ -62,7 +62,7 @@ class SupyIrcProtocol(LineReceiver):
|
|||||||
def lineReceived(self, line):
|
def lineReceived(self, line):
|
||||||
start = time.time()
|
start = time.time()
|
||||||
msg = ircmsgs.IrcMsg(line)
|
msg = ircmsgs.IrcMsg(line)
|
||||||
log.verbose('Time to parse IrcMsg: %s', time.time()-start)
|
log.debug('Time to parse IrcMsg: %s', time.time()-start)
|
||||||
try:
|
try:
|
||||||
self.factory.irc.feedMsg(msg)
|
self.factory.irc.feedMsg(msg)
|
||||||
except:
|
except:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user