This commit is contained in:
Waylon Walker 2023-06-14 09:02:50 -05:00
parent fa64c9aed1
commit 892a3c9a8a
No known key found for this signature in database
GPG key ID: 66E2BF2B4190EFE4
4 changed files with 94 additions and 14 deletions

View file

@ -101,14 +101,19 @@ async def websocket_endpoint_hero_echo(
):
config = get_config()
await websocket.accept()
last_heros = None
try:
with config.database.engine.connect() as con:
while True:
data = await websocket.receive_text()
hero = HeroUpdate.parse_raw(data)
heros = con.execute("SELECT * FROM hero").fetchall()
heros = Heros.parse_obj({"heros": heros})
# heros = con.execute("SELECT * FROM hero").fetchall()
# heros = Heros.parse_obj({"heros": heros})
heros = Heros.list(session=session)
if heros != last_heros:
await manager.broadcast(heros.json(), "heros")
last_heros = heros
hero.update(session=session)
console.print(heros)
await websocket.send_text(heros.json())
@ -119,21 +124,28 @@ async def websocket_endpoint_hero_echo(
print("connection closed")
@web_socket_router.websocket("/ws-hero-update")
async def websocket_endpoint_hero_update(
@web_socket_router.websocket("/ws-heros'")
async def websocket_endpoint_heros(
websocket: WebSocket,
session: Session = Depends(get_session),
):
await manager.connect(websocket, "heros")
await websocket.accept()
try:
while True:
data = await websocket.receive_text()
hero = HeroUpdate.parse_raw(data)
print(hero)
hero.update(session=session)
print("hero is updated")
...
# data = await websocket.receive_text()
# hero = HeroUpdate.parse_raw(data)
# heros = con.execute("SELECT * FROM hero").fetchall()
# heros = Heros.parse_obj({"heros": heros})
# hero.update(session=session)
# console.print(heros)
# await websocket.send_text(heros.json())
except WebSocketDisconnect:
print("disconnected")
manager.disconnect(websocket, "heros")
except ConnectionClosed:
manager.disconnect(websocket, "heros")
print("connection closed")

View file

@ -4,6 +4,7 @@ from typer.main import get_group
from learn_sql_model.cli.api import api_app
from learn_sql_model.cli.config import config_app
from learn_sql_model.cli.dashboard import dashboard_app
from learn_sql_model.cli.hero import hero_app
from learn_sql_model.cli.model import model_app
from learn_sql_model.game.game import game_app
@ -18,6 +19,7 @@ app.add_typer(model_app, name="model")
app.add_typer(api_app, name="api")
app.add_typer(hero_app, name="hero")
app.add_typer(game_app, name="game")
app.add_typer(dashboard_app, name="dashboard")
def version_callback(value: bool) -> None:

View file

@ -0,0 +1,65 @@
from textual.app import App, ComposeResult
from textual.containers import ScrollableContainer
from textual.widgets import Footer, Header, Static
import typer
from learn_sql_model.cli.common import verbose_callback
from learn_sql_model.models.hero import Heros
dashboard_app = typer.Typer()
@dashboard_app.callback()
def config(
verbose: bool = typer.Option(
False,
callback=verbose_callback,
help="show the log messages",
),
):
"dashboard cli"
class HeroName(Static):
"""A stopwatch widget."""
class DashboardApp(App):
"""A Textual app to manage stopwatches."""
BINDINGS = [("d", "toggle_dark", "Toggle dark mode")]
def compose(self) -> ComposeResult:
"""Create child widgets for the app."""
yield Header()
yield Footer()
yield ScrollableContainer(*[HeroName(hero.name) for hero in Heros.list().heros])
@property
def ws(self):
def connect():
self._ws = create_connection(
f"ws://{config.api_client.url.replace('https://', '')}/ws-heros"
)
if not hasattr(self, "_ws"):
connect()
if not self._ws.connected:
connect()
return self._ws
def action_toggle_dark(self) -> None:
"""An action to toggle dark mode."""
self.dark = not self.dark
@dashboard_app.command()
def run(
verbose: bool = typer.Option(
False,
callback=verbose_callback,
help="show the log messages",
),
):
app = DashboardApp()
app.run()

View file

@ -5,7 +5,7 @@ import httpx
from pydantic import BaseModel
from sqlmodel import Field, Relationship, SQLModel, Session, select
from learn_sql_model.config import config, get_config
from learn_sql_model.config import config
from learn_sql_model.models.pet import Pet
@ -79,10 +79,11 @@ class Heros(BaseModel):
return Heros(heros=heros)
if session is None:
engine = get_config().database.engine
with Session(engine) as session:
heros = get_heros(session, where, offset, limit)
return heros
r = httpx.get(f"{config.api_client.url}/heros/")
if r.status_code != 200:
raise RuntimeError(f"{r.status_code}:\n {r.text}")
return Heros.parse_obj(r.json())
return get_heros(session, where, offset, limit)