From 1f3e4955cbb3d51869cd6b15797ab597e4d4b746 Mon Sep 17 00:00:00 2001 From: nexy7574 Date: Tue, 9 Jan 2024 16:26:18 +0000 Subject: [PATCH] Start web server integration (incomplete) --- requirements.txt | 4 +++ src/conf.py | 8 ++++++ src/web.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 src/web.py diff --git a/requirements.txt b/requirements.txt index 3634cc9..6886938 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,3 +11,7 @@ selenium==4.16 rich==13.7 dnspython==2.4.2 aiosqlite==0.19.0 +fastapi==0.108.0 +uvicorn==0.25.0 +psutil==5.9.7 +pydantic==2.5.3 diff --git a/src/conf.py b/src/conf.py index 8cef6c8..aee0f08 100644 --- a/src/conf.py +++ b/src/conf.py @@ -7,6 +7,14 @@ try: CONFIG.setdefault("logging", {}) CONFIG.setdefault("jimmy", {}) CONFIG.setdefault("ollama", {}) + CONFIG.setdefault( + "server", + { + "host": "0.0.0.0", + "port": 8080, + "channel": 1032974266527907901 + } + ) except FileNotFoundError: cwd = Path.cwd() logging.getLogger("jimmy.autoconf").critical("Unable to locate config.toml in %s.", cwd, exc_info=True) diff --git a/src/web.py b/src/web.py new file mode 100644 index 0000000..e953665 --- /dev/null +++ b/src/web.py @@ -0,0 +1,71 @@ +import asyncio +import logging +import psutil +import time +import pydantic +from typing import Optional, Any +from conf import CONFIG + +from fastapi import FastAPI, HTTPException, status + +class BridgeResponse(pydantic.BaseModel): + status: str + pages: list[str] + + +class BridgePayload(pydantic.BaseModel): + secret: str + message: str + sender: str + + +class MessagePayload(pydantic.BaseModel): + class MessageAttachmentPayload(pydantic.BaseModel): + url: str + proxy_url: str + filename: str + size: int + width: Optional[int] = None + height: Optional[int] = None + content_type: str + ATTACHMENT: Optional[Any] = None + + event_type: Optional[str] = "create" + message_id: int + author: str + is_automated: bool = False + avatar: str + content: str + clean_content: str + at: float + attachments: list[MessageAttachmentPayload] = [] + reply_to: Optional["MessagePayload"] = None + + +app = FastAPI( + title="JimmyAPI", + version="2.0.0a1" +) +log = logging.getLogger("jimmy.web.api") +app.state.bot = None +app.state.bridge_lock = asyncio.Lock() + + +@app.get("/ping") +def ping(): + """Checks the bot is online and provides some uptime information""" + if not app.state.bot: + raise HTTPException(status.HTTP_503_SERVICE_UNAVAILABLE) + return { + "ping": "pong", + "online": app.state.bot.is_ready(), + "latency": max(round(app.state.bot.latency, 2), 0.01), + "uptime": round(time.time() - psutil.Process().create_time()), + "uptime.sys": time.time() - psutil.boot_time() + } + + +@app.post("/bridge", status_code=201) +async def bridge_post_send_message(body: BridgePayload): + """Sends a message FROM matrix TO discord.""" + raise HTTPException(status.HTTP_503_SERVICE_UNAVAILABLE)