# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
+import os
+import os.path
import re
from datetime import datetime
from email.utils import format_datetime
+from pathlib import Path
+
+import fastapi
from fastapi import Request, HTTPException, Query
from fastapi.responses import JSONResponse
from fastapi.responses import PlainTextResponse
+from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
-import fastapi
import uvicorn
import requests
import validators
from fba.models import blocks
router = fastapi.FastAPI(docs_url=config.get("base_url") + "/docs", redoc_url=config.get("base_url") + "/redoc")
+router.mount(
+ "/static",
+ StaticFiles(directory=Path(__file__).parent.absolute() / "static"),
+ name="static",
+)
+
templates = Jinja2Templates(directory="templates")
@router.get(config.get("base_url") + "/api/info.json", response_class=JSONResponse)
@router.get(config.get("base_url") + "/api/scoreboard.json", response_class=JSONResponse)
def api_scoreboard(mode: str, amount: int):
- if amount > 500:
+ if amount > config.get("api_limit"):
raise HTTPException(status_code=400, detail="Too many results")
if mode == "blocked":
def api_index(request: Request, mode: str, value: str, amount: int):
if mode is None or value is None or amount is None:
raise HTTPException(status_code=500, detail="No filter specified")
- elif amount > 500:
+ elif amount > config.get("api_limit"):
raise HTTPException(status_code=500, detail=f"amount={amount} is to big")
domain = whildchar = punycode = reason = None
return templates.TemplateResponse("views/scoreboard.html", {
"base_url" : config.get("base_url"),
"slogan" : config.get("slogan"),
+ "theme" : config.get("theme"),
"request" : request,
"scoreboard": True,
"mode" : mode,
return templates.TemplateResponse("views/index.html", {
"request": request,
+ "theme" : config.get("theme"),
"info" : response.json()
})
@router.get(config.get("base_url") + "/top")
-def top(request: Request, mode: str, value: str, amount: int = 500):
+def top(request: Request, mode: str, value: str, amount: int = config.get("api_limit")):
response = requests.get(f"http://{config.get('host')}:{config.get('port')}{config.get('base_url')}/api/info.json")
if not response.ok:
raise HTTPException(status_code=response.status_code, detail=response.text)
elif mode == "" or value == "" or amount == 0:
raise HTTPException(status_code=500, detail="Parameter mode, value and amount must always be set")
- elif amount > 500:
+ elif amount > config.get("api_limit"):
raise HTTPException(status_code=500, detail=f"amount='{amount}' is to big")
info = response.json()
"found" : found,
"blocklist": blocklist,
"info" : info,
+ "theme" : config.get("theme"),
})
@router.get(config.get("base_url") + "/rss")