A discord bot for teal.fm
discord tealfm music

some refactor + notes

besaid.zone bdf95bc4 c48555d1

verified
Changed files
+48 -3
kysely
migrations
+6
PLAN.md
··· 1 + # rough notes on how I think this should work 2 + 3 + - we start of with no accounts 4 + - ``/teal auth`` sends user a link to log in with atproto account 5 + - after auth success, we take did and send http request to tap instance to start backfilling for repo 6 + - user can now use bot commands
db/migrator.ts kysely/migrator.ts
+14
kysely/db.ts
··· 1 + import type { DB } from "kysely-codegen" 2 + import { Pool } from "pg" 3 + import { Kysely, PostgresDialect } from "kysely" 4 + import { DATABASE_URL } from "../constants.ts" 5 + 6 + const dialect = new PostgresDialect({ 7 + pool: new Pool({ 8 + connectionString: DATABASE_URL 9 + }) 10 + }) 11 + 12 + export const db = new Kysely<DB>({ 13 + dialect 14 + })
+17
kysely/seed.ts
··· 1 + // import { db } from "./db.ts" 2 + 3 + async function main() { 4 + // const result = await db.insertInto("users").values({ 5 + // did: "did:plc:qttsv4e7pu2jl3ilanfgc3zn" 6 + // }).returning(['did', 'created_at']) 7 + // .executeTakeFirst() 8 + // console.log({ result }) 9 + 10 + // const users = await db.selectFrom("users").select(["id", "did"]).execute() 11 + // console.log({ users }) 12 + // await db.deleteFrom("users").where("did", "=", "did:plc:qttsv4e7pu2jl3ilanfgc3zn").execute() 13 + // const plays = await db.selectFrom("plays").where("plays.user_id", "=", 4).select(["plays.played_time", "plays.track_name"]).execute() 14 + // console.log({ plays }) 15 + } 16 + 17 + main().catch(error => console.error(error))
+1 -1
migrations/schema.ts
··· 4 4 await db.schema 5 5 .createTable("users").ifNotExists() 6 6 .addColumn("id", "serial", (col) => col.primaryKey()) 7 - .addColumn("did", "varchar", (col) => col.notNull()) 7 + .addColumn("did", "varchar", (col) => col.notNull().unique()) 8 8 .addColumn('created_at', 'timestamp', (col) => 9 9 col.defaultTo(sql`now()`).notNull(), 10 10 )
+2 -1
package.json
··· 9 9 "deploy-commands": "tsx deploy-commands.ts", 10 10 "tapper:dev": "NODE_ENV=development tsx tapper.ts", 11 11 "tapper:prod": "NODE_ENV=production tsx tapper.ts", 12 - "migrate": "tsx db/migrator.ts", 12 + "migrate": "tsx kysely/migrator.ts", 13 13 "codegen": "kysely-codegen --dialect postgres", 14 + "seed": "tsx kysely/seed.ts", 14 15 "typecheck": "tsc --noEmit" 15 16 }, 16 17 "keywords": [
+8 -1
tapper.ts
··· 1 1 import { SimpleIndexer, Tap } from "@atproto/tap"; 2 2 import { TAP_ADMIN_PASSWORD } from "./constants.ts"; 3 + // import { db } from "./kysely/db.ts" 3 4 4 5 const tap = new Tap("https://tap.xero.systems", { 5 6 adminPassword: TAP_ADMIN_PASSWORD, ··· 10 11 indexer.record(async (evt, opts) => { 11 12 const uri = `at://${evt.did}/${evt.collection}/${evt.rkey}`; 12 13 if (evt.action === "create" || evt.action === "update") { 13 - console.log(evt.record); 14 + // await db.insertInto("plays").values({ 15 + // played_time: evt?.record?.playedTime, 16 + // release_name: evt?.record?.releaseName, 17 + // track_name: evt?.record?.trackName, 18 + // user_id: 4 19 + // }).execute() 20 + console.log(evt.record) 14 21 } else { 15 22 console.log(`deleted: ${uri}`); 16 23 }