diff --git a/.gitignore b/.gitignore index a9c3bfb..53c8e3a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,6 @@ node_modules .env *.log *.db +/dist/ /generated/prisma diff --git a/dist/main.js b/dist/main.js deleted file mode 100644 index 8f775a7..0000000 --- a/dist/main.js +++ /dev/null @@ -1,133 +0,0 @@ -import striptags from "striptags"; -import { PrismaClient } from "../generated/prisma/client.js"; -const prisma = new PrismaClient(); -const getNotifications = async () => { - try { - const request = await fetch(`${process.env.PLEROMA_INSTANCE_URL}/api/v1/notifications?types[]=mention`, { - method: "GET", - headers: { - Authorization: `Bearer ${process.env.INSTANCE_BEARER_TOKEN}`, - }, - }); - const notifications = await request.json(); - return notifications; - } - catch (error) { - throw new Error(error.message); - } -}; -const notifications = await getNotifications(); -const storeUserData = async (notification) => { - try { - const user = await prisma.user.upsert({ - where: { userFqn: notification.status.account.fqn }, - update: { - lastRespondedTo: new Date(Date.now()), - }, - create: { - userFqn: notification.status.account.fqn, - lastRespondedTo: new Date(Date.now()), - }, - }); - } - catch (error) { - throw new Error(error.message); - } -}; -const alreadyRespondedTo = async (notification) => { - try { - const duplicate = await prisma.response.findFirst({ - where: { pleromaNotificationId: notification.status.id }, - }); - if (duplicate) { - return true; - } - return false; - } - catch (error) { - throw new Error(error.message); - } -}; -const storePromptData = async (notification, ollamaResponseBody) => { - try { - await prisma.response.create({ - data: { - response: ollamaResponseBody.response, - request: striptags(notification.status.content), - to: notification.account.fqn, - pleromaNotificationId: notification.status.id, - createdAt: new Date(Date.now()), - }, - }); - } - catch (error) { - throw new Error(error.message); - } -}; -const generateOllamaRequest = async (notification) => { - try { - if (striptags(notification.status.content).includes("!prompt") && - !notification.status.account.bot) { - if (process.env.ONLY_LOCAL_REPLIES === "true" && - !notification.status.account.fqn.includes(`@${process.env.PLEROMA_INSTANCE_DOMAIN}`)) { - return; - } - if (await alreadyRespondedTo(notification)) { - // console.log( - // `Already responded to notification ID ${notification.status.id}. Canceling.` - // ); - return; - } - await storeUserData(notification); - const ollamaRequestBody = { - model: process.env.OLLAMA_MODEL, - system: process.env.OLLAMA_SYSTEM_PROMPT, - prompt: striptags(notification.status.content), - stream: false, - }; - const response = await fetch(`${process.env.OLLAMA_URL}/api/generate`, { - method: "POST", - body: JSON.stringify(ollamaRequestBody), - }); - const ollamaResponse = await response.json(); - await storePromptData(notification, ollamaResponse); - console.log(`${notification.status.account.fqn} asked:\n${notification.status.content}\nResponse:\n${ollamaResponse.response}`); - postReplyToStatus(notification, ollamaResponse); - } - } - catch (error) { - throw new Error(error.message); - } -}; -const postReplyToStatus = async (notification, ollamaResponseBody) => { - try { - const mentions = notification.status.mentions?.map((mention) => { - return mention.acct; - }); - let statusBody = { - content_type: "text/markdown", - status: ollamaResponseBody.response, - in_reply_to_id: notification.status.id, - to: mentions, - }; - const response = await fetch(`${process.env.PLEROMA_INSTANCE_URL}/api/v1/statuses`, { - method: "POST", - headers: { - Authorization: `Bearer ${process.env.INSTANCE_BEARER_TOKEN}`, - "Content-Type": "application/json", - }, - body: JSON.stringify(statusBody), - }); - if (!response.ok) { - throw new Error(`New status request failed: ${response.statusText}`); - } - } - catch (error) { - throw new Error(error.message); - } -}; -if (notifications) { - await Promise.all(notifications.map((notification) => { - generateOllamaRequest(notification); - })); -}