예제 #1
0
def item(msg):
    """Look up a type by ID, including dogma information."""

    start = time.time()

    if not msg.args:
        return "usage: !esi {} <id>".format(msg.command)

    item_id = msg.args[0]

    try:
        int(item_id)
    except ValueError:
        return "get outta here hackerman"

    type_url = "{}/v3/universe/types/{}/".format(esi_base_url(msg), item_id)

    ret, res = do_request(type_url)

    reqs = _expand_dogma(res, *_get_dogma_urls(msg, res))

    return SNIPPET(
        content=json.dumps(res, sort_keys=True, indent=4),
        filename="{}.json".format(item_id),
        filetype="json",
        comment="Item {}: {} ({:,d} request{} in {:,.0f}ms)".format(
            item_id,
            res["name"] if ret == 200 else "Error",
            reqs + 1,
            "s" * int(reqs > 0),
            (time.time() - start) * 1000,
        ),
        title=type_url,
    )
예제 #2
0
def status(msg):
    """Return the current ESI health/status."""

    base_url = esi_base_url(msg)

    now = time.time()
    if now - STATUS[base_url]["timestamp"] > 60:
        code, esi_status = do_request("{}/status.json".format(base_url))
        if code == 200:
            STATUS[base_url]["status"] = esi_status
        else:
            return ":fire: (failed to fetch status.json)"

    attachments = []
    categories = [
        ("red", ":fire:", "danger"),
        ("yellow", ":fire_engine:", "warning"),
    ]
    status_json = STATUS[base_url]["status"]

    for status_color, emoji, color_value in categories:
        routes = [
            route for route in status_json if route["status"] == status_color
        ]
        if routes:
            attachments.append({
                "color":
                color_value,
                "fallback":
                "{}: {} out of {}, {:.2%}".format(
                    status_color.capitalize(),
                    len(routes),
                    len(status_json),
                    len(routes) / len(status_json),
                ),
                "text":
                "{emoji} {count} {emoji} {details}".format(
                    emoji=emoji * max(
                        min(int(round(len(routes) / len(status_json) * 10)),
                            5), 1),
                    count="{} {} (out of {}, {:.2%})".format(
                        len(routes),
                        status_color,
                        len(status_json),
                        len(routes) / len(status_json),
                    ),
                    details=_status_str(routes),
                )
            })

    if not attachments:
        attachments.append({
            "color": "good",
            "text": ":ok_hand:",
        })

    return REPLY(content=None, attachments=attachments)
예제 #3
0
def refresh(msg):
    """Refresh internal specs."""

    base_url = esi_base_url(msg)
    refreshed = do_refresh(base_url)
    if refreshed:
        return "I refreshed my internal copy of the {}{}{} spec{}{}".format(
            ", ".join(refreshed[:-1]),
            " and " * int(len(refreshed) > 1),
            refreshed[-1],
            "s" * int(len(refreshed) != 1),
            " for ESI China" * int(base_url == ESI_CHINA),
        )
    return "my internal specs are up to date (try again later)"
예제 #4
0
def _get_dogma_urls(msg, res):
    """Modify the item response to extract dogma urls."""

    dogma = res.pop("dogma_attributes", [])
    effects = res.pop("dogma_effects", [])
    base = esi_base_url(msg)

    attr_urls = {}  # url: attr
    for attr in dogma:
        url = "{}/v1/dogma/attributes/{}/".format(base, attr["attribute_id"])
        attr_urls[url] = attr

    effc_urls = {}  # url: effect
    for effect in effects:
        url = "{}/v1/dogma/effects/{}/".format(base, effect["effect_id"])
        effc_urls[url] = effect

    return attr_urls, effc_urls
예제 #5
0
def diff(msg):
    """Return a link to the ESI spec diffs page."""

    return "{}/diff/latest/dev/".format(esi_base_url(msg))
예제 #6
0
def webui(msg):
    """Return a link to the ui (v3)."""

    return "{}/ui/".format(esi_base_url(msg))
예제 #7
0
def request(match, msg):
    """Make an ESI GET request, if the path is known.

    Options:
        --headers    nest the response and add the headers
    """

    match_group = match.groupdict()

    if "evepc.163.com" in (match_group["esi"] or ""):
        base_url = ESI_CHINA
    else:
        base_url = esi_base_url(msg)

    version, *req_sections = match_group["esi_path"].split("/")
    if version not in ESI_SPECS[base_url]:
        req_sections.insert(0, version)
        version = "latest"

    params = ""
    if "?" in req_sections[-1]:
        if req_sections[-1].startswith("?"):
            params = req_sections.pop()
            params = params[1:]
        else:
            # qsparams passed w/out trailing slash
            final_path, params = req_sections.pop().split("?")
            req_sections.append(final_path)

    params = html.unescape(params)
    path = "/{}/".format("/".join(x for x in req_sections if x))
    if _valid_path(base_url, path, version):
        url = "{}/{}{}{}{}".format(
            base_url,
            version,
            path,
            "?" * int(params != ""),
            params,
        )
        start = time.time()
        res = do_request(url, return_response=True)

        try:
            content = res.json()
        except ValueError:
            content = res.text

        try:
            status = http.HTTPStatus(res.status_code)  # pylint: disable=E1120
        except ValueError:
            status = str(res.status_code)
        else:
            status = "{} {}".format(status.value, status.name)  # pylint: disable=E1101

        if "--headers" in msg.args:
            res = {"response": content, "headers": dict(res.headers)}
        else:
            res = content

        return SNIPPET(
            content=json.dumps(res, sort_keys=True, indent=4),
            filename="response.json",
            filetype="json",
            comment="{} ({:,.0f}ms)".format(
                status,
                (time.time() - start) * 1000,
            ),
            title=url,
        )

    return "failed to find GET {} in the {} ESI{} spec".format(
        path,
        version,
        " China" * int(base_url == ESI_CHINA),
    )