Return basic Steam user data
This commit is contained in:
parent
9f2b880086
commit
d8ac0284cb
1 changed files with 53 additions and 20 deletions
|
@ -1,42 +1,75 @@
|
||||||
import { createFederation, Follow, Service } from "@fedify/fedify"
|
import { createFederation, Service, Application, Image } from "@fedify/fedify"
|
||||||
import { kv } from "./redis.ts"
|
import { kv } from "./redis.ts"
|
||||||
import { getLogger } from "https://jsr.io/@logtape/logtape/0.6.3/logtape/logger.ts"
|
import { getLogger } from "https://jsr.io/@logtape/logtape/0.6.3/logtape/logger.ts"
|
||||||
|
import { doQueryPlayer } from "./graphql/stratz.ts"
|
||||||
|
|
||||||
const l = getLogger(["dotino-veloce", "federation"])
|
const l = getLogger(["dotino-veloce", "federation"])
|
||||||
|
|
||||||
l.debug`Creating federation object...`
|
l.debug`Creating federation object...`
|
||||||
export const federation = createFederation<void>({ kv })
|
export const federation = createFederation<void>({ kv })
|
||||||
|
|
||||||
|
const userMatcher = /u([0-9]+)/
|
||||||
|
|
||||||
l.debug`Creating actor dispatcher...`
|
l.debug`Creating actor dispatcher...`
|
||||||
// deno-lint-ignore require-await
|
// deno-lint-ignore require-await
|
||||||
async function actorDispatcher(ctx: any, handle: string) {
|
async function actorDispatcher(ctx: any, handle: string) {
|
||||||
l.debug`Received request for actor ${handle}, handling...`
|
l.debug`Determining id of requested actor: ${handle}`
|
||||||
|
|
||||||
if (handle !== "service") {
|
|
||||||
l.debug`No match found for ${handle}, returning null.`
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
l.debug`Determining id of actor ${handle}...`
|
|
||||||
const id = ctx.getActorUri(handle)
|
const id = ctx.getActorUri(handle)
|
||||||
|
l.debug`Requested actor is: ${id.href}`
|
||||||
|
|
||||||
l.info`Returning actor: ${id.href}`
|
if (handle === "service") {
|
||||||
return new Service({
|
l.info`Dispatching service account...`
|
||||||
|
return new Application({
|
||||||
id,
|
id,
|
||||||
name: "[TEST] Dotino Veloce",
|
|
||||||
summary: "Core account of a Dotino Veloce instance.",
|
|
||||||
preferredUsername: id.href,
|
preferredUsername: id.href,
|
||||||
// Akkoma expects URL to be equal to ID
|
// Akkoma expects URL to be equal to ID
|
||||||
// https://akkoma.dev/AkkomaGang/akkoma/src/commit/f1018867097e6f293d8b2b5b6935f0a7ebf99bd0/lib/pleroma/object/fetcher.ex#L287
|
// https://akkoma.dev/AkkomaGang/akkoma/src/commit/f1018867097e6f293d8b2b5b6935f0a7ebf99bd0/lib/pleroma/object/fetcher.ex#L287
|
||||||
url: id,
|
url: id,
|
||||||
|
// Akkoma requires inboxes to be setup to display profiles
|
||||||
|
// https://akkoma.dev/AkkomaGang/akkoma/src/commit/f1018867097e6f293d8b2b5b6935f0a7ebf99bd0/lib/pleroma/web/activity_pub/object_validators/user_validator.ex#L72
|
||||||
inbox: ctx.getInboxUri(handle),
|
inbox: ctx.getInboxUri(handle),
|
||||||
|
|
||||||
|
name: "[TEST] Dotino Veloce",
|
||||||
|
summary: "Service account of a Dotino Veloce instance.",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const steamId = Number.parseInt(handle.match(userMatcher)?.[1] as any)
|
||||||
|
if(Number.isFinite(steamId)) {
|
||||||
|
l.info`Dispatching user account with Steam ID: ${steamId}`
|
||||||
|
|
||||||
|
const player = await doQueryPlayer(steamId)
|
||||||
|
|
||||||
|
if(player === null) {
|
||||||
|
l.warn`No Steam account was found with ID: ${steamId}`
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Service({
|
||||||
|
id,
|
||||||
|
preferredUsername: id.href,
|
||||||
|
// Akkoma expects URL to be equal to ID
|
||||||
|
// https://akkoma.dev/AkkomaGang/akkoma/src/commit/f1018867097e6f293d8b2b5b6935f0a7ebf99bd0/lib/pleroma/object/fetcher.ex#L287
|
||||||
|
url: id,
|
||||||
|
// Akkoma requires inboxes to be setup to display profiles
|
||||||
|
// https://akkoma.dev/AkkomaGang/akkoma/src/commit/f1018867097e6f293d8b2b5b6935f0a7ebf99bd0/lib/pleroma/web/activity_pub/object_validators/user_validator.ex#L72
|
||||||
|
inbox: ctx.getInboxUri(handle),
|
||||||
|
|
||||||
|
name: `[TEST] ${player.name}`,
|
||||||
|
icon: new Image({
|
||||||
|
url: new URL(player.avatar),
|
||||||
|
mediaType: "image/jpeg"
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
l.warn`No dispatcher was found for handle: ${handle}`
|
||||||
|
return null
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
l.debug`Connecting actor dispatcher to federation object...`
|
l.debug`Connecting actor dispatcher to federation object...`
|
||||||
federation.setActorDispatcher("/users/{identifier}", actorDispatcher)
|
federation.setActorDispatcher("/users/{identifier}", actorDispatcher)
|
||||||
|
|
||||||
// Akkoma requires inboxes to be setup to display profiles
|
|
||||||
// https://akkoma.dev/AkkomaGang/akkoma/src/commit/f1018867097e6f293d8b2b5b6935f0a7ebf99bd0/lib/pleroma/web/activity_pub/object_validators/user_validator.ex#L72
|
|
||||||
l.debug`Initializing inbox listener...`
|
l.debug`Initializing inbox listener...`
|
||||||
federation.setInboxListeners("/inbox/{identifier}") // I don't really care about the shared inbox for this project
|
federation.setInboxListeners("/inbox/{identifier}") // I don't really care about the shared inbox for this project
|
||||||
|
|
Loading…
Reference in a new issue