Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion config/config.example.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[server.log]
level = "info" #crit, error, warning, info, debug
level = "info" # crit, error, warning, info, debug
# file = "/var/log/diadem.log"

[server.golbat]
Expand Down
13 changes: 13 additions & 0 deletions src/hooks.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,19 @@ import type { User } from "@/lib/server/db/internal/schema";
import { DISCORD_REFRESH_INTERVAL, PERMISSION_UPDATE_INTERVAL } from "@/lib/constants";
import { getDiscordAuth } from "@/lib/server/auth/discord";
import type { Perms } from "@/lib/utils/features";
import { getServerLogger } from "@/lib/server/logging";
import { setServerLoggerFactory } from "@/lib/utils/logger";
import { getServerConfig } from "@/lib/services/config/config.server";

setServerLoggerFactory((name) => {
const winstonLogger = getServerLogger(name);
return {
debug: (message, ...args) => winstonLogger.debug(message, ...args),
info: (message, ...args) => winstonLogger.info(message, ...args),
warning: (message, ...args) => winstonLogger.warning(message, ...args),
error: (message, ...args) => winstonLogger.error(message, ...args),
};
});

const permissionCache: TTLCache<string, undefined> = new TTLCache({
ttl: PERMISSION_UPDATE_INTERVAL * 1000
Expand Down
12 changes: 6 additions & 6 deletions src/lib/server/api/golbatApi.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { getServerConfig } from "@/lib/services/config/config.server";
import type { PokemonData } from "@/lib/types/mapObjectData/pokemon";
import { getLogger } from "@/lib/server/logging";
import type { Coords } from "@/lib/utils/coordinates";
import type { GymData } from "@/lib/types/mapObjectData/gym";
import { getLogger } from "@/lib/utils/logger";

export type PokemonResponse = {
pokemon: PokemonData[];
Expand Down Expand Up @@ -52,11 +52,11 @@ async function callGolbat<T>(
}

export async function getSinglePokemon(id: string, thisFetch: typeof fetch = fetch) {
return await callGolbat<PokemonData>("api/pokemon/id/" + id, "GET", undefined, thisFetch)
return await callGolbat<PokemonData>("api/pokemon/id/" + id, "GET", undefined, thisFetch);
}

export async function getMultiplePokemon(body: any) {
return await callGolbat<PokemonResponse>("api/pokemon/v3/scan", "POST", JSON.stringify(body))
return await callGolbat<PokemonResponse>("api/pokemon/v3/scan", "POST", JSON.stringify(body));
}

export async function searchGyms(query: string, coords: Coords, range: number) {
Expand All @@ -71,6 +71,6 @@ export async function searchGyms(query: string, coords: Coords, range: number) {
}
],
limit: 15
}
return await callGolbat<GymData[]>("api/gym/search", "POST", JSON.stringify(body))
}
};
return await callGolbat<GymData[]>("api/gym/search", "POST", JSON.stringify(body));
}
27 changes: 14 additions & 13 deletions src/lib/server/api/kojiApi.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,32 @@
import { getServerConfig } from '@/lib/services/config/config.server';
import { getLogger } from '@/lib/server/logging';
import { error, json } from "@sveltejs/kit";
import { getServerConfig } from "@/lib/services/config/config.server";
import type { KojiFeatures } from "@/lib/features/koji";
import { getLogger } from "@/lib/utils/logger";

const log = getLogger("koji")
const log = getLogger("koji");

