We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
FreeBSD [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)
sopel/config/core_section.py
#  python3.6 [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)
```
from sys import platform

if 'freebsd' in platform:
    certs = '/etc/ssl/cert.pem'

def _find_certs():
    certs = '/etc/pki/tls/cert.pem'
    if not os.path.isfile(certs):
        certs = '/etc/ssl/certs/ca-certificates.crt'
        if not os.path.isfile(certs):
            return None
    return certs

```
Seems like there is missing a good validation on what platform it is running on and where the certs are stored.
 

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `sopel/config/core_section.py`
Content:
```
1 # coding=utf-8
2 
3 from __future__ import unicode_literals, absolute_import, print_function, division
4 
5 import os.path
6 
7 from sopel.config.types import (
8     StaticSection, ValidatedAttribute, ListAttribute, ChoiceAttribute,
9     FilenameAttribute, NO_DEFAULT
10 )
11 from sopel.tools import Identifier
12 
13 
14 def _find_certs():
15     certs = '/etc/pki/tls/cert.pem'
16     if not os.path.isfile(certs):
17         certs = '/etc/ssl/certs/ca-certificates.crt'
18         if not os.path.isfile(certs):
19             return None
20     return certs
21 
22 
23 def configure(config):
24     config.core.configure_setting('nick', 'Enter the nickname for your bot.')
25     config.core.configure_setting('host', 'Enter the server to connect to.')
26     config.core.configure_setting('use_ssl', 'Should the bot connect with SSL?')
27     if config.core.use_ssl:
28         default_port = 6697
29     else:
30         default_port = 6667
31     config.core.configure_setting('port', 'Enter the port to connect on.',
32                                   default=default_port)
33     config.core.configure_setting(
34         'owner', "Enter your own IRC name (or that of the bot's owner)")
35     config.core.configure_setting(
36         'channels',
37         'Enter the channels to connect to at startup, separated by commas.'
38     )
39 
40 
41 class CoreSection(StaticSection):
42     """The config section used for configuring the bot itself."""
43     admins = ListAttribute('admins')
44     """The list of people (other than the owner) who can administer the bot"""
45 
46     admin_accounts = ListAttribute('admin_accounts')
47     """The list of accounts (other than the owner's) who can administer the bot.
48 
49     This should not be set for networks that do not support IRCv3 account
50     capabilities."""
51 
52     auth_method = ChoiceAttribute('auth_method', choices=[
53         'nickserv', 'authserv', 'Q', 'sasl', 'server'])
54     """The method to use to authenticate with the server.
55 
56     Can be ``nickserv``, ``authserv``, ``Q``, ``sasl``, or ``server``."""
57 
58     auth_password = ValidatedAttribute('auth_password')
59     """The password to use to authenticate with the server."""
60 
61     auth_target = ValidatedAttribute('auth_target')
62     """The user to use for nickserv authentication, or the SASL mechanism.
63 
64     May not apply, depending on ``auth_method``. Defaults to NickServ for
65     nickserv auth, and PLAIN for SASL auth."""
66 
67     auth_username = ValidatedAttribute('auth_username')
68     """The username/account to use to authenticate with the server.
69 
70     May not apply, depending on ``auth_method``."""
71 
72     bind_host = ValidatedAttribute('bind_host')
73     """Bind the connection to a specific IP"""
74 
75     ca_certs = FilenameAttribute('ca_certs', default=_find_certs())
76     """The path of the CA certs pem file"""
77 
78     channels = ListAttribute('channels')
79     """List of channels for the bot to join when it connects"""
80 
81     db_filename = ValidatedAttribute('db_filename')
82     """The filename for Sopel's database."""
83 
84     default_time_format = ValidatedAttribute('default_time_format',
85                                              default='%Y-%m-%d - %T%Z')
86     """The default format to use for time in messages."""
87 
88     default_timezone = ValidatedAttribute('default_timezone')
89     """The default timezone to use for time in messages."""
90 
91     enable = ListAttribute('enable')
92     """A whitelist of the only modules you want to enable."""
93 
94     exclude = ListAttribute('exclude')
95     """A list of modules which should not be loaded."""
96 
97     extra = ListAttribute('extra')
98     """A list of other directories you'd like to include modules from."""
99 
100     help_prefix = ValidatedAttribute('help_prefix', default='.')
101     """The prefix to use in help"""
102 
103     @property
104     def homedir(self):
105         """The directory in which various files are stored at runtime.
106 
107         By default, this is the same directory as the config. It can not be
108         changed at runtime.
109         """
110         return self._parent.homedir
111 
112     host = ValidatedAttribute('host', default='irc.dftba.net')
113     """The server to connect to."""
114 
115     host_blocks = ListAttribute('host_blocks')
116     """A list of hostmasks which Sopel should ignore.
117 
118     Regular expression syntax is used"""
119 
120     log_raw = ValidatedAttribute('log_raw', bool, default=True)
121     """Whether a log of raw lines as sent and recieved should be kept."""
122 
123     logdir = FilenameAttribute('logdir', directory=True, default='logs')
124     """Directory in which to place logs."""
125 
126     logging_channel = ValidatedAttribute('logging_channel', Identifier)
127     """The channel to send logging messages to."""
128 
129     logging_level = ChoiceAttribute('logging_level',
130                                     ['CRITICAL', 'ERROR', 'WARNING', 'INFO',
131                                      'DEBUG'],
132                                     'WARNING')
133     """The lowest severity of logs to display."""
134 
135     modes = ValidatedAttribute('modes', default='B')
136     """User modes to be set on connection."""
137 
138     name = ValidatedAttribute('name', default='Sopel: http://sopel.chat')
139     """The "real name" of your bot for WHOIS responses."""
140 
141     nick = ValidatedAttribute('nick', Identifier, default=Identifier('Sopel'))
142     """The nickname for the bot"""
143 
144     nick_blocks = ListAttribute('nick_blocks')
145     """A list of nicks which Sopel should ignore.
146 
147     Regular expression syntax is used."""
148 
149     not_configured = ValidatedAttribute('not_configured', bool, default=False)
150     """For package maintainers. Not used in normal configurations.
151 
152     This allows software packages to install a default config file, with this
153     set to true, so that the bot will not run until it has been properly
154     configured."""
155 
156     owner = ValidatedAttribute('owner', default=NO_DEFAULT)
157     """The IRC name of the owner of the bot."""
158 
159     owner_account = ValidatedAttribute('owner_account')
160     """The services account name of the owner of the bot.
161 
162     This should only be set on networks which support IRCv3 account
163     capabilities.
164     """
165 
166     pid_dir = FilenameAttribute('pid_dir', directory=True, default='.')
167     """The directory in which to put the file Sopel uses to track its process ID.
168 
169     You probably do not need to change this unless you're managing Sopel with
170     systemd or similar."""
171 
172     port = ValidatedAttribute('port', int, default=6667)
173     """The port to connect on."""
174 
175     prefix = ValidatedAttribute('prefix', default='\.')
176     """The prefix to add to the beginning of commands.
177 
178     It is a regular expression (so the default, ``\.``, means commands start
179     with a period), though using capturing groups will create problems."""
180 
181     reply_errors = ValidatedAttribute('reply_errors', bool, default=True)
182     """Whether to message the sender of a message that triggered an error with the exception."""
183 
184     throttle_join = ValidatedAttribute('throttle_join', int)
185     """Slow down the initial join of channels to prevent getting kicked.
186 
187     Sopel will only join this many channels at a time, sleeping for a second
188     between each batch. This is unnecessary on most networks."""
189 
190     timeout = ValidatedAttribute('timeout', int, default=120)
191     """The amount of time acceptable between pings before timing out."""
192 
193     use_ssl = ValidatedAttribute('use_ssl', bool, default=False)
194     """Whether to use a SSL secured connection."""
195 
196     user = ValidatedAttribute('user', default='sopel')
197     """The "user" for your bot (the part before the @ in the hostname)."""
198 
199     verify_ssl = ValidatedAttribute('verify_ssl', bool, default=True)
200     """Whether to require a trusted SSL certificate for SSL connections."""
201
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/sopel/config/core_section.py b/sopel/config/core_section.py
--- a/sopel/config/core_section.py
+++ b/sopel/config/core_section.py
@@ -12,12 +12,26 @@
 
 
 def _find_certs():
-    certs = '/etc/pki/tls/cert.pem'
-    if not os.path.isfile(certs):
-        certs = '/etc/ssl/certs/ca-certificates.crt'
-        if not os.path.isfile(certs):
-            return None
-    return certs
+    """
+    Find the TLS root CA store.
+
+    :returns: str (path to file)
+    """
+    # check if the root CA store is at a known location
+    locations = [
+        '/etc/pki/tls/cert.pem',  # best first guess
+        '/etc/ssl/certs/ca-certificates.crt',  # Debian
+        '/etc/ssl/cert.pem',  # FreeBSD base OpenSSL
+        '/usr/local/openssl/cert.pem',  # FreeBSD userland OpenSSL
+        '/etc/pki/tls/certs/ca-bundle.crt',  # RHEL 6 / Fedora
+        '/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem',  # RHEL 7 / CentOS
+        '/etc/pki/tls/cacert.pem',  # OpenELEC
+        '/etc/ssl/ca-bundle.pem',  # OpenSUSE
+        ]
+    for certs in locations:
+        if os.path.isfile(certs):
+            return certs
+    return None
 
 
 def configure(config):

{"golden_diff": "diff --git a/sopel/config/core_section.py b/sopel/config/core_section.py\n--- a/sopel/config/core_section.py\n+++ b/sopel/config/core_section.py\n@@ -12,12 +12,26 @@\n \n \n def _find_certs():\n-    certs = '/etc/pki/tls/cert.pem'\n-    if not os.path.isfile(certs):\n-        certs = '/etc/ssl/certs/ca-certificates.crt'\n-        if not os.path.isfile(certs):\n-            return None\n-    return certs\n+    \"\"\"\n+    Find the TLS root CA store.\n+\n+    :returns: str (path to file)\n+    \"\"\"\n+    # check if the root CA store is at a known location\n+    locations = [\n+        '/etc/pki/tls/cert.pem',  # best first guess\n+        '/etc/ssl/certs/ca-certificates.crt',  # Debian\n+        '/etc/ssl/cert.pem',  # FreeBSD base OpenSSL\n+        '/usr/local/openssl/cert.pem',  # FreeBSD userland OpenSSL\n+        '/etc/pki/tls/certs/ca-bundle.crt',  # RHEL 6 / Fedora\n+        '/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem',  # RHEL 7 / CentOS\n+        '/etc/pki/tls/cacert.pem',  # OpenELEC\n+        '/etc/ssl/ca-bundle.pem',  # OpenSUSE\n+        ]\n+    for certs in locations:\n+        if os.path.isfile(certs):\n+            return certs\n+    return None\n \n \n def configure(config):\n", "issue": "FreeBSD [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)\nsopel/config/core_section.py\r\n#  python3.6 [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)\r\n```\r\nfrom sys import platform\r\n\r\nif 'freebsd' in platform:\r\n    certs = '/etc/ssl/cert.pem'\r\n\r\ndef _find_certs():\r\n    certs = '/etc/pki/tls/cert.pem'\r\n    if not os.path.isfile(certs):\r\n        certs = '/etc/ssl/certs/ca-certificates.crt'\r\n        if not os.path.isfile(certs):\r\n            return None\r\n    return certs\r\n\r\n```\r\nSeems like there is missing a good validation on what platform it is running on and where the certs are stored.\r\n \n", "before_files": [{"content": "# coding=utf-8\n\nfrom __future__ import unicode_literals, absolute_import, print_function, division\n\nimport os.path\n\nfrom sopel.config.types import (\n    StaticSection, ValidatedAttribute, ListAttribute, ChoiceAttribute,\n    FilenameAttribute, NO_DEFAULT\n)\nfrom sopel.tools import Identifier\n\n\ndef _find_certs():\n    certs = '/etc/pki/tls/cert.pem'\n    if not os.path.isfile(certs):\n        certs = '/etc/ssl/certs/ca-certificates.crt'\n        if not os.path.isfile(certs):\n            return None\n    return certs\n\n\ndef configure(config):\n    config.core.configure_setting('nick', 'Enter the nickname for your bot.')\n    config.core.configure_setting('host', 'Enter the server to connect to.')\n    config.core.configure_setting('use_ssl', 'Should the bot connect with SSL?')\n    if config.core.use_ssl:\n        default_port = 6697\n    else:\n        default_port = 6667\n    config.core.configure_setting('port', 'Enter the port to connect on.',\n                                  default=default_port)\n    config.core.configure_setting(\n        'owner', \"Enter your own IRC name (or that of the bot's owner)\")\n    config.core.configure_setting(\n        'channels',\n        'Enter the channels to connect to at startup, separated by commas.'\n    )\n\n\nclass CoreSection(StaticSection):\n    \"\"\"The config section used for configuring the bot itself.\"\"\"\n    admins = ListAttribute('admins')\n    \"\"\"The list of people (other than the owner) who can administer the bot\"\"\"\n\n    admin_accounts = ListAttribute('admin_accounts')\n    \"\"\"The list of accounts (other than the owner's) who can administer the bot.\n\n    This should not be set for networks that do not support IRCv3 account\n    capabilities.\"\"\"\n\n    auth_method = ChoiceAttribute('auth_method', choices=[\n        'nickserv', 'authserv', 'Q', 'sasl', 'server'])\n    \"\"\"The method to use to authenticate with the server.\n\n    Can be ``nickserv``, ``authserv``, ``Q``, ``sasl``, or ``server``.\"\"\"\n\n    auth_password = ValidatedAttribute('auth_password')\n    \"\"\"The password to use to authenticate with the server.\"\"\"\n\n    auth_target = ValidatedAttribute('auth_target')\n    \"\"\"The user to use for nickserv authentication, or the SASL mechanism.\n\n    May not apply, depending on ``auth_method``. Defaults to NickServ for\n    nickserv auth, and PLAIN for SASL auth.\"\"\"\n\n    auth_username = ValidatedAttribute('auth_username')\n    \"\"\"The username/account to use to authenticate with the server.\n\n    May not apply, depending on ``auth_method``.\"\"\"\n\n    bind_host = ValidatedAttribute('bind_host')\n    \"\"\"Bind the connection to a specific IP\"\"\"\n\n    ca_certs = FilenameAttribute('ca_certs', default=_find_certs())\n    \"\"\"The path of the CA certs pem file\"\"\"\n\n    channels = ListAttribute('channels')\n    \"\"\"List of channels for the bot to join when it connects\"\"\"\n\n    db_filename = ValidatedAttribute('db_filename')\n    \"\"\"The filename for Sopel's database.\"\"\"\n\n    default_time_format = ValidatedAttribute('default_time_format',\n                                             default='%Y-%m-%d - %T%Z')\n    \"\"\"The default format to use for time in messages.\"\"\"\n\n    default_timezone = ValidatedAttribute('default_timezone')\n    \"\"\"The default timezone to use for time in messages.\"\"\"\n\n    enable = ListAttribute('enable')\n    \"\"\"A whitelist of the only modules you want to enable.\"\"\"\n\n    exclude = ListAttribute('exclude')\n    \"\"\"A list of modules which should not be loaded.\"\"\"\n\n    extra = ListAttribute('extra')\n    \"\"\"A list of other directories you'd like to include modules from.\"\"\"\n\n    help_prefix = ValidatedAttribute('help_prefix', default='.')\n    \"\"\"The prefix to use in help\"\"\"\n\n    @property\n    def homedir(self):\n        \"\"\"The directory in which various files are stored at runtime.\n\n        By default, this is the same directory as the config. It can not be\n        changed at runtime.\n        \"\"\"\n        return self._parent.homedir\n\n    host = ValidatedAttribute('host', default='irc.dftba.net')\n    \"\"\"The server to connect to.\"\"\"\n\n    host_blocks = ListAttribute('host_blocks')\n    \"\"\"A list of hostmasks which Sopel should ignore.\n\n    Regular expression syntax is used\"\"\"\n\n    log_raw = ValidatedAttribute('log_raw', bool, default=True)\n    \"\"\"Whether a log of raw lines as sent and recieved should be kept.\"\"\"\n\n    logdir = FilenameAttribute('logdir', directory=True, default='logs')\n    \"\"\"Directory in which to place logs.\"\"\"\n\n    logging_channel = ValidatedAttribute('logging_channel', Identifier)\n    \"\"\"The channel to send logging messages to.\"\"\"\n\n    logging_level = ChoiceAttribute('logging_level',\n                                    ['CRITICAL', 'ERROR', 'WARNING', 'INFO',\n                                     'DEBUG'],\n                                    'WARNING')\n    \"\"\"The lowest severity of logs to display.\"\"\"\n\n    modes = ValidatedAttribute('modes', default='B')\n    \"\"\"User modes to be set on connection.\"\"\"\n\n    name = ValidatedAttribute('name', default='Sopel: http://sopel.chat')\n    \"\"\"The \"real name\" of your bot for WHOIS responses.\"\"\"\n\n    nick = ValidatedAttribute('nick', Identifier, default=Identifier('Sopel'))\n    \"\"\"The nickname for the bot\"\"\"\n\n    nick_blocks = ListAttribute('nick_blocks')\n    \"\"\"A list of nicks which Sopel should ignore.\n\n    Regular expression syntax is used.\"\"\"\n\n    not_configured = ValidatedAttribute('not_configured', bool, default=False)\n    \"\"\"For package maintainers. Not used in normal configurations.\n\n    This allows software packages to install a default config file, with this\n    set to true, so that the bot will not run until it has been properly\n    configured.\"\"\"\n\n    owner = ValidatedAttribute('owner', default=NO_DEFAULT)\n    \"\"\"The IRC name of the owner of the bot.\"\"\"\n\n    owner_account = ValidatedAttribute('owner_account')\n    \"\"\"The services account name of the owner of the bot.\n\n    This should only be set on networks which support IRCv3 account\n    capabilities.\n    \"\"\"\n\n    pid_dir = FilenameAttribute('pid_dir', directory=True, default='.')\n    \"\"\"The directory in which to put the file Sopel uses to track its process ID.\n\n    You probably do not need to change this unless you're managing Sopel with\n    systemd or similar.\"\"\"\n\n    port = ValidatedAttribute('port', int, default=6667)\n    \"\"\"The port to connect on.\"\"\"\n\n    prefix = ValidatedAttribute('prefix', default='\\.')\n    \"\"\"The prefix to add to the beginning of commands.\n\n    It is a regular expression (so the default, ``\\.``, means commands start\n    with a period), though using capturing groups will create problems.\"\"\"\n\n    reply_errors = ValidatedAttribute('reply_errors', bool, default=True)\n    \"\"\"Whether to message the sender of a message that triggered an error with the exception.\"\"\"\n\n    throttle_join = ValidatedAttribute('throttle_join', int)\n    \"\"\"Slow down the initial join of channels to prevent getting kicked.\n\n    Sopel will only join this many channels at a time, sleeping for a second\n    between each batch. This is unnecessary on most networks.\"\"\"\n\n    timeout = ValidatedAttribute('timeout', int, default=120)\n    \"\"\"The amount of time acceptable between pings before timing out.\"\"\"\n\n    use_ssl = ValidatedAttribute('use_ssl', bool, default=False)\n    \"\"\"Whether to use a SSL secured connection.\"\"\"\n\n    user = ValidatedAttribute('user', default='sopel')\n    \"\"\"The \"user\" for your bot (the part before the @ in the hostname).\"\"\"\n\n    verify_ssl = ValidatedAttribute('verify_ssl', bool, default=True)\n    \"\"\"Whether to require a trusted SSL certificate for SSL connections.\"\"\"\n", "path": "sopel/config/core_section.py"}], "after_files": [{"content": "# coding=utf-8\n\nfrom __future__ import unicode_literals, absolute_import, print_function, division\n\nimport os.path\n\nfrom sopel.config.types import (\n    StaticSection, ValidatedAttribute, ListAttribute, ChoiceAttribute,\n    FilenameAttribute, NO_DEFAULT\n)\nfrom sopel.tools import Identifier\n\n\ndef _find_certs():\n    \"\"\"\n    Find the TLS root CA store.\n\n    :returns: str (path to file)\n    \"\"\"\n    # check if the root CA store is at a known location\n    locations = [\n        '/etc/pki/tls/cert.pem',  # best first guess\n        '/etc/ssl/certs/ca-certificates.crt',  # Debian\n        '/etc/ssl/cert.pem',  # FreeBSD base OpenSSL\n        '/usr/local/openssl/cert.pem',  # FreeBSD userland OpenSSL\n        '/etc/pki/tls/certs/ca-bundle.crt',  # RHEL 6 / Fedora\n        '/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem',  # RHEL 7 / CentOS\n        '/etc/pki/tls/cacert.pem',  # OpenELEC\n        '/etc/ssl/ca-bundle.pem',  # OpenSUSE\n        ]\n    for certs in locations:\n        if os.path.isfile(certs):\n            return certs\n    return None\n\n\ndef configure(config):\n    config.core.configure_setting('nick', 'Enter the nickname for your bot.')\n    config.core.configure_setting('host', 'Enter the server to connect to.')\n    config.core.configure_setting('use_ssl', 'Should the bot connect with SSL?')\n    if config.core.use_ssl:\n        default_port = 6697\n    else:\n        default_port = 6667\n    config.core.configure_setting('port', 'Enter the port to connect on.',\n                                  default=default_port)\n    config.core.configure_setting(\n        'owner', \"Enter your own IRC name (or that of the bot's owner)\")\n    config.core.configure_setting(\n        'channels',\n        'Enter the channels to connect to at startup, separated by commas.'\n    )\n\n\nclass CoreSection(StaticSection):\n    \"\"\"The config section used for configuring the bot itself.\"\"\"\n    admins = ListAttribute('admins')\n    \"\"\"The list of people (other than the owner) who can administer the bot\"\"\"\n\n    admin_accounts = ListAttribute('admin_accounts')\n    \"\"\"The list of accounts (other than the owner's) who can administer the bot.\n\n    This should not be set for networks that do not support IRCv3 account\n    capabilities.\"\"\"\n\n    auth_method = ChoiceAttribute('auth_method', choices=[\n        'nickserv', 'authserv', 'Q', 'sasl', 'server'])\n    \"\"\"The method to use to authenticate with the server.\n\n    Can be ``nickserv``, ``authserv``, ``Q``, ``sasl``, or ``server``.\"\"\"\n\n    auth_password = ValidatedAttribute('auth_password')\n    \"\"\"The password to use to authenticate with the server.\"\"\"\n\n    auth_target = ValidatedAttribute('auth_target')\n    \"\"\"The user to use for nickserv authentication, or the SASL mechanism.\n\n    May not apply, depending on ``auth_method``. Defaults to NickServ for\n    nickserv auth, and PLAIN for SASL auth.\"\"\"\n\n    auth_username = ValidatedAttribute('auth_username')\n    \"\"\"The username/account to use to authenticate with the server.\n\n    May not apply, depending on ``auth_method``.\"\"\"\n\n    bind_host = ValidatedAttribute('bind_host')\n    \"\"\"Bind the connection to a specific IP\"\"\"\n\n    ca_certs = FilenameAttribute('ca_certs', default=_find_certs())\n    \"\"\"The path of the CA certs pem file\"\"\"\n\n    channels = ListAttribute('channels')\n    \"\"\"List of channels for the bot to join when it connects\"\"\"\n\n    db_filename = ValidatedAttribute('db_filename')\n    \"\"\"The filename for Sopel's database.\"\"\"\n\n    default_time_format = ValidatedAttribute('default_time_format',\n                                             default='%Y-%m-%d - %T%Z')\n    \"\"\"The default format to use for time in messages.\"\"\"\n\n    default_timezone = ValidatedAttribute('default_timezone')\n    \"\"\"The default timezone to use for time in messages.\"\"\"\n\n    enable = ListAttribute('enable')\n    \"\"\"A whitelist of the only modules you want to enable.\"\"\"\n\n    exclude = ListAttribute('exclude')\n    \"\"\"A list of modules which should not be loaded.\"\"\"\n\n    extra = ListAttribute('extra')\n    \"\"\"A list of other directories you'd like to include modules from.\"\"\"\n\n    help_prefix = ValidatedAttribute('help_prefix', default='.')\n    \"\"\"The prefix to use in help\"\"\"\n\n    @property\n    def homedir(self):\n        \"\"\"The directory in which various files are stored at runtime.\n\n        By default, this is the same directory as the config. It can not be\n        changed at runtime.\n        \"\"\"\n        return self._parent.homedir\n\n    host = ValidatedAttribute('host', default='irc.dftba.net')\n    \"\"\"The server to connect to.\"\"\"\n\n    host_blocks = ListAttribute('host_blocks')\n    \"\"\"A list of hostmasks which Sopel should ignore.\n\n    Regular expression syntax is used\"\"\"\n\n    log_raw = ValidatedAttribute('log_raw', bool, default=True)\n    \"\"\"Whether a log of raw lines as sent and recieved should be kept.\"\"\"\n\n    logdir = FilenameAttribute('logdir', directory=True, default='logs')\n    \"\"\"Directory in which to place logs.\"\"\"\n\n    logging_channel = ValidatedAttribute('logging_channel', Identifier)\n    \"\"\"The channel to send logging messages to.\"\"\"\n\n    logging_level = ChoiceAttribute('logging_level',\n                                    ['CRITICAL', 'ERROR', 'WARNING', 'INFO',\n                                     'DEBUG'],\n                                    'WARNING')\n    \"\"\"The lowest severity of logs to display.\"\"\"\n\n    modes = ValidatedAttribute('modes', default='B')\n    \"\"\"User modes to be set on connection.\"\"\"\n\n    name = ValidatedAttribute('name', default='Sopel: http://sopel.chat')\n    \"\"\"The \"real name\" of your bot for WHOIS responses.\"\"\"\n\n    nick = ValidatedAttribute('nick', Identifier, default=Identifier('Sopel'))\n    \"\"\"The nickname for the bot\"\"\"\n\n    nick_blocks = ListAttribute('nick_blocks')\n    \"\"\"A list of nicks which Sopel should ignore.\n\n    Regular expression syntax is used.\"\"\"\n\n    not_configured = ValidatedAttribute('not_configured', bool, default=False)\n    \"\"\"For package maintainers. Not used in normal configurations.\n\n    This allows software packages to install a default config file, with this\n    set to true, so that the bot will not run until it has been properly\n    configured.\"\"\"\n\n    owner = ValidatedAttribute('owner', default=NO_DEFAULT)\n    \"\"\"The IRC name of the owner of the bot.\"\"\"\n\n    owner_account = ValidatedAttribute('owner_account')\n    \"\"\"The services account name of the owner of the bot.\n\n    This should only be set on networks which support IRCv3 account\n    capabilities.\n    \"\"\"\n\n    pid_dir = FilenameAttribute('pid_dir', directory=True, default='.')\n    \"\"\"The directory in which to put the file Sopel uses to track its process ID.\n\n    You probably do not need to change this unless you're managing Sopel with\n    systemd or similar.\"\"\"\n\n    port = ValidatedAttribute('port', int, default=6667)\n    \"\"\"The port to connect on.\"\"\"\n\n    prefix = ValidatedAttribute('prefix', default='\\.')\n    \"\"\"The prefix to add to the beginning of commands.\n\n    It is a regular expression (so the default, ``\\.``, means commands start\n    with a period), though using capturing groups will create problems.\"\"\"\n\n    reply_errors = ValidatedAttribute('reply_errors', bool, default=True)\n    \"\"\"Whether to message the sender of a message that triggered an error with the exception.\"\"\"\n\n    throttle_join = ValidatedAttribute('throttle_join', int)\n    \"\"\"Slow down the initial join of channels to prevent getting kicked.\n\n    Sopel will only join this many channels at a time, sleeping for a second\n    between each batch. This is unnecessary on most networks.\"\"\"\n\n    timeout = ValidatedAttribute('timeout', int, default=120)\n    \"\"\"The amount of time acceptable between pings before timing out.\"\"\"\n\n    use_ssl = ValidatedAttribute('use_ssl', bool, default=False)\n    \"\"\"Whether to use a SSL secured connection.\"\"\"\n\n    user = ValidatedAttribute('user', default='sopel')\n    \"\"\"The \"user\" for your bot (the part before the @ in the hostname).\"\"\"\n\n    verify_ssl = ValidatedAttribute('verify_ssl', bool, default=True)\n    \"\"\"Whether to require a trusted SSL certificate for SSL connections.\"\"\"\n", "path": "sopel/config/core_section.py"}]}