mirror of
https://github.com/Mikaela/Limnoria.git
synced 2024-12-23 11:12:47 +01:00
Updated to allow different networks.
This commit is contained in:
parent
b88dd0f649
commit
aad1d2dc41
@ -123,18 +123,12 @@ if __name__ == '__main__':
|
||||
parser.add_option('-n', '--nick', action='store',
|
||||
dest='nick', default='',
|
||||
help='nick the bot should use')
|
||||
parser.add_option('-s', '--server', action='store',
|
||||
dest='server', default='',
|
||||
help='server to connect to')
|
||||
parser.add_option('-u', '--user', action='store',
|
||||
dest='user', default='',
|
||||
help='full username the bot should use')
|
||||
parser.add_option('-i', '--ident', action='store',
|
||||
dest='ident', default='',
|
||||
help='ident the bot should use')
|
||||
parser.add_option('-p', '--password', action='store',
|
||||
dest='password', default='',
|
||||
help='server password the bot should use')
|
||||
parser.add_option('-d', '--daemon', action='store_true',
|
||||
dest='daemon',
|
||||
help='Determines whether the bot will daemonize. '
|
||||
@ -209,9 +203,12 @@ if __name__ == '__main__':
|
||||
nick = options.nick or conf.supybot.nick()
|
||||
user = options.user or conf.supybot.user()
|
||||
ident = options.ident or conf.supybot.ident()
|
||||
password = options.password or conf.supybot.password()
|
||||
|
||||
server = options.server or conf.supybot.server()
|
||||
|
||||
# We could add an option for this, but we'll wait until it's requested.
|
||||
defaultNetwork = conf.supybot.networks.default()
|
||||
network = conf.supybot.networks.get(defaultNetwork)
|
||||
server = network.server()
|
||||
password = network.password()
|
||||
if ':' in server:
|
||||
serverAndPort = server.split(':', 1)
|
||||
serverAndPort[1] = int(serverAndPort[1])
|
||||
@ -220,6 +217,7 @@ if __name__ == '__main__':
|
||||
server = (server, 6667)
|
||||
|
||||
if options.optimize:
|
||||
# This doesn't work anymore.
|
||||
__builtins__.__debug__ = False
|
||||
if options.optimize > 1:
|
||||
try:
|
||||
@ -253,7 +251,8 @@ if __name__ == '__main__':
|
||||
import callbacks
|
||||
import Owner
|
||||
|
||||
irc = irclib.Irc(nick, user=user, ident=ident, password=password)
|
||||
irc = irclib.Irc(nick, user=user, ident=ident,
|
||||
network=defaultNetwork, password=password)
|
||||
callback = Owner.Class()
|
||||
irc.addCallback(callback)
|
||||
driver = drivers.newDriver(server, irc)
|
||||
|
@ -257,14 +257,27 @@ def main():
|
||||
output("""Now we're going to ask you things that actually relate to the
|
||||
bot you'll be running.""")
|
||||
|
||||
# conf.supybot.server
|
||||
# Force the user into specifying a server if he didn't have one already
|
||||
try:
|
||||
defaultServer = registry._cache['supybot.server']
|
||||
defaultServer = utils.safeEval(defaultServer)
|
||||
defaultServer = defaultServer.split(':')[0]
|
||||
except KeyError:
|
||||
defaultServer = None
|
||||
network = None
|
||||
while not network:
|
||||
output("""First, we need to know the name of the network you'd like to
|
||||
connect to. Not the server host, mind you, but the name of the
|
||||
network. If you plan to connect to irc.freenode.net, for instance, you
|
||||
should answer this question with 'freenode' (without the quotes).""")
|
||||
network = something('What IRC network will you be connecting to?')
|
||||
if '.' in network:
|
||||
output("""There shouldn't be a '.' in the network name. Remember,
|
||||
this is the network name, not the actual server you plan to connect
|
||||
to.""")
|
||||
network = None
|
||||
elif not isValidRegistryName:
|
||||
output("""That's not a valid name for one reason or another. Please
|
||||
pick a simpler name, one more likely to be valid.""")
|
||||
network = None
|
||||
|
||||
conf.supybot.networks.default.set(network)
|
||||
network = conf.registerNetwork(network)
|
||||
|
||||
defaultServer = None
|
||||
server = None
|
||||
while not server:
|
||||
serverString = something('What server would you like to connect to?',
|
||||
@ -274,28 +287,29 @@ def main():
|
||||
ip = socket.gethostbyname(serverString)
|
||||
except:
|
||||
output("""Sorry, I couldn't find that server. Perhaps you
|
||||
misspelled it?""")
|
||||
continue
|
||||
output("""Found %s (%s).""" % (serverString, ip))
|
||||
output("""IRC Servers almost always accept connections on port
|
||||
6667. They can, however, accept connections anywhere their admin
|
||||
feels like he wants to accept connections from.""")
|
||||
if yn('Does this server require connection on a non-standard port?',
|
||||
default=False):
|
||||
port = 0
|
||||
while not port:
|
||||
port = something('What port is that?')
|
||||
try:
|
||||
i = int(port)
|
||||
if not (0 < i < 65536):
|
||||
raise ValueError
|
||||
except ValueError:
|
||||
output("""That's not a valid port.""")
|
||||
port = 0
|
||||
else:
|
||||
port = 6667
|
||||
server = ':'.join(map(str, [serverString, port]))
|
||||
conf.supybot.server.set(server)
|
||||
misspelled it? Also, be sure not to put the port in the server's
|
||||
name -- we'll ask you about that later.""")
|
||||
|
||||
output("""Found %s (%s).""" % (serverString, ip))
|
||||
output("""IRC Servers almost always accept connections on port
|
||||
6667. They can, however, accept connections anywhere their admin
|
||||
feels like he wants to accept connections from.""")
|
||||
if yn('Does this server require connection on a non-standard port?',
|
||||
default=False):
|
||||
port = 0
|
||||
while not port:
|
||||
port = something('What port is that?')
|
||||
try:
|
||||
i = int(port)
|
||||
if not (0 < i < 65536):
|
||||
raise ValueError
|
||||
except ValueError:
|
||||
output("""That's not a valid port.""")
|
||||
port = 0
|
||||
else:
|
||||
port = 6667
|
||||
server = ':'.join([serverString, str(port)])
|
||||
network.server.setValue(server)
|
||||
|
||||
# conf.supybot.nick
|
||||
# Force the user into specifying a nick if he didn't have one already
|
||||
|
47
src/conf.py
47
src/conf.py
@ -51,10 +51,16 @@ _pluginsDir = os.path.join(installDir, 'plugins')
|
||||
###
|
||||
version ='0.77.2+cvs'
|
||||
|
||||
###
|
||||
# *** The following variables are affected by command-line options. They are
|
||||
# not registry variables for a specific reason. Do *not* change these to
|
||||
# registry variables without first consulting people smarter than yourself.
|
||||
###
|
||||
|
||||
###
|
||||
# daemonized: This determines whether or not the bot has been daemonized
|
||||
# (i.e., set to run in the background). Obviously, this defaults
|
||||
# to False.
|
||||
# to False. A command-line option for obvious reasons.
|
||||
###
|
||||
daemonized = False
|
||||
|
||||
@ -80,14 +86,14 @@ supybot = registry.Group()
|
||||
supybot.setName('supybot')
|
||||
|
||||
def registerGroup(Group, name, group=None):
|
||||
Group.register(name, group)
|
||||
return Group.register(name, group)
|
||||
|
||||
def registerGlobalValue(group, name, value):
|
||||
group.register(name, value)
|
||||
return group.register(name, value)
|
||||
|
||||
def registerChannelValue(group, name, value):
|
||||
value.supplyDefault = True
|
||||
group.register(name, value)
|
||||
return group.register(name, value)
|
||||
|
||||
def registerPlugin(name, currentValue=None):
|
||||
registerGlobalValue(supybot.plugins, name,
|
||||
@ -95,7 +101,7 @@ def registerPlugin(name, currentValue=None):
|
||||
default.""", showDefault=False))
|
||||
if currentValue is not None:
|
||||
supybot.plugins.get(name).setValue(currentValue)
|
||||
registerGroup(users.plugins, name)
|
||||
return registerGroup(users.plugins, name)
|
||||
|
||||
###
|
||||
# The user info registry.
|
||||
@ -130,8 +136,8 @@ class ValidChannel(registry.String):
|
||||
else:
|
||||
registry.String.setValue(self, v)
|
||||
|
||||
supybot.register('nick', ValidNick('supybot',
|
||||
"""Determines the bot's nick."""))
|
||||
registerGlobalValue(supybot, 'nick',
|
||||
ValidNick('supybot', """Determines the bot's nick."""))
|
||||
|
||||
registerGlobalValue(supybot, 'ident',
|
||||
ValidNick('supybot', """Determines the bot's ident string, if the server
|
||||
@ -142,11 +148,30 @@ registerGlobalValue(supybot, 'user',
|
||||
sends to the server."""))
|
||||
|
||||
# TODO: Make this check for validity.
|
||||
supybot.register('server', registry.String('irc.freenode.net', """Determines
|
||||
what server the bot connects to."""))
|
||||
registerGroup(supybot, 'networks')
|
||||
registerGlobalValue(supybot.networks, 'default', registry.String('',
|
||||
"""Determines what the default network joined by the bot will be."""))
|
||||
|
||||
def registerNetwork(name, password='', server=''):
|
||||
name = intern(name)
|
||||
network = registerGroup(supybot.networks, name)
|
||||
registerGlobalValue(network, 'password', registry.String(password,
|
||||
"""Determines what password will be used on %s. Yes, we know that
|
||||
technically passwords are server-specific and not network-specific,
|
||||
but this is the best we can do right now.""" % name))
|
||||
registerGlobalValue(network, 'server', registry.String(server,
|
||||
"""Determines what server the bot will connect to for %s.""" % name))
|
||||
return network
|
||||
|
||||
# Let's fill our networks.
|
||||
for (name, s) in registry._cache.iteritems():
|
||||
if name.startswith('supybot.networks.'):
|
||||
parts = name.split('.')
|
||||
print parts
|
||||
name = parts[2]
|
||||
if name != 'default':
|
||||
registerNetwork(name)
|
||||
|
||||
supybot.register('password', registry.String('', """Determines the password to
|
||||
be sent to the server if it requires one."""))
|
||||
|
||||
class SpaceSeparatedSetOfChannels(registry.SeparatedListOf):
|
||||
List = ircutils.IrcSet
|
||||
|
@ -440,11 +440,13 @@ class Irc(IrcCommandDispatcher):
|
||||
_nickSetters = sets.Set(['001', '002', '003', '004', '250', '251', '252',
|
||||
'254', '255', '265', '266', '372', '375', '376',
|
||||
'333', '353', '332', '366', '005'])
|
||||
def __init__(self, nick, user='', ident='', password='', callbacks=None):
|
||||
def __init__(self, nick, user='', ident='',
|
||||
network='unset', password='', callbacks=None):
|
||||
world.ircs.append(self)
|
||||
self.originalNick = intern(nick)
|
||||
self.originalNetwork = intern(network)
|
||||
self.nick = self.originalNick
|
||||
self.network = 'unset'
|
||||
self.network = self.originalNetwork
|
||||
self.nickmods = cycle(conf.supybot.nickmods())
|
||||
self.password = password
|
||||
self.user = intern(user or nick) # Default to nick
|
||||
@ -474,6 +476,7 @@ class Irc(IrcCommandDispatcher):
|
||||
def reset(self):
|
||||
"""Resets the Irc object. Called when the driver reconnects."""
|
||||
self.nick = self.originalNick
|
||||
self.network = self.originalNetwork
|
||||
self.prefix = '%s!%s@%s' % (self.nick, self.ident, 'unset.domain')
|
||||
self.state.reset()
|
||||
self.queue.reset()
|
||||
@ -570,13 +573,14 @@ class Irc(IrcCommandDispatcher):
|
||||
def do001(self, msg):
|
||||
"""Logs (and stores) the name of the network."""
|
||||
welcome = msg.args[1]
|
||||
if not welcome.startswith('Welcome to the '):
|
||||
log.info('Unexpected 001 welcome, guessing at network name.')
|
||||
self.network = msg.prefix
|
||||
else:
|
||||
words = welcome.split()
|
||||
# We assume there is one more word after "Welcome to the ".
|
||||
self.network = words[3].lower()
|
||||
if self.network == 'unset':
|
||||
if not welcome.startswith('Welcome to the '):
|
||||
log.info('Unexpected 001 welcome, guessing at network name.')
|
||||
self.network = msg.prefix
|
||||
else:
|
||||
words = welcome.split()
|
||||
# We assume there is one more word after "Welcome to the ".
|
||||
self.network = words[3].lower()
|
||||
log.info('Setting network to %s.', self.network)
|
||||
|
||||
def do002(self, msg):
|
||||
|
Loading…
Reference in New Issue
Block a user