From a81dfcb876aae6f27bc3247a630cc1e66a577d16 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=99=93=E5=AE=87?= <1329218916@qq.com>
Date: Sat, 1 Apr 2023 21:35:52 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20=E4=BA=8B=E4=BB=B6?=
=?UTF-8?q?=E4=BA=A4=E4=BA=92=E5=93=8D=E5=BA=94?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/keywords/dict.ts | 28 ++++++++++-------
src/scene/generate.tsx | 51 +++++++++++++++----------------
src/scene/lottery.tsx | 25 +++++++++++----
src/scene/ui.tsx | 69 +++++++++++++++++++++++++++++++++++++++++-
src/service/gpt.ts | 2 +-
src/types.ts | 1 +
6 files changed, 131 insertions(+), 45 deletions(-)
diff --git a/src/keywords/dict.ts b/src/keywords/dict.ts
index e9ede9e..15a7cca 100644
--- a/src/keywords/dict.ts
+++ b/src/keywords/dict.ts
@@ -5,17 +5,23 @@ export const PROMPT_DICT: {
[part: string]: PromptToken[];
} = {
test: [
- { value: "黑长直" },
- { value: "电波系" },
- { value: "伪娘" },
- { value: "兔女郎" },
- { value: "傲娇" },
- { value: "病娇" },
- { value: "天然呆" },
- { value: "活力" },
- { value: "抖S" },
- { value: "抖M" },
- { value: "三无" },
+ { value: "黑长直", class: "adj" },
+ { value: "电波系", class: "adj" },
+ { value: "伪娘", class: "n" },
+ { value: "兔女郎", class: "adj" },
+ { value: "傲娇", class: "adj" },
+ { value: "病娇", class: "adj" },
+ { value: "天然呆", class: "adj" },
+ { value: "活力", class: "adj" },
+ { value: "抖S", class: "adj" },
+ { value: "抖M", class: "adj" },
+ { value: "三无", class: "adj" },
+ { value: "泳装", class: "adj" },
+ { value: "银发", class: "adj" },
+ { value: "女仆", class: "n" },
+ { value: "美少女", class: "n" },
+ { value: "御姐", class: "n" },
+ { value: "萝莉", class: "n" },
],
};
diff --git a/src/scene/generate.tsx b/src/scene/generate.tsx
index 889620c..b10f01f 100644
--- a/src/scene/generate.tsx
+++ b/src/scene/generate.tsx
@@ -1,8 +1,9 @@
-import { Button, Skeleton } from "@mui/material";
+import { Button, CircularProgress, Divider, Skeleton } from "@mui/material";
import { PRESET_TOKENS } from "prompts/presets";
import React, { useEffect, useState } from "react";
import { generatePicture } from "service/service";
import { GAME_SCENES, SceneProps } from "types";
+import { Message } from "./ui";
type GenerateSceneProps = {
prompts: string[];
@@ -27,24 +28,28 @@ export const GenerateScene = ({ setScene, prompts }: GenerateSceneProps) => {
uc: "lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry",
ucPreset: 0,
width: 256,
- }).then((result) => {
- setLoading(false);
- console.log(result);
- const source = result.data.split("\n");
- const fields = {} as any;
- source?.forEach((d: string) => {
- const [name, s] = d.split(":");
- fields[name] = s;
+ })
+ .then((result) => {
+ setLoading(false);
+ console.log(result);
+ const source = result.data.split("\n");
+ const fields = {} as any;
+ source?.forEach((d: string) => {
+ const [name, s] = d.split(":");
+ fields[name] = s;
+ });
+ console.timeEnd();
+ setCode(fields.data);
+ // const data = new Uint8ClampedArray(buffer);
+ // console.log(data);
+ // const imageData = new ImageData(data, 256, 384);
+ // const canvas = document.getElementById("picture");
+ // const context = canvas.getContext("2d");
+ // context.putImageData(imageData);
+ })
+ .catch((e) => {
+ Message.error(e.message);
});
- console.timeEnd();
- setCode(fields.data);
- // const data = new Uint8ClampedArray(buffer);
- // console.log(data);
- // const imageData = new ImageData(data, 256, 384);
- // const canvas = document.getElementById("picture");
- // const context = canvas.getContext("2d");
- // context.putImageData(imageData);
- });
};
useEffect(() => {
generate();
@@ -52,17 +57,11 @@ export const GenerateScene = ({ setScene, prompts }: GenerateSceneProps) => {
return (
- {loading && (
-
- )}
+ {loading &&
}
{!loading && !!code && (

+
+
{activeTokens.map((token, index) => (
))}
+
);
diff --git a/src/scene/ui.tsx b/src/scene/ui.tsx
index 7fe6f36..84f478f 100644
--- a/src/scene/ui.tsx
+++ b/src/scene/ui.tsx
@@ -1,12 +1,66 @@
-import React, { useState } from "react";
+import React, { useEffect, useState } from "react";
import { GAME_SCENES, PromptToken } from "types";
import { MenuScene } from "./menu";
import { LotteryScene } from "./lottery";
import { GenerateScene } from "./generate";
+import { Alert, Snackbar } from "@mui/material";
+
+type SnackSetterFunction = (snack: {
+ open: boolean;
+ message: string;
+ type: "error" | "success" | "warning" | "info";
+}) => void;
+
+const Snacker = {} as any;
+
+export const Message = {
+ error: (message: string) => {
+ Snacker.setSnack({
+ open: true,
+ message,
+ type: "error",
+ });
+ },
+ warning: (message: string) => {
+ Snacker.setSnack({
+ open: true,
+ message,
+ type: "warning",
+ });
+ },
+ success: (message: string) => {
+ Snacker.setSnack({
+ open: true,
+ message,
+ type: "success",
+ });
+ },
+ show: (message: string) => {
+ Snacker.setSnack({
+ open: true,
+ message,
+ type: "info",
+ });
+ },
+};
export const GameUI = () => {
const [scene, setScene] = useState
(GAME_SCENES.MENU);
const [prompts, setPrompts] = useState([]);
+ const [snack, setSnack] = useState({
+ open: false,
+ message: "",
+ type: "info" as "error" | "success" | "warning" | "info",
+ });
+ const handleClose = () => {
+ setSnack({
+ ...snack,
+ open: false,
+ });
+ };
+ useEffect(() => {
+ Snacker.setSnack = setSnack;
+ }, []);
return (
{scene === GAME_SCENES.MENU &&
}
@@ -16,6 +70,19 @@ export const GameUI = () => {
{scene === GAME_SCENES.GENERATE && (
)}
+
+
+ {snack.message}
+
+
);
};
diff --git a/src/service/gpt.ts b/src/service/gpt.ts
index bd2cf2e..5903dbc 100644
--- a/src/service/gpt.ts
+++ b/src/service/gpt.ts
@@ -16,7 +16,7 @@ export const OpenAIService = async () => {
role: "user",
content: `我想用NovelAI生成一张${keywords.join(
","
- )}少女画像,请为我生成不少于20个提示词,请使用英文表示。`,
+ )}画像,请为我生成不少于20个提示词,请使用英文表示。`,
},
],
});
diff --git a/src/types.ts b/src/types.ts
index 4e4a75f..ea6ffef 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -25,4 +25,5 @@ export type SceneProps = {
export type PromptToken = {
value: string;
+ class: "n" | "v" | "adj" | "adv";
};