mirror of
https://github.com/Mikaela/Limnoria.git
synced 2024-11-27 05:09:23 +01:00
Moved the connect and disconnect commands to the Owner plugin from the Relay plugin.
This commit is contained in:
parent
53b90674e4
commit
c0386751cf
102
plugins/Relay.py
102
plugins/Relay.py
@ -94,9 +94,6 @@ conf.registerChannelValue(conf.supybot.plugins.Relay, 'detectOtherRelayBots',
|
|||||||
conf.registerGlobalValue(conf.supybot.plugins.Relay, 'channels',
|
conf.registerGlobalValue(conf.supybot.plugins.Relay, 'channels',
|
||||||
conf.SpaceSeparatedSetOfChannels([], """Determines which channels the bot
|
conf.SpaceSeparatedSetOfChannels([], """Determines which channels the bot
|
||||||
will relay in."""))
|
will relay in."""))
|
||||||
conf.registerGlobalValue(conf.supybot.plugins.Relay, 'networks',
|
|
||||||
Networks('', """Determines what networks the bot will join in order to relay
|
|
||||||
between."""))
|
|
||||||
|
|
||||||
class Relay(callbacks.Privmsg):
|
class Relay(callbacks.Privmsg):
|
||||||
noIgnore = True
|
noIgnore = True
|
||||||
@ -104,7 +101,6 @@ class Relay(callbacks.Privmsg):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
callbacks.Privmsg.__init__(self)
|
callbacks.Privmsg.__init__(self)
|
||||||
self._whois = {}
|
self._whois = {}
|
||||||
self.ircs = []
|
|
||||||
self.relayedMsgs = {}
|
self.relayedMsgs = {}
|
||||||
self.lastmsg = {}
|
self.lastmsg = {}
|
||||||
self.ircstates = {}
|
self.ircstates = {}
|
||||||
@ -113,7 +109,7 @@ class Relay(callbacks.Privmsg):
|
|||||||
def __call__(self, irc, msg):
|
def __call__(self, irc, msg):
|
||||||
try:
|
try:
|
||||||
irc = self._getRealIrc(irc)
|
irc = self._getRealIrc(irc)
|
||||||
if irc not in self.ircs:
|
if irc not in self.ircstates:
|
||||||
self._addIrc(irc)
|
self._addIrc(irc)
|
||||||
self.ircstates[irc].addMsg(irc, self.lastmsg[irc])
|
self.ircstates[irc].addMsg(irc, self.lastmsg[irc])
|
||||||
finally:
|
finally:
|
||||||
@ -121,21 +117,12 @@ class Relay(callbacks.Privmsg):
|
|||||||
callbacks.Privmsg.__call__(self, irc, msg)
|
callbacks.Privmsg.__call__(self, irc, msg)
|
||||||
|
|
||||||
def do376(self, irc, msg):
|
def do376(self, irc, msg):
|
||||||
if not self.ircs:
|
|
||||||
name = self._getIrcName(irc)
|
|
||||||
self.log.info('Registering initial Irc as %s.', name)
|
|
||||||
self._connect(name, irc, serverPort=None, makeNew=False)
|
|
||||||
L = []
|
L = []
|
||||||
for channel in self.registryValue('channels'):
|
for channel in self.registryValue('channels'):
|
||||||
if channel not in irc.state.channels:
|
if channel not in irc.state.channels:
|
||||||
L.append(channel)
|
L.append(channel)
|
||||||
if L:
|
if L:
|
||||||
irc.queueMsg(ircmsgs.joins(L))
|
irc.queueMsg(ircmsgs.joins(L))
|
||||||
for network in self.registryValue('networks'):
|
|
||||||
ircNames = map(self._getIrcName, self.ircs)
|
|
||||||
if network not in ircNames:
|
|
||||||
self.log.info('Starting relay connection to %s.', network)
|
|
||||||
self._connect(network, irc)
|
|
||||||
do377 = do422 = do376
|
do377 = do422 = do376
|
||||||
|
|
||||||
def _getRealIrc(self, irc):
|
def _getRealIrc(self, irc):
|
||||||
@ -145,7 +132,7 @@ class Relay(callbacks.Privmsg):
|
|||||||
return irc.getRealIrc()
|
return irc.getRealIrc()
|
||||||
|
|
||||||
def _getIrc(self, name):
|
def _getIrc(self, name):
|
||||||
for irc in self.ircs:
|
for irc in world.ircs:
|
||||||
if self._getIrcName(irc) == name:
|
if self._getIrcName(irc) == name:
|
||||||
return irc
|
return irc
|
||||||
raise KeyError, name
|
raise KeyError, name
|
||||||
@ -154,71 +141,13 @@ class Relay(callbacks.Privmsg):
|
|||||||
# We should allow abbreviations at some point.
|
# We should allow abbreviations at some point.
|
||||||
return irc.network
|
return irc.network
|
||||||
|
|
||||||
def connect(self, irc, msg, args):
|
|
||||||
"""<network> [<host:port>] (port defaults to 6667)
|
|
||||||
|
|
||||||
Connects to another network at <host:port>. The network name is used
|
|
||||||
when relaying messages from that network to other networks.
|
|
||||||
"""
|
|
||||||
realIrc = self._getRealIrc(irc)
|
|
||||||
(network, server) = privmsgs.getArgs(args, optional=1)
|
|
||||||
if server:
|
|
||||||
if ':' in server:
|
|
||||||
(server, port) = server.split(':')
|
|
||||||
port = int(port)
|
|
||||||
else:
|
|
||||||
port = 6667
|
|
||||||
serverPort = (server, port)
|
|
||||||
else:
|
|
||||||
serverPort = None
|
|
||||||
self._connect(network, realIrc, serverPort=serverPort)
|
|
||||||
irc.replySuccess()
|
|
||||||
connect = privmsgs.checkCapability(connect, 'owner')
|
|
||||||
|
|
||||||
def _addIrc(self, irc):
|
def _addIrc(self, irc):
|
||||||
# Let's just be extra-special-careful here.
|
# Let's just be extra-special-careful here.
|
||||||
if irc not in self.ircs:
|
|
||||||
self.ircs.append(irc)
|
|
||||||
if irc not in self.ircstates:
|
if irc not in self.ircstates:
|
||||||
self.ircstates[irc] = irclib.IrcState()
|
self.ircstates[irc] = irclib.IrcState()
|
||||||
if irc not in self.lastmsg:
|
if irc not in self.lastmsg:
|
||||||
self.lastmsg[irc] = ircmsgs.ping('this is just a fake message')
|
self.lastmsg[irc] = ircmsgs.ping('this is just a fake message')
|
||||||
|
|
||||||
def _connect(self, network, realIrc, serverPort=None, makeNew=True):
|
|
||||||
try:
|
|
||||||
group = conf.supybot.networks.get(network)
|
|
||||||
(server, port) = group.servers()[0]
|
|
||||||
except (registry.NonExistentRegistryEntry, IndexError):
|
|
||||||
if serverPort is None:
|
|
||||||
raise callbacks.Error, '_connect requires a (server, port) ' \
|
|
||||||
'if the network is not registered.'
|
|
||||||
conf.registerNetwork(network, servers=('%s:%s' % serverPort,))
|
|
||||||
if makeNew:
|
|
||||||
self.log.info('Creating new Irc for relaying to %s.', network)
|
|
||||||
newIrc = irclib.Irc(network)
|
|
||||||
newIrc.state.history = realIrc.state.history
|
|
||||||
newIrc.callbacks = realIrc.callbacks
|
|
||||||
driver = drivers.newDriver(newIrc)
|
|
||||||
else:
|
|
||||||
newIrc = realIrc
|
|
||||||
self._addIrc(newIrc)
|
|
||||||
networks = self.registryValue('networks')
|
|
||||||
networks.add(network)
|
|
||||||
|
|
||||||
def disconnect(self, irc, msg, args):
|
|
||||||
"""<network>
|
|
||||||
|
|
||||||
Disconnects and ceases to relay to and from the network represented by
|
|
||||||
the network <network>.
|
|
||||||
"""
|
|
||||||
network = privmsgs.getArgs(args)
|
|
||||||
otherIrc = self._getIrc(network)
|
|
||||||
otherIrc.driver.die()
|
|
||||||
world.ircs.remove(otherIrc)
|
|
||||||
self.ircs.remove(otherIrc) # Should we abstract this?
|
|
||||||
irc.replySuccess()
|
|
||||||
disconnect = privmsgs.checkCapability(disconnect, 'owner')
|
|
||||||
|
|
||||||
def join(self, irc, msg, args):
|
def join(self, irc, msg, args):
|
||||||
"""<channel>
|
"""<channel>
|
||||||
|
|
||||||
@ -233,7 +162,7 @@ class Relay(callbacks.Privmsg):
|
|||||||
irc.error('%r is not a valid channel.' % channel)
|
irc.error('%r is not a valid channel.' % channel)
|
||||||
return
|
return
|
||||||
self.registryValue('channels').add(channel)
|
self.registryValue('channels').add(channel)
|
||||||
for otherIrc in self.ircs: # Should we abstract this?
|
for otherIrc in world.ircs: # Should we abstract this?
|
||||||
if channel not in otherIrc.state.channels:
|
if channel not in otherIrc.state.channels:
|
||||||
otherIrc.queueMsg(ircmsgs.join(channel))
|
otherIrc.queueMsg(ircmsgs.join(channel))
|
||||||
irc.replySuccess()
|
irc.replySuccess()
|
||||||
@ -251,7 +180,7 @@ class Relay(callbacks.Privmsg):
|
|||||||
irc.error('%r is not a valid channel.' % channel)
|
irc.error('%r is not a valid channel.' % channel)
|
||||||
return
|
return
|
||||||
self.registryValue('channels').remove(channel)
|
self.registryValue('channels').remove(channel)
|
||||||
for otherIrc in self.ircs:
|
for otherIrc in world.ircs:
|
||||||
if channel in otherIrc.state.channels:
|
if channel in otherIrc.state.channels:
|
||||||
otherIrc.queueMsg(ircmsgs.part(channel))
|
otherIrc.queueMsg(ircmsgs.part(channel))
|
||||||
irc.replySuccess()
|
irc.replySuccess()
|
||||||
@ -275,15 +204,6 @@ class Relay(callbacks.Privmsg):
|
|||||||
self.Proxy(otherIrc, msg, args)
|
self.Proxy(otherIrc, msg, args)
|
||||||
command = privmsgs.checkCapability(command, 'admin')
|
command = privmsgs.checkCapability(command, 'admin')
|
||||||
|
|
||||||
def networks(self, irc, msg, args):
|
|
||||||
"""takes no arguments
|
|
||||||
|
|
||||||
Returns the networks to which the bot is currently connected.
|
|
||||||
"""
|
|
||||||
L = ['%s: %s' % (irc.network, irc.server) for irc in self.ircs]
|
|
||||||
utils.sortBy(str.lower, L)
|
|
||||||
irc.reply(utils.commaAndify(L))
|
|
||||||
|
|
||||||
def nicks(self, irc, msg, args):
|
def nicks(self, irc, msg, args):
|
||||||
"""[<channel>]
|
"""[<channel>]
|
||||||
|
|
||||||
@ -297,7 +217,7 @@ class Relay(callbacks.Privmsg):
|
|||||||
irc.error('I\'m not relaying in %s.' % channel)
|
irc.error('I\'m not relaying in %s.' % channel)
|
||||||
return
|
return
|
||||||
users = []
|
users = []
|
||||||
for otherIrc in self.ircs:
|
for otherIrc in world.ircs:
|
||||||
network = self._getIrcName(otherIrc)
|
network = self._getIrcName(otherIrc)
|
||||||
ops = []
|
ops = []
|
||||||
halfops = []
|
halfops = []
|
||||||
@ -349,11 +269,11 @@ class Relay(callbacks.Privmsg):
|
|||||||
return
|
return
|
||||||
nick = ircutils.toLower(nick)
|
nick = ircutils.toLower(nick)
|
||||||
except ValueError: # If split doesn't work, we get an unpack error.
|
except ValueError: # If split doesn't work, we get an unpack error.
|
||||||
if len(self.ircs) == 2:
|
if len(world.ircs) == 2:
|
||||||
# If there are only two networks being relayed, we can safely
|
# If there are only two networks being relayed, we can safely
|
||||||
# pick the *other* one.
|
# pick the *other* one.
|
||||||
nick = ircutils.toLower(nickAtNetwork)
|
nick = ircutils.toLower(nickAtNetwork)
|
||||||
for otherIrc in self.ircs:
|
for otherIrc in world.ircs:
|
||||||
if otherIrc != realIrc:
|
if otherIrc != realIrc:
|
||||||
network = self._getIrcName(otherIrc)
|
network = self._getIrcName(otherIrc)
|
||||||
else:
|
else:
|
||||||
@ -506,7 +426,7 @@ class Relay(callbacks.Privmsg):
|
|||||||
|
|
||||||
def _sendToOthers(self, irc, msg):
|
def _sendToOthers(self, irc, msg):
|
||||||
assert msg.command == 'PRIVMSG' or msg.command == 'TOPIC'
|
assert msg.command == 'PRIVMSG' or msg.command == 'TOPIC'
|
||||||
for otherIrc in self.ircs:
|
for otherIrc in world.ircs:
|
||||||
if otherIrc != irc:
|
if otherIrc != irc:
|
||||||
if msg.args[0] in otherIrc.state.channels:
|
if msg.args[0] in otherIrc.state.channels:
|
||||||
self._addRelayedMsg(msg)
|
self._addRelayedMsg(msg)
|
||||||
@ -517,7 +437,7 @@ class Relay(callbacks.Privmsg):
|
|||||||
return s and s[0] == '<' and s[-1] == '>'
|
return s and s[0] == '<' and s[-1] == '>'
|
||||||
def punish():
|
def punish():
|
||||||
punished = False
|
punished = False
|
||||||
for irc in self.ircs:
|
for irc in world.ircs:
|
||||||
if irc.nick in irc.state.channels[channel].ops:
|
if irc.nick in irc.state.channels[channel].ops:
|
||||||
self.log.info('Punishing %s in %s on %s for relaying.',
|
self.log.info('Punishing %s in %s on %s for relaying.',
|
||||||
msg.prefix, channel, irc.network)
|
msg.prefix, channel, irc.network)
|
||||||
@ -687,13 +607,13 @@ class Relay(callbacks.Privmsg):
|
|||||||
self.registryValue('topicSync', msg.args[0]):
|
self.registryValue('topicSync', msg.args[0]):
|
||||||
(channel, topic) = msg.args
|
(channel, topic) = msg.args
|
||||||
if channel in self.registryValue('channels'):
|
if channel in self.registryValue('channels'):
|
||||||
for otherIrc in self.ircs:
|
for otherIrc in world.ircs:
|
||||||
if otherIrc != irc:
|
if otherIrc != irc:
|
||||||
try:
|
try:
|
||||||
if otherIrc.state.getTopic(channel) != topic:
|
if otherIrc.state.getTopic(channel) != topic:
|
||||||
otherIrc.queueMsg(ircmsgs.topic(channel,topic))
|
otherIrc.queueMsg(ircmsgs.topic(channel,topic))
|
||||||
except KeyError:
|
except KeyError:
|
||||||
self.log.warning('Odd, not on %s on %s -- '
|
self.log.warning('Not on %s on %s -- '
|
||||||
'Can\'t synchronize topics.',
|
'Can\'t synchronize topics.',
|
||||||
channel, otherIrc.server)
|
channel, otherIrc.server)
|
||||||
|
|
||||||
|
88
src/Owner.py
88
src/Owner.py
@ -53,6 +53,8 @@ import supybot.conf as conf
|
|||||||
import supybot.utils as utils
|
import supybot.utils as utils
|
||||||
import supybot.world as world
|
import supybot.world as world
|
||||||
import supybot.ircdb as ircdb
|
import supybot.ircdb as ircdb
|
||||||
|
import supybot.irclib as irclib
|
||||||
|
import supybot.drivers as drivers
|
||||||
import supybot.ircmsgs as ircmsgs
|
import supybot.ircmsgs as ircmsgs
|
||||||
import supybot.ircutils as ircutils
|
import supybot.ircutils as ircutils
|
||||||
import supybot.privmsgs as privmsgs
|
import supybot.privmsgs as privmsgs
|
||||||
@ -182,16 +184,30 @@ class Owner(privmsgs.CapabilityCheckingPrivmsg):
|
|||||||
'Misc', 'Owner', 'User'))
|
'Misc', 'Owner', 'User'))
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
callbacks.Privmsg.__init__(self)
|
callbacks.Privmsg.__init__(self)
|
||||||
|
# Setup log object/command.
|
||||||
self.log = LogProxy(self.log)
|
self.log = LogProxy(self.log)
|
||||||
|
# Setup exec command.
|
||||||
setattr(self.__class__, 'exec', self.__class__._exec)
|
setattr(self.__class__, 'exec', self.__class__._exec)
|
||||||
|
# Setup Irc objects, connected to networks. If world.ircs is already
|
||||||
|
# populated, chances are that we're being reloaded, so don't do this.
|
||||||
|
if not world.ircs:
|
||||||
|
for network in conf.supybot.networks():
|
||||||
|
try:
|
||||||
|
self._connect(network)
|
||||||
|
except Exception, e:
|
||||||
|
self.log.error('Could not connect to %s: %s.', network, e)
|
||||||
|
# Setup plugins and default plugins for commands.
|
||||||
for (name, s) in registry._cache.iteritems():
|
for (name, s) in registry._cache.iteritems():
|
||||||
if name.startswith('supybot.plugins'):
|
if name.startswith('supybot.plugins'):
|
||||||
try:
|
try:
|
||||||
(_, _, name) = registry.split(name)
|
(_, _, name) = registry.split(name)
|
||||||
except ValueError: # unpack list of wrong size.
|
except ValueError: # unpack list of wrong size.
|
||||||
continue
|
continue
|
||||||
if name == name.lower(): # This can't be right.
|
# This is just for the prettiness of the configuration file.
|
||||||
name = name.capitalize() # Let's at least capitalize it.
|
# There are no plugins that are all-lowercase, so we'll at
|
||||||
|
# least attempt to capitalize them.
|
||||||
|
if name == name.lower():
|
||||||
|
name = name.capitalize()
|
||||||
conf.registerPlugin(name)
|
conf.registerPlugin(name)
|
||||||
if name.startswith('supybot.commands.defaultPlugins'):
|
if name.startswith('supybot.commands.defaultPlugins'):
|
||||||
try:
|
try:
|
||||||
@ -705,6 +721,74 @@ class Owner(privmsgs.CapabilityCheckingPrivmsg):
|
|||||||
delattr(cb.__class__, command)
|
delattr(cb.__class__, command)
|
||||||
irc.replySuccess()
|
irc.replySuccess()
|
||||||
|
|
||||||
|
def _connect(self, network, serverPort=None):
|
||||||
|
try:
|
||||||
|
group = conf.supybot.networks.get(network)
|
||||||
|
(server, port) = group.servers()[0]
|
||||||
|
except (registry.NonExistentRegistryEntry, IndexError):
|
||||||
|
if serverPort is None:
|
||||||
|
raise ValueError, 'connect requires a (server, port) ' \
|
||||||
|
'if the network is not registered.'
|
||||||
|
conf.registerNetwork(network)
|
||||||
|
serverS = '%s:%s' % serverPort
|
||||||
|
conf.supybot.networks.get(network).servers.append(serverS)
|
||||||
|
assert conf.supybot.networks.get(network).servers()
|
||||||
|
self.log.info('Creating new Irc for %s.', network)
|
||||||
|
newIrc = irclib.Irc(network)
|
||||||
|
for irc in world.ircs:
|
||||||
|
if irc != newIrc:
|
||||||
|
newIrc.state.history = irc.state.history
|
||||||
|
driver = drivers.newDriver(newIrc)
|
||||||
|
return newIrc
|
||||||
|
|
||||||
|
def connect(self, irc, msg, args):
|
||||||
|
"""<network> [<host[:port]>]
|
||||||
|
|
||||||
|
Connects to another network at <host:port>. If port is not provided, it
|
||||||
|
defaults to 6667, the default port for IRC.
|
||||||
|
"""
|
||||||
|
(network, server) = privmsgs.getArgs(args, optional=1)
|
||||||
|
if server:
|
||||||
|
if ':' in server:
|
||||||
|
(server, port) = server.split(':')
|
||||||
|
port = int(port)
|
||||||
|
else:
|
||||||
|
port = 6667
|
||||||
|
serverPort = (server, port)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
serverPort = conf.supybot.networks.get(network).servers()[0]
|
||||||
|
except IndexError:
|
||||||
|
irc.error('A server must be provided if the network is not '
|
||||||
|
'already registered.')
|
||||||
|
return
|
||||||
|
newIrc = self._connect(network, serverPort=serverPort)
|
||||||
|
conf.supybot.networks().add(network)
|
||||||
|
assert newIrc.callbacks == irc.callbacks, 'callbacks list is different'
|
||||||
|
irc.replySuccess()
|
||||||
|
|
||||||
|
def disconnect(self, irc, msg, args):
|
||||||
|
"""<network> [<quit message>]
|
||||||
|
|
||||||
|
Disconnects and ceases to relay to and from the network represented by
|
||||||
|
the network <network>. If <quit message> is given, quits the network
|
||||||
|
with the given quit message.
|
||||||
|
"""
|
||||||
|
(network, quitMsg) = privmsgs.getArgs(args, optional=1)
|
||||||
|
if not quitMsg:
|
||||||
|
quitMsg = msg.nick
|
||||||
|
for otherIrc in world.ircs:
|
||||||
|
if otherIrc.network == network:
|
||||||
|
# Here, rather than lower, in case we're being told to
|
||||||
|
# disconnect from the network we received the command on.
|
||||||
|
irc.replySuccess()
|
||||||
|
otherIrc.queueMsg(ircmsgs.quit(quitMsg))
|
||||||
|
otherIrc.die()
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
irc.error('I\'m not connected to %s.' % network, Raise=True)
|
||||||
|
conf.supybot.networks().remove(network)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user