Merge pull request #461 from Kathund/fixes-colon3

fixes stuff
This commit is contained in:
Wyvest 2025-12-29 14:09:49 +09:00 • committed by GitHub
commit 64db796830
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 92 additions and 73 deletions

View file

@ -303,8 +303,22 @@ export type VersionType =
*/
"old_beta"
const ARGS_MAP = { 'core':'{"updateClusterProfile":["name","profile"],"getRunningProcesses":[],"getLinkedPackages":["cluster_id"],"createCluster":["options"],"launchCluster":["id","uuid","search_for_java"],"getWorlds":["id"],"getUsers":[],"getClusters":[],"getPackage":["provider","slug"],"getMultiplePackages":["provider","slugs"],"installModpack":["modpack","cluster_id"],"removeCape":["access_token"],"setDiscordRPCMessage":["message"],"isClusterRunning":["cluster_id"],"writeSettings":["setting"],"getLogs":["id"],"getPackageBody":["provider","body"],"changeSkin":["access_token","skin_url","skin_variant"],"searchPackages":["provider","query"],"open":["input"],"openMsaLogin":[],"fetchLoggedInProfile":["access_token"],"readSettings":[],"removeCluster":["id"],"getClusterById":["id"],"createSettingsProfile":["name"],"updateClusterById":["id","request"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"killProcess":["pid"],"getLoadersForVersion":["mc_version"],"getProfileOrDefault":["name"],"setClusterStage":["id","stage"],"fetchMinecraftProfile":["uuid"],"getUsersFromAuthor":["provider","author"],"getLogByName":["id","name"],"getDefaultUser":["fallback"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"getUser":["uuid"],"removeUser":["uuid"],"changeCape":["access_token","cape_uuid"],"downloadExternalPackage":["package","cluster_id","force","skip_compatibility"],"convertUsernameUUID":["username_uuid"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"removePackage":["cluster_id","package_hash"],"getGameVersions":[],"getGlobalProfile":[],"setDefaultUser":["uuid"],"getScreenshots":["id"],"getRunningProcessesByClusterId":["cluster_id"]}', 'oneclient':'{"getClustersGroupedByMajor":[],"installUpdate":[],"checkForUpdate":[],"getBundlesFor":["cluster_id"],"getVersions":[]}', 'debug':'{"getLocale":[],"getArch":[],"getType":[],"getGitCommitHash":[],"openDevTools":[],"isInDev":[],"getFamily":[],"getPackageVersion":[],"getBuildTimestamp":[],"getPlatform":[],"getOsVersion":[]}', 'folders':'{"fromCluster":["folder_name"],"openCluster":["folder_name"]}', 'events':'{"process":["event"],"ingress":["event"],"message":["event"]}' }
export type Router = { 'oneclient': { getClustersGroupedByMajor: () => Promise<Partial<{ [key in number]: ClusterModel[] }>>,
const ARGS_MAP = { 'folders':'{"fromCluster":["folder_name"],"openCluster":["folder_name"]}', 'core':'{"getLogByName":["id","name"],"getClusterById":["id"],"getLogs":["id"],"setDiscordRPCMessage":["message"],"getClusters":[],"getWorlds":["id"],"createSettingsProfile":["name"],"getUsers":[],"isClusterRunning":["cluster_id"],"fetchMinecraftProfile":["uuid"],"getPackage":["provider","slug"],"getScreenshots":["id"],"getRunningProcessesByClusterId":["cluster_id"],"getUsersFromAuthor":["provider","author"],"getLinkedPackages":["cluster_id"],"openMsaLogin":[],"getDefaultUser":["fallback"],"downloadExternalPackage":["package","cluster_id","force","skip_compatibility"],"writeSettings":["setting"],"getUser":["uuid"],"readSettings":[],"fetchLoggedInProfile":["access_token"],"getLoadersForVersion":["mc_version"],"open":["input"],"killProcess":["pid"],"installModpack":["modpack","cluster_id"],"setClusterStage":["id","stage"],"getRunningProcesses":[],"getProfileOrDefault":["name"],"updateClusterProfile":["name","profile"],"removeCluster":["id"],"getGameVersions":[],"getPackageBody":["provider","body"],"getMultiplePackages":["provider","slugs"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"changeSkin":["access_token","skin_url","skin_variant"],"changeCape":["access_token","cape_uuid"],"removeUser":["uuid"],"setDefaultUser":["uuid"],"launchCluster":["id","uuid","search_for_java"],"updateClusterById":["id","request"],"createCluster":["options"],"getGlobalProfile":[],"searchPackages":["provider","query"],"removePackage":["cluster_id","package_hash"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"removeCape":["access_token"],"convertUsernameUUID":["username_uuid"]}', 'debug':'{"getArch":[],"getBuildTimestamp":[],"getPlatform":[],"getType":[],"getLocale":[],"getOsVersion":[],"openDevTools":[],"getGitCommitHash":[],"isInDev":[],"getPackageVersion":[],"getFamily":[]}', 'oneclient':'{"installUpdate":[],"getClustersGroupedByMajor":[],"checkForUpdate":[],"getBundlesFor":["cluster_id"],"getVersions":[]}', 'events':'{"process":["event"],"ingress":["event"],"message":["event"]}' }
export type Router = { 'events': { ingress: (event: IngressPayload) => Promise<void>,
message: (event: MessagePayload) => Promise<void>,
process: (event: ProcessPayload) => Promise<void> },
'debug': { openDevTools: () => Promise<void>,
isInDev: () => Promise<boolean>,
getArch: () => Promise<string>,
getFamily: () => Promise<string>,
getLocale: () => Promise<string | null>,
getType: () => Promise<string>,
getPlatform: () => Promise<string>,
getOsVersion: () => Promise<string>,
getGitCommitHash: () => Promise<string>,
getBuildTimestamp: () => Promise<string>,
getPackageVersion: () => Promise<string> },
'oneclient': { getClustersGroupedByMajor: () => Promise<Partial<{ [key in number]: ClusterModel[] }>>,
getBundlesFor: (clusterId: number) => Promise<ModpackArchive[]>,
getVersions: () => Promise<OnlineClusterManifest>,
checkForUpdate: () => Promise<Update | null>,
@ -358,22 +372,8 @@ removeCape: (accessToken: string) => Promise<MojangFullPlayerProfile>,
convertUsernameUUID: (usernameUuid: string) => Promise<MowojangProfile>,
setDiscordRPCMessage: (message: string) => Promise<null>,
open: (input: string) => Promise<null> },
'events': { ingress: (event: IngressPayload) => Promise<void>,
message: (event: MessagePayload) => Promise<void>,
process: (event: ProcessPayload) => Promise<void> },
'folders': { fromCluster: (folderName: string) => Promise<string>,
openCluster: (folderName: string) => Promise<null> },
'debug': { openDevTools: () => Promise<void>,
isInDev: () => Promise<boolean>,
getArch: () => Promise<string>,
getFamily: () => Promise<string>,
getLocale: () => Promise<string | null>,
getType: () => Promise<string>,
getPlatform: () => Promise<string>,
getOsVersion: () => Promise<string>,
getGitCommitHash: () => Promise<string>,
getBuildTimestamp: () => Promise<string>,
getPackageVersion: () => Promise<string> } };
openCluster: (folderName: string) => Promise<null> } };
export type { InferCommandOutput }

