mirror of
https://github.com/jlu5/PyLink.git
synced 2024-11-01 01:09:22 +01:00
parent
3749e642f2
commit
8b93b78d13
@ -6,6 +6,7 @@ sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
import utils
|
||||
from copy import copy
|
||||
import traceback
|
||||
import re
|
||||
from classes import *
|
||||
|
||||
# Raw commands sent from servers vary from protocol to protocol. Here, we map
|
||||
@ -134,7 +135,7 @@ def connect(irc):
|
||||
f('SERVER {host} {Pass} 0 {sid} :PyLink Service'.format(host=host,
|
||||
Pass=irc.serverdata["sendpass"], sid=irc.sid))
|
||||
f(':%s BURST %s' % (irc.sid, ts))
|
||||
irc.pseudoclient = spawnClient(irc, 'PyLink', 'pylink', host, modes=set(["+o"]))
|
||||
irc.pseudoclient = spawnClient(irc, 'PyLink', 'pylink', host, modes=set([("+o", None)]))
|
||||
f(':%s ENDBURST' % (irc.sid))
|
||||
for chan in irc.serverdata['channels']:
|
||||
joinClient(irc, irc.pseudoclient.uid, chan)
|
||||
@ -230,7 +231,7 @@ def handle_uid(irc, numeric, command, args):
|
||||
uid, ts, nick, realhost, host, ident, ip = args[0:7]
|
||||
realname = args[-1]
|
||||
irc.users[uid] = IrcUser(nick, ts, uid, ident, host, realname, realhost, ip)
|
||||
parsedmodes = utils.parseModes(args[8:9])
|
||||
parsedmodes = utils.parseModes(irc, [args[8], args[9]], usermodes=True)
|
||||
print('Applying modes %s for %s' % (parsedmodes, uid))
|
||||
irc.users[uid].modes = utils.applyModes(irc.users[uid].modes, parsedmodes)
|
||||
irc.servers[numeric].users.append(uid)
|
||||
@ -289,7 +290,7 @@ def handle_mode(irc, numeric, command, args):
|
||||
# <- :70MAAAAAA MODE 70MAAAAAA -i+xc
|
||||
target = args[0]
|
||||
modestrings = args[1:]
|
||||
changedmodes = utils.parseModes(modestrings)
|
||||
changedmodes = utils.parseModes(irc, modestrings, usermodes=True)
|
||||
irc.users[numeric].modes = utils.applyModes(irc.users[numeric].modes, changedmodes)
|
||||
return {'target': target, 'modes': changedmodes}
|
||||
|
||||
@ -382,6 +383,7 @@ def handle_events(irc, data):
|
||||
= caps['CHANMODES'].split(',')
|
||||
irc.umodes['*A'], irc.umodes['*B'], irc.umodes['*C'], irc.umodes['*D'] \
|
||||
= caps['USERMODES'].split(',')
|
||||
irc.prefixmodes = re.search(r'\((.*?)\)', caps['PREFIX']).group(1)
|
||||
try:
|
||||
real_args = []
|
||||
for arg in args:
|
||||
|
59
utils.py
59
utils.py
@ -83,21 +83,46 @@ def isServerName(s):
|
||||
return _isASCII(s) and '.' in s and not s.startswith('.') \
|
||||
and not s.endswith('.')
|
||||
|
||||
def parseModes(args):
|
||||
"""['+mitl-o', '3', 'person'] => ['+m', '+i', '+t', '-o']
|
||||
|
||||
TODO: handle modes with extra arguments (mainly channel modes like +beIqlk)
|
||||
def parseModes(irc, args, usermodes=False):
|
||||
"""Parses a mode string into a list of (mode, argument) tuples.
|
||||
['+mitl-o', '3', 'person'] => [('+m', None), ('+i', None), ('+t', None), ('+l', '3'), ('-o', 'person')]
|
||||
"""
|
||||
modes = args[0]
|
||||
extramodes = args[1:]
|
||||
if not modes:
|
||||
# http://www.irc.org/tech_docs/005.html
|
||||
# A = Mode that adds or removes a nick or address to a list. Always has a parameter.
|
||||
# B = Mode that changes a setting and always has a parameter.
|
||||
# C = Mode that changes a setting and only has a parameter when set.
|
||||
# D = Mode that changes a setting and never has a parameter.
|
||||
print(args)
|
||||
modestring = args[0]
|
||||
if not modestring:
|
||||
return ValueError('No modes supplied in parseModes query: %r' % modes)
|
||||
args = args[1:]
|
||||
if usermodes:
|
||||
supported_modes = irc.umodes
|
||||
else:
|
||||
supported_modes = irc.cmodes
|
||||
print('supported modes: %s' % supported_modes)
|
||||
res = []
|
||||
for mode in modes:
|
||||
for x in ('A', 'B', 'C', 'D'):
|
||||
print('%s modes: %s' % (x, supported_modes['*'+x]))
|
||||
for mode in modestring:
|
||||
if mode in '+-':
|
||||
prefix = mode
|
||||
else:
|
||||
res.append(prefix + mode)
|
||||
arg = None
|
||||
if mode in (supported_modes['*A'] + supported_modes['*B']):
|
||||
# Must have parameter.
|
||||
print('%s: Must have parameter.' % mode)
|
||||
arg = args.pop(0)
|
||||
elif mode in irc.prefixmodes and not usermodes:
|
||||
# We're setting a prefix mode on someone (e.g. +o user1)
|
||||
print('%s: prefixmode.' % mode)
|
||||
arg = args.pop(0)
|
||||
elif prefix == '+' and mode in supported_modes['*C']:
|
||||
# Only has parameter when setting.
|
||||
print('%s: Only has parameter when setting.' % mode)
|
||||
arg = args.pop(0)
|
||||
res.append((prefix + mode, arg))
|
||||
return res
|
||||
|
||||
def applyModes(modelist, changedmodes):
|
||||
@ -105,19 +130,27 @@ def applyModes(modelist, changedmodes):
|
||||
print('Initial modelist: %s' % modelist)
|
||||
print('Changedmodes: %r' % changedmodes)
|
||||
for mode in changedmodes:
|
||||
if mode[0] == '+':
|
||||
if mode[0][0] == '+':
|
||||
# We're adding a mode
|
||||
modelist.add(mode)
|
||||
print('Adding mode %r' % mode)
|
||||
print('Adding mode %r' % str(mode))
|
||||
else:
|
||||
# We're removing a mode
|
||||
modelist.discard(mode)
|
||||
print('Removing mode %r' % mode)
|
||||
print('Removing mode %r' % str(mode))
|
||||
print('Final modelist: %s' % modelist)
|
||||
return modelist
|
||||
|
||||
def joinModes(modes):
|
||||
return '+' + ''.join(mode[1] for mode in modes)
|
||||
modelist = ''
|
||||
args = []
|
||||
for modepair in modes:
|
||||
mode, arg = modepair
|
||||
modelist += mode[1]
|
||||
if arg is not None:
|
||||
args.append(arg)
|
||||
s = '+%s %s' % (modelist, ' '.join(args))
|
||||
return s
|
||||
|
||||
def isInternalClient(irc, numeric):
|
||||
"""<irc object> <client numeric>
|
||||
|
Loading…
Reference in New Issue
Block a user