@@ -2,7 +2,7 @@ | |||||
*.pyc | *.pyc | ||||
# Ignore secure config files: | # Ignore secure config files: | ||||
config/secure.py | |||||
config/secure.cfg | |||||
# Ignore pydev's nonsense: | # Ignore pydev's nonsense: | ||||
.project | .project | ||||
@@ -1,25 +0,0 @@ | |||||
# -*- coding: utf-8 -*- | |||||
# EarwigBot Configuration File | |||||
# This file contains information that the bot uses to connect to IRC. | |||||
# our main (front-end) server's hostname and port | |||||
HOST = "irc.freenode.net" | |||||
PORT = 6667 | |||||
# our watcher server's hostname, port, and RC channel | |||||
WATCHER_HOST = "irc.wikimedia.org" | |||||
WATCHER_PORT = 6667 | |||||
WATCHER_CHAN = "#en.wikipedia" | |||||
# our nick, ident, and real name, used on both servers | |||||
NICK = "EarwigBot" | |||||
IDENT = "earwigbot" | |||||
REALNAME = "[[w:en:User:EarwigBot]]" | |||||
# channels to join on main server's startup | |||||
CHANS = ["##earwigbot", "##earwig", "#wikipedia-en-afc"] | |||||
# hardcoded hostnames of users with certain permissions | |||||
OWNERS = ["wikipedia/The-Earwig"] # can use owner-only commands (!restart and !git) | |||||
ADMINS = ["wikipedia/The-Earwig", "wikipedia/LeonardBloom"] # can use high-risk commands, e.g. !op |
@@ -1,24 +0,0 @@ | |||||
# -*- coding: utf-8 -*- | |||||
# EarwigBot Configuration File | |||||
# This file tells the bot which of its components should be enabled. | |||||
# The IRC frontend (configured in config/irc.py) sits on a public IRC network, | |||||
# responds to commands given to it, and reports edits (if the IRC watcher | |||||
# component is enabled). | |||||
enable_irc_frontend = True | |||||
# The IRC watcher (connection details configured in config/irc.py as well) sits | |||||
# on an IRC network that gives a recent changes feed, usually irc.wikimedia.net. | |||||
# It looks for edits matching certain (often regex) patterns (rules configured | |||||
# in config/watcher.py), and either reports them to the IRC frontend (if | |||||
# enabled), or activates a task on the WikiBot (if configured to do). | |||||
enable_irc_watcher = True | |||||
# EarwigBot doesn't have to edit a wiki, although this is its main purpose. If | |||||
# the wiki schedule is disabled, it will not be able to handle scheduled tasks | |||||
# that involve editing (such as creating a daily category every day at midnight | |||||
# UTC), but it can still edit through rules given in the watcher, and bot tasks | |||||
# can still be activated by the command line. The schedule is configured in | |||||
# config/schedule.py. | |||||
enable_wiki_schedule = True |
@@ -1,28 +0,0 @@ | |||||
# -*- coding: utf-8 -*- | |||||
# EarwigBot Configuration File | |||||
# This file tells the bot when to run certain wiki-editing tasks. | |||||
def check(minute, hour, month_day, month, week_day): | |||||
tasks = [] # tasks to run this turn, each as a tuple of (task_name, kwargs) or just task_name | |||||
if minute == 0: # run every hour on the hour | |||||
tasks.append(("afc_statistics", {"action": "save"})) # save statistics to [[Template:AFC_statistics]] | |||||
if hour == 0: # run every day at midnight | |||||
tasks.append("afc_dailycats") # create daily categories for WP:AFC | |||||
tasks.append("feed_dailycats") # create daily categories for WP:FEED | |||||
if week_day == 0: # run every Sunday at midnight (that is, the start of Sunday, not the end) | |||||
tasks.append("afc_undated") # clear [[Category:Undated AfC submissions]] | |||||
if week_day == 1: # run every Monday at midnight | |||||
tasks.append("afc_catdelink") # delink mainspace categories in declined AfC submissions | |||||
if week_day == 2: # run every Tuesday at midnight | |||||
tasks.append("wrongmime") # tag files whose extensions do not agree with their MIME type | |||||
if week_day == 3: # run every Wednesday at midnight | |||||
tasks.append("blptag") # add |blp=yes to {{WPB}} or {{WPBS}} when it is used along with {{WP Biography}} | |||||
return tasks |
@@ -1,9 +0,0 @@ | |||||
# -*- coding: utf-8 -*- | |||||
# EarwigBot Configuration File | |||||
# This file contains information that should be kept hidden, including passwords. | |||||
# IRC: identify ourselves to NickServ? | |||||
NS_AUTH = False | |||||
NS_USER = "" | |||||
NS_PASS = "" |
@@ -1,69 +0,0 @@ | |||||
# -*- coding: utf-8 -*- | |||||
# EarwigBot Configuration File | |||||
# This file contains rules for the bot's watcher component. | |||||
import re | |||||
from wiki import task_manager | |||||
# Define different report channels on our front-end server. They /must/ be in CHANS in config/irc.py or the bot will not be able to send messages to them (unless they have -n set). | |||||
AFC_CHANS = ["#wikipedia-en-afc"] # report recent AfC changes/give AfC status messages upon join | |||||
BOT_CHANS = ["##earwigbot", "#wikipedia-en-afc"] # report edits containing "!earwigbot" | |||||
# Define some commonly used strings. | |||||
afc_prefix = "wikipedia( talk)?:(wikiproject )?articles for creation" | |||||
# Define our compiled regexps used when finding certain edits. | |||||
r_page = re.compile(afc_prefix) | |||||
r_ffu = re.compile("wikipedia( talk)?:files for upload") | |||||
r_move1 = re.compile("moved \[\[{}".format(afc_prefix)) # an AFC page was either moved locally or out | |||||
r_move2 = re.compile("moved \[\[(.*?)\]\] to \[\[{}".format(afc_prefix)) # an outside page was moved into AFC | |||||
r_moved_pages = re.compile("^moved \[\[(.*?)\]\] to \[\[(.*?)\]\]") | |||||
r_delete = re.compile("deleted \"\[\[{}".format(afc_prefix)) | |||||
r_deleted_page = re.compile("^deleted \"\[\[(.*?)\]\]") | |||||
r_restore = re.compile("restored \"\[\[{}".format(afc_prefix)) | |||||
r_restored_page = re.compile("^restored \"\[\[(.*?)\]\]") | |||||
r_protect = re.compile("protected \"\[\[{}".format(afc_prefix)) | |||||
def process(rc): | |||||
chans = set() # channels to report this message to | |||||
page_name = rc.page.lower() | |||||
comment = rc.comment.lower() | |||||
if "!earwigbot" in rc.msg.lower(): | |||||
chans.update(BOT_CHANS) | |||||
if r_page.search(page_name): | |||||
task_manager.start_task("afc_statistics", action="process_edit", page=rc.page) | |||||
task_manager.start_task("afc_copyvios", action="process_edit", page=rc.page) | |||||
chans.update(AFC_CHANS) | |||||
elif r_ffu.match(page_name): | |||||
chans.update(AFC_CHANS) | |||||
elif page_name.startswith("template:afc submission"): | |||||
chans.update(AFC_CHANS) | |||||
elif rc.flags == "move" and (r_move1.match(comment) or r_move2.match(comment)): | |||||
p = r_moved_pages.findall(rc.comment)[0] | |||||
task_manager.start_task("afc_statistics", action="process_move", pages=p) | |||||
task_manager.start_task("afc_copyvios", action="process_move", pages=p) | |||||
chans.update(AFC_CHANS) | |||||
elif rc.flags == "delete" and r_delete.match(comment): | |||||
p = r_deleted_page.findall(rc.comment)[0][0] | |||||
task_manager.start_task("afc_statistics", action="process_delete", page=p) | |||||
task_manager.start_task("afc_copyvios", action="process_delete", page=p) | |||||
chans.update(AFC_CHANS) | |||||
elif rc.flags == "restore" and r_restore.match(comment): | |||||
p = r_restored_page.findall(rc.comment)[0][0] | |||||
task_manager.start_task("afc_statistics", action="process_restore", page=p) | |||||
task_manager.start_task("afc_copyvios", action="process_restore", page=p) | |||||
chans.update(AFC_CHANS) | |||||
elif rc.flags == "protect" and r_protect.match(comment): | |||||
chans.update(AFC_CHANS) | |||||
return chans |