View file

@ -65,10 +65,10 @@ function ReplaceVariables(template: string, variables: Record<string, any>) {
function useDiscordRPC() {
const location = useLocation();
const clusterId = location.search.clusterId ?? 0;
const provider = location.search.provider ?? 'Modrinth';
const packageId = location.search.packageId ?? '8pJYUDNi';
const provider = location.search.provider ?? null;
const packageId = location.search.packageId ?? null;
const { data: cluster } = useCommand(['getClusterById', clusterId], () => bindings.core.getClusterById(clusterId));
const { data: managedPackage } = useCommand(['getPackage', provider, packageId], () => bindings.core.getPackage(provider, packageId));
const { data: managedPackage } = useCommand(['getPackage', provider, packageId], () => bindings.core.getPackage(provider!, packageId!), { enabled: provider != null && packageId != null });
useEffect(() => {
bindings.core.setDiscordRPCMessage(ReplaceVariables(ResolvedPathNames[location.pathname as URLPath], { clusterName: cluster?.name ?? 'UNKNOWN', packageName: managedPackage?.name ?? 'UNKNOWN' }));
}, [location.pathname, location.search.clusterId, cluster?.name, managedPackage?.name]);

View file

@ -21,18 +21,28 @@ export const Route = createFileRoute('/app/account')({
// TODO instead replace this with a refresh access_token function. Waiting on binding from @LynithDev
const { profile, search: validSearch } = search;
if (!profile)
return { profileData: null, profile: null, validSearch };
return { profileData: null, profile: null, validSearch, playerData: null };
const query = context.queryClient.ensureQueryData({
queryKey: ['fetchLoggedInProfile', profile.access_token],
queryFn: () => bindings.core.fetchLoggedInProfile(profile.access_token),
});
const profileData = await query;
const playerDataQuery = context.queryClient.ensureQueryData({
queryKey: ['fetchMinecraftProfile', profileData.id],
queryFn: () => bindings.core.fetchMinecraftProfile(profileData.id),
});
const playerData = await playerDataQuery
return {
profileData,
profile,
validSearch,
playerData
};
},
});

View file

@ -9,12 +9,14 @@ import { dataDir, downloadDir, join } from '@tauri-apps/api/path';
import { save } from '@tauri-apps/plugin-dialog';
import { exists, mkdir, readTextFile, writeFile, writeTextFile } from '@tauri-apps/plugin-fs';
import { Download01Icon, PlusIcon, Trash01Icon } from '@untitled-theme/icons-react';
import { OverlayScrollbarsComponent } from 'overlayscrollbars-react';
import { useEffect, useState } from 'react';
import { CrouchAnimation, FlyingAnimation, HitAnimation, IdleAnimation, WalkingAnimation } from 'skinview3d';
interface Skin {
is_slim: boolean;
skin_url: string;
cape_url?: string;
}
interface Cape {
@ -108,7 +110,7 @@ export function MissingAccountData({ validSearch }: { validSearch: boolean }) {
}
function RouteComponent() {
const { profileData, profile, queryClient, validSearch } = Route.useRouteContext();
const { profileData, profile, queryClient, validSearch, playerData } = Route.useRouteContext();
const [capes, setCapes] = useState<Array<Cape>>([]);
const [selectedCape, setSelectedCape] = useState<string>('');
@ -122,7 +124,7 @@ function RouteComponent() {
const [skins, setSkins, loaded] = useSkinHistory();
const [selectedSkin, setSelectedSkin] = useState<Skin>({ skin_url: getSkinUrl(null), is_slim: false });
const skinData: Skin = { is_slim: profileData?.skins[0].variant === 'slim', skin_url: getSkinUrl(profileData?.skins[0].url) };
const skinData: Skin = { is_slim: profileData?.skins[0].variant === 'slim', skin_url: getSkinUrl(profileData?.skins[0].url), cape_url: playerData?.cape_url ?? '' };
useEffect(() => {
if (!loaded)
@ -130,6 +132,7 @@ function RouteComponent() {
setSkins(prev => [...prev, skinData]);
setSelectedSkin(skinData);
setSelectedCape(skinData.cape_url ?? '')
}, [loaded]);
const importFromURL = (url: string) => {
@ -189,6 +192,7 @@ function RouteComponent() {
}
};
animations[0].animation.speed = animations[0].speed;
const [animation, setAnimation] = useState<PlayerAnimation>(animations[0].animation);
const [animationName, setAnimationName] = useState<string>(animations[0].name);
@ -238,7 +242,7 @@ function RouteComponent() {
<div className="min-h-full w-px bg-component-border"></div>
<div className="w-full flex flex-col min-h-full justify-between">
<div className="w-full flex flex-col min-h-full justify-between overflow-hidden">
<SkinHistoryRow
animation={animation}
@ -274,35 +278,38 @@ function RouteComponent() {
function SkinHistoryRow({ selected, animation, setSelectedSkin, skins, setSkins, importFromURL, importFromUsername, capeURL, shouldShowElytra }: { selected: Skin; animation: PlayerAnimation; setSelectedSkin: (skin: Skin) => void; skins: Array<Skin>; setSkins: (updater: (prev: Array<Skin>) => Array<Skin>) => void; importFromURL: (url: string) => void; importFromUsername: (username: string) => void; capeURL: string; shouldShowElytra: boolean }) {
return (
<div className="flex flex-col h-full justify-around">
<div className="flex flex-col h-full justify-around w-10/12">
<div className="flex flex-col justify-center items-center">
<p>Skin History</p>
</div>
<div className="flex flex-row h-fit gap-2">
<Overlay.Trigger>
<Button className="border border-component-border rounded-xl bg-component-border w-[75px] h-[120px]" color="ghost">
<div className="flex flex-col justify-center items-center content-center h-full">
<PlusIcon className="scale-200" />
</div>
</Button>
<Overlay>
<ImportSkinModal importFromURL={importFromURL} importFromUsername={importFromUsername} />
</Overlay>
</Overlay.Trigger>
{skins.map(skinData => (
<RenderSkin
animation={animation}
capeURL={capeURL}
key={skinData.skin_url}
selected={selected}
setSelectedSkin={setSelectedSkin}
setSkins={setSkins}
shouldShowElytra={shouldShowElytra}
skin={skinData}
/>
))}
</div>
<OverlayScrollbarsComponent>
<div className="flex flex-row h-fit gap-2">
<Overlay.Trigger>
<Button className="border border-component-border rounded-xl bg-component-border w-[75px] h-[120px]" color="ghost">
<div className="flex flex-col justify-center items-center content-center h-full">
<PlusIcon className="scale-200" />
</div>
</Button>
<Overlay>
<ImportSkinModal importFromURL={importFromURL} importFromUsername={importFromUsername} />
</Overlay>
</Overlay.Trigger>
{skins.map(skinData => (
<RenderSkin
animation={animation}
capeURL={capeURL}
key={skinData.skin_url}
selected={selected}
setSelectedSkin={setSelectedSkin}
setSkins={setSkins}
shouldShowElytra={shouldShowElytra}
skin={skinData}
/>
))}
<div className="w-4 shrink-0" />
</div>
</OverlayScrollbarsComponent>
</div>
);
}
@ -355,16 +362,16 @@ function RenderSkin({ skin, selected, animation, setSelectedSkin, setSkins, cape
{selected.skin_url === skin.skin_url
? <></>
: (
<Overlay.Trigger>
<Button className="group w-8 h-8 absolute top-0 right-0" color="ghost" size="icon">
<Trash01Icon className="group-hover:stroke-danger" />
</Button>
<Overlay.Trigger>
<Button className="group w-8 h-8 absolute top-0 right-0" color="ghost" size="icon">
<Trash01Icon className="group-hover:stroke-danger" />
</Button>
<Overlay>
<RemoveSkinCapeModal onPress={() => setSkins(prev => prev.filter(skinData => skinData.skin_url !== skin.skin_url))} />
</Overlay>
</Overlay.Trigger>
)}
<Overlay>
<RemoveSkinCapeModal onPress={() => setSkins(prev => prev.filter(skinData => skinData.skin_url !== skin.skin_url))} />
</Overlay>
</Overlay.Trigger>
)}
<Button
className="group w-8 h-8 absolute bottom-0 right-0"
color="ghost"
@ -379,21 +386,23 @@ function RenderSkin({ skin, selected, animation, setSelectedSkin, setSkins, cape
function CapeRow({ selected, animation, setSelectedCape, capes, shouldShowElytra, setShouldShowElytra, skinURL }: { selected: string | null; animation: PlayerAnimation; setSelectedCape: (cape: string) => void; capes: Array<Cape>; shouldShowElytra: boolean; setShouldShowElytra: () => void; skinURL: string }) {
return (
<div className="flex flex-col h-full justify-around">
<div className="flex flex-row h-fit gap-2">
{capes.map(cape => (
<RenderCape
animation={animation}
cape={cape.url}
key={cape.id}
selected={selected}
setSelectedCape={setSelectedCape}
shouldShowElytra={shouldShowElytra}
skinURL={skinURL}
/>
))}
</div>
<div className="flex flex-col h-full justify-around w-10/12">
<OverlayScrollbarsComponent className="pr-4">
<div className="flex flex-row h-fit gap-2 mr-4 pr-4">
{capes.map(cape => (
<RenderCape
animation={animation}
cape={cape.url}
key={cape.id}
selected={selected}
setSelectedCape={setSelectedCape}
shouldShowElytra={shouldShowElytra}
skinURL={skinURL}
/>
))}
<div className="w-4 shrink-0" />
</div>
</OverlayScrollbarsComponent>
<div className="flex flex-col justify-center items-center">
<p>Cape History</p>