A helper function that returns the OAuth2 URL for inviting the bot
    into servers.

    Parameters
    -----------
    client_id : str
        The client ID for your bot.
    permissions : :class:`Permissions`
        The permissions you're requesting. If not given then you won't be requesting any
        permissions.
    server : :class:`Server`
        The server to pre-select in the authorization screen, if available.
    redirect_uri : str
        An optional valid redirect URI.

def oauth_url(client_id, permissions=None, server=None, redirect_uri=None):
    """A helper function that returns the OAuth2 URL for inviting the bot
    into servers.

    Parameters
    -----------
    client_id : str
        The client ID for your bot.
    permissions : :class:`Permissions`
        The permissions you're requesting. If not given then you won't be requesting any
        permissions.
    server : :class:`Server`
        The server to pre-select in the authorization screen, if available.
    redirect_uri : str
        An optional valid redirect URI.
    """
    url = 'https://discordapp.com/oauth2/authorize?client_id={}&scope=bot'.format(client_id)
    if permissions is not None:
        url = url + '&permissions=' + str(permissions.value)
    if server is not None:
        url = url + "&guild_id=" + server.id
    if redirect_uri is not None:
        from urllib.parse import urlencode
        url = url + "&response_type=code&" + urlencode({'redirect_uri': redirect_uri})
    return url