# 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 gzip import GzipFile from json import loads from socket import error from StringIO import StringIO from urllib import quote from urllib2 import URLError from earwigbot import importer from earwigbot.exceptions import SearchQueryError oauth = importer.new("oauth2") __all__ = ["BaseSearchEngine", "YahooBOSSSearchEngine"] class BaseSearchEngine(object): """Base class for a simple search engine interface.""" name = "Base" def __init__(self, cred, opener): """Store credentials (*cred*) and *opener* for searching later on.""" self.cred = cred self.opener = opener def __repr__(self): """Return the canonical string representation of the search engine.""" return "{0}()".format(self.__class__.__name__)
from math import log from Queue import Empty, Queue from socket import error as socket_error from StringIO import StringIO from struct import error as struct_error from threading import Lock, Thread from time import time from urllib2 import build_opener, URLError from earwigbot import importer from earwigbot.exceptions import ParserExclusionError from earwigbot.wiki.copyvios.markov import MarkovChain, MarkovChainIntersection from earwigbot.wiki.copyvios.parsers import get_parser from earwigbot.wiki.copyvios.result import CopyvioCheckResult, CopyvioSource tldextract = importer.new("tldextract") __all__ = ["globalize", "localize", "CopyvioWorkspace"] _is_globalized = False _global_queues = None _global_workers = [] def globalize(num_workers=8): """Cause all copyvio checks to be done by one global set of workers. This is useful when checks are being done through a web interface where large numbers of simulatenous requests could be problematic. The global workers are spawned when the function is called, run continuously, and intelligently handle multiple checks.
from os.path import expanduser from threading import RLock from time import sleep, time from urllib import quote_plus, unquote_plus from urlparse import urlparse import requests from requests_oauthlib import OAuth1 from earwigbot import exceptions, importer from earwigbot.wiki import constants from earwigbot.wiki.category import Category from earwigbot.wiki.page import Page from earwigbot.wiki.user import User oursql = importer.new("oursql") __all__ = ["Site"] class Site(object): """ **EarwigBot: Wiki Toolset: Site** Represents a site, with support for API queries and returning :py:class:`~earwigbot.wiki.page.Page`, :py:class:`~earwigbot.wiki.user.User`, and :py:class:`~earwigbot.wiki.category.Category` objects. The constructor takes a bunch of arguments and you probably won't need to call it directly, rather :py:meth:`wiki.get_site() <earwigbot.wiki.sitesdb.SitesDB.get_site>` for returning :py:class:`Site`
# 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 os import path import re from StringIO import StringIO import mwparserfromhell from earwigbot import importer from earwigbot.exceptions import ParserExclusionError bs4 = importer.new("bs4") nltk = importer.new("nltk") converter = importer.new("pdfminer.converter") pdfinterp = importer.new("pdfminer.pdfinterp") pdfpage = importer.new("pdfminer.pdfpage") pdftypes = importer.new("pdfminer.pdftypes") psparser = importer.new("pdfminer.psparser") __all__ = ["ArticleTextParser", "get_parser"] class _BaseTextParser(object): """Base class for a parser that handles text.""" TYPE = None def __init__(self, text, args=None):
import logging import logging.handlers from os import mkdir, path import stat import yaml from earwigbot import importer from earwigbot.config.formatter import BotFormatter from earwigbot.config.node import ConfigNode from earwigbot.config.ordered_yaml import OrderedLoader from earwigbot.config.permissions import PermissionsDB from earwigbot.config.script import ConfigScript from earwigbot.exceptions import NoConfigError Blowfish = importer.new("Crypto.Cipher.Blowfish") bcrypt = importer.new("bcrypt") __all__ = ["BotConfig"] class BotConfig(object): """ **EarwigBot: YAML Config File Manager** This handles all tasks involving reading and writing to our config file, including encrypting and decrypting passwords and making a new config file from scratch at the inital bot run. BotConfig has a few attributes and methods, including the following: - :py:attr:`root_dir`: bot's working directory; contains
from os.path import expanduser from threading import RLock from time import sleep, time from urllib import quote_plus, unquote_plus from urlparse import urlparse import requests from requests_oauthlib import OAuth1 from earwigbot import exceptions, importer from earwigbot.wiki import constants from earwigbot.wiki.category import Category from earwigbot.wiki.page import Page from earwigbot.wiki.user import User oursql = importer.new("oursql") __all__ = ["Site"] class Site(object): """ **EarwigBot: Wiki Toolset: Site** Represents a site, with support for API queries and returning :py:class:`~earwigbot.wiki.page.Page`, :py:class:`~earwigbot.wiki.user.User`, and :py:class:`~earwigbot.wiki.category.Category` objects. The constructor takes a bunch of arguments and you probably won't need to call it directly, rather :py:meth:`wiki.get_site() <earwigbot.wiki.sitesdb.SitesDB.get_site>` for returning :py:class:`Site` instances, :py:meth:`wiki.add_site()
# 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 os import path import re from StringIO import StringIO import mwparserfromhell from earwigbot import importer from earwigbot.exceptions import ParserExclusionError bs4 = importer.new("bs4") nltk = importer.new("nltk") converter = importer.new("pdfminer.converter") pdfinterp = importer.new("pdfminer.pdfinterp") pdfpage = importer.new("pdfminer.pdfpage") __all__ = ["ArticleTextParser", "get_parser"] class _BaseTextParser(object): """Base class for a parser that handles text.""" TYPE = None def __init__(self, text, args=None): self.text = text self._args = args or {}
# 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. import hashlib from earwigbot import importer from earwigbot.commands import Command Blowfish = importer.new("Crypto.Cipher.Blowfish") class Crypt(Command): """Provides hash functions with !hash (!hash list for supported algorithms) and Blowfish encryption with !encrypt and !decrypt.""" name = "crypt" commands = ["crypt", "hash", "encrypt", "decrypt"] def process(self, data): if data.command == "crypt": msg = "Available commands are !hash, !encrypt, and !decrypt." self.reply(data, msg) return if not data.args:
# 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 gzip import GzipFile from json import loads from re import sub as re_sub from socket import error from StringIO import StringIO from urllib import quote, urlencode from urllib2 import URLError from earwigbot import importer from earwigbot.exceptions import SearchQueryError lxml = importer.new("lxml") oauth = importer.new("oauth2") __all__ = ["BingSearchEngine", "GoogleSearchEngine", "YahooBOSSSearchEngine", "YandexSearchEngine", "SEARCH_ENGINES"] class _BaseSearchEngine(object): """Base class for a simple search engine interface.""" name = "Base" def __init__(self, cred, opener): """Store credentials (*cred*) and *opener* for searching later on.""" self.cred = cred self.opener = opener self.count = 5
# 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 datetime import datetime from math import floor from time import time from earwigbot import importer from earwigbot.commands import Command pytz = importer.new("pytz") class Time(Command): """Report the current time in any timezone (UTC default), UNIX epoch time, or beat time.""" name = "time" commands = ["time", "beats", "swatch", "epoch", "date"] def process(self, data): if data.command in ["beats", "swatch"]: self.do_beats(data) return if data.command == "epoch": self.reply(data, time()) return if data.args:
# 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 datetime import datetime from math import floor from time import time from earwigbot import importer from earwigbot.commands import Command pytz = importer.new("pytz") class Time(Command): """Report the current time in any timezone (UTC default), UNIX epoch time, or beat time.""" name = "time" commands = ["time", "beats", "swatch", "epoch", "date"] def process(self, data): if data.command in ["beats", "swatch"]: self.do_beats(data) return if data.command == "epoch": self.reply(data, time()) return
# 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. import hashlib from earwigbot import importer from earwigbot.commands import Command Blowfish = importer.new("Crypto.Cipher.Blowfish") class Crypt(Command): """Provides hash functions with !hash (!hash list for supported algorithms) and Blowfish encryption with !encrypt and !decrypt.""" name = "crypt" commands = ["crypt", "hash", "encrypt", "decrypt"] def process(self, data): if data.command == "crypt": msg = "Available commands are !hash, !encrypt, and !decrypt." self.reply(data, msg) return if not data.args: msg = "What do you want me to {0}?".format(data.command)