Browse Source

Finishing everything; some other tweaks.

tags/v0.1^2
Ben Kurtovic 12 years ago
parent
commit
f3f372f550
2 changed files with 73 additions and 28 deletions
  1. +67
    -26
      earwigbot/config/script.py
  2. +6
    -2
      earwigbot/managers.py

+ 67
- 26
earwigbot/config/script.py View File

@@ -22,7 +22,7 @@


from collections import OrderedDict from collections import OrderedDict
from getpass import getpass from getpass import getpass
from os import chmod, path
from os import chmod, mkdir, path
import re import re
import stat import stat
from textwrap import fill, wrap from textwrap import fill, wrap
@@ -74,6 +74,9 @@ class ConfigScript(object):
def _print(self, text): def _print(self, text):
print fill(re.sub("\s\s+", " ", text), self.WIDTH) print fill(re.sub("\s\s+", " ", text), self.WIDTH)


def _pause(self):
raw_input("> Press enter to continue: ")

def _ask(self, text, default=None): def _ask(self, text, default=None):
text = "> " + text text = "> " + text
if default: if default:
@@ -102,7 +105,15 @@ class ConfigScript(object):
return False return False


def _ask_list(self, text): def _ask_list(self, text):
pass
print fill(re.sub("\s\s+", " ", "> " + text), self.WIDTH)
print "[one item per line; blank line to end]:"
result = []
while True:
line = raw_input("> ")
if line:
result.append(line)
else:
return result


def _set_metadata(self): def _set_metadata(self):
print print
@@ -237,19 +248,19 @@ class ConfigScript(object):
if self.data["components"]["irc_frontend"]: if self.data["components"]["irc_frontend"]:
print print
frontend = self.data["irc"]["frontend"] = OrderedDict() frontend = self.data["irc"]["frontend"] = OrderedDict()
msg = "Hostname of the frontend's IRC server, without 'irc://'"
msg = "Hostname of the frontend's IRC server, without 'irc://':"
frontend["host"] = self._ask(msg, "irc.freenode.net") frontend["host"] = self._ask(msg, "irc.freenode.net")
frontend["port"] = self._ask("Frontend port", 6667)
frontend["nick"] = self._ask("Frontend bot's nickname")
frontend["ident"] = self._ask("Frontend bot's ident",
frontend["port"] = self._ask("Frontend port:", 6667)
frontend["nick"] = self._ask("Frontend bot's nickname:")
frontend["ident"] = self._ask("Frontend bot's ident:",
frontend["nick"].lower()) frontend["nick"].lower())
question = "Frontend bot's real name (gecos)"
question = "Frontend bot's real name (gecos):"
frontend["realname"] = self._ask(question) frontend["realname"] = self._ask(question)
if self._ask_bool("Should the bot identify to NickServ?"): if self._ask_bool("Should the bot identify to NickServ?"):
frontend["nickservUsername"] = self._ask("NickServ username",
frontend["nickservUsername"] = self._ask("NickServ username:",
frontend["nick"]) frontend["nick"])
frontend["nickservPassword"] = getpass("> Nickserv password: ") frontend["nickservPassword"] = getpass("> Nickserv password: ")
chan_question = "Frontend channels to join by default"
chan_question = "Frontend channels to join by default:"
frontend["channels"] = self._ask_list(chan_question) frontend["channels"] = self._ask_list(chan_question)
self._print("""The bot keeps a database of its admins (users who self._print("""The bot keeps a database of its admins (users who
can use certain sensitive commands) and owners can use certain sensitive commands) and owners
@@ -259,7 +270,7 @@ class ConfigScript(object):
spoofed. If you have a cloak, it will probably look spoofed. If you have a cloak, it will probably look
like 'wikipedia/Username' or like 'wikipedia/Username' or
'unaffiliated/nickname'.""") 'unaffiliated/nickname'.""")
host = self._ask("Your hostname on the IRC frontend")
host = self._ask("Your hostname on the IRC frontend:")
if host: if host:
self.config._permissions.load() self.config._permissions.load()
self.config._permissions.add_owner(host=host) self.config._permissions.add_owner(host=host)
@@ -274,24 +285,24 @@ class ConfigScript(object):
watcher["host"] = "irc.wikimedia.org" watcher["host"] = "irc.wikimedia.org"
watcher["port"] = 6667 watcher["port"] = 6667
else: else:
msg = "Hostname of the watcher's IRC server, without 'irc://'"
msg = "Hostname of the watcher's IRC server, without 'irc://':"
watcher["host"] = self._ask(msg) watcher["host"] = self._ask(msg)
watcher["port"] = self._ask("Watcher port", 6667)
watcher["nick"] = self._ask("Watcher bot's nickname",
watcher["port"] = self._ask("Watcher port:", 6667)
watcher["nick"] = self._ask("Watcher bot's nickname:",
frontend.get("nick")) frontend.get("nick"))
watcher["ident"] = self._ask("Watcher bot's ident",
watcher["ident"] = self._ask("Watcher bot's ident:",
watcher["nick"].lower()) watcher["nick"].lower())
question = "Watcher bot's real name (gecos)"
question = "Watcher bot's real name (gecos):"
watcher["realname"] = self._ask(question, frontend.get("realname")) watcher["realname"] = self._ask(question, frontend.get("realname"))
watcher_ns = "Should the bot identify to NickServ?" watcher_ns = "Should the bot identify to NickServ?"
if not self.wmf and self._ask_bool(watcher_ns): if not self.wmf and self._ask_bool(watcher_ns):
watcher["nickservUsername"] = self._ask("NickServ username",
watcher["nickservUsername"] = self._ask("NickServ username:",
watcher["nick"]) watcher["nick"])
watcher["nickservPassword"] = getpass("> Nickserv password: ") watcher["nickservPassword"] = getpass("> Nickserv password: ")
if self.wmf: if self.wmf:
watcher["channels"] = ["#{0}.{1}".format(self.lang, self.proj)] watcher["channels"] = ["#{0}.{1}".format(self.lang, self.proj)]
else: else:
chan_question = "Watcher channels to join"
chan_question = "Watcher channels to join by default:"
watcher["channels"] = self._ask_list(chan_question) watcher["channels"] = self._ask_list(chan_question)
self._print("""I am now creating a blank 'rules.py' file, which self._print("""I am now creating a blank 'rules.py' file, which
will determine how the bot handles messages received will determine how the bot handles messages received
@@ -302,21 +313,51 @@ class ConfigScript(object):
details.""") details.""")
with open(path.join(self.config.root_dir, "rules.py"), "w") as fp: with open(path.join(self.config.root_dir, "rules.py"), "w") as fp:
fp.write(RULES_TEMPLATE) fp.write(RULES_TEMPLATE)
self._pause()


