2026.4.0-alpha.0
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
import client from "@/lib/client";
|
||||
import ueuseModule from "better-uwuzu-sdk/types/1.6.8/types/modules/ueuse";
|
||||
import i18next from "i18next";
|
||||
|
||||
export default async function followCommand(ueuse: ueuseModule) {
|
||||
const follow = await client.request("users/follow", {
|
||||
userid: ueuse.account.userid,
|
||||
});
|
||||
|
||||
if (!follow.success) {
|
||||
console.warn("フォローに失敗:", follow.error_code);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("フォロー:", follow.userid);
|
||||
|
||||
const notice = await client.request("ueuse/create", {
|
||||
text: i18next.t("followedNotification", { username: ueuse.account.username }),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!notice.success) {
|
||||
console.warn("フォロー通知に失敗:", notice.error_code);
|
||||
}
|
||||
|
||||
console.log("フォロー通知:", notice.uniqid);
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
import client from "@/lib/client";
|
||||
import ueuseModule from "better-uwuzu-sdk/types/1.6.8/types/modules/ueuse";
|
||||
import i18next from "i18next";
|
||||
import { EOL } from "node:os";
|
||||
|
||||
const helps = [
|
||||
"help",
|
||||
"follow",
|
||||
"unfollow",
|
||||
"weather",
|
||||
"miq",
|
||||
];
|
||||
|
||||
export default async function helpCommand(ueuse: ueuseModule, args: string[]) {
|
||||
if (args[1] !== undefined) {
|
||||
if (!(helps.includes(args[1]))) {
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("invalidOption", { option: args[1], command: "help" }),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("コマンド詳細の返信に失敗:", response.error_code);
|
||||
return;
|
||||
}
|
||||
|
||||
console.warn("コマンド詳細:", response.uniqid);
|
||||
return;
|
||||
}
|
||||
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t(`fullHelp${args[1].charAt(0).toUpperCase()}${args[1].slice(1)}`),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("コマンド詳細の返信に失敗:", response.error_code);
|
||||
return;
|
||||
}
|
||||
|
||||
console.warn("コマンド詳細:", response.uniqid);
|
||||
return;
|
||||
}
|
||||
|
||||
let summarys = "";
|
||||
|
||||
for (let i = 0; i < helps.length; i++) {
|
||||
const help = helps[i];
|
||||
if (!help)
|
||||
break;
|
||||
|
||||
summarys += `${i18next.t(`help${help.charAt(0).toUpperCase()}${help.slice(1)}`)}${EOL}`;
|
||||
}
|
||||
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: summarys.trim(),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("コマンド概要の返信に失敗:", response.error_code);
|
||||
return;
|
||||
}
|
||||
|
||||
console.warn("コマンド概要:", response.uniqid);
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
import client 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 weatherCommand from "@/feature/command/weather";
|
||||
import helpCommand from "@/feature/command/help";
|
||||
import followCommand from "@/feature/command/follow";
|
||||
import unfollowCommand from "@/feature/command/unfollow";
|
||||
import miqCommand from "./miq";
|
||||
|
||||
export default async function commandExecute() {
|
||||
let ueuses: ueuseModule[] = [];
|
||||
|
||||
{
|
||||
const response = await client.request("me/notification/", {
|
||||
limit: 20,
|
||||
});
|
||||
|
||||
if (response.success) {
|
||||
for (const notification of response.data) {
|
||||
if (notification.category !== "reply")
|
||||
break;
|
||||
|
||||
if (!notification.valueid) {
|
||||
console.warn("返信通知にvalueidが存在しないため、スキップします");
|
||||
break;
|
||||
}
|
||||
|
||||
const ueuseResponse = await client.request("ueuse/get", {
|
||||
uniqid: notification.valueid,
|
||||
});
|
||||
|
||||
if (!ueuseResponse.success || !ueuseResponse.data[0]) {
|
||||
console.warn("返信通知からユーズを参照できないため、スキップします");
|
||||
break;
|
||||
}
|
||||
|
||||
ueuses.push(ueuseResponse.data[0]);
|
||||
}
|
||||
} else {
|
||||
console.warn("返信通知の取得に失敗しましたが、続行します");
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
const response = await client.request("ueuse/mentions", {
|
||||
limit: 20,
|
||||
});
|
||||
|
||||
if (response.success) {
|
||||
ueuses.push(...response.data);
|
||||
} else {
|
||||
console.warn("メンションの取得に失敗しましたが、続行します");
|
||||
}
|
||||
}
|
||||
|
||||
ueuses = [...new Set(ueuses)];
|
||||
|
||||
for (const ueuse of ueuses) {
|
||||
const repliedUeuse = (Memory.memory["repliedUeuse"] as string[]);
|
||||
|
||||
if (repliedUeuse.includes(ueuse.uniqid)) {
|
||||
console.log("既に応答しているため、スキップします");
|
||||
break;
|
||||
}
|
||||
|
||||
const mem = Memory.memory;
|
||||
let text = ueuse.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("コマンドが本文から参照できません");
|
||||
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("commandNotFound"),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success)
|
||||
console.warn("ユーズの作成に失敗しました:", response.error_code);
|
||||
break;
|
||||
}
|
||||
|
||||
const args = commandRow.replace("/", "").split(" ");
|
||||
|
||||
switch (args[0]) {
|
||||
case "help":
|
||||
await helpCommand(ueuse, args);
|
||||
break;
|
||||
case "weather":
|
||||
await weatherCommand(ueuse);
|
||||
break;
|
||||
case "follow":
|
||||
await followCommand(ueuse);
|
||||
break;
|
||||
case "unfollow":
|
||||
await unfollowCommand(ueuse);
|
||||
break;
|
||||
case "miq":
|
||||
await miqCommand(ueuse, args);
|
||||
break;
|
||||
default:
|
||||
console.warn("不明なコマンドが入力されました:", args[0]);
|
||||
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("unknownCommand", { command: args[0] }),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success)
|
||||
console.warn("ユーズの作成に失敗しました:", response.error_code);
|
||||
break;
|
||||
}
|
||||
|
||||
{
|
||||
const repliedUeuse = (Memory.memory["repliedUeuse"] as string[]);
|
||||
repliedUeuse.push(ueuse.uniqid);
|
||||
const mem = Memory.memory;
|
||||
mem["repliedUeuse"] = repliedUeuse;
|
||||
Memory.memory = mem;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,418 @@
|
||||
import client 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]) {
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("lackOption", { command: "miq" }),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("返信に失敗:", response.error_code);
|
||||
}
|
||||
|
||||
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
|
||||
: "データなし");
|
||||
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("replySourceFailed"),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.log("返信に失敗:", response.error_code);
|
||||
}
|
||||
|
||||
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) {
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("miqPermissionMe"),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("返信に失敗:", response.error_code);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
case "consent":
|
||||
if (itUeuse.data[0].account.userid !== ueuse.account.userid) {
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("miqPermissionConsent", { userid: itUeuse.data[0].account.userid }),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("返信に失敗:", response.error_code);
|
||||
}
|
||||
|
||||
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")) {
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("miqGenerateFailed"),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("返信に失敗:", response.error_code);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("miqSuccess", { message: (args[2] ?? "") === "color"
|
||||
? "カラーモードで生成しました。"
|
||||
: "モノクロモードで生成しました。"
|
||||
}),
|
||||
media: {
|
||||
photo: [result],
|
||||
},
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("返信に失敗:", response.error_code);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("MiQを生成:", response.uniqid);
|
||||
|
||||
break;
|
||||
case "permission":
|
||||
if (args[2] === undefined) {
|
||||
mem = Memory.memory;
|
||||
const permission = mem["permissions"][ueuse.account.userid] ?? "consent";
|
||||
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("permissionResponse", { permission }),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("返信に失敗:", response.error_code);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("返信:", response.uniqid);
|
||||
return;
|
||||
}
|
||||
|
||||
const availablePermission = ["me", "everyone", "consent"];
|
||||
if (!(availablePermission.includes(args[2]))) {
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("invalidOption", { option: args[2], command: "miq" }),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("返信に失敗:", response.error_code);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("返信:", response.uniqid);
|
||||
return;
|
||||
}
|
||||
|
||||
{
|
||||
mem = Memory.memory;
|
||||
mem["permissions"][ueuse.account.userid] = args[2];
|
||||
Memory.memory = mem;
|
||||
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("permissionChangeSuccess", { username: ueuse.account.username, permission: args[2] }),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("返信に失敗:", response.error_code);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("返信:", response.uniqid);
|
||||
}
|
||||
|
||||
break;
|
||||
case "allow":
|
||||
if (ueuse.replyid === "") {
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("injusticeFormat"),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("返信に失敗:", response.error_code);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("返信:", response.uniqid);
|
||||
return;
|
||||
}
|
||||
|
||||
{
|
||||
mem = Memory.memory;
|
||||
const permission = mem["permissions"][ueuse.account.userid] ?? "consent";
|
||||
|
||||
if (permission !== "consent") {
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("permisionIsNotConsent"),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("返信に失敗:", response.error_code);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("返信:", response.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
|
||||
: "データなし");
|
||||
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("replySourceFailed"),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.log("返信に失敗:", response.error_code);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (confirmUeuse.data[0].replyid === "") {
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("injusticeFormat"),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("返信に失敗:", response.error_code);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("返信:", response.uniqid);
|
||||
return;
|
||||
}
|
||||
|
||||
mem = Memory.memory;
|
||||
if (confirmUeuse.data[0].account.userid !== mem["userid"]) {
|
||||
console.warn("返信元のユーズがBotではない:", "error_code" in confirmUeuse
|
||||
? confirmUeuse.error_code
|
||||
: "データなし");
|
||||
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("replySourceIsNotThis"),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.log("返信に失敗:", response.error_code);
|
||||
}
|
||||
|
||||
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
|
||||
: "データなし");
|
||||
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("replySourceFailed"),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.log("返信に失敗:", response.error_code);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (requestUeuse.data[0].replyid === "") {
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("injusticeFormat"),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("返信に失敗:", response.error_code);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("返信:", response.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
|
||||
: "データなし");
|
||||
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("replySourceFailed"),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.log("返信に失敗:", response.error_code);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (sourceUeuse.data[0].account.userid !== ueuse.account.userid) {
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("replySourceIsNotSourceUser"),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.log("返信に失敗:", response.error_code);
|
||||
}
|
||||
|
||||
console.warn("ソースのユーズと/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("コマンドが本文から参照できません");
|
||||
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("commandNotFound"),
|
||||
replyid: requestUeuse.data[0].uniqid,
|
||||
});
|
||||
|
||||
if (!response.success)
|
||||
console.warn("ユーズの作成に失敗しました:", response.error_code);
|
||||
|
||||
{
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("injusticeFormat"),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("返信に失敗:", response.error_code);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("返信:", response.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")) {
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("miqGenerateFailed"),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("返信に失敗:", response.error_code);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const response = await client.request("ueuse/create", {
|
||||
text: i18next.t("miqSuccess", { message: ((requestUeuseArgs[2] ?? "") === "color"
|
||||
? "カラーモードで生成しました。"
|
||||
: "モノクロモードで生成しました。")
|
||||
+ EOL + `@${requestUeuse.data[0].account.userid}`,
|
||||
}),
|
||||
media: {
|
||||
photo: [result],
|
||||
},
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
console.warn("返信に失敗:", response.error_code);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("MiQを生成:", response.uniqid);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
import client from "@/lib/client";
|
||||
import ueuseModule from "better-uwuzu-sdk/types/1.6.8/types/modules/ueuse";
|
||||
import i18next from "i18next";
|
||||
|
||||
export default async function unfollowCommand(ueuse: ueuseModule) {
|
||||
const unfollow = await client.request("users/unfollow", {
|
||||
userid: ueuse.account.userid,
|
||||
});
|
||||
|
||||
if (!unfollow.success) {
|
||||
console.warn("フォロー解除に失敗:", unfollow.error_code);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("フォロー解除:", unfollow.userid);
|
||||
|
||||
const notice = await client.request("ueuse/create", {
|
||||
text: i18next.t("unfollowedNotification", { username: ueuse.account.username }),
|
||||
replyid: ueuse.uniqid,
|
||||
});
|
||||
|
||||
if (!notice.success) {
|
||||
console.warn("フォロー解除通知に失敗:", notice.error_code);
|
||||
}
|
||||
|
||||
console.log("フォロー解除通知:", notice.uniqid);
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
import ueuseModule from "better-uwuzu-sdk/types/1.6.8/types/modules/ueuse";
|
||||
import { weatherReply } from "@/feature/weatherNotice";
|
||||
|
||||
export default async function weatherCommand(ueuse: ueuseModule) {
|
||||
await weatherReply(ueuse.uniqid);
|
||||
}
|
||||
Reference in New Issue
Block a user