///
import { Application, Router } from "https://deno.land/x/oak/mod.ts";
import { oakCors } from "https://deno.land/x/cors/mod.ts";
import { CookieStore, Session } from "https://deno.land/x/oak_sessions/mod.ts";
import data from "./data.json" with { type: "json" };
import routeStaticFilesFrom from "./util/routeStaticFilesFrom.ts";
import SteamAuth from "https://deno.land/x/deno_steam_openid@0.0.1/mod.ts";
import "https://deno.land/x/dotenv/load.ts";
type AppState = {
session: Session;
};
const router = new Router();
const hostname = "forums.warabi.co";
const authPath = "/auth";
const port = 8000;
export interface SteamUser {
steamid: string;
personaname: string;
profileurl: string;
avatar: string;
avatarmedium: string;
avatarfull: string;
personastate: number;
communityvisibilitystate: number;
profilestate: number;
lastlogoff: number;
commentpermission: number;
realname: string;
primaryclanid: string;
timecreated: number;
personastateflags: number;
loccountrycode: string;
locstatecode: string;
loccityid: number;
}
export const Steam = new SteamAuth({
realm: `https://${hostname}`,
returnUrl: `https://${hostname}${authPath}/return`,
apiKey: Deno.env.get("STEAM_API_KEY"),
});
router.get(`${authPath}/login`, async (ctx) => {
try {
const redirectUrl = await Steam.getRedirectUrl() as string;
ctx.response.body = { url: redirectUrl };
console.log("Redirecting to:", redirectUrl);
} catch (e) {
ctx.response.body = `Error: ${e}`;
}
});
router.get(`${authPath}/return`, async (ctx) => {
try {
console.log("Authenticating user...");
const user = await Steam.authenticate(ctx) as SteamUser;
console.log(user);
ctx.state.session.set("steamid", user.steamid);
ctx.state.session.set("user", user);
console.log("Authenticated user:", user);
ctx.response.redirect("/");
} catch (e) {
ctx.response.body = `Error: ${e}`;
}
});
router.get("/api/session", async (ctx) => {
if (ctx.state.session.has("user")) {
const user = await ctx.state.session.get("user") as SteamUser;
ctx.response.body = { user };
} else {
ctx.response.status = 401;
ctx.response.body = { error: "Not authenticated" };
}
});
router.get("/api/dinosaurs", (context) => {
context.response.body = data;
});
router.get("/api/dinosaurs/:dinosaur", (context) => {
if (!context?.params?.dinosaur) {
context.response.body = "No dinosaur name provided.";
}
const dinosaur = data.find((item) =>
item.name.toLowerCase() === context.params.dinosaur.toLowerCase()
);
context.response.body = dinosaur ? dinosaur : "No dinosaur found.";
});
const store = new CookieStore(Deno.env.get("SESSION_COOKIE_KEY") as string, {
sessionDataCookieName: "warbforums_sessionData"
});
const app = new Application();
app.use(oakCors());
app.use(Session.initMiddleware(store) as any);
app.use(router.routes());
app.use(router.allowedMethods());
app.use(routeStaticFilesFrom([
`${Deno.cwd()}/dist`,
`${Deno.cwd()}/public`,
]));
app.addEventListener("error", (evt) => {
console.log(evt.error);
});
await app.listen({ port: 8000 });