self.data["irc"]["version"] = "EarwigBot - $1 - Python/$2 https://github.com/earwig/earwigbot" self.data["irc"]["version"] = "EarwigBot - $1 - Python/$2 https://github.com/earwig/earwigbot"


def _set_commands(self): def _set_commands(self):
# disable: True if no IRC frontend or prompted
# create commands/
pass
print
msg = """Would you like to disable the default IRC commands? You can
fine-tune which commands are disabled later on."""
if (not self.data["components"]["irc_frontend"] or
self._ask_bool(msg, default=False)):
self.data["commands"]["disable"] = True
self._print("""I am now creating the 'commands/' directory, where you
can place custom IRC commands and plugins. Creating your
own commands is described in the documentation.""")
mkdir(path.join(self.config.root_dir, "commands"))
self._pause()


def _set_tasks(self): def _set_tasks(self):
# disable: True if prompted
# create tasks/
pass
print
self._print("""I am now creating the 'tasks/' directory, where you can
place custom bot tasks and plugins. Creating your own
tasks is described in the documentation.""")
mkdir(path.join(self.config.root_dir, "tasks"))
self._pause()


def _set_schedule(self): def _set_schedule(self):
pass
self._print("""The final section of your config file, 'schedule', is a
list of bot tasks to be started by the wiki scheduler.
Each entry contains cron-like time quantifiers and a
list of tasks. For example, the following starts the
'foobot' task every hour on the half-hour:""")
print "schedule:"
print " - minute: 30"
print " tasks:"
print " - foobot"
self._print("""The following starts the 'barbot' task with the keyword
arguments 'action="baz"' every Monday at 05:00 UTC:""")
print " - week_day: 1"
print " hour: 5"
print " tasks:"
print ' - ["barbot", {"action": "baz"}]'
self._print("""The full list of quantifiers is minute, hour, month_day,
month, and week_day. See the documentation for more
details.""")
self._pause()


def _save(self): def _save(self):
with open(self.config.path, "w") as stream: with open(self.config.path, "w") as stream:
@@ -344,8 +385,8 @@ class ConfigScript(object):
relatively straightforward format and you should be able relatively straightforward format and you should be able
to update these settings in the future when necessary. to update these settings in the future when necessary.
I will start the bot at your signal. Feel free to I will start the bot at your signal. Feel free to
contact me at wikipedia.earwig at gmail.com if you have
any questions.""")
contact me at wikipedia.earwig@gmail.com if you have any
questions.""")
self._save() self._save()
if not self._ask_bool("Start the bot now?"): if not self._ask_bool("Start the bot now?"):
exit() exit()

+ 6
- 2
earwigbot/managers.py View File

@@ -149,11 +149,15 @@ class _ResourceManager(object):
builtin_dir = path.join(path.dirname(__file__), name) builtin_dir = path.join(path.dirname(__file__), name)
plugins_dir = path.join(self.bot.config.root_dir, name) plugins_dir = path.join(self.bot.config.root_dir, name)
if getattr(self.bot.config, name).get("disable") is True: if getattr(self.bot.config, name).get("disable") is True:
log = "Skipping disabled builtins directory {0}"
log = "Skipping disabled builtins directory: {0}"
self.logger.debug(log.format(builtin_dir)) self.logger.debug(log.format(builtin_dir))
else: else:
self._load_directory(builtin_dir) # Built-in resources self._load_directory(builtin_dir) # Built-in resources
self._load_directory(plugins_dir) # Custom resources, aka plugins
if path.exists(plugins_dir) and path.isdir(plugins_dir):
self._load_directory(plugins_dir) # Custom resources, plugins
else:
log = "Skipping nonexistent plugins directory: {0}"
self.logger.debug(log.format(plugins_dir))


if self._resources: if self._resources:
msg = "Loaded {0} {1}: {2}" msg = "Loaded {0} {1}: {2}"


Loading…
Cancel
Save