From 8acf39cad693bb82141601cdabda338334f93f9c Mon Sep 17 00:00:00 2001 From: James Lu Date: Sat, 24 Jun 2017 23:40:41 -0700 Subject: [PATCH] protocols: rename _send to _send_with_prefix to avoid clashing with process_queue --- protocols/hybrid.py | 6 ++-- protocols/inspircd.py | 64 ++++++++++++++++++++--------------------- protocols/p10.py | 56 ++++++++++++++++++------------------ protocols/ts6.py | 22 +++++++------- protocols/ts6_common.py | 28 +++++++++--------- protocols/unreal.py | 32 ++++++++++----------- 6 files changed, 104 insertions(+), 104 deletions(-) diff --git a/protocols/hybrid.py b/protocols/hybrid.py index e22e85e..8fdae6a 100644 --- a/protocols/hybrid.py +++ b/protocols/hybrid.py @@ -109,7 +109,7 @@ class HybridProtocol(TS6Protocol): realhost=realhost, ip=ip, manipulatable=manipulatable) self.irc.applyModes(uid, modes) 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, nick=nick, ident=ident, uid=uid, modes=raw_modes, ip=ip, realname=realname)) @@ -131,7 +131,7 @@ class HybridProtocol(TS6Protocol): self.irc.users[target].host = text # On Hybrid, it appears that host changing is actually just forcing umode # "+x " 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: 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 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].topicset = True diff --git a/protocols/inspircd.py b/protocols/inspircd.py index d982a8f..83ce4e6 100644 --- a/protocols/inspircd.py +++ b/protocols/inspircd.py @@ -59,7 +59,7 @@ class InspIRCdProtocol(TS6BaseProtocol): self.irc.applyModes(uid, modes) 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, nick=nick, ident=ident, uid=uid, 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. 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, modes=self.irc.joinModes(modes))) 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) 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, modes=self.irc.joinModes(modes))) self.irc.channels[channel].users.update(uids) @@ -150,7 +150,7 @@ class InspIRCdProtocol(TS6BaseProtocol): if banmodes: # Burst ban modes if there are any. # <- :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))) self.updateTS(server, channel, ts, changedmodes) @@ -187,7 +187,7 @@ class InspIRCdProtocol(TS6BaseProtocol): else: otype = ':' + otype - self._send(target, 'OPERTYPE %s' % otype) + self._send_with_prefix(target, 'OPERTYPE %s' % otype) def mode(self, numeric, target, modes, ts=None): """Sends mode changes from a PyLink client/server.""" @@ -198,7 +198,7 @@ class InspIRCdProtocol(TS6BaseProtocol): (not self.irc.isInternalServer(numeric)): 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): # 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. @@ -207,9 +207,9 @@ class InspIRCdProtocol(TS6BaseProtocol): joinedmodes = self.irc.joinModes(modes) if utils.isChannel(target): 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: - self._send(numeric, 'MODE %s %s' % (target, joinedmodes)) + self._send_with_prefix(numeric, 'MODE %s %s' % (target, joinedmodes)) def kill(self, numeric, target, reason): """Sends a kill from a PyLink client/server.""" @@ -225,7 +225,7 @@ class InspIRCdProtocol(TS6BaseProtocol): else: 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 # clients, since any remote servers will send a QUIT from @@ -239,7 +239,7 @@ class InspIRCdProtocol(TS6BaseProtocol): raise LookupError('No such PyLink server exists.') ts = int(time.time()) 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].topicset = True @@ -247,13 +247,13 @@ class InspIRCdProtocol(TS6BaseProtocol): """Sends an INVITE from a PyLink client..""" if not self.irc.isInternalClient(numeric): 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): """Sends a KNOCK from a PyLink client.""" if not self.irc.isInternalClient(numeric): 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): """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. if field == 'IDENT': self.irc.users[target].ident = text - self._send(target, 'FIDENT %s' % text) + self._send_with_prefix(target, 'FIDENT %s' % text) elif field == 'HOST': 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'): self.irc.users[target].realname = text - self._send(target, 'FNAME :%s' % text) + self._send_with_prefix(target, 'FNAME :%s' % text) else: # It is a client on another server, use CHGIDENT/HOST/NAME. if field == 'IDENT': @@ -282,7 +282,7 @@ class InspIRCdProtocol(TS6BaseProtocol): return 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. self.irc.callHooks([self.irc.sid, 'CHGIDENT', @@ -293,7 +293,7 @@ class InspIRCdProtocol(TS6BaseProtocol): return 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', {'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) return 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', {'target': target, 'newgecos': text}]) @@ -314,7 +314,7 @@ class InspIRCdProtocol(TS6BaseProtocol): source = source or self.irc.sid target = target or self.irc.uplink 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): """Sends raw numerics from a server to a remote client.""" @@ -327,15 +327,15 @@ class InspIRCdProtocol(TS6BaseProtocol): # : NUM <3 digit number> # Take this into consideration if we ever target InspIRCd 2.2, even though m_spanningtree # 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): """Sends an AWAY message from a PyLink client. can be an empty string to unset AWAY status.""" 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: - self._send(source, 'AWAY') + self._send_with_prefix(source, 'AWAY') self.irc.users[source].away = text 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) if not utils.isServerName(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) def endburstf(): @@ -376,18 +376,18 @@ class InspIRCdProtocol(TS6BaseProtocol): # 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) return - self._send(sid, 'ENDBURST') + self._send_with_prefix(sid, 'ENDBURST') if endburst_delay: threading.Thread(target=endburstf).start() else: # Else, send burst immediately - self._send(sid, 'ENDBURST') + self._send_with_prefix(sid, 'ENDBURST') return sid def squit(self, source, target, text='No reason given'): """SQUITs a PyLink server.""" # -> :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]) ### Core / command handlers @@ -409,10 +409,10 @@ class InspIRCdProtocol(TS6BaseProtocol): Pass=self.irc.serverdata["sendpass"], sid=self.irc.sid, 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. - self._send(self.irc.sid, 'VERSION :%s' % self.irc.version()) - self._send(self.irc.sid, 'ENDBURST') + self._send_with_prefix(self.irc.sid, 'VERSION :%s' % self.irc.version()) + self._send_with_prefix(self.irc.sid, 'ENDBURST') def handle_capab(self, source, command, args): """ @@ -524,7 +524,7 @@ class InspIRCdProtocol(TS6BaseProtocol): # <- :70M PING 70M 0AL # -> :0AL PONG 0AL 70M 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): """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... uplink = self.irc.servers[target].uplink 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]) else: 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. 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 diff --git a/protocols/p10.py b/protocols/p10.py index 34ebe80..e7f1ba1 100644 --- a/protocols/p10.py +++ b/protocols/p10.py @@ -164,7 +164,7 @@ class P10Protocol(IRCS2SProtocol): 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) @staticmethod @@ -292,7 +292,7 @@ class P10Protocol(IRCS2SProtocol): else: # TODO: propagate IPv6 address, but only if uplink supports it 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, modes=raw_modes, ip=b64ip, realname=realname, realhost=realhost)) @@ -305,9 +305,9 @@ class P10Protocol(IRCS2SProtocol): raise LookupError('No such PyLink client exists.') if text: - self._send(source, 'A :%s' % text) + self._send_with_prefix(source, 'A :%s' % text) else: - self._send(source, 'A') + self._send_with_prefix(source, 'A') self.irc.users[source].away = text def invite(self, numeric, target, channel): @@ -320,7 +320,7 @@ class P10Protocol(IRCS2SProtocol): 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): """Joins a PyLink client to a channel.""" @@ -333,9 +333,9 @@ class P10Protocol(IRCS2SProtocol): if not self.irc.channels[channel].users: # 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: - 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.users[client].channels.add(channel) @@ -358,7 +358,7 @@ class P10Protocol(IRCS2SProtocol): reason = '(%s) %s' % (self.irc.getFriendlyName(numeric), reason) 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 # is that the target gets removed from the channel userlist, and calling @@ -373,7 +373,7 @@ class P10Protocol(IRCS2SProtocol): (not self.irc.isInternalServer(numeric)): 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) def knock(self, numeric, target, text): @@ -384,7 +384,7 @@ class P10Protocol(IRCS2SProtocol): if not self.irc.isInternalClient(numeric): 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): """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]]) if is_cmode: 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: - self._send(numeric, 'M %s %s' % (real_target, joinedmodes)) + self._send_with_prefix(numeric, 'M %s %s' % (real_target, joinedmodes)) modes = modes[12:] def nick(self, numeric, newnick): @@ -439,7 +439,7 @@ class P10Protocol(IRCS2SProtocol): if not self.irc.isInternalClient(numeric): 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 # 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 replies.""" # <- 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): """Sends a NOTICE from a PyLink client or server.""" @@ -457,7 +457,7 @@ class P10Protocol(IRCS2SProtocol): (not self.irc.isInternalServer(numeric)): 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): """Sends a part from a PyLink client.""" @@ -469,7 +469,7 @@ class P10Protocol(IRCS2SProtocol): msg = "L %s" % channel if reason: msg += " :%s" % reason - self._send(client, msg) + self._send_with_prefix(client, msg) self.handle_part(client, 'PART', [channel]) def ping(self, source=None, target=None): @@ -479,14 +479,14 @@ class P10Protocol(IRCS2SProtocol): if source is None: return if target is not None: - self._send(source, 'G %s %s' % (source, target)) + self._send_with_prefix(source, 'G %s %s' % (source, target)) else: - self._send(source, 'G %s' % source) + self._send_with_prefix(source, 'G %s' % source) def quit(self, numeric, reason): """Quits a PyLink client.""" if self.irc.isInternalClient(numeric): - self._send(numeric, "Q :%s" % reason) + self._send_with_prefix(numeric, "Q :%s" % reason) self.removeClient(numeric) else: raise LookupError("No such PyLink client exists.") @@ -657,7 +657,7 @@ class P10Protocol(IRCS2SProtocol): if not utils.isServerName(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)) self.irc.servers[sid] = IrcServer(uplink, name, internal=True, desc=desc) @@ -669,7 +669,7 @@ class P10Protocol(IRCS2SProtocol): 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]) def topic(self, numeric, target, text): @@ -684,7 +684,7 @@ class P10Protocol(IRCS2SProtocol): 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)) self.irc.channels[target].topic = text self.irc.channels[target].topicset = True @@ -700,7 +700,7 @@ class P10Protocol(IRCS2SProtocol): 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)) self.irc.channels[target].topic = text 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) # 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), # so further host checks work. @@ -821,7 +821,7 @@ class P10Protocol(IRCS2SProtocol): self.irc.cmodes.update(cmodes) 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() def handle_server(self, source, command, args): @@ -975,7 +975,7 @@ class P10Protocol(IRCS2SProtocol): if self.irc.isInternalServer(sid): # Only respond if the target server is ours. No forwarding is needed because # 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): """Handles authentication with our uplink.""" @@ -1116,7 +1116,7 @@ class P10Protocol(IRCS2SProtocol): # Send EOB acknowledgement; this is required by the P10 specification, # and needed if we want to be able to receive channel messages, etc. if source == self.irc.uplink: - self._send(self.irc.sid, 'EA') + self._send_with_prefix(self.irc.sid, 'EA') return {} def handle_mode(self, source, command, args): @@ -1180,7 +1180,7 @@ class P10Protocol(IRCS2SProtocol): # Send PART in response to acknowledge the KICK, per # 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]} diff --git a/protocols/ts6.py b/protocols/ts6.py index e637776..c498ee5 100644 --- a/protocols/ts6.py +++ b/protocols/ts6.py @@ -56,7 +56,7 @@ class TS6Protocol(TS6BaseProtocol): self.irc.applyModes(uid, modes) 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, nick=nick, ident=ident, uid=uid, modes=raw_modes, ip=ip, realname=realname, @@ -72,7 +72,7 @@ class TS6Protocol(TS6BaseProtocol): 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) 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.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) users = users[12:] 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, modes=self.irc.joinModes(regularmodes))) self.irc.channels[channel].users.update(uids) @@ -193,7 +193,7 @@ class TS6Protocol(TS6BaseProtocol): self.irc.send(msgprefix + modestr) else: 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): """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 ts = self.irc.channels[target].ts 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].topicset = True @@ -214,7 +214,7 @@ class TS6Protocol(TS6BaseProtocol): """Sends an INVITE from a PyLink client..""" if not self.irc.isInternalClient(numeric): 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): """Sends a KNOCK from a PyLink client.""" @@ -225,14 +225,14 @@ class TS6Protocol(TS6BaseProtocol): if not self.irc.isInternalClient(numeric): raise LookupError('No such PyLink client exists.') # 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): """Updates the hostname of any connected client.""" field = field.upper() if field == 'HOST': 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 the target isn't one of our clients, send hook payload # for other plugins to listen to. @@ -249,9 +249,9 @@ class TS6Protocol(TS6BaseProtocol): if source is None: return if target is not None: - self._send(source, 'PING %s %s' % (source, target)) + self._send_with_prefix(source, 'PING %s %s' % (source, target)) else: - self._send(source, 'PING %s' % source) + self._send_with_prefix(source, 'PING %s' % source) ### Core / handlers @@ -407,7 +407,7 @@ class TS6Protocol(TS6BaseProtocol): except IndexError: destination = self.irc.sid 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: # Charybdis' idea of endburst is just sending a PING. No, really! diff --git a/protocols/ts6_common.py b/protocols/ts6_common.py index c4edd06..a002fb6 100644 --- a/protocols/ts6_common.py +++ b/protocols/ts6_common.py @@ -109,7 +109,7 @@ class TS6BaseProtocol(IRCS2SProtocol): # SID generator for TS6. 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.""" self.irc.send(':%s %s' % (source, msg), **kwargs) @@ -130,7 +130,7 @@ class TS6BaseProtocol(IRCS2SProtocol): # Mangle the target for IRCds that require it. 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): """Sends kicks from a PyLink client/server.""" @@ -146,7 +146,7 @@ class TS6BaseProtocol(IRCS2SProtocol): # Mangle kick targets for IRCds that require it. 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 # is that the target gets removed from the channel userlist, and calling @@ -183,7 +183,7 @@ class TS6BaseProtocol(IRCS2SProtocol): self.irc.name, numeric) 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) def nick(self, numeric, newnick): @@ -191,7 +191,7 @@ class TS6BaseProtocol(IRCS2SProtocol): if not self.irc.isInternalClient(numeric): 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 @@ -207,13 +207,13 @@ class TS6BaseProtocol(IRCS2SProtocol): msg = "PART %s" % channel if reason: msg += " :%s" % reason - self._send(client, msg) + self._send_with_prefix(client, msg) self.handle_part(client, 'PART', [channel]) def quit(self, numeric, reason): """Quits a PyLink client.""" if self.irc.isInternalClient(numeric): - self._send(numeric, "QUIT :%s" % reason) + self._send_with_prefix(numeric, "QUIT :%s" % reason) self.removeClient(numeric) else: raise LookupError("No such PyLink client exists.") @@ -226,7 +226,7 @@ class TS6BaseProtocol(IRCS2SProtocol): # Mangle message targets for IRCds that require it. 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): """Sends a NOTICE from a PyLink client or server.""" @@ -237,13 +237,13 @@ class TS6BaseProtocol(IRCS2SProtocol): # Mangle message targets for IRCds that require it. 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): """Sends a TOPIC change from a PyLink client.""" if not self.irc.isInternalClient(numeric): 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].topicset = True @@ -273,7 +273,7 @@ class TS6BaseProtocol(IRCS2SProtocol): raise ValueError('Server %r is not a PyLink server!' % 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._send_with_prefix(uplink, 'SID %s 1 %s :%s' % (name, sid, desc)) self.irc.servers[sid] = IrcServer(uplink, name, internal=True, desc=desc) return sid @@ -281,16 +281,16 @@ class TS6BaseProtocol(IRCS2SProtocol): """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._send_with_prefix(source, 'SQUIT %s :%s' % (target, text)) self.handle_squit(source, 'SQUIT', [target, text]) def away(self, source, text): """Sends an AWAY message from a PyLink client. can be an empty string to unset AWAY status.""" if text: - self._send(source, 'AWAY :%s' % text) + self._send_with_prefix(source, 'AWAY :%s' % text) else: - self._send(source, 'AWAY') + self._send_with_prefix(source, 'AWAY') self.irc.users[source].away = text ### HANDLERS diff --git a/protocols/unreal.py b/protocols/unreal.py index 12325ac..fece249 100644 --- a/protocols/unreal.py +++ b/protocols/unreal.py @@ -106,7 +106,7 @@ class UnrealProtocol(TS6BaseProtocol): encoded_ip = encoded_ip.strip().decode() # <- :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, nick=nick, ident=ident, uid=uid, modes=raw_modes, realname=realname, @@ -119,7 +119,7 @@ class UnrealProtocol(TS6BaseProtocol): channel = self.irc.toLower(channel) if not self.irc.isInternalClient(client): 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.users[client].channels.add(channel) @@ -207,7 +207,7 @@ class UnrealProtocol(TS6BaseProtocol): source = source or self.irc.sid target = target or self.irc.uplink 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): """ @@ -252,7 +252,7 @@ class UnrealProtocol(TS6BaseProtocol): # Thanks to kevin and Jobe for helping me debug this! 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: # For user modes, the only way to set modes (for non-U:Lined servers) # 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 # checks could be added just to be safe... 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): """Sends a TOPIC change from a PyLink server.""" if not self.irc.isInternalServer(numeric): 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].topicset = True @@ -286,18 +286,18 @@ class UnrealProtocol(TS6BaseProtocol): # It is one of our clients, use SETIDENT/HOST/NAME. if field == 'IDENT': self.irc.users[target].ident = text - self._send(target, 'SETIDENT %s' % text) + self._send_with_prefix(target, 'SETIDENT %s' % text) elif field == 'HOST': 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'): self.irc.users[target].realname = text - self._send(target, 'SETNAME :%s' % text) + self._send_with_prefix(target, 'SETNAME :%s' % text) else: # It is a client on another server, use CHGIDENT/HOST/NAME. if field == 'IDENT': 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. self.irc.callHooks([self.irc.sid, 'CHGIDENT', @@ -305,14 +305,14 @@ class UnrealProtocol(TS6BaseProtocol): elif field == 'HOST': 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', {'target': target, 'newhost': text}]) elif field in ('REALNAME', 'GECOS'): 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', {'target': target, 'newgecos': text}]) @@ -321,7 +321,7 @@ class UnrealProtocol(TS6BaseProtocol): """Sends an INVITE from a PyLink client..""" if not self.irc.isInternalClient(numeric): 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): """Sends a KNOCK from a PyLink client.""" @@ -331,7 +331,7 @@ class UnrealProtocol(TS6BaseProtocol): assert utils.isChannel(target), "Can only knock on channels!" sender = self.irc.getServer(numeric) 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 @@ -378,7 +378,7 @@ class UnrealProtocol(TS6BaseProtocol): 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('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): """EOS is used to denote end of burst.""" @@ -958,6 +958,6 @@ class UnrealProtocol(TS6BaseProtocol): if args[0] == 'alltime': # 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