diff --git a/earwigbot/commands/_old.py b/earwigbot/commands/_old.py deleted file mode 100644 index bc58ee2..0000000 --- a/earwigbot/commands/_old.py +++ /dev/null @@ -1,263 +0,0 @@ -# -*- coding: utf-8 -*- -###### -###### NOTE: -###### This is an old commands file from the previous version of EarwigBot. -###### It is not used by the new EarwigBot and is simply here for reference -###### when developing new commands. -###### -### EarwigBot - -def parse(command, line, line2, nick, chan, host, auth, notice, say, reply, s): - authy = auth(host) - - - if command == "access": - a = 'The bot\'s owner is "%s".' % OWNER - b = 'The bot\'s admins are "%s".' % ', '.join(ADMINS_R) - reply(a, chan, nick) - reply(b, chan, nick) - return - - - if command == "dict" or command == "dictionary": - def trim(thing): - if thing.endswith(' '): - thing = thing[:-6] - return thing.strip(' :.') - r_li = re.compile(r'(?ims)
  • .*?
  • ') - r_tag = re.compile(r'<[^>]+>') - r_parens = re.compile(r'(?<=\()(?:[^()]+|\([^)]+\))*(?=\))') - r_word = re.compile(r'^[A-Za-z0-9\' -]+$') - uri = 'http://encarta.msn.com/dictionary_/%s.html' - r_info = re.compile(r'(?:ResultBody">

    (.*?) )|(?:(.*?))') - try: - word = line2[4] - except Exception: - reply("Please enter a word.", chan, nick) - return - word = urllib.quote(word.encode('utf-8')) - bytes = web.get(uri % word) - results = {} - wordkind = None - for kind, sense in r_info.findall(bytes): - kind, sense = trim(kind), trim(sense) - if kind: wordkind = kind - elif sense: - results.setdefault(wordkind, []).append(sense) - result = word.encode('utf-8') + ' - ' - for key in sorted(results.keys()): - if results[key]: - result += (key or '') + ' 1. ' + results[key][0] - if len(results[key]) > 1: - result += ', 2. ' + results[key][1] - result += '; ' - result = result.rstrip('; ') - if result.endswith('-') and (len(result) < 30): - reply('Sorry, no definition found.', chan, nick) - else: say(result, chan) - return - - - if command == "ety" or command == "etymology": - etyuri = 'http://etymonline.com/?term=%s' - etysearch = 'http://etymonline.com/?search=%s' - r_definition = re.compile(r'(?ims)]*>.*?') - r_tag = re.compile(r'<(?!!)[^>]+>') - r_whitespace = re.compile(r'[\t\r\n ]+') - abbrs = [ - 'cf', 'lit', 'etc', 'Ger', 'Du', 'Skt', 'Rus', 'Eng', 'Amer.Eng', 'Sp', - 'Fr', 'N', 'E', 'S', 'W', 'L', 'Gen', 'J.C', 'dial', 'Gk', - '19c', '18c', '17c', '16c', 'St', 'Capt', 'obs', 'Jan', 'Feb', 'Mar', - 'Apr', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'c', 'tr', 'e', 'g' - ] - t_sentence = r'^.*?(?') - s = s.replace('<', '<') - s = s.replace('&', '&') - return s - def text(html): - html = r_tag.sub('', html) - html = r_whitespace.sub(' ', html) - return unescape(html).strip() - try: - word = line2[4] - except Exception: - reply("Please enter a word.", chan, nick) - return - def ety(word): - if len(word) > 25: - raise ValueError("Word too long: %s[...]" % word[:10]) - word = {'axe': 'ax/axe'}.get(word, word) - bytes = web.get(etyuri % word) - definitions = r_definition.findall(bytes) - if not definitions: - return None - defn = text(definitions[0]) - m = r_sentence.match(defn) - if not m: - return None - sentence = m.group(0) - try: - sentence = unicode(sentence, 'iso-8859-1') - sentence = sentence.encode('utf-8') - except: pass - maxlength = 275 - if len(sentence) > maxlength: - sentence = sentence[:maxlength] - words = sentence[:-5].split(' ') - words.pop() - sentence = ' '.join(words) + ' [...]' - sentence = '"' + sentence.replace('"', "'") + '"' - return sentence + ' - ' + (etyuri % word) - try: - result = ety(word.encode('utf-8')) - except IOError: - msg = "Can't connect to etymonline.com (%s)" % (etyuri % word) - reply(msg, chan, nick) - return - except AttributeError: - result = None - if result is not None: - reply(result, chan, nick) - else: - uri = etysearch % word - msg = 'Can\'t find the etymology for "%s". Try %s' % (word, uri) - reply(msg, chan, nick) - return - - - if command == "notes" or command == "note" or command == "about" or command == "data" or command == "database": - try: - action = line2[4] - except BaseException: - reply("What do you want me to do? Type \"!notes help\" for more information.", chan, nick) - return - import MySQLdb - db = MySQLdb.connect(db="u_earwig_ircbot", host="sql", read_default_file="/home/earwig/.my.cnf") - specify = ' '.join(line2[5:]) - if action == "help" or action == "manual": - shortCommandList = "read, write, change, undo, delete, move, author, category, list, report, developer" - if specify == "read": - say("To read an entry, type \"!notes read \".", chan) - elif specify == "write": - say("To write a new entry, type \"!notes write \". This will create a new entry only if one does not exist, see the below command...", chan) - elif specify == "change": - say("To change an entry, type \"!notes change \". The old entry will be stored in the database, so it can be undone later.", chan) - elif specify == "undo": - say("To undo a change, type \"!notes undo \".", chan) - elif specify == "delete": - say("To delete an entry, type \"!notes delete \". For security reasons, only bot admins can do this.", chan) - elif specify == "move": - say("To move an entry, type \"!notes move \".", chan) - elif specify == "author": - say("To return the author of an entry, type \"!notes author \".", chan) - elif specify == "category" or specify == "cat": - say("To change an entry's category, type \"!notes category \".", chan) - elif specify == "list": - say("To list all categories in the database, type \"!notes list\". Type \"!notes list \" to get all entries in a certain category.", chan) - elif specify == "report": - say("To give some statistics about the mini-wiki, including some debugging information, type \"!notes report\" in a PM.", chan) - elif specify == "developer": - say("To do developer work, such as writing to the database directly, type \"!notes developer \". This can only be done by the bot owner.", chan) - else: - db.query("SELECT * FROM version;") - r = db.use_result() - data = r.fetch_row(0) - version = data[0] - reply("The Earwig Mini-Wiki: running v%s." % version, chan, nick) - reply("The full list of commands, for reference, are: %s." % shortCommandList, chan, nick) - reply("For an explaination of a certain command, type \"!notes help \".", chan, nick) - reply("You can also access the database from the Toolserver: http://toolserver.org/~earwig/cgi-bin/irc_database.py", chan, nick) - time.sleep(0.4) - return - elif action == "read": - specify = string.lower(specify) - if " " in specify: specify = string.split(specify, " ")[0] - if not specify or "\"" in specify: - reply("Please include the name of the entry you would like to read after the command, e.g. !notes read earwig", chan, nick) - return - try: - db.query("SELECT entry_content FROM entries WHERE entry_title = \"%s\";" % specify) - r = db.use_result() - data = r.fetch_row(0) - entry = data[0][0] - say("Entry \"\x02%s\x0F\": %s" % (specify, entry), chan) - except Exception: - reply("There is no entry titled \"\x02%s\x0F\"." % specify, chan, nick) - return - elif action == "delete" or action == "remove": - specify = string.lower(specify) - if " " in specify: specify = string.split(specify, " ")[0] - if not specify or "\"" in specify: - reply("Please include the name of the entry you would like to delete after the command, e.g. !notes delete earwig", chan, nick) - return - if authy == "owner" or authy == "admin": - try: - db.query("DELETE from entries where entry_title = \"%s\";" % specify) - r = db.use_result() - db.commit() - reply("The entry on \"\x02%s\x0F\" has been removed." % specify, chan, nick) - except Exception: - phenny.reply("Unable to remove the entry on \"\x02%s\x0F\", because it doesn't exist." % specify, chan, nick) - else: - reply("Only bot admins can remove entries.", chan, nick) - return - elif action == "developer": - if authy == "owner": - db.query(specify) - r = db.use_result() - try: - print r.fetch_row(0) - except Exception: - pass - db.commit() - reply("Done.", chan, nick) - else: - reply("Only the bot owner can modify the raw database.", chan, nick) - return - elif action == "write": - try: - write = line2[5] - content = ' '.join(line2[6:]) - except Exception: - reply("Please include some content in your entry.", chan, nick) - return - db.query("SELECT * from entries WHERE entry_title = \"%s\";" % write) - r = db.use_result() - data = r.fetch_row(0) - if data: - reply("An entry on %s already exists; please use \"!notes change %s %s\"." % (write, write, content), chan, nick) - return - content2 = content.replace('"', '\\' + '"') - db.query("INSERT INTO entries (entry_title, entry_author, entry_category, entry_content, entry_content_old) VALUES (\"%s\", \"%s\", \"uncategorized\", \"%s\", NULL);" % (write, nick, content2)) - db.commit() - reply("You have written an entry titled \"\x02%s\x0F\", with the following content: \"%s\"" % (write, content), chan, nick) - return - elif action == "change": - reply("NotImplementedError", chan, nick) - elif action == "undo": - reply("NotImplementedError", chan, nick) - elif action == "move": - reply("NotImplementedError", chan, nick) - elif action == "author": - try: - entry = line2[5] - except Exception: - reply("Please include the name of the entry you would like to get information for after the command, e.g. !notes author earwig", chan, nick) - return - db.query("SELECT entry_author from entries WHERE entry_title = \"%s\";" % entry) - r = db.use_result() - data = r.fetch_row(0) - if data: - say("The author of \"\x02%s\x0F\" is \x02%s\x0F." % (entry, data[0][0]), chan) - return - reply("There is no entry titled \"\x02%s\x0F\"." % entry, chan, nick) - return - elif action == "cat" or action == "category": - reply("NotImplementedError", chan, nick) - elif action == "list": - reply("NotImplementedError", chan, nick) - elif action == "report": - reply("NotImplementedError", chan, nick) diff --git a/earwigbot/commands/notes.py b/earwigbot/commands/notes.py new file mode 100644 index 0000000..29d387f --- /dev/null +++ b/earwigbot/commands/notes.py @@ -0,0 +1,169 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2009-2012 by Ben Kurtovic +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from earwigbot.commands import Command + +__all__ = ["Notes"] + +class Notes(Command): + """A mini IRC-based wiki for storing notes, tips, and reminders.""" + name = "notes" + + def process(self, data): + pass + + +class OldCommand(object): + def parse(self): + if command == "notes" or command == "note" or command == "about" or command == "data" or command == "database": + try: + action = line2[4] + except BaseException: + reply("What do you want me to do? Type \"!notes help\" for more information.", chan, nick) + return + import MySQLdb + db = MySQLdb.connect(db="u_earwig_ircbot", host="sql", read_default_file="/home/earwig/.my.cnf") + specify = ' '.join(line2[5:]) + if action == "help" or action == "manual": + shortCommandList = "read, write, change, undo, delete, move, author, category, list, report, developer" + if specify == "read": + say("To read an entry, type \"!notes read \".", chan) + elif specify == "write": + say("To write a new entry, type \"!notes write \". This will create a new entry only if one does not exist, see the below command...", chan) + elif specify == "change": + say("To change an entry, type \"!notes change \". The old entry will be stored in the database, so it can be undone later.", chan) + elif specify == "undo": + say("To undo a change, type \"!notes undo \".", chan) + elif specify == "delete": + say("To delete an entry, type \"!notes delete \". For security reasons, only bot admins can do this.", chan) + elif specify == "move": + say("To move an entry, type \"!notes move \".", chan) + elif specify == "author": + say("To return the author of an entry, type \"!notes author \".", chan) + elif specify == "category" or specify == "cat": + say("To change an entry's category, type \"!notes category \".", chan) + elif specify == "list": + say("To list all categories in the database, type \"!notes list\". Type \"!notes list \" to get all entries in a certain category.", chan) + elif specify == "report": + say("To give some statistics about the mini-wiki, including some debugging information, type \"!notes report\" in a PM.", chan) + elif specify == "developer": + say("To do developer work, such as writing to the database directly, type \"!notes developer \". This can only be done by the bot owner.", chan) + else: + db.query("SELECT * FROM version;") + r = db.use_result() + data = r.fetch_row(0) + version = data[0] + reply("The Earwig Mini-Wiki: running v%s." % version, chan, nick) + reply("The full list of commands, for reference, are: %s." % shortCommandList, chan, nick) + reply("For an explaination of a certain command, type \"!notes help \".", chan, nick) + reply("You can also access the database from the Toolserver: http://toolserver.org/~earwig/cgi-bin/irc_database.py", chan, nick) + time.sleep(0.4) + return + elif action == "read": + specify = string.lower(specify) + if " " in specify: specify = string.split(specify, " ")[0] + if not specify or "\"" in specify: + reply("Please include the name of the entry you would like to read after the command, e.g. !notes read earwig", chan, nick) + return + try: + db.query("SELECT entry_content FROM entries WHERE entry_title = \"%s\";" % specify) + r = db.use_result() + data = r.fetch_row(0) + entry = data[0][0] + say("Entry \"\x02%s\x0F\": %s" % (specify, entry), chan) + except Exception: + reply("There is no entry titled \"\x02%s\x0F\"." % specify, chan, nick) + return + elif action == "delete" or action == "remove": + specify = string.lower(specify) + if " " in specify: specify = string.split(specify, " ")[0] + if not specify or "\"" in specify: + reply("Please include the name of the entry you would like to delete after the command, e.g. !notes delete earwig", chan, nick) + return + if authy == "owner" or authy == "admin": + try: + db.query("DELETE from entries where entry_title = \"%s\";" % specify) + r = db.use_result() + db.commit() + reply("The entry on \"\x02%s\x0F\" has been removed." % specify, chan, nick) + except Exception: + phenny.reply("Unable to remove the entry on \"\x02%s\x0F\", because it doesn't exist." % specify, chan, nick) + else: + reply("Only bot admins can remove entries.", chan, nick) + return + elif action == "developer": + if authy == "owner": + db.query(specify) + r = db.use_result() + try: + print r.fetch_row(0) + except Exception: + pass + db.commit() + reply("Done.", chan, nick) + else: + reply("Only the bot owner can modify the raw database.", chan, nick) + return + elif action == "write": + try: + write = line2[5] + content = ' '.join(line2[6:]) + except Exception: + reply("Please include some content in your entry.", chan, nick) + return + db.query("SELECT * from entries WHERE entry_title = \"%s\";" % write) + r = db.use_result() + data = r.fetch_row(0) + if data: + reply("An entry on %s already exists; please use \"!notes change %s %s\"." % (write, write, content), chan, nick) + return + content2 = content.replace('"', '\\' + '"') + db.query("INSERT INTO entries (entry_title, entry_author, entry_category, entry_content, entry_content_old) VALUES (\"%s\", \"%s\", \"uncategorized\", \"%s\", NULL);" % (write, nick, content2)) + db.commit() + reply("You have written an entry titled \"\x02%s\x0F\", with the following content: \"%s\"" % (write, content), chan, nick) + return + elif action == "change": + reply("NotImplementedError", chan, nick) + elif action == "undo": + reply("NotImplementedError", chan, nick) + elif action == "move": + reply("NotImplementedError", chan, nick) + elif action == "author": + try: + entry = line2[5] + except Exception: + reply("Please include the name of the entry you would like to get information for after the command, e.g. !notes author earwig", chan, nick) + return + db.query("SELECT entry_author from entries WHERE entry_title = \"%s\";" % entry) + r = db.use_result() + data = r.fetch_row(0) + if data: + say("The author of \"\x02%s\x0F\" is \x02%s\x0F." % (entry, data[0][0]), chan) + return + reply("There is no entry titled \"\x02%s\x0F\"." % entry, chan, nick) + return + elif action == "cat" or action == "category": + reply("NotImplementedError", chan, nick) + elif action == "list": + reply("NotImplementedError", chan, nick) + elif action == "report": + reply("NotImplementedError", chan, nick)