chore: remove boilerplate shit

This commit is contained in:
Severian
2025-01-19 21:47:35 +08:00
parent 01edd57296
commit b6df5d196f
5 changed files with 67 additions and 64 deletions

View File

@@ -1,5 +1,5 @@
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
interface StoredCard extends CardData {
timestamp: number;
@@ -15,7 +15,9 @@ function generateId(): string {
function cleanupExpiredCards() {
const now = Date.now();
extractedCards = extractedCards.filter(card => (now - card.timestamp) < EXPIRY_TIME);
extractedCards = extractedCards.filter(
(card) => now - card.timestamp < EXPIRY_TIME
);
}
interface Message {
@@ -34,16 +36,18 @@ interface CardData {
function extractPersonaName(content: string, personaIndex: number = 0): string {
const personaMatches = Array.from(content.matchAll(/'s Persona:/g));
if (personaMatches.length <= personaIndex) return "";
const personaIdx = personaMatches[personaIndex].index!;
const lineStartIdx = content.lastIndexOf('\n', personaIdx);
const lineStartIdx = content.lastIndexOf("\n", personaIdx);
const lineEndIdx = personaIdx;
return content.slice(lineStartIdx === -1 ? 0 : lineStartIdx + 1, lineEndIdx).trim();
return content
.slice(lineStartIdx === -1 ? 0 : lineStartIdx + 1, lineEndIdx)
.trim();
}
function safeReplace(text: string, old: string, newStr: string): string {
return old ? text.replace(new RegExp(old, 'g'), newStr) : text;
return old ? text.replace(new RegExp(old, "g"), newStr) : text;
}
function extractCardData(messages: Message[]): CardData {
@@ -60,7 +64,7 @@ function extractCardData(messages: Message[]): CardData {
scenario: "",
mes_example: "",
personality: "",
first_mes: content1
first_mes: content1,
};
if (personaMatches.length >= 2) {
@@ -80,27 +84,32 @@ function extractCardData(messages: Message[]): CardData {
if (scenarioMarker) {
const scenarioStart = scenarioMarker.index! + scenarioMarker[0].length;
const scenarioRemaining = remaining.slice(scenarioStart);
const exampleInScenarioMarker = scenarioRemaining.match(/Example conversations between/);
const scenarioEnd = exampleInScenarioMarker ? exampleInScenarioMarker.index! : scenarioRemaining.length;
const exampleInScenarioMarker = scenarioRemaining.match(
/Example conversations between/
);
const scenarioEnd = exampleInScenarioMarker
? exampleInScenarioMarker.index!
: scenarioRemaining.length;
cardData.scenario = scenarioRemaining.slice(0, scenarioEnd).trim();
}
if (exampleMarker) {
const exampleStart = exampleMarker.index!;
const rawExampleStr = remaining.slice(exampleStart).trim();
const colonIdx = rawExampleStr.indexOf(':');
cardData.mes_example = colonIdx !== -1 ?
rawExampleStr.slice(colonIdx + 1).trim() :
rawExampleStr.trim();
const colonIdx = rawExampleStr.indexOf(":");
cardData.mes_example =
colonIdx !== -1
? rawExampleStr.slice(colonIdx + 1).trim()
: rawExampleStr.trim();
}
}
for (const field in cardData) {
if (field !== 'name') {
if (field !== "name") {
const val = cardData[field as keyof CardData];
if (typeof val === 'string') {
let newVal = safeReplace(val, userName, '{{user}}');
newVal = safeReplace(newVal, charName, '{{char}}');
if (typeof val === "string") {
let newVal = safeReplace(val, userName, "{{user}}");
newVal = safeReplace(newVal, charName, "{{char}}");
cardData[field as keyof CardData] = newVal;
}
}
@@ -110,27 +119,27 @@ function extractCardData(messages: Message[]): CardData {
}
export async function POST(request: NextRequest) {
if (request.method === 'OPTIONS') {
if (request.method === "OPTIONS") {
return new NextResponse(null, {
status: 204,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, OPTIONS, GET',
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "POST, OPTIONS, GET",
"Access-Control-Allow-Headers": "Content-Type, Authorization",
},
});
}
try {
const body = await request.json();
if (!body.messages || body.messages.length < 2) {
return NextResponse.json(
{ error: "Missing messages or insufficient message count" },
{
{
status: 400,
headers: {
'Access-Control-Allow-Origin': '*',
"Access-Control-Allow-Origin": "*",
},
}
);
@@ -140,25 +149,27 @@ export async function POST(request: NextRequest) {
extractedCards.push({
...cardData,
timestamp: Date.now(),
id: generateId()
id: generateId(),
});
cleanupExpiredCards();
return NextResponse.json({ status: "Card stored successfully" }, {
headers: {
'Access-Control-Allow-Origin': '*',
},
});
return NextResponse.json(
{ status: "Card stored successfully" },
{
headers: {
"Access-Control-Allow-Origin": "*",
},
}
);
} catch (error) {
console.error('Error processing request:', error);
console.error("Error processing request:", error);
return NextResponse.json(
{ error: "Internal server error" },
{
{
status: 500,
headers: {
'Access-Control-Allow-Origin': '*',
"Access-Control-Allow-Origin": "*",
},
}
);
@@ -167,24 +178,27 @@ export async function POST(request: NextRequest) {
export async function GET() {
cleanupExpiredCards();
return NextResponse.json({
status: "online",
cards: extractedCards.map(({ timestamp, ...card }) => card) // Keep ID but remove timestamp
}, {
headers: {
'Access-Control-Allow-Origin': '*',
return NextResponse.json(
{
status: "online",
cards: extractedCards.map(({ timestamp, ...card }) => card),
},
});
{
headers: {
"Access-Control-Allow-Origin": "*",
},
}
);
}
export async function OPTIONS() {
return new NextResponse(null, {
status: 204,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, OPTIONS, GET',
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "POST, OPTIONS, GET",
"Access-Control-Allow-Headers": "Content-Type, Authorization",
},
});
}
}