Files
noticeUwuzu/src/feature/command/miq.ts
T

302 lines
8.9 KiB
TypeScript

import client, { createUeuse } from "@/lib/client";
import Memory from "@/lib/memory";
import ueuseModule from "better-uwuzu-sdk/types/1.6.8/types/modules/ueuse";
import i18next from "i18next";
import MiQ from "miq";
import { EOL } from "node:os";
export default async function miqCommand(ueuse: ueuseModule, args: string[]) {
if (!args[1]) {
await createUeuse({
text: i18next.t("lackOption", { command: "miq" }),
replyid: ueuse.uniqid,
}, "オプションが不足している旨");
return;
}
let mem = Memory.memory;
switch (args[1]) {
case "generate":
const itUeuse = await client.request("ueuse/get", {
uniqid: ueuse.replyid,
});
if (!itUeuse.success || !itUeuse.data[0]) {
console.warn("返信元のユーズの取得に失敗:", "error_code" in itUeuse
? itUeuse.error_code
: "データなし");
await createUeuse({
text: i18next.t("replySourceFailed"),
replyid: ueuse.uniqid,
}, "ソースが見つからない旨");
return;
}
mem = Memory.memory;
const permission = mem["permissions"][itUeuse.data[0].account.userid] ?? "consent";
switch (permission) {
case "me":
if (itUeuse.data[0].account.userid !== ueuse.account.userid) {
await createUeuse({
text: i18next.t("miqPermissionMe"),
replyid: ueuse.uniqid,
}, "権限が自分自身のみである旨");
return;
}
case "consent":
if (itUeuse.data[0].account.userid !== ueuse.account.userid) {
await createUeuse({
text: i18next.t("miqPermissionConsent", { userid: itUeuse.data[0].account.userid }),
replyid: ueuse.uniqid,
}, "権限が許可制である旨");
return;
}
}
const result = await MiQ({
type: "Base64Data",
color: (args[2] ?? "") === "color",
text: itUeuse.data[0].text,
iconURL: itUeuse.data[0].account.user_icon,
userid: itUeuse.data[0].account.userid,
username: itUeuse.data[0].account.username,
});
if (!(typeof result === "string")) {
await createUeuse({
text: i18next.t("miqGenerateFailed"),
replyid: ueuse.uniqid,
}, "Make it a Quoteの生成に失敗した旨");
return;
}
await createUeuse({
text: i18next.t("miqSuccess", { message: (args[2] ?? "") === "color"
? "カラーモードで生成しました。"
: "モノクロモードで生成しました。"
}),
media: {
photo: [result],
},
replyid: ueuse.uniqid,
}, "Make it a Quote");
break;
case "permission":
if (args[2] === undefined) {
mem = Memory.memory;
const permission = mem["permissions"][ueuse.account.userid] ?? "consent";
await createUeuse({
text: i18next.t("permissionResponse", { permission }),
replyid: ueuse.uniqid,
}, "権限");
return;
}
const availablePermission = ["me", "everyone", "consent"];
if (!(availablePermission.includes(args[2]))) {
await createUeuse({
text: i18next.t("invalidOption", { option: args[2], command: "miq" }),
replyid: ueuse.uniqid,
}, "無効なオプションである旨");
return;
}
{
mem = Memory.memory;
mem["permissions"][ueuse.account.userid] = args[2];
Memory.memory = mem;
await createUeuse({
text: i18next.t("permissionChangeSuccess", { username: ueuse.account.username, permission: args[2] }),
replyid: ueuse.uniqid,
}, "権限の変更に成功した旨");
}
break;
case "allow":
if (ueuse.replyid === "") {
await createUeuse({
text: i18next.t("injusticeFormat"),
replyid: ueuse.uniqid,
}, "形式が異なる旨");
return;
}
{
mem = Memory.memory;
const permission = mem["permissions"][ueuse.account.userid] ?? "consent";
if (permission !== "consent") {
await createUeuse({
text: i18next.t("permisionIsNotConsent"),
replyid: ueuse.uniqid,
}, "権限が許可制ではない旨");
return;
}
}
const confirmUeuse = await client.request("ueuse/get", {
uniqid: ueuse.replyid,
});
if (!confirmUeuse.success || !confirmUeuse.data[0]) {
console.warn("返信元のユーズの取得に失敗:", "error_code" in confirmUeuse
? confirmUeuse.error_code
: "データなし");
await createUeuse({
text: i18next.t("replySourceFailed"),
replyid: ueuse.uniqid,
}, "ソースが見つからない旨");
return;
}
if (confirmUeuse.data[0].replyid === "") {
await createUeuse({
text: i18next.t("injusticeFormat"),
replyid: ueuse.uniqid,
}, "形式が異なる旨");
return;
}
mem = Memory.memory;
if (confirmUeuse.data[0].account.userid !== mem["userid"]) {
console.warn("返信元のユーズがBotではない:", "error_code" in confirmUeuse
? confirmUeuse.error_code
: "データなし");
await createUeuse({
text: i18next.t("replySourceIsNotThis"),
replyid: ueuse.uniqid,
}, "返信元がこのBotではない旨");
return;
}
const requestUeuse = await client.request("ueuse/get", {
uniqid: confirmUeuse.data[0].replyid,
});
if (!requestUeuse.success || !requestUeuse.data[0]) {
console.warn("返信元のユーズの取得に失敗:", "error_code" in requestUeuse
? requestUeuse.error_code
: "データなし");
await createUeuse({
text: i18next.t("replySourceFailed"),
replyid: ueuse.uniqid,
}, "ソースが見つからない旨");
return;
}
if (requestUeuse.data[0].replyid === "") {
await createUeuse({
text: i18next.t("injusticeFormat"),
replyid: ueuse.uniqid,
}, "形式が異なる旨");
return;
}
const sourceUeuse = await client.request("ueuse/get", {
uniqid: requestUeuse.data[0].replyid,
});
if (!sourceUeuse.success || !sourceUeuse.data[0]) {
console.warn("返信元のユーズの取得に失敗:", "error_code" in sourceUeuse
? sourceUeuse.error_code
: "データなし");
await createUeuse({
text: i18next.t("replySourceFailed"),
replyid: ueuse.uniqid,
}, "ソースが見つからない旨");
return;
}
if (sourceUeuse.data[0].account.userid !== ueuse.account.userid) {
await createUeuse({
text: i18next.t("replySourceIsNotSourceUser"),
replyid: ueuse.uniqid,
}, "ソースのユーズと/miq allowのユーザーが一致しない旨");
return;
}
{
mem = Memory.memory;
let text = requestUeuse.data[0].text;
text = text.replace(`@${mem.userid}`, "");
text = text.trim();
const rows = text.split(/\r\n|\r|\n/).map(row => row.trim());
const commandRow = rows.filter(row => row.startsWith("/"))[0];
if (!commandRow || commandRow === "") {
console.warn("コマンドが本文から参照できません");
await createUeuse({
text: i18next.t("commandNotFound"),
replyid: requestUeuse.data[0].uniqid,
}, "コマンドが見つからない旨");
await createUeuse({
text: i18next.t("injusticeFormat"),
replyid: ueuse.uniqid,
}, "形式が異なる旨");
break;
}
const requestUeuseArgs = commandRow.replace("/", "").split(" ");
const result = await MiQ({
type: "Base64Data",
color: (requestUeuseArgs[2] ?? "") === "color",
text: sourceUeuse.data[0].text,
iconURL: sourceUeuse.data[0].account.user_icon,
userid: sourceUeuse.data[0].account.userid,
username: sourceUeuse.data[0].account.username,
});
if (!(typeof result === "string")) {
await createUeuse({
text: i18next.t("miqGenerateFailed"),
replyid: ueuse.uniqid,
}, "Make it a Quoteの生成に失敗した旨");
return;
}
await createUeuse({
text: i18next.t("miqSuccess", { message: ((requestUeuseArgs[2] ?? "") === "color"
? "カラーモードで生成しました。"
: "モノクロモードで生成しました。")
+ EOL + `@${requestUeuse.data[0].account.userid}`,
}),
media: {
photo: [result],
},
replyid: ueuse.uniqid,
}, "Make it a Quote");
}
break;
}
}