Skip to content

Commit

Permalink
more refactoring into apps & usecases, code cleaup
Browse files Browse the repository at this point in the history
  • Loading branch information
cmyui committed Apr 18, 2022
1 parent 3a91f22 commit f222511
Show file tree
Hide file tree
Showing 21 changed files with 465 additions and 456 deletions.
44 changes: 27 additions & 17 deletions app/api/domains/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import app.packets
import app.repositories.beatmaps
import app.repositories.clans
import app.repositories.mappools
import app.repositories.players
import app.repositories.scores
Expand Down Expand Up @@ -74,6 +75,7 @@
DATETIME_OFFSET = 0x89F7FF5F7B58000


# TODO: probably refactor these into something better, like responses.py
def format_clan_basic(clan: Clan) -> dict[str, object]:
return {
"id": clan.id,
Expand All @@ -83,16 +85,6 @@ def format_clan_basic(clan: Clan) -> dict[str, object]:
}


def format_player_basic(p: Player) -> dict[str, object]:
return {
"id": p.id,
"name": p.name,
"country": p.geoloc["country"]["acronym"],
"clan": format_clan_basic(p.clan) if p.clan else None,
"online": p.online,
}


def format_map_basic(m: Beatmap) -> dict[str, object]:
return {
"id": m.id,
Expand Down Expand Up @@ -402,15 +394,20 @@ async def api_get_player_scores(
bmap = await app.repositories.beatmaps.fetch_by_md5(row.pop("map_md5"))
row["beatmap"] = bmap.as_dict if bmap else None

if player.clan_id is not None:
clan = await app.repositories.clans.fetch_by_id(player.clan_id)
else:
clan = None

player_info = {
"id": player.id,
"name": player.name,
"clan": {
"id": player.clan.id,
"name": player.clan.name,
"tag": player.clan.tag,
"id": clan.id,
"name": clan.name,
"tag": clan.tag,
}
if player.clan
if clan
else None,
}

Expand Down Expand Up @@ -865,7 +862,8 @@ async def api_get_clan(

# TODO: fetching by name & tag (requires safe_name, safe_tag)

if not (clan := app.state.sessions.clans.get(id=clan_id)):
clan = await app.repositories.clans.fetch_by_id(clan_id)
if clan is None:
return ORJSONResponse(
{"status": "Clan not found."},
status_code=status.HTTP_404_NOT_FOUND,
Expand Down Expand Up @@ -920,15 +918,27 @@ async def api_get_pool(
status_code=status.HTTP_404_NOT_FOUND,
)

pool_creator = await app.repositories.players.fetch(id=pool.creator_id)
pool_creator = await app.repositories.players.fetch(id=pool.created_by)
assert pool_creator is not None

if pool_creator.clan_id is not None:
clan = await app.repositories.clans.fetch_by_id(pool_creator.clan_id)
assert clan is not None
else:
clan = None

return ORJSONResponse(
{
"id": pool.id,
"name": pool.name,
"created_at": pool.created_at,
"created_by": format_player_basic(pool_creator),
"created_by": {
"id": pool_creator.id,
"name": pool_creator.name,
"country": pool_creator.geoloc["country"]["acronym"],
"clan": format_clan_basic(clan) if clan else None,
"online": pool_creator.online,
},
"maps": {
f"{mods!r}{slot}": format_map_basic(bmap)
for (mods, slot), bmap in pool.maps.items()
Expand Down
4 changes: 2 additions & 2 deletions app/api/domains/cho.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@
from app.logging import Ansi
from app.logging import log
from app.logging import magnitude_fmt_time
from app.objects.channel import Channel
from app.objects.match import Match
from app.objects.match import MatchTeams
from app.objects.match import MatchTeamTypes
Expand Down Expand Up @@ -1128,7 +1127,8 @@ async def handle(self, p: Player) -> None:
resp_msg = "Could not find map."

# time out their previous /np
p.last_np["timeout"] = 0.0
if p.last_np is not None:
p.last_np["timeout"] = 0.0

app.usecases.players.send(p, resp_msg, sender=t)

Expand Down
31 changes: 23 additions & 8 deletions app/api/domains/osu.py
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,10 @@ async def lastfm_handler(
admin=app.state.sessions.bot,
reason=f"hq!osu running ({flags})",
)

if player.online: # refresh their client state
app.usecases.players.logout(player)

return b"-3"

if flags & LastFMFlags.REGISTRY_EDITS:
Expand All @@ -269,6 +273,9 @@ async def lastfm_handler(
admin=app.state.sessions.bot,
reason="hq!osu relife 1/32",
)

if player.online: # refresh their client state
app.usecases.players.logout(player)
return b"-3"

# TODO: make a tool to remove the flags & send this as a dm.
Expand Down Expand Up @@ -444,10 +451,14 @@ async def submit_score(
stacktrace = app.utils.get_appropriate_stacktrace()
await app.state.services.log_strange_occurrence(stacktrace)

# await player.restrict(
# await app.usecases.players.restrict(
# player=player,
# admin=app.state.sessions.bot,
# reason="TODO",
# )

# if player.online: # refresh their client state
# app.usecases.players.logout(player)
# return b"error: ban"
except:
raise
Expand Down Expand Up @@ -515,10 +526,14 @@ async def submit_score(
pp_cap = app.app.settings.AUTOBAN_PP[score.mode][score.mods & Mods.FLASHLIGHT != 0]
if score.pp > pp_cap:
await player.restrict(
await app.usecases.players.restrict(
player=player,
admin=app.state.sessions.bot,
reason=f"[{score.mode!r} {score.mods!r}] autoban @ {score.pp:.2f}pp",
)
if player.online: # refresh their client state
app.usecases.players.logout(player)
"""

""" Score submission checks completed; submit the score. """
Expand Down Expand Up @@ -648,6 +663,9 @@ async def submit_score(
admin=app.state.sessions.bot,
reason="submitted score with no replay",
)

if player.online: # refresh their client state
app.usecases.players.logout(player)
else:
# TODO: the replay is currently sent from the osu!
# client compressed with LZMA; this compression can
Expand Down Expand Up @@ -796,8 +814,6 @@ async def submit_score(

# update their recent score
player.recent_scores[score.mode] = score
if "recent_score" in player.__dict__:
del player.recent_score # wipe cached_property

""" score submission charts """

Expand Down Expand Up @@ -847,7 +863,6 @@ async def submit_score(
chart_entry("accuracy", None, round(score.acc, 2)),
chart_entry("pp", None, score.pp),
)
import dataclasses

overall_ranking_chart_entries = (
chart_entry("rank", prev_stats.rank, stats.rank),
Expand All @@ -868,7 +883,7 @@ async def submit_score(
"\n",
# beatmap ranking chart
"chartId:beatmap",
f"chartUrl:{beatmap.set.url}",
f"chartUrl:https://osu.{app.settings.DOMAIN}/beatmapsets/{beatmap.set_id}"
"chartName:Beatmap Ranking",
*beatmap_ranking_chart_entries,
f"onlineScoreId:{score.id}",
Expand Down Expand Up @@ -918,7 +933,7 @@ async def post_beatmap_rating(
if rating is None:
# check if we have the map in our cache;
# if not, the map probably doesn't exist.
beatmap = app.repositories.beatmaps._fetch_by_key_cache("md5", map_md5)
beatmap = app.repositories.beatmaps._fetch_by_key_cache(map_md5)
if beatmap is None:
return b"no exist"

Expand Down Expand Up @@ -1184,7 +1199,7 @@ async def get_beatmap_leaderboard(
response_lines.append(
SCORE_LISTING_FMTSTR.format(
**personal_best_score_row,
name=player.full_name,
name=player.name,
userid=player.id,
score=int(personal_best_score_row["_score"]),
has_replay="1",
Expand Down
4 changes: 4 additions & 0 deletions app/api/init_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@ def init_events(asgi_app: FastAPI) -> None:

@asgi_app.on_event("startup")
async def on_startup() -> None:
import os

print("TEST:", os.environ.get("TEST"))

This comment has been minimized.

Copy link
@cmyui

cmyui Apr 18, 2022

Author Member

oops


app.state.loop = asyncio.get_running_loop()

if os.geteuid() == 0:
Expand Down
Loading

0 comments on commit f222511

Please sign in to comment.