Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions user_scanner/user_scan/community/bambulab.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import urllib.parse
from user_scanner.core.helpers import get_random_user_agent
from user_scanner.core.orchestrator import Result, generic_validate

def validate_bambulab(user: str) -> Result:
encoded_user = urllib.parse.quote(user)
url = f"https://forum.bambulab.com/u/{encoded_user}.json"
show_url = f"https://forum.bambulab.com/u/{encoded_user}"

headers = {
"User-Agent": get_random_user_agent(),
"Accept": "application/json",
}

def process(response) -> Result:
if response.status_code == 404:
try:
data = response.json()
if (
data.get("error_type") == "not_found"
or any("not be found" in str(err).lower() for err in data.get("errors", []))
):
return Result.available(url=show_url)
except Exception:
pass
return Result.error("Discourse 404 response missing expected error payload")

if response.status_code == 200:
try:
data = response.json()
user_obj = data.get("user")
if user_obj and isinstance(user_obj, dict) and user_obj.get("username"):
extra: dict[str, str] = {}
media: dict[str, str] = {}

if user_obj.get("name"):
extra["name"] = str(user_obj["name"])
if user_obj.get("title"):
extra["title"] = str(user_obj["title"])
if user_obj.get("location"):
extra["location"] = str(user_obj["location"])
if user_obj.get("website_name") or user_obj.get("website"):
extra["website"] = str(user_obj.get("website") or user_obj.get("website_name"))
if user_obj.get("trust_level") is not None:
extra["trust_level"] = str(user_obj["trust_level"])
if user_obj.get("badge_count") is not None:
extra["badges"] = str(user_obj["badge_count"])
if user_obj.get("created_at"):
extra["joined"] = str(user_obj["created_at"])
if user_obj.get("bio_raw") or user_obj.get("bio_cooked"):
extra["bio"] = str(user_obj.get("bio_raw") or user_obj.get("bio_cooked"))

avatar_template = user_obj.get("avatar_template")
if avatar_template:
avatar_url = avatar_template.replace("{size}", "240")
if avatar_url.startswith("/"):
avatar_url = f"https://forum.bambulab.com{avatar_url}"
media["avatar"] = avatar_url

return Result.taken(url=show_url, extra=extra, media=media)
except Exception:
pass
return Result.error("Discourse 200 response missing valid user payload")

return Result.error(f"Unexpected status code: {response.status_code}")

return generic_validate(url, process, headers=headers, show_url=show_url, follow_redirects=True)
67 changes: 67 additions & 0 deletions user_scanner/user_scan/community/calculate_linux.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import urllib.parse
from user_scanner.core.helpers import get_random_user_agent
from user_scanner.core.orchestrator import Result, generic_validate

def validate_calculate_linux(user: str) -> Result:
encoded_user = urllib.parse.quote(user)
url = f"https://forum.calculate-linux.org/u/{encoded_user}.json"
show_url = f"https://forum.calculate-linux.org/u/{encoded_user}"

headers = {
"User-Agent": get_random_user_agent(),
"Accept": "application/json",
}

def process(response) -> Result:
if response.status_code == 404:
try:
data = response.json()
if (
data.get("error_type") == "not_found"
or any("not be found" in str(err).lower() for err in data.get("errors", []))
):
return Result.available(url=show_url)
except Exception:
pass
return Result.error("Discourse 404 response missing expected error payload")

if response.status_code == 200:
try:
data = response.json()
user_obj = data.get("user")
if user_obj and isinstance(user_obj, dict) and user_obj.get("username"):
extra: dict[str, str] = {}
media: dict[str, str] = {}

if user_obj.get("name"):
extra["name"] = str(user_obj["name"])
if user_obj.get("title"):
extra["title"] = str(user_obj["title"])
if user_obj.get("location"):
extra["location"] = str(user_obj["location"])
if user_obj.get("website_name") or user_obj.get("website"):
extra["website"] = str(user_obj.get("website") or user_obj.get("website_name"))
if user_obj.get("trust_level") is not None:
extra["trust_level"] = str(user_obj["trust_level"])
if user_obj.get("badge_count") is not None:
extra["badges"] = str(user_obj["badge_count"])
if user_obj.get("created_at"):
extra["joined"] = str(user_obj["created_at"])
if user_obj.get("bio_raw") or user_obj.get("bio_cooked"):
extra["bio"] = str(user_obj.get("bio_raw") or user_obj.get("bio_cooked"))

