mirror of
https://github.com/jlu5/PyLink.git
synced 2025-02-04 08:34:12 +01:00
Move squitServer/spawnServer to ts6_common, add topicServer for Unreal
This commit is contained in:
parent
5664218254
commit
ac48c49591
@ -247,39 +247,6 @@ class TS6Protocol(TS6BaseProtocol):
|
|||||||
else:
|
else:
|
||||||
self._send(source, 'AWAY')
|
self._send(source, 'AWAY')
|
||||||
|
|
||||||
def spawnServer(self, name, sid=None, uplink=None, desc=None):
|
|
||||||
"""
|
|
||||||
Spawns a server off a PyLink server. desc (server description)
|
|
||||||
defaults to the one in the config. uplink defaults to the main PyLink
|
|
||||||
server, and sid (the server ID) is automatically generated if not
|
|
||||||
given.
|
|
||||||
"""
|
|
||||||
# -> :0AL SID test.server 1 0XY :some silly pseudoserver
|
|
||||||
uplink = uplink or self.irc.sid
|
|
||||||
name = name.lower()
|
|
||||||
desc = desc or self.irc.serverdata.get('serverdesc') or self.irc.botdata['serverdesc']
|
|
||||||
if sid is None: # No sid given; generate one!
|
|
||||||
sid = self.sidgen.next_sid()
|
|
||||||
assert len(sid) == 3, "Incorrect SID length"
|
|
||||||
if sid in self.irc.servers:
|
|
||||||
raise ValueError('A server with SID %r already exists!' % sid)
|
|
||||||
for server in self.irc.servers.values():
|
|
||||||
if name == server.name:
|
|
||||||
raise ValueError('A server named %r already exists!' % name)
|
|
||||||
if not utils.isInternalServer(self.irc, uplink):
|
|
||||||
raise ValueError('Server %r is not a PyLink internal PseudoServer!' % uplink)
|
|
||||||
if not utils.isServerName(name):
|
|
||||||
raise ValueError('Invalid server name %r' % name)
|
|
||||||
self._send(uplink, 'SID %s 1 %s :%s' % (name, sid, desc))
|
|
||||||
self.irc.servers[sid] = IrcServer(uplink, name, internal=True, desc=desc)
|
|
||||||
return sid
|
|
||||||
|
|
||||||
def squitServer(self, source, target, text='No reason given'):
|
|
||||||
"""SQUITs a PyLink server."""
|
|
||||||
# -> SQUIT 9PZ :blah, blah
|
|
||||||
self._send(source, 'SQUIT %s :%s' % (target, text))
|
|
||||||
self.handle_squit(source, 'SQUIT', [target, text])
|
|
||||||
|
|
||||||
def connect(self):
|
def connect(self):
|
||||||
"""Initializes a connection to a server."""
|
"""Initializes a connection to a server."""
|
||||||
ts = self.irc.start_ts
|
ts = self.irc.start_ts
|
||||||
|
@ -25,6 +25,8 @@ class TS6BaseProtocol(Protocol):
|
|||||||
for k, v in self.irc.servers.items():
|
for k, v in self.irc.servers.items():
|
||||||
if v.name.lower() == nick:
|
if v.name.lower() == nick:
|
||||||
return k
|
return k
|
||||||
|
else:
|
||||||
|
return sname # Fall back to given text instead of None
|
||||||
|
|
||||||
### OUTGOING COMMANDS
|
### OUTGOING COMMANDS
|
||||||
|
|
||||||
@ -103,6 +105,40 @@ class TS6BaseProtocol(Protocol):
|
|||||||
self.irc.channels[target].topic = text
|
self.irc.channels[target].topic = text
|
||||||
self.irc.channels[target].topicset = True
|
self.irc.channels[target].topicset = True
|
||||||
|
|
||||||
|
def spawnServer(self, name, sid=None, uplink=None, desc=None):
|
||||||
|
"""
|
||||||
|
Spawns a server off a PyLink server. desc (server description)
|
||||||
|
defaults to the one in the config. uplink defaults to the main PyLink
|
||||||
|
server, and sid (the server ID) is automatically generated if not
|
||||||
|
given.
|
||||||
|
"""
|
||||||
|
# -> :0AL SID test.server 1 0XY :some silly pseudoserver
|
||||||
|
uplink = uplink or self.irc.sid
|
||||||
|
name = name.lower()
|
||||||
|
desc = desc or self.irc.serverdata.get('serverdesc') or self.irc.botdata['serverdesc']
|
||||||
|
if sid is None: # No sid given; generate one!
|
||||||
|
sid = self.sidgen.next_sid()
|
||||||
|
assert len(sid) == 3, "Incorrect SID length"
|
||||||
|
if sid in self.irc.servers:
|
||||||
|
raise ValueError('A server with SID %r already exists!' % sid)
|
||||||
|
for server in self.irc.servers.values():
|
||||||
|
if name == server.name:
|
||||||
|
raise ValueError('A server named %r already exists!' % name)
|
||||||
|
if not utils.isInternalServer(self.irc, uplink):
|
||||||
|
raise ValueError('Server %r is not a PyLink internal PseudoServer!' % uplink)
|
||||||
|
if not utils.isServerName(name):
|
||||||
|
raise ValueError('Invalid server name %r' % name)
|
||||||
|
self._send(uplink, 'SID %s 1 %s :%s' % (name, sid, desc))
|
||||||
|
self.irc.servers[sid] = IrcServer(uplink, name, internal=True, desc=desc)
|
||||||
|
return sid
|
||||||
|
|
||||||
|
def squitServer(self, source, target, text='No reason given'):
|
||||||
|
"""SQUITs a PyLink server."""
|
||||||
|
# -> SQUIT 9PZ :blah, blah
|
||||||
|
log.debug('source=%s, target=%s', source, target)
|
||||||
|
self._send(source, 'SQUIT %s :%s' % (target, text))
|
||||||
|
self.handle_squit(source, 'SQUIT', [target, text])
|
||||||
|
|
||||||
### HANDLERS
|
### HANDLERS
|
||||||
|
|
||||||
def handle_privmsg(self, source, command, args):
|
def handle_privmsg(self, source, command, args):
|
||||||
@ -172,6 +208,7 @@ class TS6BaseProtocol(Protocol):
|
|||||||
def handle_squit(self, numeric, command, args):
|
def handle_squit(self, numeric, command, args):
|
||||||
"""Handles incoming SQUITs (netsplits)."""
|
"""Handles incoming SQUITs (netsplits)."""
|
||||||
# :70M SQUIT 1ML :Server quit by GL!gl@0::1
|
# :70M SQUIT 1ML :Server quit by GL!gl@0::1
|
||||||
|
log.debug('handle_squit args: %s', args)
|
||||||
split_server = args[0]
|
split_server = args[0]
|
||||||
affected_users = []
|
affected_users = []
|
||||||
log.debug('(%s) Splitting server %s (reason: %s)', self.irc.name, split_server, args[-1])
|
log.debug('(%s) Splitting server %s (reason: %s)', self.irc.name, split_server, args[-1])
|
||||||
|
@ -22,6 +22,7 @@ class UnrealProtocol(TS6BaseProtocol):
|
|||||||
self.hook_map = {'UMODE2': 'MODE', 'SVSKILL': 'KILL', 'SVSMODE': 'MODE',
|
self.hook_map = {'UMODE2': 'MODE', 'SVSKILL': 'KILL', 'SVSMODE': 'MODE',
|
||||||
'SVS2MODE': 'MODE'}
|
'SVS2MODE': 'MODE'}
|
||||||
self.uidgen = {}
|
self.uidgen = {}
|
||||||
|
self.sidgen = utils.TS6SIDGenerator(self.irc)
|
||||||
|
|
||||||
self.caps = {}
|
self.caps = {}
|
||||||
self.irc.prefixmodes = {'q': '~', 'a': '&', 'o': '@', 'h': '%', 'v': '+'}
|
self.irc.prefixmodes = {'q': '~', 'a': '&', 'o': '@', 'h': '%', 'v': '+'}
|
||||||
@ -36,6 +37,7 @@ class UnrealProtocol(TS6BaseProtocol):
|
|||||||
'I': 'invex', 't': 'topiclock', 'f': 'flood_unreal'}
|
'I': 'invex', 't': 'topiclock', 'f': 'flood_unreal'}
|
||||||
self._neededCaps = ["VL", "SID", "CHANMODES", "NOQUIT", "SJ3"]
|
self._neededCaps = ["VL", "SID", "CHANMODES", "NOQUIT", "SJ3"]
|
||||||
|
|
||||||
|
# Some command aliases
|
||||||
self.handle_svskill = self.handle_kill
|
self.handle_svskill = self.handle_kill
|
||||||
|
|
||||||
### OUTGOING COMMAND FUNCTIONS
|
### OUTGOING COMMAND FUNCTIONS
|
||||||
@ -195,6 +197,14 @@ class UnrealProtocol(TS6BaseProtocol):
|
|||||||
raise LookupError('No such PyLink server exists.')
|
raise LookupError('No such PyLink server exists.')
|
||||||
self._sendModes(numeric, target, modes, ts=ts)
|
self._sendModes(numeric, target, modes, ts=ts)
|
||||||
|
|
||||||
|
def topicServer(self, numeric, target, text):
|
||||||
|
"""Sends a TOPIC change from a PyLink server."""
|
||||||
|
if not utils.isInternalServer(self.irc, numeric):
|
||||||
|
raise LookupError('No such PyLink server exists.')
|
||||||
|
self._send(numeric, 'TOPIC %s :%s' % (target, text))
|
||||||
|
self.irc.channels[target].topic = text
|
||||||
|
self.irc.channels[target].topicset = True
|
||||||
|
|
||||||
### HANDLERS
|
### HANDLERS
|
||||||
|
|
||||||
def connect(self):
|
def connect(self):
|
||||||
@ -375,8 +385,13 @@ class UnrealProtocol(TS6BaseProtocol):
|
|||||||
args = args[2:]
|
args = args[2:]
|
||||||
# If the sender isn't in UID format, try to convert it automatically.
|
# If the sender isn't in UID format, try to convert it automatically.
|
||||||
# Unreal's protocol isn't quite consistent with this yet!
|
# Unreal's protocol isn't quite consistent with this yet!
|
||||||
numeric = self._getSid(sender) or utils.nickToUid(self.irc, sender) or \
|
sender_server = self._getSid(sender)
|
||||||
sender
|
if sender_server in self.irc.servers:
|
||||||
|
# Sender is a server when converted from name to SID.
|
||||||
|
numeric = sender_server
|
||||||
|
else:
|
||||||
|
# Sender is a user.
|
||||||
|
numeric = self._getNick(sender)
|
||||||
# parseTS6Args() will raise IndexError if the TS6 sender prefix is missing.
|
# parseTS6Args() will raise IndexError if the TS6 sender prefix is missing.
|
||||||
except IndexError:
|
except IndexError:
|
||||||
# Raw command without an explicit sender; assume it's being sent by our uplink.
|
# Raw command without an explicit sender; assume it's being sent by our uplink.
|
||||||
|
Loading…
Reference in New Issue
Block a user