The Wiki Toolset ================ EarwigBot's answer to the `Pywikipedia framework`_ is the Wiki Toolset (``earwigbot.wiki``), which you will mainly access through ``bot.wiki``. ``bot.wiki`` provides three methods for the management of Sites - ``get_site()``, ``add_site()``, and ``remove_site()``. Sites are objects that simply represent a MediaWiki site. A single instance of EarwigBot (i.e. a single *working directory*) is expected to relate to a single site or group of sites using the same login info (like all WMF wikis with CentralAuth). Load your default site (the one that you picked during setup) with ``site = bot.wiki.get_site()``. Dealing with other sites ~~~~~~~~~~~~~~~~~~~~~~~~ *Skip this section if you're only working with one site.* If a site is *already known to the bot* (meaning that it is stored in the ``sites.db`` file, which includes just your default wiki at first), you can load a site with ``site = bot.wiki.get_site(name)``, where ``name`` might be ``"enwiki"`` or ``"frwiktionary"`` (you can also do ``site = bot.wiki.get_site(project="wikipedia", lang="en")``). Recall that not giving any arguments to ``get_site()`` will return the default site. ``add_site()`` is used to add new sites to the sites database. It may be called with similar arguments as ``get_site()``, but the difference is important. ``get_site()`` only needs enough information to identify the site in its database, which is usually just its name; the database stores all other necessary connection info. With ``add_site()``, you need to provide enough connection info so the toolset can successfully access the site's API/SQL databases and store that information for later. That might not be much; for WMF wikis, you can usually use code like this:: project, lang = "wikipedia", "es" try: site = bot.wiki.get_site(project=project, lang=lang) except earwigbot.SiteNotFoundError: # Load site info from http://es.wikipedia.org/w/api.php: site = bot.wiki.add_site(project=project, lang=lang) This works because EarwigBot assumes that the URL for the site is ``"//{lang}.{project}.org"`` and the API is at ``/w/api.php``; this might change if you're dealing with non-WMF wikis, where the code might look something more like:: project, lang = "mywiki", "it" try: site = bot.wiki.get_site(project=project, lang=lang) except earwigbot.SiteNotFoundError: Load site info from http://mysite.net/mywiki/it/s/api.php: base_url = "http://mysite.net/" + project + "/" + lang db_name = lang + project + "_p" sql = {host: "sql.mysite.net", db: db_name} site = bot.wiki.add_site(base_url=base_url, script_path="/s", sql=sql) ``remove_site()`` does the opposite of ``add_site()``: give it a site's name or a project/lang pair like ``get_site()`` takes, and it'll remove that site from the sites database. Sites ~~~~~ ``Site`` objects provide the following attributes: - ``name``: the site's name (or "wikiid"), like ``"enwiki"`` - ``project``: the site's project name, like ``"wikipedia"`` - ``lang``: the site's language code, like ``"en"`` - ``domain``: the site's web domain, like ``"en.wikipedia.org"`` and the following methods: - ``api_query(**kwargs)``: does an API query with the given keyword arguments as params - ``sql_query(query, params=(), ...)``: does an SQL query and yields its results (as a generator) - ``get_replag()``: returns the estimated database replication lag (if we have the site's SQL connection info) - ``namespace_id_to_name(id, all=False)``: given a namespace ID, returns the primary associated namespace name (or a list of all names when ``all`` is ``True``) - ``namespace_name_to_id(name)``: given a namespace name, returns the associated namespace ID - ``get_page(title, follow_redirects=False)``: returns a ``Page`` object for the given title (or a ``Category`` object if the page's namespace is "``Category:``") - ``get_category(catname, follow_redirects=False)``: returns a ``Category`` object for the given title (sans namespace) - ``get_user(username)``: returns a ``User`` object for the given username Pages (and Categories) ~~~~~~~~~~~~~~~~~~~~~~ Create ``Page`` objects with ``site.get_page(title)``, ``page.toggle_talk()``, ``user.get_userpage()``, or ``user.get_talkpage()``. They provide the following attributes: - ``title``: the page's title, or pagename - ``exists``: whether the page exists - ``pageid``: an integer ID representing the page - ``url``: the page's URL - ``namespace``: the page's namespace as an integer - ``protection``: the page's current protection status - ``is_talkpage``: ``True`` if the page is a talkpage, else ``False`` - ``is_redirect``: ``True`` if the page is a redirect, else ``False`` and the following methods: - ``reload()``: forcibly reload the page's attributes (emphasis on *reload* - this is only necessary if there is reason to believe they have changed) - ``toggle_talk(...)``: returns a content page's talk page, or vice versa - ``get()``: returns page content - ``get_redirect_target()``: if the page is a redirect, returns its destination - ``get_creator()``: returns a ``User`` object representing the first user to edit the page - ``edit(text, summary, minor=False, bot=True, force=False)``: replaces the page's content with ``text`` or creates a new page - ``add_section(text, title, minor=False, bot=True, force=False)``: adds a new section named ``title`` at the bottom of the page - ``copyvio_check(...)``: checks the page for copyright violations - ``copyvio_compare(url, ...)``: checks the page like ``copyvio_check()``, but against a specific URL Additionally, ``Category`` objects (created with ``site.get_category(name)`` or ``site.get_page(title)`` where ``title`` is in the ``Category:`` namespace) provide the following additional method: - ``get_members(use_sql=False, limit=None)``: returns a list of page titles in the category (limit is ``50`` by default if using the API) Users ~~~~~ Create ``User`` objects with ``site.get_user(name)`` or ``page.get_creator()``. They provide the following attributes: - ``name``: the user's username - ``exists``: ``True`` if the user exists, or ``False`` if they do not - ``userid``: an integer ID representing the user - ``blockinfo``: information about any current blocks on the user (``False`` if no block, or a dict of ``{"by": blocking_user, "reason": block_reason, "expiry": block_expire_time}``) - ``groups``: a list of the user's groups - ``rights``: a list of the user's rights - ``editcount``: the number of edits made by the user - ``registration``: the time the user registered as a ``time.struct_time`` - ``emailable``: ``True`` if you can email the user, ``False`` if you cannot - ``gender``: the user's gender (``"male"``, ``"female"``, or ``"unknown"``) and the following methods: - ``reload()``: forcibly reload the user's attributes (emphasis on *reload* - this is only necessary if there is reason to believe they have changed) - ``get_userpage()``: returns a ``Page`` object representing the user's userpage - ``get_talkpage()``: returns a ``Page`` object representing the user's talkpage Additional features ~~~~~~~~~~~~~~~~~~~ Not all aspects of the toolset are covered here. Explore `its code and docstrings`_ to learn how to use it in a more hands-on fashion. For reference, ``bot.wiki`` is an instance of ``earwigbot.wiki.SitesDB`` tied to the ``sites.db`` file in the bot's working directory. .. _Pywikipedia framework: http://pywikipediabot.sourceforge.net/ .. _its code and docstrings: https://github.com/earwig/earwigbot/tree/develop/earwigbot/wiki