mirror of
https://github.com/jlu5/PyLink.git
synced 2024-11-30 14:49:28 +01:00
protocols: rename _send to _send_with_prefix to avoid clashing with process_queue
This commit is contained in:
parent
df18e318a8
commit
8acf39cad6
@ -109,7 +109,7 @@ class HybridProtocol(TS6Protocol):
|
|||||||
realhost=realhost, ip=ip, manipulatable=manipulatable)
|
realhost=realhost, ip=ip, manipulatable=manipulatable)
|
||||||
self.irc.applyModes(uid, modes)
|
self.irc.applyModes(uid, modes)
|
||||||
self.irc.servers[server].users.add(uid)
|
self.irc.servers[server].users.add(uid)
|
||||||
self._send(server, "UID {nick} 1 {ts} {modes} {ident} {host} {ip} {uid} "
|
self._send_with_prefix(server, "UID {nick} 1 {ts} {modes} {ident} {host} {ip} {uid} "
|
||||||
"* :{realname}".format(ts=ts, host=host,
|
"* :{realname}".format(ts=ts, host=host,
|
||||||
nick=nick, ident=ident, uid=uid,
|
nick=nick, ident=ident, uid=uid,
|
||||||
modes=raw_modes, ip=ip, realname=realname))
|
modes=raw_modes, ip=ip, realname=realname))
|
||||||
@ -131,7 +131,7 @@ class HybridProtocol(TS6Protocol):
|
|||||||
self.irc.users[target].host = text
|
self.irc.users[target].host = text
|
||||||
# On Hybrid, it appears that host changing is actually just forcing umode
|
# On Hybrid, it appears that host changing is actually just forcing umode
|
||||||
# "+x <hostname>" on the target. -GLolol
|
# "+x <hostname>" on the target. -GLolol
|
||||||
self._send(self.irc.sid, 'SVSMODE %s %s +x %s' % (target, ts, text))
|
self._send_with_prefix(self.irc.sid, 'SVSMODE %s %s +x %s' % (target, ts, text))
|
||||||
else:
|
else:
|
||||||
raise NotImplementedError("Changing field %r of a client is unsupported by this protocol." % field)
|
raise NotImplementedError("Changing field %r of a client is unsupported by this protocol." % field)
|
||||||
|
|
||||||
@ -144,7 +144,7 @@ class HybridProtocol(TS6Protocol):
|
|||||||
ts = self.irc.channels[target].ts
|
ts = self.irc.channels[target].ts
|
||||||
servername = self.irc.servers[numeric].name
|
servername = self.irc.servers[numeric].name
|
||||||
|
|
||||||
self._send(numeric, 'TBURST %s %s %s %s :%s' % (ts, target, int(time.time()), servername, text))
|
self._send_with_prefix(numeric, 'TBURST %s %s %s %s :%s' % (ts, target, int(time.time()), servername, text))
|
||||||
self.irc.channels[target].topic = text
|
self.irc.channels[target].topic = text
|
||||||
self.irc.channels[target].topicset = True
|
self.irc.channels[target].topicset = True
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
self.irc.applyModes(uid, modes)
|
self.irc.applyModes(uid, modes)
|
||||||
self.irc.servers[server].users.add(uid)
|
self.irc.servers[server].users.add(uid)
|
||||||
|
|
||||||
self._send(server, "UID {uid} {ts} {nick} {realhost} {host} {ident} {ip}"
|
self._send_with_prefix(server, "UID {uid} {ts} {nick} {realhost} {host} {ident} {ip}"
|
||||||
" {ts} {modes} + :{realname}".format(ts=ts, host=host,
|
" {ts} {modes} + :{realname}".format(ts=ts, host=host,
|
||||||
nick=nick, ident=ident, uid=uid,
|
nick=nick, ident=ident, uid=uid,
|
||||||
modes=raw_modes, ip=ip, realname=realname,
|
modes=raw_modes, ip=ip, realname=realname,
|
||||||
@ -82,7 +82,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
|
|
||||||
# Strip out list-modes, they shouldn't be ever sent in FJOIN.
|
# Strip out list-modes, they shouldn't be ever sent in FJOIN.
|
||||||
modes = [m for m in self.irc.channels[channel].modes if m[0] not in self.irc.cmodes['*A']]
|
modes = [m for m in self.irc.channels[channel].modes if m[0] not in self.irc.cmodes['*A']]
|
||||||
self._send(server, "FJOIN {channel} {ts} {modes} :,{uid}".format(
|
self._send_with_prefix(server, "FJOIN {channel} {ts} {modes} :,{uid}".format(
|
||||||
ts=self.irc.channels[channel].ts, uid=client, channel=channel,
|
ts=self.irc.channels[channel].ts, uid=client, channel=channel,
|
||||||
modes=self.irc.joinModes(modes)))
|
modes=self.irc.joinModes(modes)))
|
||||||
self.irc.channels[channel].users.add(client)
|
self.irc.channels[channel].users.add(client)
|
||||||
@ -142,7 +142,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
log.debug("(%s) sjoin: KeyError trying to add %r to %r's channel list?", self.irc.name, channel, user)
|
log.debug("(%s) sjoin: KeyError trying to add %r to %r's channel list?", self.irc.name, channel, user)
|
||||||
|
|
||||||
namelist = ' '.join(namelist)
|
namelist = ' '.join(namelist)
|
||||||
self._send(server, "FJOIN {channel} {ts} {modes} :{users}".format(
|
self._send_with_prefix(server, "FJOIN {channel} {ts} {modes} :{users}".format(
|
||||||
ts=ts, users=namelist, channel=channel,
|
ts=ts, users=namelist, channel=channel,
|
||||||
modes=self.irc.joinModes(modes)))
|
modes=self.irc.joinModes(modes)))
|
||||||
self.irc.channels[channel].users.update(uids)
|
self.irc.channels[channel].users.update(uids)
|
||||||
@ -150,7 +150,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
if banmodes:
|
if banmodes:
|
||||||
# Burst ban modes if there are any.
|
# Burst ban modes if there are any.
|
||||||
# <- :1ML FMODE #test 1461201525 +bb *!*@bad.user *!*@rly.bad.user
|
# <- :1ML FMODE #test 1461201525 +bb *!*@bad.user *!*@rly.bad.user
|
||||||
self._send(server, "FMODE {channel} {ts} {modes} ".format(
|
self._send_with_prefix(server, "FMODE {channel} {ts} {modes} ".format(
|
||||||
ts=ts, channel=channel, modes=self.irc.joinModes(banmodes)))
|
ts=ts, channel=channel, modes=self.irc.joinModes(banmodes)))
|
||||||
|
|
||||||
self.updateTS(server, channel, ts, changedmodes)
|
self.updateTS(server, channel, ts, changedmodes)
|
||||||
@ -187,7 +187,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
else:
|
else:
|
||||||
otype = ':' + otype
|
otype = ':' + otype
|
||||||
|
|
||||||
self._send(target, 'OPERTYPE %s' % otype)
|
self._send_with_prefix(target, 'OPERTYPE %s' % otype)
|
||||||
|
|
||||||
def mode(self, numeric, target, modes, ts=None):
|
def mode(self, numeric, target, modes, ts=None):
|
||||||
"""Sends mode changes from a PyLink client/server."""
|
"""Sends mode changes from a PyLink client/server."""
|
||||||
@ -198,7 +198,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
(not self.irc.isInternalServer(numeric)):
|
(not self.irc.isInternalServer(numeric)):
|
||||||
raise LookupError('No such PyLink client/server exists.')
|
raise LookupError('No such PyLink client/server exists.')
|
||||||
|
|
||||||
log.debug('(%s) inspircd._sendModes: received %r for mode list', self.irc.name, modes)
|
log.debug('(%s) inspircd._send_with_prefixModes: received %r for mode list', self.irc.name, modes)
|
||||||
if ('+o', None) in modes and not utils.isChannel(target):
|
if ('+o', None) in modes and not utils.isChannel(target):
|
||||||
# https://github.com/inspircd/inspircd/blob/master/src/modules/m_spanningtree/opertype.cpp#L26-L28
|
# https://github.com/inspircd/inspircd/blob/master/src/modules/m_spanningtree/opertype.cpp#L26-L28
|
||||||
# Servers need a special command to set umode +o on people.
|
# Servers need a special command to set umode +o on people.
|
||||||
@ -207,9 +207,9 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
joinedmodes = self.irc.joinModes(modes)
|
joinedmodes = self.irc.joinModes(modes)
|
||||||
if utils.isChannel(target):
|
if utils.isChannel(target):
|
||||||
ts = ts or self.irc.channels[self.irc.toLower(target)].ts
|
ts = ts or self.irc.channels[self.irc.toLower(target)].ts
|
||||||
self._send(numeric, 'FMODE %s %s %s' % (target, ts, joinedmodes))
|
self._send_with_prefix(numeric, 'FMODE %s %s %s' % (target, ts, joinedmodes))
|
||||||
else:
|
else:
|
||||||
self._send(numeric, 'MODE %s %s' % (target, joinedmodes))
|
self._send_with_prefix(numeric, 'MODE %s %s' % (target, joinedmodes))
|
||||||
|
|
||||||
def kill(self, numeric, target, reason):
|
def kill(self, numeric, target, reason):
|
||||||
"""Sends a kill from a PyLink client/server."""
|
"""Sends a kill from a PyLink client/server."""
|
||||||
@ -225,7 +225,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
else:
|
else:
|
||||||
sourcenick = self.irc.users[numeric].nick
|
sourcenick = self.irc.users[numeric].nick
|
||||||
|
|
||||||
self._send(numeric, 'KILL %s :Killed (%s (%s))' % (target, sourcenick, reason))
|
self._send_with_prefix(numeric, 'KILL %s :Killed (%s (%s))' % (target, sourcenick, reason))
|
||||||
|
|
||||||
# We only need to call removeClient here if the target is one of our
|
# We only need to call removeClient here if the target is one of our
|
||||||
# clients, since any remote servers will send a QUIT from
|
# clients, since any remote servers will send a QUIT from
|
||||||
@ -239,7 +239,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
raise LookupError('No such PyLink server exists.')
|
raise LookupError('No such PyLink server exists.')
|
||||||
ts = int(time.time())
|
ts = int(time.time())
|
||||||
servername = self.irc.servers[numeric].name
|
servername = self.irc.servers[numeric].name
|
||||||
self._send(numeric, 'FTOPIC %s %s %s :%s' % (target, ts, servername, text))
|
self._send_with_prefix(numeric, 'FTOPIC %s %s %s :%s' % (target, ts, servername, text))
|
||||||
self.irc.channels[target].topic = text
|
self.irc.channels[target].topic = text
|
||||||
self.irc.channels[target].topicset = True
|
self.irc.channels[target].topicset = True
|
||||||
|
|
||||||
@ -247,13 +247,13 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
"""Sends an INVITE from a PyLink client.."""
|
"""Sends an INVITE from a PyLink client.."""
|
||||||
if not self.irc.isInternalClient(numeric):
|
if not self.irc.isInternalClient(numeric):
|
||||||
raise LookupError('No such PyLink client exists.')
|
raise LookupError('No such PyLink client exists.')
|
||||||
self._send(numeric, 'INVITE %s %s' % (target, channel))
|
self._send_with_prefix(numeric, 'INVITE %s %s' % (target, channel))
|
||||||
|
|
||||||
def knock(self, numeric, target, text):
|
def knock(self, numeric, target, text):
|
||||||
"""Sends a KNOCK from a PyLink client."""
|
"""Sends a KNOCK from a PyLink client."""
|
||||||
if not self.irc.isInternalClient(numeric):
|
if not self.irc.isInternalClient(numeric):
|
||||||
raise LookupError('No such PyLink client exists.')
|
raise LookupError('No such PyLink client exists.')
|
||||||
self._send(numeric, 'ENCAP * KNOCK %s :%s' % (target, text))
|
self._send_with_prefix(numeric, 'ENCAP * KNOCK %s :%s' % (target, text))
|
||||||
|
|
||||||
def updateClient(self, target, field, text):
|
def updateClient(self, target, field, text):
|
||||||
"""Updates the ident, host, or realname of any connected client."""
|
"""Updates the ident, host, or realname of any connected client."""
|
||||||
@ -267,13 +267,13 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
# It is one of our clients, use FIDENT/HOST/NAME.
|
# It is one of our clients, use FIDENT/HOST/NAME.
|
||||||
if field == 'IDENT':
|
if field == 'IDENT':
|
||||||
self.irc.users[target].ident = text
|
self.irc.users[target].ident = text
|
||||||
self._send(target, 'FIDENT %s' % text)
|
self._send_with_prefix(target, 'FIDENT %s' % text)
|
||||||
elif field == 'HOST':
|
elif field == 'HOST':
|
||||||
self.irc.users[target].host = text
|
self.irc.users[target].host = text
|
||||||
self._send(target, 'FHOST %s' % text)
|
self._send_with_prefix(target, 'FHOST %s' % text)
|
||||||
elif field in ('REALNAME', 'GECOS'):
|
elif field in ('REALNAME', 'GECOS'):
|
||||||
self.irc.users[target].realname = text
|
self.irc.users[target].realname = text
|
||||||
self._send(target, 'FNAME :%s' % text)
|
self._send_with_prefix(target, 'FNAME :%s' % text)
|
||||||
else:
|
else:
|
||||||
# It is a client on another server, use CHGIDENT/HOST/NAME.
|
# It is a client on another server, use CHGIDENT/HOST/NAME.
|
||||||
if field == 'IDENT':
|
if field == 'IDENT':
|
||||||
@ -282,7 +282,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
return
|
return
|
||||||
|
|
||||||
self.irc.users[target].ident = text
|
self.irc.users[target].ident = text
|
||||||
self._send(self.irc.sid, 'CHGIDENT %s %s' % (target, text))
|
self._send_with_prefix(self.irc.sid, 'CHGIDENT %s %s' % (target, text))
|
||||||
|
|
||||||
# Send hook payloads for other plugins to listen to.
|
# Send hook payloads for other plugins to listen to.
|
||||||
self.irc.callHooks([self.irc.sid, 'CHGIDENT',
|
self.irc.callHooks([self.irc.sid, 'CHGIDENT',
|
||||||
@ -293,7 +293,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
return
|
return
|
||||||
|
|
||||||
self.irc.users[target].host = text
|
self.irc.users[target].host = text
|
||||||
self._send(self.irc.sid, 'CHGHOST %s %s' % (target, text))
|
self._send_with_prefix(self.irc.sid, 'CHGHOST %s %s' % (target, text))
|
||||||
|
|
||||||
self.irc.callHooks([self.irc.sid, 'CHGHOST',
|
self.irc.callHooks([self.irc.sid, 'CHGHOST',
|
||||||
{'target': target, 'newhost': text}])
|
{'target': target, 'newhost': text}])
|
||||||
@ -303,7 +303,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
log.warning('(%s) Failed to change real name of %s to %r: load m_chgname.so!', self.irc.name, target, text)
|
log.warning('(%s) Failed to change real name of %s to %r: load m_chgname.so!', self.irc.name, target, text)
|
||||||
return
|
return
|
||||||
self.irc.users[target].realname = text
|
self.irc.users[target].realname = text
|
||||||
self._send(self.irc.sid, 'CHGNAME %s :%s' % (target, text))
|
self._send_with_prefix(self.irc.sid, 'CHGNAME %s :%s' % (target, text))
|
||||||
|
|
||||||
self.irc.callHooks([self.irc.sid, 'CHGNAME',
|
self.irc.callHooks([self.irc.sid, 'CHGNAME',
|
||||||
{'target': target, 'newgecos': text}])
|
{'target': target, 'newgecos': text}])
|
||||||
@ -314,7 +314,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
source = source or self.irc.sid
|
source = source or self.irc.sid
|
||||||
target = target or self.irc.uplink
|
target = target or self.irc.uplink
|
||||||
if not (target is None or source is None):
|
if not (target is None or source is None):
|
||||||
self._send(source, 'PING %s %s' % (source, target))
|
self._send_with_prefix(source, 'PING %s %s' % (source, target))
|
||||||
|
|
||||||
def numeric(self, source, numeric, target, text):
|
def numeric(self, source, numeric, target, text):
|
||||||
"""Sends raw numerics from a server to a remote client."""
|
"""Sends raw numerics from a server to a remote client."""
|
||||||
@ -327,15 +327,15 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
# :<sid> NUM <numeric source sid> <target uuid> <3 digit number> <params>
|
# :<sid> NUM <numeric source sid> <target uuid> <3 digit number> <params>
|
||||||
# Take this into consideration if we ever target InspIRCd 2.2, even though m_spanningtree
|
# Take this into consideration if we ever target InspIRCd 2.2, even though m_spanningtree
|
||||||
# does provide backwards compatibility for commands like this. -GLolol
|
# does provide backwards compatibility for commands like this. -GLolol
|
||||||
self._send(self.irc.sid, 'PUSH %s ::%s %s %s %s' % (target, source, numeric, target, text))
|
self._send_with_prefix(self.irc.sid, 'PUSH %s ::%s %s %s %s' % (target, source, numeric, target, text))
|
||||||
|
|
||||||
def away(self, source, text):
|
def away(self, source, text):
|
||||||
"""Sends an AWAY message from a PyLink client. <text> can be an empty string
|
"""Sends an AWAY message from a PyLink client. <text> can be an empty string
|
||||||
to unset AWAY status."""
|
to unset AWAY status."""
|
||||||
if text:
|
if text:
|
||||||
self._send(source, 'AWAY %s :%s' % (int(time.time()), text))
|
self._send_with_prefix(source, 'AWAY %s :%s' % (int(time.time()), text))
|
||||||
else:
|
else:
|
||||||
self._send(source, 'AWAY')
|
self._send_with_prefix(source, 'AWAY')
|
||||||
self.irc.users[source].away = text
|
self.irc.users[source].away = text
|
||||||
|
|
||||||
def spawnServer(self, name, sid=None, uplink=None, desc=None, endburst_delay=0):
|
def spawnServer(self, name, sid=None, uplink=None, desc=None, endburst_delay=0):
|
||||||
@ -367,7 +367,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
raise ValueError('Server %r is not a PyLink server!' % uplink)
|
raise ValueError('Server %r is not a PyLink server!' % uplink)
|
||||||
if not utils.isServerName(name):
|
if not utils.isServerName(name):
|
||||||
raise ValueError('Invalid server name %r' % name)
|
raise ValueError('Invalid server name %r' % name)
|
||||||
self._send(uplink, 'SERVER %s * 1 %s :%s' % (name, sid, desc))
|
self._send_with_prefix(uplink, 'SERVER %s * 1 %s :%s' % (name, sid, desc))
|
||||||
self.irc.servers[sid] = IrcServer(uplink, name, internal=True, desc=desc)
|
self.irc.servers[sid] = IrcServer(uplink, name, internal=True, desc=desc)
|
||||||
|
|
||||||
def endburstf():
|
def endburstf():
|
||||||
@ -376,18 +376,18 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
# We managed to catch the abort flag before sending ENDBURST, so break
|
# We managed to catch the abort flag before sending ENDBURST, so break
|
||||||
log.debug('(%s) stopping endburstf() for %s as aborted was set', self.irc.name, sid)
|
log.debug('(%s) stopping endburstf() for %s as aborted was set', self.irc.name, sid)
|
||||||
return
|
return
|
||||||
self._send(sid, 'ENDBURST')
|
self._send_with_prefix(sid, 'ENDBURST')
|
||||||
|
|
||||||
if endburst_delay:
|
if endburst_delay:
|
||||||
threading.Thread(target=endburstf).start()
|
threading.Thread(target=endburstf).start()
|
||||||
else: # Else, send burst immediately
|
else: # Else, send burst immediately
|
||||||
self._send(sid, 'ENDBURST')
|
self._send_with_prefix(sid, 'ENDBURST')
|
||||||
return sid
|
return sid
|
||||||
|
|
||||||
def squit(self, source, target, text='No reason given'):
|
def squit(self, source, target, text='No reason given'):
|
||||||
"""SQUITs a PyLink server."""
|
"""SQUITs a PyLink server."""
|
||||||
# -> :9PY SQUIT 9PZ :blah, blah
|
# -> :9PY SQUIT 9PZ :blah, blah
|
||||||
self._send(source, 'SQUIT %s :%s' % (target, text))
|
self._send_with_prefix(source, 'SQUIT %s :%s' % (target, text))
|
||||||
self.handle_squit(source, 'SQUIT', [target, text])
|
self.handle_squit(source, 'SQUIT', [target, text])
|
||||||
|
|
||||||
### Core / command handlers
|
### Core / command handlers
|
||||||
@ -409,10 +409,10 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
Pass=self.irc.serverdata["sendpass"], sid=self.irc.sid,
|
Pass=self.irc.serverdata["sendpass"], sid=self.irc.sid,
|
||||||
sdesc=self.irc.serverdata.get('serverdesc') or conf.conf['bot']['serverdesc']))
|
sdesc=self.irc.serverdata.get('serverdesc') or conf.conf['bot']['serverdesc']))
|
||||||
|
|
||||||
self._send(self.irc.sid, 'BURST %s' % ts)
|
self._send_with_prefix(self.irc.sid, 'BURST %s' % ts)
|
||||||
# InspIRCd sends VERSION data on link, instead of whenever requested by a client.
|
# InspIRCd sends VERSION data on link, instead of whenever requested by a client.
|
||||||
self._send(self.irc.sid, 'VERSION :%s' % self.irc.version())
|
self._send_with_prefix(self.irc.sid, 'VERSION :%s' % self.irc.version())
|
||||||
self._send(self.irc.sid, 'ENDBURST')
|
self._send_with_prefix(self.irc.sid, 'ENDBURST')
|
||||||
|
|
||||||
def handle_capab(self, source, command, args):
|
def handle_capab(self, source, command, args):
|
||||||
"""
|
"""
|
||||||
@ -524,7 +524,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
# <- :70M PING 70M 0AL
|
# <- :70M PING 70M 0AL
|
||||||
# -> :0AL PONG 0AL 70M
|
# -> :0AL PONG 0AL 70M
|
||||||
if self.irc.isInternalServer(args[1]):
|
if self.irc.isInternalServer(args[1]):
|
||||||
self._send(args[1], 'PONG %s %s' % (args[1], source), queue=False)
|
self._send_with_prefix(args[1], 'PONG %s %s' % (args[1], source), queue=False)
|
||||||
|
|
||||||
def handle_fjoin(self, servernumeric, command, args):
|
def handle_fjoin(self, servernumeric, command, args):
|
||||||
"""Handles incoming FJOIN commands (InspIRCd equivalent of JOIN/SJOIN)."""
|
"""Handles incoming FJOIN commands (InspIRCd equivalent of JOIN/SJOIN)."""
|
||||||
@ -764,7 +764,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
# The target has to be one of our servers in order to work...
|
# The target has to be one of our servers in order to work...
|
||||||
uplink = self.irc.servers[target].uplink
|
uplink = self.irc.servers[target].uplink
|
||||||
reason = 'Requested by %s' % self.irc.getHostmask(numeric)
|
reason = 'Requested by %s' % self.irc.getHostmask(numeric)
|
||||||
self._send(uplink, 'SQUIT %s :%s' % (target, reason))
|
self._send_with_prefix(uplink, 'SQUIT %s :%s' % (target, reason))
|
||||||
return self.handle_squit(numeric, 'SQUIT', [target, reason])
|
return self.handle_squit(numeric, 'SQUIT', [target, reason])
|
||||||
else:
|
else:
|
||||||
log.debug("(%s) Got RSQUIT for '%s', which is either invalid or not "
|
log.debug("(%s) Got RSQUIT for '%s', which is either invalid or not "
|
||||||
@ -833,6 +833,6 @@ class InspIRCdProtocol(TS6BaseProtocol):
|
|||||||
|
|
||||||
# XXX: We override notice() here because that abstraction doesn't allow messages from servers.
|
# XXX: We override notice() here because that abstraction doesn't allow messages from servers.
|
||||||
timestring = '%s (%s)' % (time.strftime('%Y-%m-%d %H:%M:%S'), int(time.time()))
|
timestring = '%s (%s)' % (time.strftime('%Y-%m-%d %H:%M:%S'), int(time.time()))
|
||||||
self._send(self.irc.sid, 'NOTICE %s :System time is %s on %s' % (source, timestring, self.irc.hostname()))
|
self._send_with_prefix(self.irc.sid, 'NOTICE %s :System time is %s on %s' % (source, timestring, self.irc.hostname()))
|
||||||
|
|
||||||
Class = InspIRCdProtocol
|
Class = InspIRCdProtocol
|
||||||
|
@ -164,7 +164,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
|
|
||||||
self.protocol_caps |= {'slash-in-hosts', 'underscore-in-hosts'}
|
self.protocol_caps |= {'slash-in-hosts', 'underscore-in-hosts'}
|
||||||
|
|
||||||
def _send(self, source, text, **kwargs):
|
def _send_with_prefix(self, source, text, **kwargs):
|
||||||
self.irc.send("%s %s" % (source, text), **kwargs)
|
self.irc.send("%s %s" % (source, text), **kwargs)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -292,7 +292,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
else: # TODO: propagate IPv6 address, but only if uplink supports it
|
else: # TODO: propagate IPv6 address, but only if uplink supports it
|
||||||
b64ip = 'AAAAAA'
|
b64ip = 'AAAAAA'
|
||||||
|
|
||||||
self._send(server, "N {nick} 1 {ts} {ident} {host} {modes} {ip} {uid} "
|
self._send_with_prefix(server, "N {nick} 1 {ts} {ident} {host} {modes} {ip} {uid} "
|
||||||
":{realname}".format(ts=ts, host=host, nick=nick, ident=ident, uid=uid,
|
":{realname}".format(ts=ts, host=host, nick=nick, ident=ident, uid=uid,
|
||||||
modes=raw_modes, ip=b64ip, realname=realname,
|
modes=raw_modes, ip=b64ip, realname=realname,
|
||||||
realhost=realhost))
|
realhost=realhost))
|
||||||
@ -305,9 +305,9 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
raise LookupError('No such PyLink client exists.')
|
raise LookupError('No such PyLink client exists.')
|
||||||
|
|
||||||
if text:
|
if text:
|
||||||
self._send(source, 'A :%s' % text)
|
self._send_with_prefix(source, 'A :%s' % text)
|
||||||
else:
|
else:
|
||||||
self._send(source, 'A')
|
self._send_with_prefix(source, 'A')
|
||||||
self.irc.users[source].away = text
|
self.irc.users[source].away = text
|
||||||
|
|
||||||
def invite(self, numeric, target, channel):
|
def invite(self, numeric, target, channel):
|
||||||
@ -320,7 +320,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
|
|
||||||
nick = self.irc.users[target].nick
|
nick = self.irc.users[target].nick
|
||||||
|
|
||||||
self._send(numeric, 'I %s %s %s' % (nick, channel, self.irc.channels[channel].ts))
|
self._send_with_prefix(numeric, 'I %s %s %s' % (nick, channel, self.irc.channels[channel].ts))
|
||||||
|
|
||||||
def join(self, client, channel):
|
def join(self, client, channel):
|
||||||
"""Joins a PyLink client to a channel."""
|
"""Joins a PyLink client to a channel."""
|
||||||
@ -333,9 +333,9 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
|
|
||||||
if not self.irc.channels[channel].users:
|
if not self.irc.channels[channel].users:
|
||||||
# Empty channels should be created with the CREATE command.
|
# Empty channels should be created with the CREATE command.
|
||||||
self._send(client, "C {channel} {ts}".format(ts=ts, channel=channel))
|
self._send_with_prefix(client, "C {channel} {ts}".format(ts=ts, channel=channel))
|
||||||
else:
|
else:
|
||||||
self._send(client, "J {channel} {ts}".format(ts=ts, channel=channel))
|
self._send_with_prefix(client, "J {channel} {ts}".format(ts=ts, channel=channel))
|
||||||
|
|
||||||
self.irc.channels[channel].users.add(client)
|
self.irc.channels[channel].users.add(client)
|
||||||
self.irc.users[client].channels.add(channel)
|
self.irc.users[client].channels.add(channel)
|
||||||
@ -358,7 +358,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
reason = '(%s) %s' % (self.irc.getFriendlyName(numeric), reason)
|
reason = '(%s) %s' % (self.irc.getFriendlyName(numeric), reason)
|
||||||
numeric = self.irc.getServer(numeric)
|
numeric = self.irc.getServer(numeric)
|
||||||
|
|
||||||
self._send(numeric, 'K %s %s :%s' % (channel, target, reason))
|
self._send_with_prefix(numeric, 'K %s %s :%s' % (channel, target, reason))
|
||||||
|
|
||||||
# We can pretend the target left by its own will; all we really care about
|
# We can pretend the target left by its own will; all we really care about
|
||||||
# is that the target gets removed from the channel userlist, and calling
|
# is that the target gets removed from the channel userlist, and calling
|
||||||
@ -373,7 +373,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
(not self.irc.isInternalServer(numeric)):
|
(not self.irc.isInternalServer(numeric)):
|
||||||
raise LookupError('No such PyLink client/server exists.')
|
raise LookupError('No such PyLink client/server exists.')
|
||||||
|
|
||||||
self._send(numeric, 'D %s :Killed (%s)' % (target, reason))
|
self._send_with_prefix(numeric, 'D %s :Killed (%s)' % (target, reason))
|
||||||
self.removeClient(target)
|
self.removeClient(target)
|
||||||
|
|
||||||
def knock(self, numeric, target, text):
|
def knock(self, numeric, target, text):
|
||||||
@ -384,7 +384,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
if not self.irc.isInternalClient(numeric):
|
if not self.irc.isInternalClient(numeric):
|
||||||
raise LookupError('No such PyLink client exists.')
|
raise LookupError('No such PyLink client exists.')
|
||||||
|
|
||||||
self._send(numeric, 'P %s :%s' % (target, text))
|
self._send_with_prefix(numeric, 'P %s :%s' % (target, text))
|
||||||
|
|
||||||
def mode(self, numeric, target, modes, ts=None):
|
def mode(self, numeric, target, modes, ts=None):
|
||||||
"""Sends mode changes from a PyLink client/server."""
|
"""Sends mode changes from a PyLink client/server."""
|
||||||
@ -428,9 +428,9 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
joinedmodes = self.irc.joinModes([m for m in modes[:12]])
|
joinedmodes = self.irc.joinModes([m for m in modes[:12]])
|
||||||
if is_cmode:
|
if is_cmode:
|
||||||
for wrapped_modes in self.irc.wrapModes(modes[:12], bufsize):
|
for wrapped_modes in self.irc.wrapModes(modes[:12], bufsize):
|
||||||
self._send(numeric, 'M %s %s %s' % (real_target, wrapped_modes, ts))
|
self._send_with_prefix(numeric, 'M %s %s %s' % (real_target, wrapped_modes, ts))
|
||||||
else:
|
else:
|
||||||
self._send(numeric, 'M %s %s' % (real_target, joinedmodes))
|
self._send_with_prefix(numeric, 'M %s %s' % (real_target, joinedmodes))
|
||||||
modes = modes[12:]
|
modes = modes[12:]
|
||||||
|
|
||||||
def nick(self, numeric, newnick):
|
def nick(self, numeric, newnick):
|
||||||
@ -439,7 +439,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
if not self.irc.isInternalClient(numeric):
|
if not self.irc.isInternalClient(numeric):
|
||||||
raise LookupError('No such PyLink client exists.')
|
raise LookupError('No such PyLink client exists.')
|
||||||
|
|
||||||
self._send(numeric, 'N %s %s' % (newnick, int(time.time())))
|
self._send_with_prefix(numeric, 'N %s %s' % (newnick, int(time.time())))
|
||||||
self.irc.users[numeric].nick = newnick
|
self.irc.users[numeric].nick = newnick
|
||||||
|
|
||||||
# Update the NICK TS.
|
# Update the NICK TS.
|
||||||
@ -449,7 +449,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
"""Sends raw numerics from a server to a remote client. This is used for WHOIS
|
"""Sends raw numerics from a server to a remote client. This is used for WHOIS
|
||||||
replies."""
|
replies."""
|
||||||
# <- AB 311 AyAAA GL ~gl nefarious.midnight.vpn * :realname
|
# <- AB 311 AyAAA GL ~gl nefarious.midnight.vpn * :realname
|
||||||
self._send(source, '%s %s %s' % (numeric, target, text))
|
self._send_with_prefix(source, '%s %s %s' % (numeric, target, text))
|
||||||
|
|
||||||
def notice(self, numeric, target, text):
|
def notice(self, numeric, target, text):
|
||||||
"""Sends a NOTICE from a PyLink client or server."""
|
"""Sends a NOTICE from a PyLink client or server."""
|
||||||
@ -457,7 +457,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
(not self.irc.isInternalServer(numeric)):
|
(not self.irc.isInternalServer(numeric)):
|
||||||
raise LookupError('No such PyLink client/server exists.')
|
raise LookupError('No such PyLink client/server exists.')
|
||||||
|
|
||||||
self._send(numeric, 'O %s :%s' % (target, text))
|
self._send_with_prefix(numeric, 'O %s :%s' % (target, text))
|
||||||
|
|
||||||
def part(self, client, channel, reason=None):
|
def part(self, client, channel, reason=None):
|
||||||
"""Sends a part from a PyLink client."""
|
"""Sends a part from a PyLink client."""
|
||||||
@ -469,7 +469,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
msg = "L %s" % channel
|
msg = "L %s" % channel
|
||||||
if reason:
|
if reason:
|
||||||
msg += " :%s" % reason
|
msg += " :%s" % reason
|
||||||
self._send(client, msg)
|
self._send_with_prefix(client, msg)
|
||||||
self.handle_part(client, 'PART', [channel])
|
self.handle_part(client, 'PART', [channel])
|
||||||
|
|
||||||
def ping(self, source=None, target=None):
|
def ping(self, source=None, target=None):
|
||||||
@ -479,14 +479,14 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
if source is None:
|
if source is None:
|
||||||
return
|
return
|
||||||
if target is not None:
|
if target is not None:
|
||||||
self._send(source, 'G %s %s' % (source, target))
|
self._send_with_prefix(source, 'G %s %s' % (source, target))
|
||||||
else:
|
else:
|
||||||
self._send(source, 'G %s' % source)
|
self._send_with_prefix(source, 'G %s' % source)
|
||||||
|
|
||||||
def quit(self, numeric, reason):
|
def quit(self, numeric, reason):
|
||||||
"""Quits a PyLink client."""
|
"""Quits a PyLink client."""
|
||||||
if self.irc.isInternalClient(numeric):
|
if self.irc.isInternalClient(numeric):
|
||||||
self._send(numeric, "Q :%s" % reason)
|
self._send_with_prefix(numeric, "Q :%s" % reason)
|
||||||
self.removeClient(numeric)
|
self.removeClient(numeric)
|
||||||
else:
|
else:
|
||||||
raise LookupError("No such PyLink client exists.")
|
raise LookupError("No such PyLink client exists.")
|
||||||
@ -657,7 +657,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
if not utils.isServerName(name):
|
if not utils.isServerName(name):
|
||||||
raise ValueError('Invalid server name %r' % name)
|
raise ValueError('Invalid server name %r' % name)
|
||||||
|
|
||||||
self._send(uplink, 'SERVER %s 1 %s %s P10 %s]]] +h6 :%s' % \
|
self._send_with_prefix(uplink, 'SERVER %s 1 %s %s P10 %s]]] +h6 :%s' % \
|
||||||
(name, self.irc.start_ts, int(time.time()), sid, desc))
|
(name, self.irc.start_ts, int(time.time()), sid, desc))
|
||||||
|
|
||||||
self.irc.servers[sid] = IrcServer(uplink, name, internal=True, desc=desc)
|
self.irc.servers[sid] = IrcServer(uplink, name, internal=True, desc=desc)
|
||||||
@ -669,7 +669,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
|
|
||||||
targetname = self.irc.servers[target].name
|
targetname = self.irc.servers[target].name
|
||||||
|
|
||||||
self._send(source, 'SQ %s 0 :%s' % (targetname, text))
|
self._send_with_prefix(source, 'SQ %s 0 :%s' % (targetname, text))
|
||||||
self.handle_squit(source, 'SQUIT', [target, text])
|
self.handle_squit(source, 'SQUIT', [target, text])
|
||||||
|
|
||||||
def topic(self, numeric, target, text):
|
def topic(self, numeric, target, text):
|
||||||
@ -684,7 +684,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
|
|
||||||
creationts = self.irc.channels[target].ts
|
creationts = self.irc.channels[target].ts
|
||||||
|
|
||||||
self._send(numeric, 'T %s %s %s %s :%s' % (target, sendername, creationts,
|
self._send_with_prefix(numeric, 'T %s %s %s %s :%s' % (target, sendername, creationts,
|
||||||
int(time.time()), text))
|
int(time.time()), text))
|
||||||
self.irc.channels[target].topic = text
|
self.irc.channels[target].topic = text
|
||||||
self.irc.channels[target].topicset = True
|
self.irc.channels[target].topicset = True
|
||||||
@ -700,7 +700,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
|
|
||||||
creationts = self.irc.channels[target].ts
|
creationts = self.irc.channels[target].ts
|
||||||
|
|
||||||
self._send(numeric, 'T %s %s %s %s :%s' % (target, sendername, creationts,
|
self._send_with_prefix(numeric, 'T %s %s %s %s :%s' % (target, sendername, creationts,
|
||||||
int(time.time()), text))
|
int(time.time()), text))
|
||||||
self.irc.channels[target].topic = text
|
self.irc.channels[target].topic = text
|
||||||
self.irc.channels[target].topicset = True
|
self.irc.channels[target].topicset = True
|
||||||
@ -737,7 +737,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
"only available on nefarious, and we're using p10_ircd=%r" % ircd)
|
"only available on nefarious, and we're using p10_ircd=%r" % ircd)
|
||||||
|
|
||||||
# Use FAKE (FA) for external clients.
|
# Use FAKE (FA) for external clients.
|
||||||
self._send(self.irc.sid, 'FA %s %s' % (target, text))
|
self._send_with_prefix(self.irc.sid, 'FA %s %s' % (target, text))
|
||||||
|
|
||||||
# Save the host change as a user mode (this is what P10 does on bursts),
|
# Save the host change as a user mode (this is what P10 does on bursts),
|
||||||
# so further host checks work.
|
# so further host checks work.
|
||||||
@ -821,7 +821,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
self.irc.cmodes.update(cmodes)
|
self.irc.cmodes.update(cmodes)
|
||||||
|
|
||||||
self.irc.send('SERVER %s 1 %s %s J10 %s]]] +s6 :%s' % (name, ts, ts, sid, desc))
|
self.irc.send('SERVER %s 1 %s %s J10 %s]]] +s6 :%s' % (name, ts, ts, sid, desc))
|
||||||
self._send(sid, "EB")
|
self._send_with_prefix(sid, "EB")
|
||||||
self.irc.connected.set()
|
self.irc.connected.set()
|
||||||
|
|
||||||
def handle_server(self, source, command, args):
|
def handle_server(self, source, command, args):
|
||||||
@ -975,7 +975,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
if self.irc.isInternalServer(sid):
|
if self.irc.isInternalServer(sid):
|
||||||
# Only respond if the target server is ours. No forwarding is needed because
|
# Only respond if the target server is ours. No forwarding is needed because
|
||||||
# no IRCds can ever connect behind us...
|
# no IRCds can ever connect behind us...
|
||||||
self._send(self.irc.sid, 'Z %s %s %s %s' % (target, orig_pingtime, timediff, currtime), queue=False)
|
self._send_with_prefix(self.irc.sid, 'Z %s %s %s %s' % (target, orig_pingtime, timediff, currtime), queue=False)
|
||||||
|
|
||||||
def handle_pass(self, source, command, args):
|
def handle_pass(self, source, command, args):
|
||||||
"""Handles authentication with our uplink."""
|
"""Handles authentication with our uplink."""
|
||||||
@ -1116,7 +1116,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
# Send EOB acknowledgement; this is required by the P10 specification,
|
# Send EOB acknowledgement; this is required by the P10 specification,
|
||||||
# and needed if we want to be able to receive channel messages, etc.
|
# and needed if we want to be able to receive channel messages, etc.
|
||||||
if source == self.irc.uplink:
|
if source == self.irc.uplink:
|
||||||
self._send(self.irc.sid, 'EA')
|
self._send_with_prefix(self.irc.sid, 'EA')
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
def handle_mode(self, source, command, args):
|
def handle_mode(self, source, command, args):
|
||||||
@ -1180,7 +1180,7 @@ class P10Protocol(IRCS2SProtocol):
|
|||||||
|
|
||||||
# Send PART in response to acknowledge the KICK, per
|
# Send PART in response to acknowledge the KICK, per
|
||||||
# https://github.com/evilnet/nefarious2/blob/ed12d64/doc/p10.txt#L611-L616
|
# https://github.com/evilnet/nefarious2/blob/ed12d64/doc/p10.txt#L611-L616
|
||||||
self._send(kicked, 'L %s :%s' % (channel, args[2]))
|
self._send_with_prefix(kicked, 'L %s :%s' % (channel, args[2]))
|
||||||
|
|
||||||
return {'channel': channel, 'target': kicked, 'text': args[2]}
|
return {'channel': channel, 'target': kicked, 'text': args[2]}
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ class TS6Protocol(TS6BaseProtocol):
|
|||||||
self.irc.applyModes(uid, modes)
|
self.irc.applyModes(uid, modes)
|
||||||
self.irc.servers[server].users.add(uid)
|
self.irc.servers[server].users.add(uid)
|
||||||
|
|
||||||
self._send(server, "EUID {nick} 1 {ts} {modes} {ident} {host} {ip} {uid} "
|
self._send_with_prefix(server, "EUID {nick} 1 {ts} {modes} {ident} {host} {ip} {uid} "
|
||||||
"{realhost} * :{realname}".format(ts=ts, host=host,
|
"{realhost} * :{realname}".format(ts=ts, host=host,
|
||||||
nick=nick, ident=ident, uid=uid,
|
nick=nick, ident=ident, uid=uid,
|
||||||
modes=raw_modes, ip=ip, realname=realname,
|
modes=raw_modes, ip=ip, realname=realname,
|
||||||
@ -72,7 +72,7 @@ class TS6Protocol(TS6BaseProtocol):
|
|||||||
if not self.irc.isInternalClient(client):
|
if not self.irc.isInternalClient(client):
|
||||||
log.error('(%s) Error trying to join %r to %r (no such client exists)', self.irc.name, client, channel)
|
log.error('(%s) Error trying to join %r to %r (no such client exists)', self.irc.name, client, channel)
|
||||||
raise LookupError('No such PyLink client exists.')
|
raise LookupError('No such PyLink client exists.')
|
||||||
self._send(client, "JOIN {ts} {channel} +".format(ts=self.irc.channels[channel].ts, channel=channel))
|
self._send_with_prefix(client, "JOIN {ts} {channel} +".format(ts=self.irc.channels[channel].ts, channel=channel))
|
||||||
self.irc.channels[channel].users.add(client)
|
self.irc.channels[channel].users.add(client)
|
||||||
self.irc.users[client].channels.add(channel)
|
self.irc.users[client].channels.add(channel)
|
||||||
|
|
||||||
@ -147,7 +147,7 @@ class TS6Protocol(TS6BaseProtocol):
|
|||||||
log.debug("(%s) sjoin: KeyError trying to add %r to %r's channel list?", self.irc.name, channel, user)
|
log.debug("(%s) sjoin: KeyError trying to add %r to %r's channel list?", self.irc.name, channel, user)
|
||||||
users = users[12:]
|
users = users[12:]
|
||||||
namelist = ' '.join(namelist)
|
namelist = ' '.join(namelist)
|
||||||
self._send(server, "SJOIN {ts} {channel} {modes} :{users}".format(
|
self._send_with_prefix(server, "SJOIN {ts} {channel} {modes} :{users}".format(
|
||||||
ts=ts, users=namelist, channel=channel,
|
ts=ts, users=namelist, channel=channel,
|
||||||
modes=self.irc.joinModes(regularmodes)))
|
modes=self.irc.joinModes(regularmodes)))
|
||||||
self.irc.channels[channel].users.update(uids)
|
self.irc.channels[channel].users.update(uids)
|
||||||
@ -193,7 +193,7 @@ class TS6Protocol(TS6BaseProtocol):
|
|||||||
self.irc.send(msgprefix + modestr)
|
self.irc.send(msgprefix + modestr)
|
||||||
else:
|
else:
|
||||||
joinedmodes = self.irc.joinModes(modes)
|
joinedmodes = self.irc.joinModes(modes)
|
||||||
self._send(numeric, 'MODE %s %s' % (target, joinedmodes))
|
self._send_with_prefix(numeric, 'MODE %s %s' % (target, joinedmodes))
|
||||||
|
|
||||||
def topicBurst(self, numeric, target, text):
|
def topicBurst(self, numeric, target, text):
|
||||||
"""Sends a topic change from a PyLink server. This is usually used on burst."""
|
"""Sends a topic change from a PyLink server. This is usually used on burst."""
|
||||||
@ -206,7 +206,7 @@ class TS6Protocol(TS6BaseProtocol):
|
|||||||
# parameters: channel, topicTS, opt. topic setter, topic
|
# parameters: channel, topicTS, opt. topic setter, topic
|
||||||
ts = self.irc.channels[target].ts
|
ts = self.irc.channels[target].ts
|
||||||
servername = self.irc.servers[numeric].name
|
servername = self.irc.servers[numeric].name
|
||||||
self._send(numeric, 'TB %s %s %s :%s' % (target, ts, servername, text))
|
self._send_with_prefix(numeric, 'TB %s %s %s :%s' % (target, ts, servername, text))
|
||||||
self.irc.channels[target].topic = text
|
self.irc.channels[target].topic = text
|
||||||
self.irc.channels[target].topicset = True
|
self.irc.channels[target].topicset = True
|
||||||
|
|
||||||
@ -214,7 +214,7 @@ class TS6Protocol(TS6BaseProtocol):
|
|||||||
"""Sends an INVITE from a PyLink client.."""
|
"""Sends an INVITE from a PyLink client.."""
|
||||||
if not self.irc.isInternalClient(numeric):
|
if not self.irc.isInternalClient(numeric):
|
||||||
raise LookupError('No such PyLink client exists.')
|
raise LookupError('No such PyLink client exists.')
|
||||||
self._send(numeric, 'INVITE %s %s %s' % (target, channel, self.irc.channels[channel].ts))
|
self._send_with_prefix(numeric, 'INVITE %s %s %s' % (target, channel, self.irc.channels[channel].ts))
|
||||||
|
|
||||||
def knock(self, numeric, target, text):
|
def knock(self, numeric, target, text):
|
||||||
"""Sends a KNOCK from a PyLink client."""
|
"""Sends a KNOCK from a PyLink client."""
|
||||||
@ -225,14 +225,14 @@ class TS6Protocol(TS6BaseProtocol):
|
|||||||
if not self.irc.isInternalClient(numeric):
|
if not self.irc.isInternalClient(numeric):
|
||||||
raise LookupError('No such PyLink client exists.')
|
raise LookupError('No such PyLink client exists.')
|
||||||
# No text value is supported here; drop it.
|
# No text value is supported here; drop it.
|
||||||
self._send(numeric, 'KNOCK %s' % target)
|
self._send_with_prefix(numeric, 'KNOCK %s' % target)
|
||||||
|
|
||||||
def updateClient(self, target, field, text):
|
def updateClient(self, target, field, text):
|
||||||
"""Updates the hostname of any connected client."""
|
"""Updates the hostname of any connected client."""
|
||||||
field = field.upper()
|
field = field.upper()
|
||||||
if field == 'HOST':
|
if field == 'HOST':
|
||||||
self.irc.users[target].host = text
|
self.irc.users[target].host = text
|
||||||
self._send(self.irc.sid, 'CHGHOST %s :%s' % (target, text))
|
self._send_with_prefix(self.irc.sid, 'CHGHOST %s :%s' % (target, text))
|
||||||
if not self.irc.isInternalClient(target):
|
if not self.irc.isInternalClient(target):
|
||||||
# If the target isn't one of our clients, send hook payload
|
# If the target isn't one of our clients, send hook payload
|
||||||
# for other plugins to listen to.
|
# for other plugins to listen to.
|
||||||
@ -249,9 +249,9 @@ class TS6Protocol(TS6BaseProtocol):
|
|||||||
if source is None:
|
if source is None:
|
||||||
return
|
return
|
||||||
if target is not None:
|
if target is not None:
|
||||||
self._send(source, 'PING %s %s' % (source, target))
|
self._send_with_prefix(source, 'PING %s %s' % (source, target))
|
||||||
else:
|
else:
|
||||||
self._send(source, 'PING %s' % source)
|
self._send_with_prefix(source, 'PING %s' % source)
|
||||||
|
|
||||||
### Core / handlers
|
### Core / handlers
|
||||||
|
|
||||||
@ -407,7 +407,7 @@ class TS6Protocol(TS6BaseProtocol):
|
|||||||
except IndexError:
|
except IndexError:
|
||||||
destination = self.irc.sid
|
destination = self.irc.sid
|
||||||
if self.irc.isInternalServer(destination):
|
if self.irc.isInternalServer(destination):
|
||||||
self._send(destination, 'PONG %s %s' % (destination, source), queue=False)
|
self._send_with_prefix(destination, 'PONG %s %s' % (destination, source), queue=False)
|
||||||
|
|
||||||
if destination == self.irc.sid and not self.has_eob:
|
if destination == self.irc.sid and not self.has_eob:
|
||||||
# Charybdis' idea of endburst is just sending a PING. No, really!
|
# Charybdis' idea of endburst is just sending a PING. No, really!
|
||||||
|
@ -109,7 +109,7 @@ class TS6BaseProtocol(IRCS2SProtocol):
|
|||||||
# SID generator for TS6.
|
# SID generator for TS6.
|
||||||
self.sidgen = TS6SIDGenerator(irc)
|
self.sidgen = TS6SIDGenerator(irc)
|
||||||
|
|
||||||
def _send(self, source, msg, **kwargs):
|
def _send_with_prefix(self, source, msg, **kwargs):
|
||||||
"""Sends a TS6-style raw command from a source numeric to the self.irc connection given."""
|
"""Sends a TS6-style raw command from a source numeric to the self.irc connection given."""
|
||||||
self.irc.send(':%s %s' % (source, msg), **kwargs)
|
self.irc.send(':%s %s' % (source, msg), **kwargs)
|
||||||
|
|
||||||
@ -130,7 +130,7 @@ class TS6BaseProtocol(IRCS2SProtocol):
|
|||||||
# Mangle the target for IRCds that require it.
|
# Mangle the target for IRCds that require it.
|
||||||
target = self._expandPUID(target)
|
target = self._expandPUID(target)
|
||||||
|
|
||||||
self._send(source, '%s %s %s' % (numeric, target, text))
|
self._send_with_prefix(source, '%s %s %s' % (numeric, target, text))
|
||||||
|
|
||||||
def kick(self, numeric, channel, target, reason=None):
|
def kick(self, numeric, channel, target, reason=None):
|
||||||
"""Sends kicks from a PyLink client/server."""
|
"""Sends kicks from a PyLink client/server."""
|
||||||
@ -146,7 +146,7 @@ class TS6BaseProtocol(IRCS2SProtocol):
|
|||||||
# Mangle kick targets for IRCds that require it.
|
# Mangle kick targets for IRCds that require it.
|
||||||
real_target = self._expandPUID(target)
|
real_target = self._expandPUID(target)
|
||||||
|
|
||||||
self._send(numeric, 'KICK %s %s :%s' % (channel, real_target, reason))
|
self._send_with_prefix(numeric, 'KICK %s %s :%s' % (channel, real_target, reason))
|
||||||
|
|
||||||
# We can pretend the target left by its own will; all we really care about
|
# We can pretend the target left by its own will; all we really care about
|
||||||
# is that the target gets removed from the channel userlist, and calling
|
# is that the target gets removed from the channel userlist, and calling
|
||||||
@ -183,7 +183,7 @@ class TS6BaseProtocol(IRCS2SProtocol):
|
|||||||
self.irc.name, numeric)
|
self.irc.name, numeric)
|
||||||
killpath = self.irc.servers[self.irc.sid].name
|
killpath = self.irc.servers[self.irc.sid].name
|
||||||
|
|
||||||
self._send(numeric, 'KILL %s :%s (%s)' % (target, killpath, reason))
|
self._send_with_prefix(numeric, 'KILL %s :%s (%s)' % (target, killpath, reason))
|
||||||
self.removeClient(target)
|
self.removeClient(target)
|
||||||
|
|
||||||
def nick(self, numeric, newnick):
|
def nick(self, numeric, newnick):
|
||||||
@ -191,7 +191,7 @@ class TS6BaseProtocol(IRCS2SProtocol):
|
|||||||
if not self.irc.isInternalClient(numeric):
|
if not self.irc.isInternalClient(numeric):
|
||||||
raise LookupError('No such PyLink client exists.')
|
raise LookupError('No such PyLink client exists.')
|
||||||
|
|
||||||
self._send(numeric, 'NICK %s %s' % (newnick, int(time.time())))
|
self._send_with_prefix(numeric, 'NICK %s %s' % (newnick, int(time.time())))
|
||||||
|
|
||||||
self.irc.users[numeric].nick = newnick
|
self.irc.users[numeric].nick = newnick
|
||||||
|
|
||||||
@ -207,13 +207,13 @@ class TS6BaseProtocol(IRCS2SProtocol):
|
|||||||
msg = "PART %s" % channel
|
msg = "PART %s" % channel
|
||||||
if reason:
|
if reason:
|
||||||
msg += " :%s" % reason
|
msg += " :%s" % reason
|
||||||
self._send(client, msg)
|
self._send_with_prefix(client, msg)
|
||||||
self.handle_part(client, 'PART', [channel])
|
self.handle_part(client, 'PART', [channel])
|
||||||
|
|
||||||
def quit(self, numeric, reason):
|
def quit(self, numeric, reason):
|
||||||
"""Quits a PyLink client."""
|
"""Quits a PyLink client."""
|
||||||
if self.irc.isInternalClient(numeric):
|
if self.irc.isInternalClient(numeric):
|
||||||
self._send(numeric, "QUIT :%s" % reason)
|
self._send_with_prefix(numeric, "QUIT :%s" % reason)
|
||||||
self.removeClient(numeric)
|
self.removeClient(numeric)
|
||||||
else:
|
else:
|
||||||
raise LookupError("No such PyLink client exists.")
|
raise LookupError("No such PyLink client exists.")
|
||||||
@ -226,7 +226,7 @@ class TS6BaseProtocol(IRCS2SProtocol):
|
|||||||
# Mangle message targets for IRCds that require it.
|
# Mangle message targets for IRCds that require it.
|
||||||
target = self._expandPUID(target)
|
target = self._expandPUID(target)
|
||||||
|
|
||||||
self._send(numeric, 'PRIVMSG %s :%s' % (target, text))
|
self._send_with_prefix(numeric, 'PRIVMSG %s :%s' % (target, text))
|
||||||
|
|
||||||
def notice(self, numeric, target, text):
|
def notice(self, numeric, target, text):
|
||||||
"""Sends a NOTICE from a PyLink client or server."""
|
"""Sends a NOTICE from a PyLink client or server."""
|
||||||
@ -237,13 +237,13 @@ class TS6BaseProtocol(IRCS2SProtocol):
|
|||||||
# Mangle message targets for IRCds that require it.
|
# Mangle message targets for IRCds that require it.
|
||||||
target = self._expandPUID(target)
|
target = self._expandPUID(target)
|
||||||
|
|
||||||
self._send(numeric, 'NOTICE %s :%s' % (target, text))
|
self._send_with_prefix(numeric, 'NOTICE %s :%s' % (target, text))
|
||||||
|
|
||||||
def topic(self, numeric, target, text):
|
def topic(self, numeric, target, text):
|
||||||
"""Sends a TOPIC change from a PyLink client."""
|
"""Sends a TOPIC change from a PyLink client."""
|
||||||
if not self.irc.isInternalClient(numeric):
|
if not self.irc.isInternalClient(numeric):
|
||||||
raise LookupError('No such PyLink client exists.')
|
raise LookupError('No such PyLink client exists.')
|
||||||
self._send(numeric, 'TOPIC %s :%s' % (target, text))
|
self._send_with_prefix(numeric, 'TOPIC %s :%s' % (target, text))
|
||||||
self.irc.channels[target].topic = text
|
self.irc.channels[target].topic = text
|
||||||
self.irc.channels[target].topicset = True
|
self.irc.channels[target].topicset = True
|
||||||
|
|
||||||
@ -273,7 +273,7 @@ class TS6BaseProtocol(IRCS2SProtocol):
|
|||||||
raise ValueError('Server %r is not a PyLink server!' % uplink)
|
raise ValueError('Server %r is not a PyLink server!' % uplink)
|
||||||
if not utils.isServerName(name):
|
if not utils.isServerName(name):
|
||||||
raise ValueError('Invalid server name %r' % name)
|
raise ValueError('Invalid server name %r' % name)
|
||||||
self._send(uplink, 'SID %s 1 %s :%s' % (name, sid, desc))
|
self._send_with_prefix(uplink, 'SID %s 1 %s :%s' % (name, sid, desc))
|
||||||
self.irc.servers[sid] = IrcServer(uplink, name, internal=True, desc=desc)
|
self.irc.servers[sid] = IrcServer(uplink, name, internal=True, desc=desc)
|
||||||
return sid
|
return sid
|
||||||
|
|
||||||
@ -281,16 +281,16 @@ class TS6BaseProtocol(IRCS2SProtocol):
|
|||||||
"""SQUITs a PyLink server."""
|
"""SQUITs a PyLink server."""
|
||||||
# -> SQUIT 9PZ :blah, blah
|
# -> SQUIT 9PZ :blah, blah
|
||||||
log.debug('source=%s, target=%s', source, target)
|
log.debug('source=%s, target=%s', source, target)
|
||||||
self._send(source, 'SQUIT %s :%s' % (target, text))
|
self._send_with_prefix(source, 'SQUIT %s :%s' % (target, text))
|
||||||
self.handle_squit(source, 'SQUIT', [target, text])
|
self.handle_squit(source, 'SQUIT', [target, text])
|
||||||
|
|
||||||
def away(self, source, text):
|
def away(self, source, text):
|
||||||
"""Sends an AWAY message from a PyLink client. <text> can be an empty string
|
"""Sends an AWAY message from a PyLink client. <text> can be an empty string
|
||||||
to unset AWAY status."""
|
to unset AWAY status."""
|
||||||
if text:
|
if text:
|
||||||
self._send(source, 'AWAY :%s' % text)
|
self._send_with_prefix(source, 'AWAY :%s' % text)
|
||||||
else:
|
else:
|
||||||
self._send(source, 'AWAY')
|
self._send_with_prefix(source, 'AWAY')
|
||||||
self.irc.users[source].away = text
|
self.irc.users[source].away = text
|
||||||
|
|
||||||
### HANDLERS
|
### HANDLERS
|
||||||
|
@ -106,7 +106,7 @@ class UnrealProtocol(TS6BaseProtocol):
|
|||||||
encoded_ip = encoded_ip.strip().decode()
|
encoded_ip = encoded_ip.strip().decode()
|
||||||
|
|
||||||
# <- :001 UID GL 0 1441306929 gl localhost 0018S7901 0 +iowx * midnight-1C620195 fwAAAQ== :realname
|
# <- :001 UID GL 0 1441306929 gl localhost 0018S7901 0 +iowx * midnight-1C620195 fwAAAQ== :realname
|
||||||
self._send(server, "UID {nick} 0 {ts} {ident} {realhost} {uid} 0 {modes} "
|
self._send_with_prefix(server, "UID {nick} 0 {ts} {ident} {realhost} {uid} 0 {modes} "
|
||||||
"{host} * {ip} :{realname}".format(ts=ts, host=host,
|
"{host} * {ip} :{realname}".format(ts=ts, host=host,
|
||||||
nick=nick, ident=ident, uid=uid,
|
nick=nick, ident=ident, uid=uid,
|
||||||
modes=raw_modes, realname=realname,
|
modes=raw_modes, realname=realname,
|
||||||
@ -119,7 +119,7 @@ class UnrealProtocol(TS6BaseProtocol):
|
|||||||
channel = self.irc.toLower(channel)
|
channel = self.irc.toLower(channel)
|
||||||
if not self.irc.isInternalClient(client):
|
if not self.irc.isInternalClient(client):
|
||||||
raise LookupError('No such PyLink client exists.')
|
raise LookupError('No such PyLink client exists.')
|
||||||
self._send(client, "JOIN %s" % channel)
|
self._send_with_prefix(client, "JOIN %s" % channel)
|
||||||
self.irc.channels[channel].users.add(client)
|
self.irc.channels[channel].users.add(client)
|
||||||
self.irc.users[client].channels.add(channel)
|
self.irc.users[client].channels.add(channel)
|
||||||
|
|
||||||
@ -207,7 +207,7 @@ class UnrealProtocol(TS6BaseProtocol):
|
|||||||
source = source or self.irc.sid
|
source = source or self.irc.sid
|
||||||
target = target or self.irc.uplink
|
target = target or self.irc.uplink
|
||||||
if not (target is None or source is None):
|
if not (target is None or source is None):
|
||||||
self._send(source, 'PING %s %s' % (self.irc.servers[source].name, self.irc.servers[target].name))
|
self._send_with_prefix(source, 'PING %s %s' % (self.irc.servers[source].name, self.irc.servers[target].name))
|
||||||
|
|
||||||
def mode(self, numeric, target, modes, ts=None):
|
def mode(self, numeric, target, modes, ts=None):
|
||||||
"""
|
"""
|
||||||
@ -252,7 +252,7 @@ class UnrealProtocol(TS6BaseProtocol):
|
|||||||
|
|
||||||
# Thanks to kevin and Jobe for helping me debug this!
|
# Thanks to kevin and Jobe for helping me debug this!
|
||||||
for modestring in self.irc.wrapModes(modes, bufsize, max_modes_per_msg=12):
|
for modestring in self.irc.wrapModes(modes, bufsize, max_modes_per_msg=12):
|
||||||
self._send(numeric, 'MODE %s %s %s' % (target, modestring, ts))
|
self._send_with_prefix(numeric, 'MODE %s %s %s' % (target, modestring, ts))
|
||||||
else:
|
else:
|
||||||
# For user modes, the only way to set modes (for non-U:Lined servers)
|
# For user modes, the only way to set modes (for non-U:Lined servers)
|
||||||
# is through UMODE2, which sets the modes on the caller.
|
# is through UMODE2, which sets the modes on the caller.
|
||||||
@ -264,13 +264,13 @@ class UnrealProtocol(TS6BaseProtocol):
|
|||||||
# XXX: I don't expect usermode changes to ever get cut off, but length
|
# XXX: I don't expect usermode changes to ever get cut off, but length
|
||||||
# checks could be added just to be safe...
|
# checks could be added just to be safe...
|
||||||
joinedmodes = self.irc.joinModes(modes)
|
joinedmodes = self.irc.joinModes(modes)
|
||||||
self._send(target, 'UMODE2 %s' % joinedmodes)
|
self._send_with_prefix(target, 'UMODE2 %s' % joinedmodes)
|
||||||
|
|
||||||
def topicBurst(self, numeric, target, text):
|
def topicBurst(self, numeric, target, text):
|
||||||
"""Sends a TOPIC change from a PyLink server."""
|
"""Sends a TOPIC change from a PyLink server."""
|
||||||
if not self.irc.isInternalServer(numeric):
|
if not self.irc.isInternalServer(numeric):
|
||||||
raise LookupError('No such PyLink server exists.')
|
raise LookupError('No such PyLink server exists.')
|
||||||
self._send(numeric, 'TOPIC %s :%s' % (target, text))
|
self._send_with_prefix(numeric, 'TOPIC %s :%s' % (target, text))
|
||||||
self.irc.channels[target].topic = text
|
self.irc.channels[target].topic = text
|
||||||
self.irc.channels[target].topicset = True
|
self.irc.channels[target].topicset = True
|
||||||
|
|
||||||
@ -286,18 +286,18 @@ class UnrealProtocol(TS6BaseProtocol):
|
|||||||
# It is one of our clients, use SETIDENT/HOST/NAME.
|
# It is one of our clients, use SETIDENT/HOST/NAME.
|
||||||
if field == 'IDENT':
|
if field == 'IDENT':
|
||||||
self.irc.users[target].ident = text
|
self.irc.users[target].ident = text
|
||||||
self._send(target, 'SETIDENT %s' % text)
|
self._send_with_prefix(target, 'SETIDENT %s' % text)
|
||||||
elif field == 'HOST':
|
elif field == 'HOST':
|
||||||
self.irc.users[target].host = text
|
self.irc.users[target].host = text
|
||||||
self._send(target, 'SETHOST %s' % text)
|
self._send_with_prefix(target, 'SETHOST %s' % text)
|
||||||
elif field in ('REALNAME', 'GECOS'):
|
elif field in ('REALNAME', 'GECOS'):
|
||||||
self.irc.users[target].realname = text
|
self.irc.users[target].realname = text
|
||||||
self._send(target, 'SETNAME :%s' % text)
|
self._send_with_prefix(target, 'SETNAME :%s' % text)
|
||||||
else:
|
else:
|
||||||
# It is a client on another server, use CHGIDENT/HOST/NAME.
|
# It is a client on another server, use CHGIDENT/HOST/NAME.
|
||||||
if field == 'IDENT':
|
if field == 'IDENT':
|
||||||
self.irc.users[target].ident = text
|
self.irc.users[target].ident = text
|
||||||
self._send(self.irc.sid, 'CHGIDENT %s %s' % (target, text))
|
self._send_with_prefix(self.irc.sid, 'CHGIDENT %s %s' % (target, text))
|
||||||
|
|
||||||
# Send hook payloads for other plugins to listen to.
|
# Send hook payloads for other plugins to listen to.
|
||||||
self.irc.callHooks([self.irc.sid, 'CHGIDENT',
|
self.irc.callHooks([self.irc.sid, 'CHGIDENT',
|
||||||
@ -305,14 +305,14 @@ class UnrealProtocol(TS6BaseProtocol):
|
|||||||
|
|
||||||
elif field == 'HOST':
|
elif field == 'HOST':
|
||||||
self.irc.users[target].host = text
|
self.irc.users[target].host = text
|
||||||
self._send(self.irc.sid, 'CHGHOST %s %s' % (target, text))
|
self._send_with_prefix(self.irc.sid, 'CHGHOST %s %s' % (target, text))
|
||||||
|
|
||||||
self.irc.callHooks([self.irc.sid, 'CHGHOST',
|
self.irc.callHooks([self.irc.sid, 'CHGHOST',
|
||||||
{'target': target, 'newhost': text}])
|
{'target': target, 'newhost': text}])
|
||||||
|
|
||||||
elif field in ('REALNAME', 'GECOS'):
|
elif field in ('REALNAME', 'GECOS'):
|
||||||
self.irc.users[target].realname = text
|
self.irc.users[target].realname = text
|
||||||
self._send(self.irc.sid, 'CHGNAME %s :%s' % (target, text))
|
self._send_with_prefix(self.irc.sid, 'CHGNAME %s :%s' % (target, text))
|
||||||
|
|
||||||
self.irc.callHooks([self.irc.sid, 'CHGNAME',
|
self.irc.callHooks([self.irc.sid, 'CHGNAME',
|
||||||
{'target': target, 'newgecos': text}])
|
{'target': target, 'newgecos': text}])
|
||||||
@ -321,7 +321,7 @@ class UnrealProtocol(TS6BaseProtocol):
|
|||||||
"""Sends an INVITE from a PyLink client.."""
|
"""Sends an INVITE from a PyLink client.."""
|
||||||
if not self.irc.isInternalClient(numeric):
|
if not self.irc.isInternalClient(numeric):
|
||||||
raise LookupError('No such PyLink client exists.')
|
raise LookupError('No such PyLink client exists.')
|
||||||
self._send(numeric, 'INVITE %s %s' % (target, channel))
|
self._send_with_prefix(numeric, 'INVITE %s %s' % (target, channel))
|
||||||
|
|
||||||
def knock(self, numeric, target, text):
|
def knock(self, numeric, target, text):
|
||||||
"""Sends a KNOCK from a PyLink client."""
|
"""Sends a KNOCK from a PyLink client."""
|
||||||
@ -331,7 +331,7 @@ class UnrealProtocol(TS6BaseProtocol):
|
|||||||
assert utils.isChannel(target), "Can only knock on channels!"
|
assert utils.isChannel(target), "Can only knock on channels!"
|
||||||
sender = self.irc.getServer(numeric)
|
sender = self.irc.getServer(numeric)
|
||||||
s = '[Knock] by %s (%s)' % (self.irc.getHostmask(numeric), text)
|
s = '[Knock] by %s (%s)' % (self.irc.getHostmask(numeric), text)
|
||||||
self._send(sender, 'NOTICE @%s :%s' % (target, s))
|
self._send_with_prefix(sender, 'NOTICE @%s :%s' % (target, s))
|
||||||
|
|
||||||
### HANDLERS
|
### HANDLERS
|
||||||
|
|
||||||
@ -378,7 +378,7 @@ class UnrealProtocol(TS6BaseProtocol):
|
|||||||
sdesc = self.irc.serverdata.get('serverdesc') or conf.conf['bot']['serverdesc']
|
sdesc = self.irc.serverdata.get('serverdesc') or conf.conf['bot']['serverdesc']
|
||||||
f('SERVER %s 1 U%s-h6e-%s :%s' % (host, self.proto_ver, self.irc.sid, sdesc))
|
f('SERVER %s 1 U%s-h6e-%s :%s' % (host, self.proto_ver, self.irc.sid, sdesc))
|
||||||
f('NETINFO 1 %s %s * 0 0 0 :%s' % (self.irc.start_ts, self.proto_ver, self.irc.serverdata.get("netname", self.irc.name)))
|
f('NETINFO 1 %s %s * 0 0 0 :%s' % (self.irc.start_ts, self.proto_ver, self.irc.serverdata.get("netname", self.irc.name)))
|
||||||
self._send(self.irc.sid, 'EOS')
|
self._send_with_prefix(self.irc.sid, 'EOS')
|
||||||
|
|
||||||
def handle_eos(self, numeric, command, args):
|
def handle_eos(self, numeric, command, args):
|
||||||
"""EOS is used to denote end of burst."""
|
"""EOS is used to denote end of burst."""
|
||||||
@ -958,6 +958,6 @@ class UnrealProtocol(TS6BaseProtocol):
|
|||||||
|
|
||||||
if args[0] == 'alltime':
|
if args[0] == 'alltime':
|
||||||
# XXX: We override notice() here because that abstraction doesn't allow messages from servers.
|
# XXX: We override notice() here because that abstraction doesn't allow messages from servers.
|
||||||
self._send(self.irc.sid, 'NOTICE %s :*** Server=%s time()=%d' % (source, self.irc.hostname(), time.time()))
|
self._send_with_prefix(self.irc.sid, 'NOTICE %s :*** Server=%s time()=%d' % (source, self.irc.hostname(), time.time()))
|
||||||
|
|
||||||
Class = UnrealProtocol
|
Class = UnrealProtocol
|
||||||
|
Loading…
Reference in New Issue
Block a user