avatar_template = user_obj.get("avatar_template")
if avatar_template:
avatar_url = avatar_template.replace("{size}", "240")
if avatar_url.startswith("/"):
avatar_url = f"https://forum.calculate-linux.org{avatar_url}"
media["avatar"] = avatar_url

return Result.taken(url=show_url, extra=extra, media=media)
except Exception:
pass
return Result.error("Discourse 200 response missing valid user payload")

return Result.error(f"Unexpected status code: {response.status_code}")

return generic_validate(url, process, headers=headers, show_url=show_url, follow_redirects=True)
67 changes: 67 additions & 0 deletions user_scanner/user_scan/community/emacs_china.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import urllib.parse
from user_scanner.core.helpers import get_random_user_agent
from user_scanner.core.orchestrator import Result, generic_validate

def validate_emacs_china(user: str) -> Result:
encoded_user = urllib.parse.quote(user)
url = f"https://emacs-china.org/u/{encoded_user}.json"
show_url = f"https://emacs-china.org/u/{encoded_user}"

headers = {
"User-Agent": get_random_user_agent(),
"Accept": "application/json",
}

def process(response) -> Result:
if response.status_code == 404:
try:
data = response.json()
if (
data.get("error_type") == "not_found"
or any("not be found" in str(err).lower() for err in data.get("errors", []))
):
return Result.available(url=show_url)
except Exception:
pass
return Result.error("Discourse 404 response missing expected error payload")

if response.status_code == 200:
try:
data = response.json()
user_obj = data.get("user")
if user_obj and isinstance(user_obj, dict) and user_obj.get("username"):
extra: dict[str, str] = {}
media: dict[str, str] = {}

if user_obj.get("name"):
extra["name"] = str(user_obj["name"])
if user_obj.get("title"):
extra["title"] = str(user_obj["title"])
if user_obj.get("location"):
extra["location"] = str(user_obj["location"])
if user_obj.get("website_name") or user_obj.get("website"):
extra["website"] = str(user_obj.get("website") or user_obj.get("website_name"))
if user_obj.get("trust_level") is not None:
extra["trust_level"] = str(user_obj["trust_level"])
if user_obj.get("badge_count") is not None:
extra["badges"] = str(user_obj["badge_count"])
if user_obj.get("created_at"):
extra["joined"] = str(user_obj["created_at"])
if user_obj.get("bio_raw") or user_obj.get("bio_cooked"):
extra["bio"] = str(user_obj.get("bio_raw") or user_obj.get("bio_cooked"))

avatar_template = user_obj.get("avatar_template")
if avatar_template:
avatar_url = avatar_template.replace("{size}", "240")
if avatar_url.startswith("/"):
avatar_url = f"https://emacs-china.org{avatar_url}"
media["avatar"] = avatar_url

return Result.taken(url=show_url, extra=extra, media=media)
except Exception:
pass
return Result.error("Discourse 200 response missing valid user payload")

return Result.error(f"Unexpected status code: {response.status_code}")

return generic_validate(url, process, headers=headers, show_url=show_url, follow_redirects=True)
67 changes: 67 additions & 0 deletions user_scanner/user_scan/community/freifunk.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import urllib.parse
from user_scanner.core.helpers import get_random_user_agent
from user_scanner.core.orchestrator import Result, generic_validate

def validate_freifunk(user: str) -> Result:
encoded_user = urllib.parse.quote(user)
url = f"https://forum.freifunk.net/u/{encoded_user}.json"
show_url = f"https://forum.freifunk.net/u/{encoded_user}"

headers = {
"User-Agent": get_random_user_agent(),
"Accept": "application/json",
}

def process(response) -> Result:
if response.status_code == 404:
try:
data = response.json()
if (
data.get("error_type") == "not_found"
or any("not be found" in str(err).lower() for err in data.get("errors", []))
):
return Result.available(url=show_url)
except Exception:
pass
return Result.error("Discourse 404 response missing expected error payload")

