import socket
import re
import os
import requests
import mimetypes
from bs4 import BeautifulSoup
from urllib.parse import urlparse

# IRC server and channel configuration
SERVER = "192.168.2.48"   # Example IRC server
PORT = 6667
NICK = "urlbot"
IDENT = "servicebot"
REALNAME = "URL Info Bot"
CHANNEL = "#main"

# Regex to detect URLs (http/https)
url_pattern = re.compile(r'(https?://\S+)')

def irc_connect():
    irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    irc.connect((SERVER, PORT))
    irc.send(f"NICK {NICK}\r\n".encode("utf-8"))
    irc.send(f"USER {IDENT} 0 * :{REALNAME}\r\n".encode("utf-8"))
    return irc

def join_channel(irc):
    irc.send(f"JOIN {CHANNEL}\r\n".encode("utf-8"))

def send_message(irc, message):
    irc.send(f"PRIVMSG {CHANNEL} :{message}\r\n".encode("utf-8"))

def fetch_title_and_description(url):

    title = None
    description = None
    ext = None
    mime = None
    my_mime = None

    path = urlparse(url).path
    _, ext = os.path.splitext(path)
    ext = ext.lstrip('.').lower() if ext else None
    
    try:
        headers = {"User-Agent": "Mozilla/5.0 (compatible; UrlInfoBot/1.0)"}
        resp = requests.get(url, headers=headers, timeout=10)
        resp.raise_for_status()

        soup = BeautifulSoup(resp.text, "html.parser")

        # Title
        title = soup.title.string.strip() if soup.title else "No title found"

        # Description
        desc_tag = soup.find("meta", attrs={"name": "description"})
        if desc_tag and desc_tag.get("content"):
            description = desc_tag["content"].strip()
        else:
            p_tag = soup.find("p")
            if p_tag:
                description = p_tag.get_text().strip()

        # MIME from HEAD
        try:
            head = requests.head(url, allow_redirects=True, timeout=5)
            mime = head.headers.get("Content-Type")
        except:
            mime = None

        # MIME from our robust detector
        try:
            my_mime = get_mime_type(url)
        except:
            my_mime = None

        return title, description, ext, mime, my_mime

    except Exception as e:
        return "Error fetching title", str(e)

def main():
    irc = irc_connect()
    join_channel(irc)

    while True:
        data = irc.recv(4096).decode("utf-8", errors="ignore")
        for line in data.split("\r\n"):
            if line.startswith("PING"):
                irc.send(f"PONG {line.split()[1]}\r\n".encode("utf-8"))
            else:
                urls = url_pattern.findall(line)
                for url in urls:
                   # if any(domain in url for domain in ["spotify.com", "deezer.com", "youtube.com", "youtu.be"]):
                        title, description, ext, mime, my_mime = fetch_title_and_description(url)
                        send_message(irc, f"URL: {url}")
                        send_message(irc, f"Title: {title}")
                        if ext:
                            send_message(irc, f"File Type: {ext}")
                        if my_mime:
                            send_message(irc, f"Mime Type: {my_mime}")
                        if description:
                            send_message(irc, f"Description: {description[:200]}")  # truncate for IRC

if __name__ == "__main__":
    main()
