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:
parent
0bfe2b2a21
commit
d6341109be
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user