feat: notes wip part tres
All checks were successful
create archive with lfs / tag (push) Successful in 10s
All checks were successful
create archive with lfs / tag (push) Successful in 10s
This commit is contained in:
parent
9f57b193ce
commit
980579b50c
5
gazebot/.gitignore
vendored
5
gazebot/.gitignore
vendored
@ -1,2 +1,5 @@
|
||||
target
|
||||
.env
|
||||
.env
|
||||
Secrets.toml/target
|
||||
.shuttle*
|
||||
Secrets*.toml
|
||||
|
1082
gazebot/Cargo.lock
generated
1082
gazebot/Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -8,4 +8,6 @@ tracing = "0.1"
|
||||
tracing-subscriber = "0.3"
|
||||
dotenvy = "0.15.7"
|
||||
serenity = { version = "0.12", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] }
|
||||
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
|
||||
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
|
||||
shuttle-serenity = "0.48.0"
|
||||
shuttle-runtime = "0.48.0"
|
||||
|
@ -1,9 +1,11 @@
|
||||
use std::env;
|
||||
|
||||
use serenity::all::ActivityData;
|
||||
use serenity::async_trait;
|
||||
use serenity::model::channel::Message;
|
||||
use serenity::model::prelude::*;
|
||||
use serenity::prelude::*;
|
||||
use shuttle_runtime::SecretStore;
|
||||
|
||||
struct Handler;
|
||||
|
||||
@ -17,26 +19,44 @@ impl EventHandler for Handler {
|
||||
}
|
||||
}
|
||||
|
||||
async fn ready(&self, _: Context, ready: Ready) {
|
||||
async fn ready(&self, ctx: Context, ready: Ready) {
|
||||
println!("{} is connected!", ready.user.name);
|
||||
|
||||
ctx.set_presence(Some(ActivityData::listening("messages to log")), OnlineStatus::Online);
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
let _ = dotenvy::dotenv();
|
||||
// #[tokio::main]
|
||||
// async fn main() {
|
||||
// let _ = dotenvy::dotenv();
|
||||
|
||||
tracing_subscriber::fmt::init();
|
||||
// tracing_subscriber::fmt::init();
|
||||
|
||||
let token = env::var("DISCORD_TOKEN").expect("Expected a token in the environment");
|
||||
let intents = GatewayIntents::GUILD_MESSAGES
|
||||
| GatewayIntents::DIRECT_MESSAGES
|
||||
| GatewayIntents::MESSAGE_CONTENT;
|
||||
// let token = env::var("DISCORD_TOKEN").expect("Expected a token in the environment");
|
||||
// let intents = GatewayIntents::DIRECT_MESSAGES | GatewayIntents::MESSAGE_CONTENT;
|
||||
|
||||
let mut client =
|
||||
Client::builder(&token, intents).event_handler(Handler).await.expect("Err creating client");
|
||||
// let mut client =
|
||||
// Client::builder(&token, intents).event_handler(Handler).await.expect("Err creating client");
|
||||
|
||||
if let Err(why) = client.start().await {
|
||||
println!("Client error: {why:?}");
|
||||
}
|
||||
// if let Err(why) = client.start().await {
|
||||
// println!("Client error: {why:?}");
|
||||
// }
|
||||
// }
|
||||
|
||||
#[shuttle_runtime::main]
|
||||
async fn serenity(
|
||||
#[shuttle_runtime::Secrets] secrets: SecretStore,
|
||||
) -> shuttle_serenity::ShuttleSerenity {
|
||||
// Get the discord token set in `Secrets.toml`
|
||||
let token = secrets.get("DISCORD_TOKEN").unwrap();
|
||||
|
||||
// Set gateway intents, which decides what events the bot will be notified about
|
||||
let intents = GatewayIntents::DIRECT_MESSAGES | GatewayIntents::MESSAGE_CONTENT;
|
||||
|
||||
let client = Client::builder(&token, intents)
|
||||
.event_handler(Handler)
|
||||
.await
|
||||
.expect("Err creating client");
|
||||
|
||||
Ok(client.into())
|
||||
}
|
@ -39,6 +39,7 @@
|
||||
},
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@atproto/api": "^0.13.12",
|
||||
"@std/toml": "npm:@jsr/std__toml",
|
||||
"base64url": "^3.0.1",
|
||||
"nanoid": "^5.0.8",
|
||||
|
@ -2,6 +2,7 @@ import type { Cookies } from '@sveltejs/kit'
|
||||
import { env } from '$env/dynamic/private'
|
||||
import { writable } from 'svelte/store'
|
||||
import { existsSync, readFileSync } from 'fs'
|
||||
import { Agent, CredentialSession } from '@atproto/api'
|
||||
|
||||
export const scopeCookies = (cookies: Cookies, path: string) => {
|
||||
return {
|
||||
@ -19,3 +20,10 @@ export const scopeCookies = (cookies: Cookies, path: string) => {
|
||||
|
||||
export const visitCountFile = `${env.WEBSITE_DATA_DIR}/visitcount`
|
||||
export const visitCount = writable(parseInt(existsSync(visitCountFile) ? readFileSync(visitCountFile).toString() : '0'));
|
||||
|
||||
const loginToBsky = () => {
|
||||
const creds = new CredentialSession(new URL("https://bsky.social"))
|
||||
creds.login({identifier: 'gaze.systems', password: env.BSKY_PASSWORD ?? "" })
|
||||
return new Agent(creds)
|
||||
}
|
||||
export const bskyClient = loginToBsky()
|
@ -29,9 +29,14 @@ export const writeNote = (id: NoteId, note: Note) => {
|
||||
// only append to note list if its not in it yet
|
||||
let noteList = readNotesList()
|
||||
if (noteList.indexOf(id) === -1) {
|
||||
writeNotesList(noteList.concat([id]))
|
||||
writeNotesList([id].concat(noteList))
|
||||
}
|
||||
}
|
||||
export const createNote = (note: Note) => {
|
||||
const id = genNoteId()
|
||||
writeNote(id, note)
|
||||
return id
|
||||
}
|
||||
|
||||
export const readNotesList = (): NoteId[] => {
|
||||
return JSON.parse(readFileSync(notesListFile).toString())
|
||||
|
@ -25,9 +25,9 @@
|
||||
"
|
||||
>
|
||||
<pre class="language-bash"><code class="language-bash"><nobr>
|
||||
<Token v="[" punct/>gazesystems <Token v="/notes/" keywd/><Token v="]$" punct/> <Token v="source" funct/> note.nu
|
||||
<Token v="[" punct/>gazesystems <Token v="/log/" keywd/><Token v="]$" punct/> <Token v="source" funct/> log.nu
|
||||
<br>
|
||||
<Token v="[" punct/>gazesystems <Token v="/notes/" keywd/><Token v="]$" punct/> <Token v="ls" funct/> notes <Token v="|" punct/> <Token v="each" funct/> <Token v="{" punct/><Token v="|" punct/>file<Token v="|" punct/> <Token v="render" funct/> <Token v="(" punct/><Token v="open" funct/> $file.name<Token v=")" punct/><Token v="}" punct/>
|
||||
<Token v="[" punct/>gazesystems <Token v="/log/" keywd/><Token v="]$" punct/> <Token v="ls" funct/> log <Token v="|" punct/> <Token v="each" funct/> <Token v="{" punct/><Token v="|" punct/>file<Token v="|" punct/> <Token v="render" funct/> <Token v="(" punct/><Token v="open" funct/> $file.name<Token v=")" punct/><Token v="}" punct/>
|
||||
<br>
|
||||
<br>
|
||||
{#each data.notes as { noteId, note }, index}
|
31
src/routes/log/create/+server.ts
Normal file
31
src/routes/log/create/+server.ts
Normal file
@ -0,0 +1,31 @@
|
||||
import { env } from '$env/dynamic/private';
|
||||
import { PUBLIC_BASE_URL } from '$env/static/public';
|
||||
import { bskyClient } from '$lib';
|
||||
import { createNote } from '$lib/notes.js';
|
||||
|
||||
|
||||
export const POST = async ({ request }) => {
|
||||
const token = request.headers.get('authorization')
|
||||
if (token !== env.GAZEBOT_TOKEN) {
|
||||
return new Response("rizz failed", { status: 403 })
|
||||
}
|
||||
// get note data
|
||||
const noteData = await request.json()
|
||||
if (noteData.content ?? null === null) {
|
||||
return new Response("no rizz :(", { status: 400 })
|
||||
}
|
||||
// create note
|
||||
const published = Date.now()
|
||||
const noteId = createNote({ content: noteData.content, published })
|
||||
// bridge to bsky if want to bridge
|
||||
if (noteData.bskyPosse ?? null !== null) {
|
||||
await bskyClient.post({text: `${noteData.content} (${PUBLIC_BASE_URL}/log?id=${noteId})`})
|
||||
}
|
||||
// send back created note id
|
||||
return new Response(JSON.stringify({ noteId }), {
|
||||
headers: {
|
||||
'content-type': 'application/json',
|
||||
'cache-control': 'no-store',
|
||||
}
|
||||
})
|
||||
};
|
Loading…
Reference in New Issue
Block a user