112 lines
3.4 KiB
Python
112 lines
3.4 KiB
Python
import logging
|
|
import socket
|
|
import ipinfo
|
|
import discord
|
|
|
|
from discord.ext import commands, flags
|
|
from ipwhois import Net
|
|
from ipwhois.asn import IPASN
|
|
from ipinfo.exceptions import RequestQuotaExceededError
|
|
from requests.exceptions import HTTPError
|
|
|
|
from app import TuxBot
|
|
from utils.functions.extra import ContextPlus, command_extra
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
class Network(commands.Cog, name="Useless"):
|
|
def __init__(self, bot: TuxBot):
|
|
self.bot = bot
|
|
|
|
@flags.add_flag(
|
|
"-i", "--ip", type=str, default="v4", choices=["v4", "4", "v6", "6"]
|
|
)
|
|
@command_extra(name="iplocalise", aliases=["localiseip"])
|
|
@commands.cooldown(1, 5, commands.BucketType.user)
|
|
async def _iplocalise(self, ctx: ContextPlus, target: str, **passed_flags):
|
|
loading = await ctx.send("_Récupération des informations..._", deletable=False)
|
|
|
|
def get_hostname(dtl, tgt):
|
|
try:
|
|
return dtl.hostname
|
|
except AttributeError:
|
|
try:
|
|
return socket.gethostbyaddr(tgt)[0]
|
|
except (ValueError, socket.herror):
|
|
return "N/A"
|
|
|
|
ip_type = passed_flags.get("ip")
|
|
target_copy = target
|
|
|
|
# clean https://, last /, ...
|
|
spltTgt = target.split("://")
|
|
target = (
|
|
spltTgt[(0, 1)[len(spltTgt) > 1]]
|
|
.split("?")[0]
|
|
.split("/")[0]
|
|
.split(":")[0]
|
|
.lower()
|
|
)
|
|
|
|
try:
|
|
target = socket.getaddrinfo(
|
|
target,
|
|
None,
|
|
socket.AF_INET if ip_type in ["v4", "4"] else socket.AF_INET6,
|
|
)[1][4][0]
|
|
except socket.gaierror:
|
|
return await ctx.send("Erreur, cette adresse n'est pas disponible.")
|
|
|
|
net = Net(target)
|
|
obj = IPASN(net)
|
|
ip_info = obj.lookup()
|
|
|
|
try:
|
|
handler = ipinfo.getHandler(self.bot.config.ipinfo)
|
|
details = handler.getDetails(target)
|
|
api_result = True
|
|
except (RequestQuotaExceededError, HTTPError):
|
|
details = None
|
|
api_result = False
|
|
|
|
if api_result:
|
|
belongs = f"{details.org}"
|
|
|
|
osm = (
|
|
f"https://www.openstreetmap.org/"
|
|
f"?mlat={details.latitude}"
|
|
f"&mlon={details.longitude}"
|
|
f"#map=5/{details.latitude}/{details.longitude}"
|
|
f"&layers=H"
|
|
)
|
|
|
|
region = (
|
|
f"[{details.city} - {details.region} " f"({details.country})]({osm})"
|
|
)
|
|
flag = f"https://www.countryflags.io/" f"{details.country}/shiny/64.png"
|
|
else:
|
|
belongs = f"{ip_info['asn_description']} (AS{ip_info['asn']})"
|
|
region = f"{ip_info['asn_country_code']}"
|
|
flag = (
|
|
f"https://www.countryflags.io/"
|
|
f"{ip_info['asn_country_code']}/shiny/64.png"
|
|
)
|
|
|
|
e = discord.Embed(
|
|
title=f"**Information sur __{target_copy}__ :**" f" `{target}`",
|
|
color=0x5858D7,
|
|
)
|
|
|
|
e.add_field(name="Appartient à :", value=belongs)
|
|
e.add_field(name="RIR :", value=f"{ip_info['asn_registry']}")
|
|
e.add_field(name="Region :", value=region)
|
|
|
|
e.add_field(
|
|
name="Nom de l'hôte :", value=get_hostname(details, target), inline=False
|
|
)
|
|
|
|
e.set_thumbnail(url=flag)
|
|
|
|
await loading.delete()
|
|
await ctx.send(embed=e)
|