Source code for sans

# MIT License

# Copyright (c) 2018 - 2023

# 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 __future__ import annotations

import sys as _sys
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from typing_extensions import Literal

from .auth import *
from .client import *
from .errors import *
from .limiter import RateLimiter as RateLimiter, TelegramLimiter as TelegramLimiter
from .response import *
from .url import *
from .utils import *

if _sys.version_info < (3, 8):
    from importlib_metadata import metadata as _metadata
else:
    from importlib.metadata import metadata as _metadata

__copyright__ = "Copyright 2019-2023 Zephyrkul"

_meta = _metadata(__name__)
__title__ = _meta["Name"]
__author__ = _meta["Author"]
__license__ = _meta["License"]
__version__ = _meta["Version"]


del annotations, _sys, TYPE_CHECKING, _metadata, _meta  # not for export


def set_agent(new_agent: str, *, _force: Literal[False] = False) -> str:
    """
    Sets sans' User-Agent header.

    Parameters
    ----------
    agent: str
        The User-Agent header to use.
        Your nation name and a method of contact, like an email address, are recommended.
        Some script info will be appended automatically.
    _force: bool
        Forcibly override the User-Agent header even after it's already been set.
        Not recommended: https://www.nationstates.net/pages/api.html#terms

    Returns
    -------
    The actual newly set agent, including attached additional script information.
    """

    if RateLimiter._agent and not _force:
        raise RuntimeError("Agent cannot be re-set")
    if not new_agent:
        RateLimiter._agent = ""
    else:
        import sys

        import httpx

        RateLimiter._agent = (
            f"{new_agent} Python/{sys.version_info[0]}.{sys.version_info[1]} "
            f"httpx/{httpx.__version__} sans/{__version__}"
        )
    return RateLimiter._agent


def deferred() -> float | None:
    """
    Returns when the internal ratelimiting lock is scheduled to be
    released in seconds from now, or None if the lock isn't deferred.

    Note that this is only the *schedule* - the value could be
    0.0 or even negative if the deferring thread falls behind.
    """
    return RateLimiter._lock.deferred


def locked() -> bool:
    """
    Returns when the internal ratelimiting lock is locked.
    """
    return RateLimiter._lock.locked()


for obj in list(globals().values()):
    if getattr(obj, "__module__", "").startswith(__name__):
        obj.__module__ = __name__
del obj  # type: ignore