mirror of
https://github.com/jlu5/PyLink.git
synced 2024-11-24 03:29:28 +01:00
classes: Move ISUPPORT-style PREFIX and capabilities handling to Protocol
This commit is contained in:
parent
75d88224f1
commit
eef54cd77d
30
classes.py
30
classes.py
@ -15,6 +15,7 @@ import ssl
|
|||||||
import hashlib
|
import hashlib
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
import inspect
|
import inspect
|
||||||
|
import re
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import ircmatch
|
import ircmatch
|
||||||
@ -1301,6 +1302,35 @@ class Protocol():
|
|||||||
return {'target': split_server, 'users': affected_users, 'name': sname,
|
return {'target': split_server, 'users': affected_users, 'name': sname,
|
||||||
'uplink': uplink}
|
'uplink': uplink}
|
||||||
|
|
||||||
|
def parseCapabilities(self, args):
|
||||||
|
"""
|
||||||
|
Parses a string of capabilities in the 005 / RPL_ISUPPORT format.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if type(args) == str:
|
||||||
|
args = args.split(' ')
|
||||||
|
|
||||||
|
caps = {}
|
||||||
|
for cap in args:
|
||||||
|
try:
|
||||||
|
# Try to split it as a KEY=VALUE pair.
|
||||||
|
key, value = cap.split('=', 1)
|
||||||
|
except ValueError:
|
||||||
|
key = cap
|
||||||
|
value = ''
|
||||||
|
caps[key] = value
|
||||||
|
|
||||||
|
return caps
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def parsePrefixes(args):
|
||||||
|
"""
|
||||||
|
Separates prefixes field like "(qaohv)~&@%+" into a dict mapping mode characters to mode
|
||||||
|
prefixes.
|
||||||
|
"""
|
||||||
|
prefixsearch = re.search(r'\(([A-Za-z]+)\)(.*)', args)
|
||||||
|
return dict(zip(prefixsearch.group(1), prefixsearch.group(2)))
|
||||||
|
|
||||||
### FakeIRC classes, used for test cases
|
### FakeIRC classes, used for test cases
|
||||||
|
|
||||||
class FakeIRC(Irc):
|
class FakeIRC(Irc):
|
||||||
|
@ -444,11 +444,12 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
# USERMODES=,,s,BHIRSWcghikorwx GLOBOPS=1 SVSPART=1
|
# USERMODES=,,s,BHIRSWcghikorwx GLOBOPS=1 SVSPART=1
|
||||||
|
|
||||||
# First, turn the arguments into a dict
|
# First, turn the arguments into a dict
|
||||||
caps = dict([x.split('=') for x in args[-1].split()])
|
caps = self.parseCapabilities(args[-1])
|
||||||
|
log.debug("(%s) capabilities list: %s", self.irc.name, caps)
|
||||||
|
|
||||||
# Check the protocol version
|
# Check the protocol version
|
||||||
protocol_version = int(caps['PROTOCOL'])
|
protocol_version = int(caps['PROTOCOL'])
|
||||||
|
|
||||||
if protocol_version < self.min_proto_ver:
|
if protocol_version < self.min_proto_ver:
|
||||||
raise ProtocolError("Remote protocol version is too old! "
|
raise ProtocolError("Remote protocol version is too old! "
|
||||||
"At least %s (InspIRCd 2.0.x) is "
|
"At least %s (InspIRCd 2.0.x) is "
|
||||||
@ -474,9 +475,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
|
|
||||||
# Separate the prefixes field (e.g. "(Yqaohv)!~&@%+") into a
|
# Separate the prefixes field (e.g. "(Yqaohv)!~&@%+") into a
|
||||||
# dict mapping mode characters to mode prefixes.
|
# dict mapping mode characters to mode prefixes.
|
||||||
prefixsearch = re.search(r'\(([A-Za-z]+)\)(.*)', caps['PREFIX'])
|
self.irc.prefixmodes = self.parsePrefixes(caps['PREFIX'])
|
||||||
self.irc.prefixmodes = dict(zip(prefixsearch.group(1),
|
|
||||||
prefixsearch.group(2)))
|
|
||||||
log.debug('(%s) self.irc.prefixmodes set to %r', self.irc.name,
|
log.debug('(%s) self.irc.prefixmodes set to %r', self.irc.name,
|
||||||
self.irc.prefixmodes)
|
self.irc.prefixmodes)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user