mirror of
https://gitea.tendokyu.moe/ppc/amnet.git
synced 2026-10-06 13:48:10 +03:00
Compare commits
10
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0d05a972ef | ||
|
|
3ef3c2937b | ||
|
|
6019eb1920 | ||
|
|
95f066817f | ||
|
|
bff0416f00 | ||
|
|
701a92dea5 | ||
|
|
3f17f9b432 | ||
|
|
6146f1c409 | ||
|
|
9b2c62c035 | ||
|
|
e77f401e0c |
@@ -0,0 +1,8 @@
|
|||||||
|
**/node_modules
|
||||||
|
**/dist
|
||||||
|
**/*.tsbuildinfo
|
||||||
|
.git
|
||||||
|
target
|
||||||
|
amnet-native
|
||||||
|
amnet-server-test
|
||||||
|
res
|
||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
FROM node:lts-alpine AS builder
|
||||||
|
|
||||||
|
WORKDIR /build
|
||||||
|
|
||||||
|
# amnet-shared packages
|
||||||
|
COPY amnet-shared/package.json amnet-shared/package.json
|
||||||
|
COPY amnet-shared/package-lock.json amnet-shared/package-lock.json
|
||||||
|
RUN cd amnet-shared && npm ci
|
||||||
|
|
||||||
|
# amnet-web packages
|
||||||
|
COPY amnet-web/package.json amnet-web/package.json
|
||||||
|
COPY amnet-web/package-lock.json amnet-web/package-lock.json
|
||||||
|
RUN cd amnet-web && npm ci
|
||||||
|
|
||||||
|
# main contents
|
||||||
|
COPY amnet-shared amnet-shared
|
||||||
|
COPY amnet-web amnet-web
|
||||||
|
|
||||||
|
RUN cd amnet-shared && npm run build
|
||||||
|
RUN cd amnet-web && npm run build
|
||||||
|
|
||||||
|
# ---
|
||||||
|
|
||||||
|
FROM joseluisq/static-web-server:2 AS final
|
||||||
|
|
||||||
|
ENV SERVER_PORT=8080
|
||||||
|
ENV SERVER_ROOT=/static
|
||||||
|
ENV SERVER_LOG_LEVEL=info
|
||||||
|
ENV SERVER_FALLBACK_PAGE=/static/index.html
|
||||||
|
|
||||||
|
COPY --from=builder /build/amnet-web/dist /static
|
||||||
|
|
||||||
|
EXPOSE 8080
|
||||||
|
|
||||||
|
# ENTRYPOINT/CMD doesn't need modifying
|
||||||
+10
-8
@@ -77,15 +77,17 @@ const Tab = createBottomTabNavigator();
|
|||||||
const Stack = createNativeStackNavigator();
|
const Stack = createNativeStackNavigator();
|
||||||
|
|
||||||
function AppContent() {
|
function AppContent() {
|
||||||
return (<Tab.Navigator tabBar={p => <AMUITabBar {...p}/>} screenOptions={{headerShown: false}}>
|
return (
|
||||||
<Tab.Screen name="servers"
|
<Tab.Navigator tabBar={p => <AMUITabBar {...p}/>} screenOptions={{headerShown: false}}>
|
||||||
component={ServerManagerStack}
|
<Tab.Screen name="servers"
|
||||||
options={{tabBarIcon: ({color, size}) => (<Server color={color} size={size}/>)}}/>
|
component={ServerManagerStack}
|
||||||
|
options={{tabBarIcon: ({color, size}) => (<Server color={color} size={size}/>)}}/>
|
||||||
|
|
||||||
<Tab.Screen name="cards"
|
<Tab.Screen name="cards"
|
||||||
component={CardManagerStack}
|
component={CardManagerStack}
|
||||||
options={{tabBarIcon: ({color, size}) => (<WalletCards color={color} size={size}/>)}}/>
|
options={{tabBarIcon: ({color, size}) => (<WalletCards color={color} size={size}/>)}}/>
|
||||||
</Tab.Navigator>)
|
</Tab.Navigator>
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function AppRoot() {
|
export default function AppRoot() {
|
||||||
|
|||||||
+2
-15
@@ -10,25 +10,12 @@
|
|||||||
"ios": {
|
"ios": {
|
||||||
"bundleIdentifier": "moe.ppc.amnet",
|
"bundleIdentifier": "moe.ppc.amnet",
|
||||||
"supportsTablet": true,
|
"supportsTablet": true,
|
||||||
"associatedDomains": [
|
|
||||||
"applinks:card.ppc.moe"
|
|
||||||
],
|
|
||||||
"infoPlist": {
|
"infoPlist": {
|
||||||
"NSAppTransportSecurity": {
|
"NSAppTransportSecurity": {
|
||||||
"NSAllowsArbitraryLoads": true
|
"NSAllowsArbitraryLoads": true
|
||||||
},
|
},
|
||||||
"UIDesignRequiresCompatibility": true,
|
"UIDesignRequiresCompatibility": true,
|
||||||
"UIViewControllerBasedStatusBarAppearance": false,
|
"UIViewControllerBasedStatusBarAppearance": false
|
||||||
"NFCReaderUsageDescription": "AMNet uses NFC to scan Physical IC Cards",
|
|
||||||
"com.apple.developer.nfc.readersession.felica.systemcodes": [
|
|
||||||
"0003",
|
|
||||||
"88b4"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"entitlements": {
|
|
||||||
"com.apple.developer.nfc.readersession.formats": [
|
|
||||||
"TAG"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"usesNonExemptEncryption": false
|
"usesNonExemptEncryption": false
|
||||||
@@ -36,7 +23,7 @@
|
|||||||
},
|
},
|
||||||
"android": {
|
"android": {
|
||||||
"package": "moe.ppc.amnet",
|
"package": "moe.ppc.amnet",
|
||||||
"versionCode": 8,
|
"versionCode": 9,
|
||||||
"adaptiveIcon": {
|
"adaptiveIcon": {
|
||||||
"foregroundImage": "./assets/icon-android.png",
|
"foregroundImage": "./assets/icon-android.png",
|
||||||
"backgroundColor": "#DED8FD"
|
"backgroundColor": "#DED8FD"
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import {BSON} from "realm";
|
import {BSON} from "realm";
|
||||||
import NfcManager from "react-native-nfc-manager";
|
import {ActivityIndicator, Button, Text, useTheme} from "react-native-paper";
|
||||||
import React, {useCallback, useEffect, useLayoutEffect, useMemo, useState} from "react";
|
import React, {useCallback, useEffect, useLayoutEffect, useMemo, useState} from "react";
|
||||||
import {ActivityIndicator, Button, IconButton, Text, useTheme} from "react-native-paper";
|
|
||||||
import {Alert, Platform, RefreshControl, ScrollView, Share, StyleSheet, View} from "react-native";
|
import {Alert, Platform, RefreshControl, ScrollView, Share, StyleSheet, View} from "react-native";
|
||||||
import {
|
import {
|
||||||
CircleCheck,
|
CircleCheck,
|
||||||
@@ -13,7 +12,6 @@ import {
|
|||||||
WifiOff,
|
WifiOff,
|
||||||
TvMinimalPlay,
|
TvMinimalPlay,
|
||||||
Star,
|
Star,
|
||||||
SmartphoneNfc,
|
|
||||||
SquareArrowOutUpRight
|
SquareArrowOutUpRight
|
||||||
} from "lucide-react-native";
|
} from "lucide-react-native";
|
||||||
|
|
||||||
@@ -26,7 +24,6 @@ import RealmContext from "../models/RealmContext";
|
|||||||
import {AMServer} from "../models/AMServer";
|
import {AMServer} from "../models/AMServer";
|
||||||
import {AMCard} from "../models/AMCard";
|
import {AMCard} from "../models/AMCard";
|
||||||
|
|
||||||
import {felicaCardReadAsync, icCard0008Number, ICType} from "../lib/iccard";
|
|
||||||
import {
|
import {
|
||||||
AMCardInRequest,
|
AMCardInRequest,
|
||||||
AMServerConnectionInfo,
|
AMServerConnectionInfo,
|
||||||
@@ -82,16 +79,6 @@ export default function ServerCardIn({route, navigation}) {
|
|||||||
}
|
}
|
||||||
}, [realm, server, navigation]);
|
}, [realm, server, navigation]);
|
||||||
|
|
||||||
// nfc support
|
|
||||||
const [nfcSupported, setNfcSupported] = useState<boolean | null>(Platform.select({android: false, default: null}));
|
|
||||||
useEffect(() => {
|
|
||||||
if (nfcSupported !== null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NfcManager.isSupported().then(setNfcSupported);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
// server state
|
// server state
|
||||||
const [serverRefreshing, setServerRefreshing] = useState<boolean>(false);
|
const [serverRefreshing, setServerRefreshing] = useState<boolean>(false);
|
||||||
const [serverReloadCounter, setServerReloadCounter] = useState<number>(0);
|
const [serverReloadCounter, setServerReloadCounter] = useState<number>(0);
|
||||||
@@ -101,7 +88,6 @@ export default function ServerCardIn({route, navigation}) {
|
|||||||
const [cardInCompleted, setCardInCompleted] = useState<boolean | null>(null);
|
const [cardInCompleted, setCardInCompleted] = useState<boolean | null>(null);
|
||||||
|
|
||||||
const disableCardIn = useMemo(() => cardInCompleted !== null || !serverConnectionSuccess, [cardInCompleted, serverConnectionSuccess]);
|
const disableCardIn = useMemo(() => cardInCompleted !== null || !serverConnectionSuccess, [cardInCompleted, serverConnectionSuccess]);
|
||||||
|
|
||||||
const serverDefaultCard = useMemo(() => {
|
const serverDefaultCard = useMemo(() => {
|
||||||
if (server?.isValid() !== true || !server.gameId) {
|
if (server?.isValid() !== true || !server.gameId) {
|
||||||
return null;
|
return null;
|
||||||
@@ -211,38 +197,6 @@ export default function ServerCardIn({route, navigation}) {
|
|||||||
return () => abortController.abort();
|
return () => abortController.abort();
|
||||||
}, [server]);
|
}, [server]);
|
||||||
|
|
||||||
const performPhysicalCardIn = useCallback(async () => {
|
|
||||||
const card = await felicaCardReadAsync();
|
|
||||||
|
|
||||||
if (!card) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const savedCard = cards.find(x => x.physicalCardData?.cardIDm === card.idm);
|
|
||||||
|
|
||||||
if (savedCard) {
|
|
||||||
setUserSelectedCard(savedCard);
|
|
||||||
cardInCallback(savedCard);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setCardInCompleted(false);
|
|
||||||
|
|
||||||
const cardId = card.type !== ICType.Amusement ? icCard0008Number(card.idm) : card.accessCode;
|
|
||||||
const abortController = new AbortController();
|
|
||||||
|
|
||||||
performCardIn(server, {cardId, physicalCardIDm: card.idm}, abortController.signal).then(r => {
|
|
||||||
setCardInCompleted(r);
|
|
||||||
}).catch(() => {
|
|
||||||
setCardInCompleted(false);
|
|
||||||
}).finally(() => {
|
|
||||||
setTimeout(() => setCardInCompleted(null), 3000);
|
|
||||||
});
|
|
||||||
|
|
||||||
setTimeout(() => abortController.abort(), 5000);
|
|
||||||
return () => abortController.abort();
|
|
||||||
}, [server]);
|
|
||||||
|
|
||||||
const performRefresh = () => {
|
const performRefresh = () => {
|
||||||
setServerRefreshing(true);
|
setServerRefreshing(true);
|
||||||
setServerReloadCounter(serverReloadCounter + 1);
|
setServerReloadCounter(serverReloadCounter + 1);
|
||||||
@@ -262,8 +216,7 @@ export default function ServerCardIn({route, navigation}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ScrollView contentInsetAdjustmentBehavior="automatic"
|
<ScrollView contentInsetAdjustmentBehavior="automatic" refreshControl={<RefreshControl refreshing={serverRefreshing} onRefresh={performRefresh}/>}>
|
||||||
refreshControl={<RefreshControl refreshing={serverRefreshing} onRefresh={performRefresh}/>}>
|
|
||||||
<View style={styles.container}>
|
<View style={styles.container}>
|
||||||
<StatusAlert server={server} connectionEstablished={serverConnectionSuccess}/>
|
<StatusAlert server={server} connectionEstablished={serverConnectionSuccess}/>
|
||||||
<View style={styles.section}>
|
<View style={styles.section}>
|
||||||
@@ -274,28 +227,16 @@ export default function ServerCardIn({route, navigation}) {
|
|||||||
actionIcon={<CircleCheck color="green" size={24}/>}>
|
actionIcon={<CircleCheck color="green" size={24}/>}>
|
||||||
{serverDefaultCard?.code == selectedCard.code && <DefaultCardDetail/>}
|
{serverDefaultCard?.code == selectedCard.code && <DefaultCardDetail/>}
|
||||||
</ICCard>
|
</ICCard>
|
||||||
<View style={{display: "flex", flexDirection: "row", gap: 5}}>
|
<Button style={{flex: 1}}
|
||||||
<Button style={{flex: 1}}
|
|
||||||
textColor="white"
|
textColor="white"
|
||||||
disabled={disableCardIn}
|
disabled={disableCardIn}
|
||||||
contentStyle={{flexDirection: 'row-reverse'}}
|
contentStyle={{flexDirection: 'row-reverse'}}
|
||||||
mode={serverConnectionSuccess ? "contained" : "outlined"}
|
mode={serverConnectionSuccess ? "contained" : "outlined"}
|
||||||
buttonColor={cardInCompleted === false ? "red" : "green"}
|
buttonColor={cardInCompleted === false ? "red" : "green"}
|
||||||
onPress={() => cardInCallback(selectedCard)}
|
onPress={() => cardInCallback(selectedCard)}
|
||||||
icon={() => <SquareArrowOutUpRight color={disableCardIn ? "gray" : "white"}
|
icon={() => <SquareArrowOutUpRight color={disableCardIn ? "gray" : "white"} size={18}/>}>
|
||||||
size={18}/>}>
|
{cardInCompleted === null ? "Card In" : cardInCompleted ? "Card In Success" : "Failed"}
|
||||||
{cardInCompleted === null ? "Card In" : cardInCompleted ? "Card In Success" : "Failed"}
|
</Button>
|
||||||
</Button>
|
|
||||||
{nfcSupported === true && (
|
|
||||||
<IconButton
|
|
||||||
mode="outlined"
|
|
||||||
disabled={disableCardIn}
|
|
||||||
onPress={performPhysicalCardIn}
|
|
||||||
style={{borderRadius: 10, margin: 0, height: "100%", flex: 0.2}}
|
|
||||||
icon={() => <SmartphoneNfc
|
|
||||||
color={disableCardIn ? "gray" : theme.colors.onBackground} size={18}/>}/>
|
|
||||||
)}
|
|
||||||
</View>
|
|
||||||
</>
|
</>
|
||||||
: <View style={styles.emptyPlaceholderView}>
|
: <View style={styles.emptyPlaceholderView}>
|
||||||
<EmptyStatePlaceholder message="No card selected" icon={<CreditCard color="gray"/>}/>
|
<EmptyStatePlaceholder message="No card selected" icon={<CreditCard color="gray"/>}/>
|
||||||
@@ -329,8 +270,7 @@ export default function ServerCardIn({route, navigation}) {
|
|||||||
{serverDefaultCard?.code == card.code && <DefaultCardDetail/>}
|
{serverDefaultCard?.code == card.code && <DefaultCardDetail/>}
|
||||||
</ICCard>))
|
</ICCard>))
|
||||||
: <View style={styles.emptyPlaceholderView}>
|
: <View style={styles.emptyPlaceholderView}>
|
||||||
<EmptyStatePlaceholder message="No additional cards"
|
<EmptyStatePlaceholder message="No additional cards" icon={<SmartphoneNfcIcon color="gray"/>}/>
|
||||||
icon={<SmartphoneNfcIcon color="gray"/>}/>
|
|
||||||
</View>}
|
</View>}
|
||||||
</View>)}
|
</View>)}
|
||||||
</View>
|
</View>
|
||||||
|
|||||||
@@ -1,15 +1,12 @@
|
|||||||
|
import React from "react";
|
||||||
import {StatusBar} from "expo-status-bar";
|
import {StatusBar} from "expo-status-bar";
|
||||||
import NfcManager from "react-native-nfc-manager";
|
|
||||||
|
|
||||||
import React, {useEffect, useState} from "react";
|
|
||||||
import {Platform, TouchableOpacity, View} from "react-native";
|
import {Platform, TouchableOpacity, View} from "react-native";
|
||||||
import {createNativeStackNavigator} from "@react-navigation/native-stack";
|
import {createNativeStackNavigator} from "@react-navigation/native-stack";
|
||||||
|
|
||||||
import {Card, Text, useTheme} from "react-native-paper";
|
import {Card, Text, useTheme} from "react-native-paper";
|
||||||
import {ShieldBan, SmartphoneNfc, SquareAsterisk, SquarePlus} from "lucide-react-native";
|
import {SquareAsterisk, SquarePlus} from "lucide-react-native";
|
||||||
|
|
||||||
import ManualCardEntry from "./ManualCardEntry";
|
import ManualCardEntry from "./ManualCardEntry";
|
||||||
import PhysicalCardScan from "./PhyscialCardScan";
|
|
||||||
|
|
||||||
const Stack = createNativeStackNavigator();
|
const Stack = createNativeStackNavigator();
|
||||||
|
|
||||||
@@ -18,7 +15,6 @@ function CardAddModal() {
|
|||||||
<Stack.Navigator initialRouteName="Select" screenOptions={{headerTitleStyle: {fontWeight: "bold"}}}>
|
<Stack.Navigator initialRouteName="Select" screenOptions={{headerTitleStyle: {fontWeight: "bold"}}}>
|
||||||
<Stack.Screen name="Select" component={CardAddMethodSelector} options={{headerShown: false}}/>
|
<Stack.Screen name="Select" component={CardAddMethodSelector} options={{headerShown: false}}/>
|
||||||
|
|
||||||
<Stack.Screen name="Scan" component={PhysicalCardScan} options={{title: "Add Physical Card"}}/>
|
|
||||||
<Stack.Screen name="Manual" component={ManualCardEntry} options={{title: "Add Card Manually"}}/>
|
<Stack.Screen name="Manual" component={ManualCardEntry} options={{title: "Add Card Manually"}}/>
|
||||||
</Stack.Navigator>
|
</Stack.Navigator>
|
||||||
)
|
)
|
||||||
@@ -26,11 +22,6 @@ function CardAddModal() {
|
|||||||
|
|
||||||
function CardAddMethodSelector({navigation}) {
|
function CardAddMethodSelector({navigation}) {
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const [nfcSupported, setNfcSupported] = useState<boolean | null>(null);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
NfcManager.isSupported().then(setNfcSupported);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -45,19 +36,6 @@ function CardAddMethodSelector({navigation}) {
|
|||||||
</Text>
|
</Text>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
{nfcSupported !== null && (
|
|
||||||
<>
|
|
||||||
<MethodCard title="Scan Physical Card"
|
|
||||||
disabled={!nfcSupported}
|
|
||||||
color={nfcSupported ? "#03a9f4" : "gray"}
|
|
||||||
icon={nfcSupported ? <SmartphoneNfc/> : <ShieldBan/>}
|
|
||||||
description={nfcSupported ? "Amusement IC or Transport cards supported" : "NFC is not supported on this device"}
|
|
||||||
onPress={() => navigation.navigate('Scan')}/>
|
|
||||||
|
|
||||||
<View></View>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
|
|
||||||
<MethodCard color={theme.colors.secondary}
|
<MethodCard color={theme.colors.secondary}
|
||||||
icon={<SquareAsterisk/>}
|
icon={<SquareAsterisk/>}
|
||||||
title="Enter Details Manually"
|
title="Enter Details Manually"
|
||||||
@@ -106,8 +84,4 @@ function MethodCard(props: {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// the nfc library doesn't offer the same support for felica cards on android compared to ios...
|
export default CardAddModal;
|
||||||
export default Platform.select({
|
|
||||||
ios: CardAddModal,
|
|
||||||
default: ManualCardEntry
|
|
||||||
});
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
import {StatusBar} from "expo-status-bar";
|
|
||||||
import {useNavigation} from "@react-navigation/native";
|
|
||||||
import {Card, Text, useTheme} from "react-native-paper";
|
|
||||||
import {useCallback, useLayoutEffect, useState} from "react";
|
|
||||||
import {Platform, TextInput, TouchableOpacity, View} from "react-native";
|
|
||||||
|
|
||||||
import RealmContext from "../../models/RealmContext";
|
|
||||||
import {useModalStyles} from "../../utils/ModalStyles";
|
|
||||||
|
|
||||||
import {AMCard} from "../../models/AMCard";
|
|
||||||
import {AMPhysicalCardData} from "../../models/AMPhysicalCardData";
|
|
||||||
import {felicaCardReadAsync, icCard0008Number, ICType} from "../../lib/iccard";
|
|
||||||
|
|
||||||
const {useRealm} = RealmContext;
|
|
||||||
|
|
||||||
export default function PhysicalCardScan() {
|
|
||||||
const realm = useRealm();
|
|
||||||
const theme = useTheme();
|
|
||||||
const navigation = useNavigation();
|
|
||||||
const modalStyles = useModalStyles();
|
|
||||||
|
|
||||||
const [cardName, setCardName] = useState<string>('');
|
|
||||||
|
|
||||||
const handleScan = useCallback(async () => {
|
|
||||||
const cardInfo = await felicaCardReadAsync();
|
|
||||||
|
|
||||||
if (!cardInfo) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
realm.write(() => {
|
|
||||||
// check if the card has already been registered (convert a manually entered card to a physically scanned card)
|
|
||||||
const accessCode = cardInfo.type === ICType.Amusement ? cardInfo.accessCode : icCard0008Number(cardInfo.idm);
|
|
||||||
const cardEntity = realm.objects<AMCard>(AMCard.schema.name).find(x => x.code === accessCode) ?? realm.create<AMCard>(AMCard.schema.name, AMCard.generate(accessCode, cardName));
|
|
||||||
|
|
||||||
// set physical card props
|
|
||||||
cardEntity.name = cardName;
|
|
||||||
cardEntity.added = new Date();
|
|
||||||
cardEntity.physicalCardData ??= realm.objectForPrimaryKey<AMPhysicalCardData>(AMPhysicalCardData.schema.name, cardInfo.idm) ?? realm.create<AMPhysicalCardData>(AMPhysicalCardData.schema.name, {
|
|
||||||
cardIDm: cardInfo.idm,
|
|
||||||
cardType: cardInfo.type,
|
|
||||||
cardVendor: cardInfo.type === ICType.Amusement ? cardInfo.vendor : null
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// dismiss the parent screen (this screen can only be accessed from modal -> stack)
|
|
||||||
navigation.getParent()?.goBack();
|
|
||||||
}, [realm, navigation, cardName]);
|
|
||||||
|
|
||||||
useLayoutEffect(() => {
|
|
||||||
const canSave = cardName.length;
|
|
||||||
const themeOptions = canSave ? modalStyles.headerText : {color: theme.colors.outline};
|
|
||||||
|
|
||||||
navigation.setOptions({
|
|
||||||
headerRight: () => <TouchableOpacity disabled={!canSave} onPress={() => handleScan()}>
|
|
||||||
<Text variant="bodyMedium" style={{...themeOptions}}>Scan</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
})
|
|
||||||
}, [navigation, modalStyles, cardName]);
|
|
||||||
|
|
||||||
return (<>
|
|
||||||
{Platform.OS == 'ios' && <StatusBar style="light"/>}
|
|
||||||
<View style={modalStyles.rootLayout}>
|
|
||||||
<Card mode="contained">
|
|
||||||
<Card.Content>
|
|
||||||
<View style={modalStyles.formItemRow}>
|
|
||||||
<Text variant="bodyMedium" style={modalStyles.formItemName}>
|
|
||||||
Card Name
|
|
||||||
</Text>
|
|
||||||
<TextInput style={modalStyles.formItemInput}
|
|
||||||
autoFocus
|
|
||||||
numberOfLines={1}
|
|
||||||
value={cardName}
|
|
||||||
onChangeText={setCardName}
|
|
||||||
placeholder="Primary Card"
|
|
||||||
placeholderTextColor={theme.colors.outline}/>
|
|
||||||
</View>
|
|
||||||
</Card.Content>
|
|
||||||
</Card>
|
|
||||||
|
|
||||||
<Text variant="bodyMedium" style={modalStyles.formFootnote}>
|
|
||||||
Ensure you have either an Amusement IC or Transport card ready to scan.
|
|
||||||
After the scan has completed, the card will be saved to your device.
|
|
||||||
</Text>
|
|
||||||
</View>
|
|
||||||
</>)
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
import {Buffer} from "buffer";
|
|
||||||
|
|
||||||
const s_box_inv = [
|
|
||||||
"243cba36e385a4d0934373b9706ec9f1100e9b2c97e70b636c2920fe86f3e1f5f69fb616047b8fabb1392a1beb5ca8ac3811125f893e7dcaec53db6d1ed281789646fff9541c287a4fd3c0dcc16af2bccb57fd4ae4f0b2c79540625241e2ad49a6b51f02c8da92e5b0c564764821de0f45584cdfa784cfd5154e27806b7ffc44714722dd300ca13be037a03523903274bf8dc2ead650bbd9c483b43168558b5df47218b7eff7982d010361cc0a8e1300e814af095175a52f1d0d658acd66073d05d84be99d997c91d1b819c32b426988c679173a4d5ba25afb253fbdf8edcee687a326a92ebe94087e67608c9c5e6fb39e06fa82aeee5977d71a9a34d456aa33",
|
|
||||||
"f9817c00b93037d590516ef0b206fbcd39145ff81bc74a82708c921deac34ec812e6b610d32f95842542a572e58f55ef86a253aeed262047de786828e445cc35bc3ebb8ec0be34afa60964017b44f5f3b13fa4b33280c94f6f40bf214c74e1115eeb3d712e9d6275d41648771367ad6b5d0787f7a89a59768b9b1ed8eeaae9992dc597f1a783fccadcbab84be88917050ba06523d1ce3603d7e0f291df0e9c2c0d66d673585cb40a4dc23bd2b7e2ac33db6027bd56432404028d7d7ff6b5f4fddd5bec79c4221fa18854e71998947e31a329e35acb6ab0cf6d936c7a08a93c1cd06350c68538c14149ab61522a9fd9181a57462b69dafaff0f15963a8afe9e0c",
|
|
||||||
"11a29ac394a051015bf7d130ee1f06d57767d3c16ee76a1aa48e9f6566d60c2dc6e469b7565a5760fc791ee11652f007d0cdca78c98bb38827f6e0c084cf2fa304008040a7fa759d4b89462228373413ff20b4da08266c8ff25d7b735c4c9071418a9ebb12e8556d2a254aafbd9519a531baadd9c5a66b83c4b6a9ccf9a1b17adcc7db2e7e7f8d4e620f0339fdb8d418c2ec6102531c3b7dbc1d59f58c98f16f9385f82c74d85e4d97ab87820a21425f0d5833443adde9fb5047c8d7819be51b1754862beff429320e7c2315ebe63c35e296683f0b43cede9cbe4f457276b510e3df92d2a84891b9acbf49b2996470eaf33e6314aeedaa24fe3dcbb009383605",
|
|
||||||
"c4f02849554af5fd75af2069c843866bc9a8c6544cdd025be89b597734d7c0515ff37ed4f19081ce198a7833cd978cd66a4b8fa480dc1a1714c5078766ad9d85b2f88d98df3e1f3f645840ac6c5c085d53baffd2a92c25abe432389af9cbc29167d0e322292d9248b40e9905a36f0a15efd5104fd8f600e6462b31578394ae03eb8e1324a11e5ed126d9a7ca366e7137eeb1fa7c7606b823be21bc9ec1da7a3b62277bb0e56318827f0feda02a9cbf11bde0880d3a795256f7b6d309161b70b342602f1ca29f72124547bbe10b018b1ddeec0c4ee9cfcc9574f4a593c7db4dfb3565fee739b5ea96c304414484fc6d30e2f268b7897d733db95a50a63c61aa2e",
|
|
||||||
"1a599cadc8e41154ed370f3ae65f3c4bb81589b1e8da697791568bdb0624cf18f8b087df8c35cb86539da4664a7a710a4838ffdc8320ce9832f6d7af705e738a14721ec129790708e94346d02fde2a4f3d2c50b375fc0b64ae317b61a530a093d2bec255ba6cf36268fdac3b95491f6bb485f7a603ec6e9a81090c6aee9e4ef0ab2d7ea1e1bbc9bc41f2fa2e1bdd2734d36004b501d640f9d50247d9d8e08f2bfbb7c5eb5716e5788df400cd8239c696bdbfe336450e261d63e7843eb69b22a3f58e236dc3997d9097102580d44ce274ccb25c33c7ea05123f51a8fef11c42cad176286f92a767a919a2445baaef587f21c08865b95d4d0d5ac413527c9f9417",
|
|
||||||
"c72b82615bd09684d34a70a19b59339fc02014532917c50bc97b97020d3a1e7c3f6b52e8753df6e40c8a4fc35f2665733123284874aaa73609b1e291045122fc08a605a4f1121c19eb4037c2a0411dd4dc07438f47afd12e98ab01baf06668acf9e769b6cb8d78871503d5dfa31a9d6aea2f944e9e42d7b83892d8bbdedd9abcb04c79f4583ee98381ffe355fd5db2ef9c6d549960da3becfa11d6c42aed4bae13bfb9068be01f7f5aad90390ff3bd466c2cf2f8fed9e6720e89be5ec6a8cff5577e8cb7e1887ac81b18db6f35d216326463a58ef7b47695867de5a95c8500c1934dfb30a2b5253410773c67712d4445560a50b3cd6280ce214924caee276ecc",
|
|
||||||
"a5b06db251551fbf3e8ddd1992ea1bbd326529a48967b1906800da0da65954f210142f45e03b23fad750ac93e643010a5c78709846a97bf395072ad374b33fa36082394e3448c01cf6c291644d3cf89d359a94e37af0f96eb912b8042d02281385728087db2bf14f26a2e1497e9ccca7b6a0d09b3677ad8b6b4a031d058a064bafe531b5d4c60c66ba83fd090fae71b76fdc41e8178e407f6230ffa88425fb16ce3744ab991eeb183a47f75f81cfed582c6cfe9e57539720ca791a5a88f5699fe7d90ebe42df56e44c22aa730b15c5eefcc7d6cbcd8ce27621e9d1ecc87dd88f617c2ebcdeb475d2c4633da15e5d6a0824c927bbef33865bd5385211f4c396c1",
|
|
||||||
"345adb2c5957122b30c2a092bfedbc45de279b96d3e6c5ebd8244ba421cca8d6ce3cbab109e0d732664a831d19ca89670f420771e9bb445e8517c4ae9c3f6b78e76d02a7fe33e3d90a7deaf118877b6203795223003e25b9dd16683b1f90a62ac629918a9def1e8476ee4f39fb111b0b93ad49b705e14dcbe838d055f2f70d8b65cdfad49ec9814e14c826b6f9aaf580f86a98ab58f3b88eb5974372a2da64c1405c13b0e5bd089f1c7e8f06be6e501a2f37a1fc102e705304206348e2fd6f7a7561b3353acf5b888251d247a5a9746c31947c9ac0ec150e28012dc3f0b4e48ddcac3d5f86c79522f4b2a35446d1778c0cffaf565d36697f994cd56073df41f6",
|
|
||||||
"04da79631ebdeae30b652501cda992ed187557308903096adcc798a450911fb10c778566ca121c67c2e01783599dd5228256a89fc66048b311fca328fb06dd5dba297a4fe8fee910cbf3937b6c6954e744a2841d8dcefffa1a879074a1f814aabcc0cf31b4d9bfd85e262dd0e43f19d68c2fab3958726edf3be63cb66288de40b28f9b7c9543d19eac9cd423e10e4b5333462013341b97f7f1c3614a6f5a217f702e554105c5d776e52715ec425c4d78358befd2eeb5beae023ad35fc424f0f9514eeb000ffdaf3ec19a528681807ef62bccb97d68f2ad99a7072c7338b06bb78e71a0f43da60d37db0a473616966d322a5be24594f5a54cc88a4964bb08c9b8"
|
|
||||||
];
|
|
||||||
|
|
||||||
function rotate_right(data: Uint8Array, nBytes: number, nBits: number) {
|
|
||||||
let prior = data[nBytes - 1];
|
|
||||||
|
|
||||||
for (let i = 0; i < nBytes; i++) {
|
|
||||||
let current = data[i];
|
|
||||||
|
|
||||||
data[i] = (current >> nBits) | ((prior & ((1 << nBits) - 1)) << (8 - nBits));
|
|
||||||
prior = current;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const S_BOX_INV = s_box_inv.map(x => new Uint8Array(Buffer.from(x, 'hex')));
|
|
||||||
const N_TABLES = S_BOX_INV.length - 1;
|
|
||||||
const ITER_ADD = 5;
|
|
||||||
|
|
||||||
export function performDecrypt(data: Uint8Array) {
|
|
||||||
const spad = data.map(x => S_BOX_INV[N_TABLES][x]);
|
|
||||||
|
|
||||||
let count = (spad[15] >> 4) + 7;
|
|
||||||
let table = spad[15] + ITER_ADD * count;
|
|
||||||
|
|
||||||
for (let z = 0; z < count; z++) {
|
|
||||||
table -= ITER_ADD;
|
|
||||||
rotate_right(spad, 15, 5);
|
|
||||||
|
|
||||||
for (let i = 0; i < 15; i++) {
|
|
||||||
spad[i] = S_BOX_INV[table % N_TABLES][spad[i]];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
version: spad[0],
|
|
||||||
accessCodeBytes: spad.slice(6) // access code is a binary-coded decimal
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,3 @@
|
|||||||
import {Buffer} from "buffer";
|
|
||||||
import NfcManager, {NfcTech} from "react-native-nfc-manager";
|
|
||||||
|
|
||||||
import {performDecrypt} from "./iccard-crypto";
|
|
||||||
|
|
||||||
export enum ICType {
|
export enum ICType {
|
||||||
Amusement = 1,
|
Amusement = 1,
|
||||||
Transport = 2
|
Transport = 2
|
||||||
@@ -41,92 +36,3 @@ export function icCard0008Number(idm: string): string {
|
|||||||
// 0008 is the numerical representation of the idm padded with zeros until it is 20 digits
|
// 0008 is the numerical representation of the idm padded with zeros until it is 20 digits
|
||||||
return BigInt(`0x${idm}`).toString().padStart(20, '0');
|
return BigInt(`0x${idm}`).toString().padStart(20, '0');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Reads a FeliCa card, returning access code information.
|
|
||||||
*/
|
|
||||||
export async function felicaCardReadAsync(): Promise<ICCard | null> {
|
|
||||||
try {
|
|
||||||
await NfcManager.requestTechnology(NfcTech.FelicaIOS, {
|
|
||||||
isReaderModeEnabled: true,
|
|
||||||
invalidateAfterFirstRead: false,
|
|
||||||
alertMessage: "Hold an Amusement IC or Transport card to the top of your phone to scan it."
|
|
||||||
});
|
|
||||||
|
|
||||||
const tag = await NfcManager.getTag();
|
|
||||||
const idm = tag['idm'] as string;
|
|
||||||
|
|
||||||
switch (tag['systemCode'] as string) {
|
|
||||||
case "0003":
|
|
||||||
return {
|
|
||||||
type: ICType.Transport,
|
|
||||||
idm
|
|
||||||
};
|
|
||||||
|
|
||||||
case "88B4":
|
|
||||||
return await readAmusementICCardContents(idm);
|
|
||||||
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
} catch (ex) {
|
|
||||||
return null;
|
|
||||||
} finally {
|
|
||||||
await NfcManager.cancelTechnologyRequest();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function readAmusementICCardContents(idm: string): Promise<AmusementICCard | null> {
|
|
||||||
const idmBytes = Uint8Array.from(Buffer.from(idm, 'hex'));
|
|
||||||
const readCommand = [
|
|
||||||
0x06, // read
|
|
||||||
...idmBytes,
|
|
||||||
0x01, // service count (fixed)
|
|
||||||
0x0B, 0x00, // service code (000b, le)
|
|
||||||
0x02, // block count
|
|
||||||
0x80, 0x00, // S_PAD0 block
|
|
||||||
0x80, 0x82 // ID block
|
|
||||||
];
|
|
||||||
|
|
||||||
let response = await NfcManager.sendFelicaCommandIOS(readCommand);
|
|
||||||
const offset = response.indexOf(0x07); // look for 0x07 as for some reason the response may not start at response[0]
|
|
||||||
|
|
||||||
// response must have 44 bytes
|
|
||||||
if (offset === -1 || response.length - offset !== 44) {
|
|
||||||
return null;
|
|
||||||
} else if (offset !== 0) {
|
|
||||||
response = response.slice(offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
// response format:
|
|
||||||
// 0 - read response (0x07)
|
|
||||||
// 1-8 - IDm
|
|
||||||
// 9 - status flag 1
|
|
||||||
// 10 - status flag 2
|
|
||||||
// 11 - number of blocks (0x02)
|
|
||||||
// 12-27 - S_PAD0 block
|
|
||||||
// 28-43 - ID block (DFC is 35-36)
|
|
||||||
|
|
||||||
if (response[9] !== 0x00 || response[11] !== 0x02) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
const dfcValue = response[37] | (response[36] << 8);
|
|
||||||
|
|
||||||
if (dfcValue in AmusementICVendor && dfcValue !== AmusementICVendor.Unknown) {
|
|
||||||
const accessCode = performDecrypt(new Uint8Array(response.slice(12, 28)));
|
|
||||||
return {
|
|
||||||
type: ICType.Amusement,
|
|
||||||
accessCode: [...accessCode.accessCodeBytes].map(x => x.toString(16).padStart(2, '0')).join(''),
|
|
||||||
vendor: dfcValue,
|
|
||||||
idm
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
type: ICType.Amusement,
|
|
||||||
accessCode: icCard0008Number(idm),
|
|
||||||
vendor: AmusementICVendor.Unknown,
|
|
||||||
idm
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|||||||
Generated
+8
-24
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "amnet-native",
|
"name": "amnet-native",
|
||||||
"version": "1.3.2",
|
"version": "1.3.9",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "amnet-native",
|
"name": "amnet-native",
|
||||||
"version": "1.3.2",
|
"version": "1.3.9",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.28.4",
|
"@babel/runtime": "^7.28.4",
|
||||||
"@expo-google-fonts/jetbrains-mono": "^0.4.1",
|
"@expo-google-fonts/jetbrains-mono": "^0.4.1",
|
||||||
@@ -32,7 +32,6 @@
|
|||||||
"react-native-context-menu-view": "^1.21.0",
|
"react-native-context-menu-view": "^1.21.0",
|
||||||
"react-native-gesture-handler": "^2.30.0",
|
"react-native-gesture-handler": "^2.30.0",
|
||||||
"react-native-get-random-values": "^2.0.0",
|
"react-native-get-random-values": "^2.0.0",
|
||||||
"react-native-nfc-manager": "^3.17.2",
|
|
||||||
"react-native-paper": "^5.14.5",
|
"react-native-paper": "^5.14.5",
|
||||||
"react-native-reanimated": "~4.2.1",
|
"react-native-reanimated": "~4.2.1",
|
||||||
"react-native-safe-area-context": "5.6.2",
|
"react-native-safe-area-context": "5.6.2",
|
||||||
@@ -1626,7 +1625,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz",
|
||||||
"integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==",
|
"integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@expo/config-types": "^54.0.10",
|
"@expo/config-types": "^54.0.10",
|
||||||
"@expo/json-file": "~10.0.8",
|
"@expo/json-file": "~10.0.8",
|
||||||
@@ -7344,20 +7342,6 @@
|
|||||||
"react-native": "*"
|
"react-native": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/react-native-nfc-manager": {
|
|
||||||
"version": "3.17.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/react-native-nfc-manager/-/react-native-nfc-manager-3.17.2.tgz",
|
|
||||||
"integrity": "sha512-0NryP/Iw2hzw4MVH5KCngoRerNUrnRok6VfLrlFcFZRKyTQ7KTgpsdDxCB6cR33qYNyEDrWGBayfAI+ym5gt8Q==",
|
|
||||||
"license": "MIT",
|
|
||||||
"peerDependencies": {
|
|
||||||
"@expo/config-plugins": "*"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"@expo/config-plugins": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/react-native-paper": {
|
"node_modules/react-native-paper": {
|
||||||
"version": "5.14.5",
|
"version": "5.14.5",
|
||||||
"resolved": "https://registry.npmjs.org/react-native-paper/-/react-native-paper-5.14.5.tgz",
|
"resolved": "https://registry.npmjs.org/react-native-paper/-/react-native-paper-5.14.5.tgz",
|
||||||
@@ -8519,9 +8503,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/tar": {
|
"node_modules/tar": {
|
||||||
"version": "7.5.2",
|
"version": "7.5.7",
|
||||||
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz",
|
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz",
|
||||||
"integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==",
|
"integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==",
|
||||||
"license": "BlueOak-1.0.0",
|
"license": "BlueOak-1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@isaacs/fs-minipass": "^4.0.0",
|
"@isaacs/fs-minipass": "^4.0.0",
|
||||||
@@ -8810,9 +8794,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/undici": {
|
"node_modules/undici": {
|
||||||
"version": "6.22.0",
|
"version": "6.23.0",
|
||||||
"resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz",
|
"resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz",
|
||||||
"integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==",
|
"integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18.17"
|
"node": ">=18.17"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "amnet-native",
|
"name": "amnet-native",
|
||||||
"version": "1.3.2",
|
"version": "1.3.9",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"android": "expo run:android",
|
"android": "expo run:android",
|
||||||
@@ -33,7 +33,6 @@
|
|||||||
"react-native-context-menu-view": "^1.21.0",
|
"react-native-context-menu-view": "^1.21.0",
|
||||||
"react-native-gesture-handler": "^2.30.0",
|
"react-native-gesture-handler": "^2.30.0",
|
||||||
"react-native-get-random-values": "^2.0.0",
|
"react-native-get-random-values": "^2.0.0",
|
||||||
"react-native-nfc-manager": "^3.17.2",
|
|
||||||
"react-native-paper": "^5.14.5",
|
"react-native-paper": "^5.14.5",
|
||||||
"react-native-reanimated": "~4.2.1",
|
"react-native-reanimated": "~4.2.1",
|
||||||
"react-native-safe-area-context": "5.6.2",
|
"react-native-safe-area-context": "5.6.2",
|
||||||
|
|||||||
@@ -96,10 +96,13 @@ impl Config {
|
|||||||
.map(|v| v > 0)
|
.map(|v| v > 0)
|
||||||
.unwrap_or(defaults::AIME_KEYBOARD_ENABLED);
|
.unwrap_or(defaults::AIME_KEYBOARD_ENABLED);
|
||||||
|
|
||||||
let aime_txt_path = aime_section
|
let aime_txt_path_raw = aime_section
|
||||||
.and_then(|s| s.get("aimePath"))
|
.and_then(|s| s.get("aimePath"))
|
||||||
.unwrap_or(defaults::AIME_FILE)
|
.unwrap_or(defaults::AIME_FILE);
|
||||||
.into();
|
|
||||||
|
// Normalize backslashes to forward slashes to avoid escape issues
|
||||||
|
let aime_txt_path_str = aime_txt_path_raw.replace("\\", "/");
|
||||||
|
let aime_txt_path = PathBuf::from(aime_txt_path_str);
|
||||||
|
|
||||||
let server_listen_address = io_section.get("listenAddress")
|
let server_listen_address = io_section.get("listenAddress")
|
||||||
.unwrap_or(defaults::SERVER_ADDRESS)
|
.unwrap_or(defaults::SERVER_ADDRESS)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
use axum::http::{StatusCode, header};
|
use axum::http::{Method, StatusCode, header};
|
||||||
use axum::response::{IntoResponse, Response};
|
use axum::response::{IntoResponse, Response};
|
||||||
use axum::routing::{get, post};
|
use axum::routing::{get, post};
|
||||||
use axum::{Json, Router};
|
use axum::{Json, Router};
|
||||||
@@ -16,7 +16,7 @@ use crate::webapi::API_VERSION;
|
|||||||
pub fn build_server() -> Router {
|
pub fn build_server() -> Router {
|
||||||
let services = ServiceBuilder::new()
|
let services = ServiceBuilder::new()
|
||||||
.layer(TraceLayer::new_for_http())
|
.layer(TraceLayer::new_for_http())
|
||||||
.layer(CorsLayer::new().allow_origin(Any).allow_methods(Any));
|
.layer(CorsLayer::new().allow_origin(Any).allow_headers(Any).allow_methods([Method::GET, Method::POST]).max_age(Duration::from_secs(600)));
|
||||||
|
|
||||||
Router::<()>::new()
|
Router::<()>::new()
|
||||||
.route("/amnet/info", get(server_state_handler))
|
.route("/amnet/info", get(server_state_handler))
|
||||||
|
|||||||
Generated
+217
-106
@@ -542,9 +542,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm-eabi": {
|
"node_modules/@rollup/rollup-android-arm-eabi": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz",
|
||||||
"integrity": "sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg==",
|
"integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
@@ -556,9 +556,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm64": {
|
"node_modules/@rollup/rollup-android-arm64": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz",
|
||||||
"integrity": "sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ==",
|
"integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -570,9 +570,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-darwin-arm64": {
|
"node_modules/@rollup/rollup-darwin-arm64": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz",
|
||||||
"integrity": "sha512-buA17AYXlW9Rn091sWMq1xGUvWQFOH4N1rqUxGJtEQzhChxWjldGCCup7r/wUnaI6Au8sKXpoh0xg58a7cgcpg==",
|
"integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -584,9 +584,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-darwin-x64": {
|
"node_modules/@rollup/rollup-darwin-x64": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz",
|
||||||
"integrity": "sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg==",
|
"integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -598,9 +598,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-freebsd-arm64": {
|
"node_modules/@rollup/rollup-freebsd-arm64": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz",
|
||||||
"integrity": "sha512-zzJACgjLbQTsscxWqvrEQAEh28hqhebpRz5q/uUd1T7VTwUNZ4VIXQt5hE7ncs0GrF+s7d3S4on4TiXUY8KoQA==",
|
"integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -612,9 +612,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-freebsd-x64": {
|
"node_modules/@rollup/rollup-freebsd-x64": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz",
|
||||||
"integrity": "sha512-hCY/KAeYMCyDpEE4pTETam0XZS4/5GXzlLgpi5f0IaPExw9kuB+PDTOTLuPtM10TlRG0U9OSmXJ+Wq9J39LvAg==",
|
"integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -626,13 +626,16 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz",
|
||||||
"integrity": "sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg==",
|
"integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -640,13 +643,16 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
|
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz",
|
||||||
"integrity": "sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg==",
|
"integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"musl"
|
||||||
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -654,13 +660,16 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz",
|
||||||
"integrity": "sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA==",
|
"integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -668,41 +677,84 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz",
|
||||||
"integrity": "sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ==",
|
"integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"musl"
|
||||||
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
|
"node_modules/@rollup/rollup-linux-loong64-gnu": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz",
|
||||||
"integrity": "sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg==",
|
"integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"loong64"
|
"loong64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
|
"node_modules/@rollup/rollup-linux-loong64-musl": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz",
|
||||||
"integrity": "sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw==",
|
"integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==",
|
||||||
|
"cpu": [
|
||||||
|
"loong64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"musl"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
|
||||||
|
"version": "4.62.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz",
|
||||||
|
"integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"ppc64"
|
"ppc64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/@rollup/rollup-linux-ppc64-musl": {
|
||||||
|
"version": "4.62.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz",
|
||||||
|
"integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==",
|
||||||
|
"cpu": [
|
||||||
|
"ppc64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"musl"
|
||||||
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -710,13 +762,16 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz",
|
||||||
"integrity": "sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg==",
|
"integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"riscv64"
|
"riscv64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -724,13 +779,16 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-riscv64-musl": {
|
"node_modules/@rollup/rollup-linux-riscv64-musl": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz",
|
||||||
"integrity": "sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA==",
|
"integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"riscv64"
|
"riscv64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"musl"
|
||||||
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -738,13 +796,16 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-s390x-gnu": {
|
"node_modules/@rollup/rollup-linux-s390x-gnu": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz",
|
||||||
"integrity": "sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q==",
|
"integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"s390x"
|
"s390x"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -752,13 +813,16 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz",
|
||||||
"integrity": "sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==",
|
"integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -766,9 +830,26 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-x64-musl": {
|
"node_modules/@rollup/rollup-linux-x64-musl": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz",
|
||||||
"integrity": "sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g==",
|
"integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"musl"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/@rollup/rollup-openbsd-x64": {
|
||||||
|
"version": "4.62.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz",
|
||||||
|
"integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -776,13 +857,27 @@
|
|||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"openbsd"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/@rollup/rollup-openharmony-arm64": {
|
||||||
|
"version": "4.62.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz",
|
||||||
|
"integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"openharmony"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz",
|
||||||
"integrity": "sha512-u/Jbm1BU89Vftqyqbmxdq14nBaQjQX1HhmsdBWqSdGClNaKwhjsg5TpW+5Ibs1mb8Es9wJiMdl86BcmtUVXNZg==",
|
"integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
@@ -794,9 +889,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz",
|
||||||
"integrity": "sha512-mqu4PzTrlpNHHbu5qleGvXJoGgHpChBlrBx/mEhTPpnAL1ZAYFlvHD7rLK839LLKQzqEQMFJfGrrOHItN4ZQqA==",
|
"integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"ia32"
|
"ia32"
|
||||||
],
|
],
|
||||||
@@ -807,10 +902,24 @@
|
|||||||
"win32"
|
"win32"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"node_modules/@rollup/rollup-win32-x64-gnu": {
|
||||||
|
"version": "4.62.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz",
|
||||||
|
"integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
]
|
||||||
|
},
|
||||||
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz",
|
||||||
"integrity": "sha512-jjqy3uWlecfB98Psxb5cD6Fny9Fupv9LrDSPTQZUROqjvZmcCqNu4UMl7qqhlUUGpwiAkotj6GYu4SZdcr/nLw==",
|
"integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
@@ -822,9 +931,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@types/estree": {
|
"node_modules/@types/estree": {
|
||||||
"version": "1.0.7",
|
"version": "1.0.9",
|
||||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
|
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
|
||||||
"integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
|
"integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
@@ -898,9 +1007,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/brace-expansion": {
|
"node_modules/brace-expansion": {
|
||||||
"version": "2.0.2",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz",
|
||||||
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
|
"integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -1050,7 +1159,6 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"bin": {
|
"bin": {
|
||||||
"esbuild": "bin/esbuild"
|
"esbuild": "bin/esbuild"
|
||||||
},
|
},
|
||||||
@@ -1253,9 +1361,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/lodash": {
|
"node_modules/lodash": {
|
||||||
"version": "4.17.21",
|
"version": "4.18.1",
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
|
||||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
|
"integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/lru-cache": {
|
"node_modules/lru-cache": {
|
||||||
@@ -1276,13 +1384,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/minimatch": {
|
"node_modules/minimatch": {
|
||||||
"version": "9.0.5",
|
"version": "9.0.9",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
|
||||||
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
|
"integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"brace-expansion": "^2.0.1"
|
"brace-expansion": "^2.0.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=16 || 14 >=14.17"
|
"node": ">=16 || 14 >=14.17"
|
||||||
@@ -1392,12 +1500,11 @@
|
|||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
"node_modules/picomatch": {
|
"node_modules/picomatch": {
|
||||||
"version": "4.0.2",
|
"version": "4.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
|
||||||
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
|
"integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12"
|
"node": ">=12"
|
||||||
},
|
},
|
||||||
@@ -1495,13 +1602,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/rollup": {
|
"node_modules/rollup": {
|
||||||
"version": "4.38.0",
|
"version": "4.62.2",
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.38.0.tgz",
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz",
|
||||||
"integrity": "sha512-5SsIRtJy9bf1ErAOiFMFzl64Ex9X5V7bnJ+WlFMb+zmP459OSWCEG7b0ERZ+PEU7xPt4OG3RHbrp1LJlXxYTrw==",
|
"integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/estree": "1.0.7"
|
"@types/estree": "1.0.9"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"rollup": "dist/bin/rollup"
|
"rollup": "dist/bin/rollup"
|
||||||
@@ -1511,26 +1618,31 @@
|
|||||||
"npm": ">=8.0.0"
|
"npm": ">=8.0.0"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@rollup/rollup-android-arm-eabi": "4.38.0",
|
"@rollup/rollup-android-arm-eabi": "4.62.2",
|
||||||
"@rollup/rollup-android-arm64": "4.38.0",
|
"@rollup/rollup-android-arm64": "4.62.2",
|
||||||
"@rollup/rollup-darwin-arm64": "4.38.0",
|
"@rollup/rollup-darwin-arm64": "4.62.2",
|
||||||
"@rollup/rollup-darwin-x64": "4.38.0",
|
"@rollup/rollup-darwin-x64": "4.62.2",
|
||||||
"@rollup/rollup-freebsd-arm64": "4.38.0",
|
"@rollup/rollup-freebsd-arm64": "4.62.2",
|
||||||
"@rollup/rollup-freebsd-x64": "4.38.0",
|
"@rollup/rollup-freebsd-x64": "4.62.2",
|
||||||
"@rollup/rollup-linux-arm-gnueabihf": "4.38.0",
|
"@rollup/rollup-linux-arm-gnueabihf": "4.62.2",
|
||||||
"@rollup/rollup-linux-arm-musleabihf": "4.38.0",
|
"@rollup/rollup-linux-arm-musleabihf": "4.62.2",
|
||||||
"@rollup/rollup-linux-arm64-gnu": "4.38.0",
|
"@rollup/rollup-linux-arm64-gnu": "4.62.2",
|
||||||
"@rollup/rollup-linux-arm64-musl": "4.38.0",
|
"@rollup/rollup-linux-arm64-musl": "4.62.2",
|
||||||
"@rollup/rollup-linux-loongarch64-gnu": "4.38.0",
|
"@rollup/rollup-linux-loong64-gnu": "4.62.2",
|
||||||
"@rollup/rollup-linux-powerpc64le-gnu": "4.38.0",
|
"@rollup/rollup-linux-loong64-musl": "4.62.2",
|
||||||
"@rollup/rollup-linux-riscv64-gnu": "4.38.0",
|
"@rollup/rollup-linux-ppc64-gnu": "4.62.2",
|
||||||
"@rollup/rollup-linux-riscv64-musl": "4.38.0",
|
"@rollup/rollup-linux-ppc64-musl": "4.62.2",
|
||||||
"@rollup/rollup-linux-s390x-gnu": "4.38.0",
|
"@rollup/rollup-linux-riscv64-gnu": "4.62.2",
|
||||||
"@rollup/rollup-linux-x64-gnu": "4.38.0",
|
"@rollup/rollup-linux-riscv64-musl": "4.62.2",
|
||||||
"@rollup/rollup-linux-x64-musl": "4.38.0",
|
"@rollup/rollup-linux-s390x-gnu": "4.62.2",
|
||||||
"@rollup/rollup-win32-arm64-msvc": "4.38.0",
|
"@rollup/rollup-linux-x64-gnu": "4.62.2",
|
||||||
"@rollup/rollup-win32-ia32-msvc": "4.38.0",
|
"@rollup/rollup-linux-x64-musl": "4.62.2",
|
||||||
"@rollup/rollup-win32-x64-msvc": "4.38.0",
|
"@rollup/rollup-openbsd-x64": "4.62.2",
|
||||||
|
"@rollup/rollup-openharmony-arm64": "4.62.2",
|
||||||
|
"@rollup/rollup-win32-arm64-msvc": "4.62.2",
|
||||||
|
"@rollup/rollup-win32-ia32-msvc": "4.62.2",
|
||||||
|
"@rollup/rollup-win32-x64-gnu": "4.62.2",
|
||||||
|
"@rollup/rollup-win32-x64-msvc": "4.62.2",
|
||||||
"fsevents": "~2.3.2"
|
"fsevents": "~2.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1817,7 +1929,6 @@
|
|||||||
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"peer": true,
|
|
||||||
"bin": {
|
"bin": {
|
||||||
"tsc": "bin/tsc",
|
"tsc": "bin/tsc",
|
||||||
"tsserver": "bin/tsserver"
|
"tsserver": "bin/tsserver"
|
||||||
|
|||||||
Generated
+352
-257
File diff suppressed because it is too large
Load Diff
@@ -1,29 +0,0 @@
|
|||||||
{
|
|
||||||
"applinks": {
|
|
||||||
"details": [
|
|
||||||
{
|
|
||||||
"appIDs": [
|
|
||||||
"Q824VHAT9S.moe.ppc.amnet"
|
|
||||||
],
|
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"#": "/cards*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"#": "/servers"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"#": "/servers/"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"#": "/servers/add*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"#": "/servers/*",
|
|
||||||
"exclude": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
import * as LabelPrimitive from "@radix-ui/react-label"
|
import * as LabelPrimitive from "@radix-ui/react-label"
|
||||||
import { cva, type VariantProps } from "class-variance-authority"
|
import { cva } from "class-variance-authority"
|
||||||
|
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
# AMNet
|
# AMNet
|
||||||
[TestFlight](https://testflight.apple.com/join/kHbeJTsQ) • [Firebase](https://appdistribution.firebase.dev/i/6acc3151357deaa8) • [Website](http://card.ppc.moe) • [Server DLLs](https://gitea.tendokyu.moe/ppc/amnet/releases)
|
[Latest .ipa](https://amnet-dist.ppc.moe/amnet-1.3.9.ipa) • [Firebase](https://appdistribution.firebase.dev/i/6acc3151357deaa8) • [Website](http://card.ppc.moe) • [Server DLLs](https://gitea.tendokyu.moe/ppc/amnet/releases)
|
||||||
|
|
||||||
An Aime Card Switcher for segatools-based games.
|
An Amusement IC Card Switcher for segatools-based games.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
AMNet is designed to simulate the `DEVICE/aime.txt` file, allowing multiple users to log into a game using their phone.
|
AMNet is designed to acts as dynamic version of the `DEVICE/aime.txt` file, allowing multiple users to log into a game using their own mobile devices.
|
||||||
This was originally intended for use with maimai and CHUNITHM, but should be compatible with any segatools-based game with Aime support.
|
This was originally intended for use with maimai and CHUNITHM, but should be compatible with any segatools-based game with that uses Amusement IC for account management.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> TestFlight is no longer available and must be sideloaded using AltStore or similar tooling for the forseeable future.
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
1. Download the latest `amnet.dll` from the releases page
|
1. Download the latest `amnet.dll` from the releases page
|
||||||
@@ -26,7 +29,7 @@ This was originally intended for use with maimai and CHUNITHM, but should be com
|
|||||||
; serverName - the name of the server to show to users (defaults to the computer name if not set)
|
; serverName - the name of the server to show to users (defaults to the computer name if not set)
|
||||||
; serverAddress - the address to listen on, including the protocol (don't set/change unless you know what you're doing)
|
; serverAddress - the address to listen on, including the protocol (don't set/change unless you know what you're doing)
|
||||||
; enableKeyboardMode - whether to enable hold-enter-to-login mode. Reads the file set at aimePath for card number (or DEVICE/aime.txt if not set).
|
; enableKeyboardMode - whether to enable hold-enter-to-login mode. Reads the file set at aimePath for card number (or DEVICE/aime.txt if not set).
|
||||||
; useAimeDBForPhysicalCards - Whether physical cards should use AiMeDB to retrieve access codes. If the game is using a hosted network, set this to 1 to load the same account data/profile as you would get on a physical cab.
|
; useAimeDBForPhysicalCards - Whether codes from real cards should use AiMeDB to retrieve access codes. If the game is using a hosted network, set this to 1 to load the same account data/profile as you would get on a physical cab.
|
||||||
gameId=SDEZ
|
gameId=SDEZ
|
||||||
;serverName=CHUNI-PENGUIN
|
;serverName=CHUNI-PENGUIN
|
||||||
;serverAddress=http://0.0.0.0:6070
|
;serverAddress=http://0.0.0.0:6070
|
||||||
@@ -60,8 +63,8 @@ AMNet can be used on most platforms, see below for options available for each pl
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>iOS</td>
|
<td>iOS</td>
|
||||||
<td><a href="https://testflight.apple.com/join/kHbeJTsQ" target="_blank">TestFlight</a></td>
|
<td><a href="https://amnet-dist.ppc.moe/amnet-1.3.9.ipa" target="_blank">.ipa</a></td>
|
||||||
<td>Aime/Banapass/NESiCA/e-Amusement IC cards supported</td>
|
<td>*TestFlight has been shut down and won't be back for the forseeable future, sideload using AltStore or similar tooling</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td rowspan="2">Android</td>
|
<td rowspan="2">Android</td>
|
||||||
|
|||||||
Reference in New Issue
Block a user