export async function fetchKojiGeofences(thisFetch?: typeof fetch): Promise<KojiFeatures | undefined> {
export async function fetchKojiGeofences(
thisFetch?: typeof fetch
): Promise<KojiFeatures | undefined> {
const config = getServerConfig();
if (!config.koji || !config.koji.url) {
log.warning("Koji was called, but is not configured")
return
log.warning("Koji was called, but is not configured");
return;
}

const url = config.koji.url + '/api/v1/geofence/FeatureCollection/' + config.koji.projectName;
const url = config.koji.url + "/api/v1/geofence/FeatureCollection/" + config.koji.projectName;
const response = await (thisFetch ?? fetch)(url, {
method: 'GET',
method: "GET",
headers: {
Authorization: `Bearer ${config.koji.secret}`,
'Content-Type': 'application/json'
"Content-Type": "application/json"
}
});

if (!response.ok) {
log.error("Koji Error: %d (%s)", response.status, await response.text())
return
log.error("Koji Error: %d (%s)", response.status, await response.text());
return;
}

const data = await response.json();
return data?.data?.features ?? [] as KojiFeatures
return data?.data?.features ?? ([] as KojiFeatures);
}
2 changes: 1 addition & 1 deletion src/lib/server/auth/permissions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import { getServerConfig } from "@/lib/services/config/config.server";
import type { Permissions as ConfigRule } from "@/lib/services/config/configTypes";
import { type KojiFeatures } from "@/lib/features/koji";
import { fetchKojiGeofences } from "@/lib/server/api/kojiApi";
import { getLogger } from "@/lib/server/logging";
import type { FeaturesKey, PermArea, Perms } from "@/lib/utils/features";
import { getLogger } from "@/lib/utils/logger";

const log = getLogger("permissions");

Expand Down
16 changes: 8 additions & 8 deletions src/lib/server/db/external/internalQuery.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import mysql from 'mysql2/promise';
import { getServerConfig } from '@/lib/services/config/config.server';
import { getDbUri } from '@/lib/services/config/dbUri.server';
import { getLogger } from '@/lib/server/logging';
import mysql from "mysql2/promise";
import { getServerConfig } from "@/lib/services/config/config.server";
import { getDbUri } from "@/lib/services/config/dbUri.server";
import { getLogger } from "@/lib/utils/logger";

const log = getLogger("query")
const log = getLogger("query");

const connection = mysql.createPool(getDbUri(getServerConfig().db));

Expand All @@ -14,7 +14,7 @@ export async function query<T>(
error: number | undefined;
result: T;
}> {
const start = performance.now()
const start = performance.now();
let result: mysql.QueryResult = [];
let error: number | undefined = undefined;

Expand All @@ -28,7 +28,7 @@ export async function query<T>(
);
result = queryResult[0];
} catch (e) {
log.error('SQL exception', e);
log.error("SQL exception", e);
error = 500;
}

Expand Down Expand Up @@ -61,7 +61,7 @@ export async function query<T>(
}
}

