3
0
mirror of https://github.com/jlu5/PyLink.git synced 2024-11-24 11:39:25 +01:00

inspircd: bug fixes found by testing

- Lowercase all channel names consistently, to prevent duplicates
- Store uidgen as an attribute of Irc, so each Irc instance gets its own set of UID generators
- Raise an error in handle_part of the user doesn't exist in the channel.
This commit is contained in:
James Lu 2015-07-03 23:30:38 -07:00
parent 0bfe2b2a21
commit d6341109be

View File

@ -8,7 +8,6 @@ from copy import copy
import traceback import traceback
from classes import * from classes import *
uidgen = {}
# Map raw commands to protocol-independent hooks # Map raw commands to protocol-independent hooks
hook_map = {'FJOIN': 'join', hook_map = {'FJOIN': 'join',
'PART': 'part', 'PART': 'part',
@ -27,9 +26,9 @@ def spawnClient(irc, nick, ident, host, modes=[], server=None, *args):
raise ValueError('Server %r is not a PyLink internal PseudoServer!' % server) raise ValueError('Server %r is not a PyLink internal PseudoServer!' % server)
# We need a separate UID generator instance for every PseudoServer # We need a separate UID generator instance for every PseudoServer
# we spawn. Otherwise, things won't wrap around properly. # we spawn. Otherwise, things won't wrap around properly.
if server not in uidgen: if server not in irc.uidgen:
uidgen[server] = utils.TS6UIDGenerator(server) irc.uidgen[server] = utils.TS6UIDGenerator(server)
uid = uidgen[server].next_uid() uid = irc.uidgen[server].next_uid()
ts = int(time.time()) ts = int(time.time())
if modes: if modes:
modes = utils.joinModes(modes) modes = utils.joinModes(modes)
@ -46,6 +45,7 @@ def spawnClient(irc, nick, ident, host, modes=[], server=None, *args):
return u return u
def joinClient(irc, client, channel): def joinClient(irc, client, channel):
channel = channel.lower()
server = utils.isInternalClient(irc, client) server = utils.isInternalClient(irc, client)
if not server: if not server:
raise LookupError('No such PyLink PseudoClient exists.') raise LookupError('No such PyLink PseudoClient exists.')
@ -57,6 +57,7 @@ def joinClient(irc, client, channel):
irc.channels[channel].users.add(client) irc.channels[channel].users.add(client)
def partClient(irc, client, channel, reason=None): def partClient(irc, client, channel, reason=None):
channel = channel.lower()
if not utils.isInternalClient(irc, client): if not utils.isInternalClient(irc, client):
raise LookupError('No such PyLink PseudoClient exists.') raise LookupError('No such PyLink PseudoClient exists.')
msg = "PART %s" % channel msg = "PART %s" % channel
@ -65,7 +66,7 @@ def partClient(irc, client, channel, reason=None):
if reason: if reason:
msg += " :%s" % reason msg += " :%s" % reason
_sendFromUser(irc, client, msg) _sendFromUser(irc, client, msg)
handle_part(irc, client, 'PART', channel) handle_part(irc, client, 'PART', [channel])
def removeClient(irc, numeric): def removeClient(irc, numeric):
"""<irc object> <client numeric> """<irc object> <client numeric>
@ -99,6 +100,7 @@ def kickClient(irc, numeric, channel, target, reason=None):
"""<irc object> <kicker client numeric> """<irc object> <kicker client numeric>
Sends a kick from a PyLink PseudoClient.""" Sends a kick from a PyLink PseudoClient."""
channel = channel.lower()
if not utils.isInternalClient(irc, numeric): if not utils.isInternalClient(irc, numeric):
raise LookupError('No such PyLink PseudoClient exists.') raise LookupError('No such PyLink PseudoClient exists.')
if not reason: if not reason:
@ -118,6 +120,7 @@ def nickClient(irc, numeric, newnick):
def connect(irc): def connect(irc):
irc.start_ts = ts = int(time.time()) irc.start_ts = ts = int(time.time())
irc.uidgen = {}
host = irc.serverdata["hostname"] host = irc.serverdata["hostname"]
irc.servers[irc.sid] = IrcServer(None, host, internal=True) irc.servers[irc.sid] = IrcServer(None, host, internal=True)
@ -178,15 +181,16 @@ def handle_kill(irc, source, command, args):
def handle_kick(irc, source, command, args): def handle_kick(irc, source, command, args):
# :70MAAAAAA KICK #endlessvoid 70MAAAAAA :some reason # :70MAAAAAA KICK #endlessvoid 70MAAAAAA :some reason
channel = args[0] channel = args[0]
channel = channel.lower()
kicked = args[1] kicked = args[1]
irc.channels[channel].users.discard(kicked) irc.channels[channel].users.discard(kicked)
if kicked == irc.pseudoclient.uid: if kicked == irc.pseudoclient.uid:
joinClient(irc, irc.pseudoclient.uid, channel) joinClient(irc, irc.pseudoclient.uid, channel)
def handle_part(irc, source, command, args): def handle_part(irc, source, command, args):
channel = args[0] channel = args[0].lower()
# We should only get PART commands for channels that exist, right?? # We should only get PART commands for channels that exist, right??
irc.channels[channel].users.discard(source) irc.channels[channel].users.remove(source)
if not irc.channels[channel].users: if not irc.channels[channel].users:
del irc.channels[channel] del irc.channels[channel]
@ -196,7 +200,7 @@ def handle_error(irc, numeric, command, args):
def handle_fjoin(irc, servernumeric, command, args): def handle_fjoin(irc, servernumeric, command, args):
# :70M FJOIN #chat 1423790411 +AFPfjnt 6:5 7:5 9:5 :o,1SRAABIT4 v,1IOAAF53R <...> # :70M FJOIN #chat 1423790411 +AFPfjnt 6:5 7:5 9:5 :o,1SRAABIT4 v,1IOAAF53R <...>
channel = args[0] channel = args[0].lower()
# InspIRCd sends each user's channel data in the form of 'modeprefix(es),UID' # InspIRCd sends each user's channel data in the form of 'modeprefix(es),UID'
userlist = args[-1].split() userlist = args[-1].split()
for user in userlist: for user in userlist: