⚙️ User Management
@@ -105,7 +67,7 @@ const searchResultClass = computed(() => {
- {{ searchResultMessage }}
+ {{ searchResult }}
@@ -133,8 +95,11 @@ const searchResultClass = computed(() => {
Ping: {{ ping }}
Health: {{ health }}
+
Stamina: {{ stamina }}
+
Bank: {{ '$' + characterData.bank }}
+
Cash: {{ '$' + characterData.cash }}
Street: {{ street }}
-
Discord Id: {{ player.discordId }}
+
Discord ID: {{ player.discordId }}
-
diff --git a/webview/composables/useAdminPanel.ts b/webview/composables/useAdminPanel.ts
new file mode 100644
index 0000000..ac0dc83
--- /dev/null
+++ b/webview/composables/useAdminPanel.ts
@@ -0,0 +1,42 @@
+import { ref } from 'vue';
+import { useEvents } from '@Composables/useEvents.js';
+import { adminpanelEvents } from '@Plugins/rebar-adminpanel/shared/events.js';
+
+const events = useEvents();
+
+export const useAdminPanel = () => {
+
+ let coordinatesInput = ref
('');
+
+ const showUsers = async () => {
+ await events.emitServerRpc(adminpanelEvents.rpc.showAllUsers);
+ };
+
+ const giveAdmin = async () => {
+ await events.emitServerRpc(adminpanelEvents.rpc.giveAdmin);
+ };
+
+ const closePanel = () => {
+ events.emitServer(adminpanelEvents.toServer.closePanel);
+ }
+
+ const toWaypoint = async () => {
+ const coordsInput = coordinatesInput.value.trim();
+ const coords = coordinatesInput.value.split(',').map(Number);
+ if (coords.length === 3 && coords.every((num) => !isNaN(num))) {
+ await events.emitServerRpc(adminpanelEvents.rpc.toWaypoint, ...coords);
+ } else if (coordsInput === "") {
+ events.emitServer(adminpanelEvents.toServer.tpMarker);
+ } else {
+ return;
+ }
+ }
+
+ return {
+ coordinatesInput,
+ showUsers,
+ closePanel,
+ giveAdmin,
+ toWaypoint,
+ }
+}
\ No newline at end of file
diff --git a/webview/composables/useUserSearch.ts b/webview/composables/useUserSearch.ts
new file mode 100644
index 0000000..b689b94
--- /dev/null
+++ b/webview/composables/useUserSearch.ts
@@ -0,0 +1,56 @@
+import { ref, computed } from 'vue';
+import { useEvents } from '@Composables/useEvents.js';
+import { useSyncedMeta } from '@Composables/useSyncedMeta.js';
+import { adminpanelEvents } from '@Plugins/rebar-adminpanel/shared/events.js';
+
+const events = useEvents();
+const syncedMeta = useSyncedMeta();
+
+export function useUserSearch() {
+
+ const characterData = syncedMeta.getCharacter();
+
+ const playerDetails = ref<{ id: string; name: string; discordId: number; }[]>([]);
+ const searchQuery = ref('');
+
+ const getPlayerDetails = (details: { id: string; name: string; discordId: number; }[]) => {
+ playerDetails.value = details;
+ }
+
+ const filteredPlayers = computed(() => {
+ if (!searchQuery.value) return playerDetails.value;
+ const lowerCaseQuery = searchQuery.value.toLowerCase();
+ return playerDetails.value
+ .map((player) => ({
+ ...player,
+ highlighted: player.name.toLowerCase().includes(lowerCaseQuery) || player.id.toString().includes(lowerCaseQuery),
+ }))
+ .filter((player) => player.highlighted);
+ });
+
+ const searchResult = computed(() => {
+ if (!searchQuery.value) return '';
+ const count = filteredPlayers.value.length;
+ return count > 0 ? `${count} user${count > 1 ? 's' : ''} found` : 'No users found';
+ });
+
+ const searchResultClass = computed(() => {
+ if (!searchQuery.value) return '';
+ return filteredPlayers.value.length > 0 ? 'bg-green-500' : 'bg-yellow-500';
+ })
+
+ const closePanel = () => {
+ events.emitServer(adminpanelEvents.toServer.closeUsers);
+ };
+
+
+ return {
+ closePanel,
+ characterData,
+ playerDetails,
+ searchQuery,
+ filteredPlayers,
+ searchResult,
+ searchResultClass,
+ }
+}
\ No newline at end of file