log.debug(`Query took %fms: %s`, (performance.now() - start).toFixed(1), sql)
log.debug(`Query took %fms: %s`, (performance.now() - start).toFixed(1), sql);
return {
error,
result: parsedResult
Expand Down
2 changes: 1 addition & 1 deletion src/lib/server/logging.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,6 @@ if (config.file) {
log.add(new DailyRotateFile({ filename: config.file }))
}

export function getLogger(name: string) {
export function getServerLogger(name: string) {
return log.child({ label: name })
}
3 changes: 3 additions & 0 deletions src/lib/services/user/checkPerm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ import type { Bounds } from "@/lib/mapObjects/mapBounds";
import { bbox, feature as makeFeature, featureCollection, intersect, polygon } from "@turf/turf";
import type { Feature, Polygon } from "geojson";
import { Features, type FeaturesKey, type Perms } from "@/lib/utils/features";
import { getLogger } from "@/lib/utils/logger";

const log = getLogger("permissions");

function isFeatureInFeatureList(featureList: FeaturesKey[] | undefined, feature: FeaturesKey) {
if (featureList === undefined) return false;
Expand Down
37 changes: 37 additions & 0 deletions src/lib/utils/logger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// Universal logger that works on both the server and in the browser

type LogFn = (message: string, ...args: unknown[]) => void;

export interface Logger {
debug: LogFn;
info: LogFn;
warning: LogFn;
error: LogFn;
}

export type DebugCategories = {
permissions?: boolean;
};

let serverLoggerFactory: ((name: string) => Logger) | null = null;

export function setServerLoggerFactory(factory: (name: string) => Logger,) {
serverLoggerFactory = factory;
}

function createBrowserLogger(name: string): Logger {
const prefix = `[${name}]`;
return {
debug: (message, ...args) => console.debug(prefix, message, ...args),
info: (message, ...args) => console.info(prefix, message, ...args),
warning: (message, ...args) => console.warn(prefix, message, ...args),
error: (message, ...args) => console.error(prefix, message, ...args),
};
}

export function getLogger(name: string): Logger {
if (serverLoggerFactory) {
return serverLoggerFactory(name);
}
return createBrowserLogger(name);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import { initAllIconSets } from "@/lib/services/uicons.svelte.js";
import { loadRemoteLocale } from "@/lib/services/ingameLocale";
import { querySingleMapObject } from "@/lib/server/api/querySingleMapObject";
import { makeMapObject } from "@/lib/mapObjects/makeMapObject";
import { getLogger } from "@/lib/server/logging";
import { getClientConfig } from "@/lib/services/config/config.server";
import { type MapData, MapObjectType } from "@/lib/mapObjects/mapObjectTypes";
import { getLogger } from "@/lib/utils/logger";

const log = getLogger("directlink");
export const ssr = true;
Expand Down
35 changes: 19 additions & 16 deletions src/routes/(share)/a/[area]/+page.server.ts
Original file line number Diff line number Diff line change
@@ -1,35 +1,38 @@
import { getConfig, setConfig } from "@/lib/services/config/config";
import { loadRemoteLocale } from "@/lib/services/ingameLocale";
import type { PageServerLoad } from "./$types";
import { getLogger } from "@/lib/server/logging";
import { getServerConfig } from "@/lib/services/config/config.server";
import { error } from "@sveltejs/kit";
import { getKojiGeofences } from "@/lib/features/koji";
import { fetchKojiGeofences } from "@/lib/server/api/kojiApi";
import { getFeatureJump } from "@/lib/utils/geo";
import { getLogger } from "@/lib/utils/logger";

const log = getLogger("arealink")
const log = getLogger("arealink");

export const load: PageServerLoad = async ({ params, fetch }) => {
const areaName = params.area
const areaName = params.area;

log.info("Direct area link called to %s", areaName)
log.info("Direct area link called to %s", areaName);

const features = await fetchKojiGeofences(fetch)
const features = await fetchKojiGeofences(fetch);

if (!features) {
log.error("Error fetching features, returning 404")
error(404)
log.error("Error fetching features, returning 404");
error(404);
}

const feature = features.find(a => a.properties.name.toLowerCase().includes(areaName.toLowerCase()))
const feature = features.find((a) =>
a.properties.name.toLowerCase().includes(areaName.toLowerCase())
);

if (!feature) {
log.info("Area %s not found", areaName)
error(404)
log.info("Area %s not found", areaName);
error(404);
}

const jumpTo = getFeatureJump(feature)
const jumpTo = getFeatureJump(feature);

return { lat: jumpTo.coords.lat, lon: jumpTo.coords.lon, zoom: jumpTo.zoom, name: feature.properties.name };
return {
lat: jumpTo.coords.lat,
lon: jumpTo.coords.lon,
zoom: jumpTo.zoom,
name: feature.properties.name
};
};
Original file line number Diff line number Diff line change
Expand Up @@ -10,41 +10,41 @@ import {
FiltersetRaidSchema
} from "@/lib/features/filters/filtersetSchemas";
import * as m from "@/lib/paraglide/messages";
import { getLogger } from "@/lib/server/logging";
import type { ZodSafeParseResult } from "zod";
import { getLogger } from "@/lib/utils/logger";

const log = getLogger("filtershare")
const log = getLogger("filtershare");

function decodeFilterset(
majorCategory: FilterCategory | string,
subCategory: FilterCategory | string | undefined,
str: string
) {
const decoded: AnyFilterset = JSON.parse(decodeURIComponent(atob(str)));
log.info("Decoding filterset: %s", decoded)
log.info("Decoding filterset: %s", decoded);
decoded.id = getId();

let zodResult: ZodSafeParseResult<AnyFilterset> | undefined = undefined
let zodResult: ZodSafeParseResult<AnyFilterset> | undefined = undefined;

if (majorCategory === "pokemon") {
zodResult = FiltersetPokemonSchema.safeParse(decoded)
zodResult = FiltersetPokemonSchema.safeParse(decoded);
} else if (majorCategory === "gym" && subCategory === "raid") {
zodResult = FiltersetRaidSchema.safeParse(decoded)
zodResult = FiltersetRaidSchema.safeParse(decoded);
} else if (majorCategory === "pokestop" && subCategory === "invasion") {
zodResult = FiltersetInvasionSchema.safeParse(decoded)
zodResult = FiltersetInvasionSchema.safeParse(decoded);
}

if (!zodResult) return undefined
if (!zodResult) return undefined;

if (zodResult?.error) {
log.crit("Decoding failed!!", zodResult?.error)
return undefined
log.crit("Decoding failed!!", zodResult?.error);
return undefined;
}

const safe = zodResult.data
const safe = zodResult.data;

if (safe?.title?.message && !Object.keys(m).includes(safe.title.message)) {
log.crit("Tried to send invalid message!!", safe.title.message)
log.crit("Tried to send invalid message!!", safe.title.message);
return undefined;
}

Expand Down
3 changes: 2 additions & 1 deletion src/routes/api/[queryMapObject=mapObject]/+server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ import { error, json } from "@sveltejs/kit";
import { checkFeatureInBounds } from "@/lib/services/user/checkPerm";
import { queryMapObjects } from "@/lib/server/api/queryMapObjects";
import type { MapObjectRequestData } from "@/lib/mapObjects/updateMapObject";
import { getLogger } from "@/lib/server/logging";
import { getServerLogger } from "@/lib/server/logging";
import { hasFeatureAnywhereServer } from "@/lib/server/auth/checkIfAuthed";
import { MapObjectType } from "@/lib/mapObjects/mapObjectTypes";
import { getLogger } from "@/lib/utils/logger";

const log = getLogger("mapobjects");

Expand Down
3 changes: 2 additions & 1 deletion src/routes/api/address/[query]/+server.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { error, json } from "@sveltejs/kit";
import { getServerConfig } from "@/lib/services/config/config.server";
import type { FeatureCollection, Point } from "geojson";
import { getLogger } from "@/lib/server/logging";
import { getServerLogger } from "@/lib/server/logging";
import { getLogger } from "@/lib/utils/logger";

const log = getLogger("nominatim");

Expand Down
3 changes: 2 additions & 1 deletion src/routes/api/locale/[tag]/+server.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { json } from "@sveltejs/kit";
import { prefixes as localePrefixesObject } from "@/lib/services/ingameLocale";
import TTLCache from "@isaacs/ttlcache";
import { getLogger } from "@/lib/server/logging";
import { getServerLogger } from "@/lib/server/logging";
import { locales } from "@/lib/paraglide/runtime";
import { getLogger } from "@/lib/utils/logger";

type Locale = (typeof locales)[number];
type RemoteLocale = { [key: string]: string };
Expand Down
3 changes: 2 additions & 1 deletion src/routes/api/scout/+server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ import type { ScoutRequest } from "@/lib/features/scout.svelte.js";
import { addScoutEntries, getScoutQueue } from "@/lib/server/api/dragoniteApi";

import { result } from "@/lib/server/api/results";
import { getLogger } from "@/lib/server/logging";
import { getServerLogger } from "@/lib/server/logging";
import { hasFeatureAnywhereServer } from "@/lib/server/auth/checkIfAuthed";
import { Features } from "@/lib/utils/features";
import { getLogger } from "@/lib/utils/logger";

const log = getLogger("scout");

Expand Down
3 changes: 2 additions & 1 deletion src/routes/api/search/[type=searchType]/+server.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { error, json } from "@sveltejs/kit";
import { getLogger } from "@/lib/server/logging";
import { getServerLogger } from "@/lib/server/logging";
import { hasFeatureAnywhereServer } from "@/lib/server/auth/checkIfAuthed";
import { searchGyms } from "@/lib/server/api/golbatApi";
import { Coords } from "@/lib/utils/coordinates";
import { type SearchPayload, SearchType, sortSearchResults } from "@/lib/services/search.svelte";
import { getLogger } from "@/lib/utils/logger";

const log = getLogger("search");

Expand Down
Loading