diff --git a/apps/dispatch-server/socket-events/connect-dispatch.ts b/apps/dispatch-server/socket-events/connect-dispatch.ts index f2acb6c9..3ebf74c8 100644 --- a/apps/dispatch-server/socket-events/connect-dispatch.ts +++ b/apps/dispatch-server/socket-events/connect-dispatch.ts @@ -1,6 +1,6 @@ import { getPublicUser, prisma, User } from "@repo/db"; import { addRolesToMember, removeRolesFromMember, renameMember } from "modules/discord"; -import { getNextDateWithTime } from "@repo/shared-components"; +import { getNextDateWithTime, getUserPenaltys } from "@repo/shared-components"; import { DISCORD_ROLES } from "@repo/db"; import { Server, Socket } from "socket.io"; @@ -28,8 +28,17 @@ export const handleConnectDispatch = return; } - if (!user.permissions?.includes("DISPO")) { - socket.emit("error", "You do not have permission to connect to the dispatch server."); + const userPenaltys = await getUserPenaltys(user.id); + + if ( + userPenaltys.openTimeban.length > 0 || + user.isBanned || + userPenaltys.openBans.length > 0 + ) { + socket.emit("connect-message", { + message: "Du hast eine aktive Strafe und kannst dich deshalb nicht verbinden.", + }); + socket.disconnect(); return; } diff --git a/apps/dispatch-server/socket-events/connect-pilot.ts b/apps/dispatch-server/socket-events/connect-pilot.ts index 07c15850..aaa936cf 100644 --- a/apps/dispatch-server/socket-events/connect-pilot.ts +++ b/apps/dispatch-server/socket-events/connect-pilot.ts @@ -1,8 +1,8 @@ import { getPublicUser, prisma, User } from "@repo/db"; import { addRolesToMember, removeRolesFromMember, renameMember } from "modules/discord"; -import { getNextDateWithTime } from "@repo/shared-components"; import { DISCORD_ROLES } from "@repo/db"; import { Server, Socket } from "socket.io"; +import { getUserPenaltys } from "@repo/shared-components"; export const handleConnectPilot = (socket: Socket, io: Server) => @@ -34,6 +34,19 @@ export const handleConnectPilot = socket.disconnect(); return; } + const userPenaltys = await getUserPenaltys(userId); + + if ( + userPenaltys.openTimeban.length > 0 || + user.isBanned || + userPenaltys.openBans.length > 0 + ) { + socket.emit("connect-message", { + message: "Du hast eine aktive Strafe und kannst dich deshalb nicht verbinden.", + }); + socket.disconnect(); + return; + } if (!user) return Error("User not found"); diff --git a/apps/dispatch-server/socket-events/send-message.ts b/apps/dispatch-server/socket-events/send-message.ts index d6b8a39c..c9990138 100644 --- a/apps/dispatch-server/socket-events/send-message.ts +++ b/apps/dispatch-server/socket-events/send-message.ts @@ -5,7 +5,7 @@ import { Server, Socket } from "socket.io"; export const handleSendMessage = (socket: Socket, io: Server) => async ( - { userId, message }: { userId: string; message: string }, + { userId, message, role }: { userId: string; message: string; role: string }, cb: (err: { error?: string }) => void, ) => { const senderId = socket.data.user.id; @@ -24,7 +24,7 @@ export const handleSendMessage = receiverId: userId, senderId, receiverName: `${receiverUser?.firstname} ${receiverUser?.lastname[0]}. - ${receiverUser?.publicId}`, - senderName: `${senderUser?.firstname} ${senderUser?.lastname[0]}. - ${senderUser?.publicId}`, + senderName: `${senderUser?.firstname} ${senderUser?.lastname[0]}. - ${role ?? senderUser?.publicId}`, }, }); diff --git a/apps/dispatch/app/_components/map/AircraftMarker.tsx b/apps/dispatch/app/_components/map/AircraftMarker.tsx index 371565de..c5b6b803 100644 --- a/apps/dispatch/app/_components/map/AircraftMarker.tsx +++ b/apps/dispatch/app/_components/map/AircraftMarker.tsx @@ -17,7 +17,6 @@ import { getConnectedAircraftPositionLogAPI, getConnectedAircraftsAPI } from "_q import { getMissionsAPI } from "_querys/missions"; import { FMS_STATUS_COLORS, FMS_STATUS_TEXT_COLORS } from "_helpers/fmsStatusColors"; import { usePilotConnectionStore } from "_store/pilot/connectionStore"; -import { useSession } from "next-auth/react"; const AircraftPopupContent = ({ aircraft, @@ -73,7 +72,7 @@ const AircraftPopupContent = ({ } }, [currentTab, aircraft, mission]); - const { setOpenAircraftMarker, setMap, openAircraftMarker } = useMapStore((state) => state); + const { setOpenAircraftMarker, setMap } = useMapStore((state) => state); const { anchor } = useSmartPopup(); return ( <> @@ -435,6 +434,9 @@ export const AircraftLayer = () => { } }, [pilotConnectionStatus, followOwnAircraft, ownAircraft, setMap, map]); + console.debug("Hubschrauber auf Karte:", filteredAircrafts.length, filteredAircrafts); + console.debug("Daten vom Server:", aircrafts?.length, aircrafts); + return ( <> {filteredAircrafts?.map((aircraft) => { diff --git a/apps/dispatch/app/_components/navbar/AdminPanel.tsx b/apps/dispatch/app/_components/navbar/AdminPanel.tsx index da768d1b..43af976b 100644 --- a/apps/dispatch/app/_components/navbar/AdminPanel.tsx +++ b/apps/dispatch/app/_components/navbar/AdminPanel.tsx @@ -92,11 +92,6 @@ export default function AdminPanel() { const modalRef = useRef(null); - console.debug("piloten von API", { - anzahl: pilots?.length, - pilots, - }); - return (
); } @@ -78,14 +83,14 @@ export const penaltyColumns: ColumnDef {report && ( diff --git a/apps/hub/app/(app)/admin/penalty/page.tsx b/apps/hub/app/(app)/admin/penalty/page.tsx index 95d678a4..5b9b6e3b 100644 --- a/apps/hub/app/(app)/admin/penalty/page.tsx +++ b/apps/hub/app/(app)/admin/penalty/page.tsx @@ -10,6 +10,12 @@ export default function ReportPage() { CreatedUser: true, Report: true, }} + initialOrderBy={[ + { + id: "timestamp", + desc: true, + }, + ]} columns={penaltyColumns} /> ); diff --git a/apps/hub/app/(app)/admin/report/_components/NewReport.tsx b/apps/hub/app/(app)/admin/report/_components/NewReport.tsx index 7aa1f36e..fc13f251 100644 --- a/apps/hub/app/(app)/admin/report/_components/NewReport.tsx +++ b/apps/hub/app/(app)/admin/report/_components/NewReport.tsx @@ -44,7 +44,7 @@ export const NewReportForm = ({ reviewerUserId: null, }, }); - console.log(form.formState.errors); + return (
= ({ user }: ProfileFormPro export const ConnectionHistory: React.FC<{ user: User }> = ({ user }: { user: User }) => { const dispoTableRef = useRef(null); + const pilotTableRef = useRef(null); return (
@@ -302,7 +305,7 @@ export const ConnectionHistory: React.FC<{ user: User }> = ({ user }: { user: Us cell: ({ row }) => { return (
- +
); }, @@ -324,7 +327,7 @@ export const ConnectionHistory: React.FC<{ user: User }> = ({ user }: { user: Us Pilot-Verbindungs Historie = ({ user }: { user: Us cell: ({ row }) => { return (
- +
); }, @@ -408,6 +411,7 @@ export const UserPenalties = ({ user }: { user: User }) => {
} onClick={async ({ reason, until }) => { @@ -437,6 +441,7 @@ export const UserPenalties = ({ user }: { user: User }) => { /> {session.data?.user.permissions.includes("ADMIN_USER_ADVANCED") && ( } onClick={async ({ reason }) => { @@ -528,6 +533,12 @@ interface AdminFormProps { open: number; total60Days: number; }; + openBans: (Penalty & { + CreatedUser: User | null; + })[]; + openTimebans: (Penalty & { + CreatedUser: User | null; + })[]; } export const AdminForm = ({ @@ -536,6 +547,8 @@ export const AdminForm = ({ pilotTime, reports, discordAccount, + openBans, + openTimebans, }: AdminFormProps) => { const router = useRouter(); const { data: session } = useSession(); @@ -627,6 +640,33 @@ export const AdminForm = ({ )}
+ {(!!openBans.length || !!openTimebans.length) && ( +
+
+ + {openBans.map((ban) => ( +
+

Permanent ausgeschlossen

+ {ban.reason} (von {ban.CreatedUser?.firstname} {ban.CreatedUser?.lastname} -{" "} + {ban.CreatedUser?.publicId}) +
+ ))} + {openTimebans.map((timeban) => ( +
+

+ Zeitstrafe bis{" "} + {timeban.until ? new Date(timeban.until).toLocaleString("de-DE") : "unbekannt"} +

+ {timeban.reason} ({timeban.CreatedUser?.firstname} {timeban.CreatedUser?.lastname} -{" "} + {timeban.CreatedUser?.publicId}) +
+ ))} +
+

+ Achtung! Die Strafe(n) sind aktiv, die Rechte des Nutzers müssen nicht angepasst werden! +

+
+ )}

Aktivität

diff --git a/apps/hub/app/(app)/admin/user/[id]/page.tsx b/apps/hub/app/(app)/admin/user/[id]/page.tsx index f1d3f022..1c74253d 100644 --- a/apps/hub/app/(app)/admin/user/[id]/page.tsx +++ b/apps/hub/app/(app)/admin/user/[id]/page.tsx @@ -8,10 +8,10 @@ import { UserReports, } from "./_components/forms"; import { Error } from "../../../../_components/Error"; +import { getUserPenaltys } from "@repo/shared-components"; export default async function Page({ params }: { params: Promise<{ id: string }> }) { const { id } = await params; - const user = await prisma.user.findUnique({ where: { id: id, @@ -20,6 +20,7 @@ export default async function Page({ params }: { params: Promise<{ id: string }> discordAccounts: true, }, }); + if (!user) return ; const dispoSessions = await prisma.connectedDispatcher.findMany({ where: { @@ -97,41 +98,43 @@ export default async function Page({ params }: { params: Promise<{ id: string }> open: totalReportsOpen, total60Days: totalReports60Days, }; - if (!user) return ; + const { openBans, openTimeban } = await getUserPenaltys(user?.id); return (
-
-

- +

+

+ {user?.firstname} {user?.lastname} #{user?.publicId}

{new Date(user.createdAt).toLocaleString("de-DE")}

-
+
-
+
-
+
-
+
-
+
diff --git a/packages/shared-components/components/Changelog.tsx b/packages/shared-components/components/Changelog.tsx index 7bf98e85..69a143da 100644 --- a/packages/shared-components/components/Changelog.tsx +++ b/packages/shared-components/components/Changelog.tsx @@ -39,7 +39,7 @@ export const ChangelogModal = ({ )}
-
+
void; showDatePicker?: boolean; btnClassName?: string; btnName: string; btnTip?: string; + showBtnName?: boolean; Icon: ReactNode; }) => { const [open, setOpen] = useState(false); @@ -25,25 +27,29 @@ export const PenaltyDropdown = ({
{open && (
-

{btnName}

+

{btnName}