if response.status_code == 200:
try:
data = response.json()
user_obj = data.get("user")
if user_obj and isinstance(user_obj, dict) and user_obj.get("username"):
extra: dict[str, str] = {}
media: dict[str, str] = {}

if user_obj.get("name"):
extra["name"] = str(user_obj["name"])
if user_obj.get("title"):
extra["title"] = str(user_obj["title"])
if user_obj.get("location"):
extra["location"] = str(user_obj["location"])
if user_obj.get("website_name") or user_obj.get("website"):
extra["website"] = str(user_obj.get("website") or user_obj.get("website_name"))
if user_obj.get("trust_level") is not None:
extra["trust_level"] = str(user_obj["trust_level"])
if user_obj.get("badge_count") is not None:
extra["badges"] = str(user_obj["badge_count"])
if user_obj.get("created_at"):
extra["joined"] = str(user_obj["created_at"])
if user_obj.get("bio_raw") or user_obj.get("bio_cooked"):
extra["bio"] = str(user_obj.get("bio_raw") or user_obj.get("bio_cooked"))

avatar_template = user_obj.get("avatar_template")
if avatar_template:
avatar_url = avatar_template.replace("{size}", "240")
if avatar_url.startswith("/"):
avatar_url = f"https://forum.freifunk.net{avatar_url}"
media["avatar"] = avatar_url

return Result.taken(url=show_url, extra=extra, media=media)
except Exception:
pass
return Result.error("Discourse 200 response missing valid user payload")

return Result.error(f"Unexpected status code: {response.status_code}")

return generic_validate(url, process, headers=headers, show_url=show_url, follow_redirects=True)
67 changes: 67 additions & 0 deletions user_scanner/user_scan/community/garudalinux.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import urllib.parse
from user_scanner.core.helpers import get_random_user_agent
from user_scanner.core.orchestrator import Result, generic_validate

def validate_garudalinux(user: str) -> Result:
encoded_user = urllib.parse.quote(user)
url = f"https://forum.garudalinux.org/u/{encoded_user}.json"
show_url = f"https://forum.garudalinux.org/u/{encoded_user}"

headers = {
"User-Agent": get_random_user_agent(),
"Accept": "application/json",
}

def process(response) -> Result:
if response.status_code == 404:
try:
data = response.json()
if (
data.get("error_type") == "not_found"
or any("not be found" in str(err).lower() for err in data.get("errors", []))
):
return Result.available(url=show_url)
except Exception:
pass
return Result.error("Discourse 404 response missing expected error payload")

if response.status_code == 200:
try:
data = response.json()
user_obj = data.get("user")
if user_obj and isinstance(user_obj, dict) and user_obj.get("username"):
extra: dict[str, str] = {}
media: dict[str, str] = {}

if user_obj.get("name"):
extra["name"] = str(user_obj["name"])
if user_obj.get("title"):
extra["title"] = str(user_obj["title"])
if user_obj.get("location"):
extra["location"] = str(user_obj["location"])
if user_obj.get("website_name") or user_obj.get("website"):
extra["website"] = str(user_obj.get("website") or user_obj.get("website_name"))
if user_obj.get("trust_level") is not None:
extra["trust_level"] = str(user_obj["trust_level"])
if user_obj.get("badge_count") is not None:
extra["badges"] = str(user_obj["badge_count"])
if user_obj.get("created_at"):
extra["joined"] = str(user_obj["created_at"])
if user_obj.get("bio_raw") or user_obj.get("bio_cooked"):
extra["bio"] = str(user_obj.get("bio_raw") or user_obj.get("bio_cooked"))

avatar_template = user_obj.get("avatar_template")
if avatar_template:
avatar_url = avatar_template.replace("{size}", "240")
if avatar_url.startswith("/"):
avatar_url = f"https://forum.garudalinux.org{avatar_url}"
media["avatar"] = avatar_url

return Result.taken(url=show_url, extra=extra, media=media)
except Exception:
pass
return Result.error("Discourse 200 response missing valid user payload")

return Result.error(f"Unexpected status code: {response.status_code}")

return generic_validate(url, process, headers=headers, show_url=show_url, follow_redirects=True)
Loading
Loading