-- ===================================================================== -- aether-police — Rollen und Rechte -- -- Rechte sind einzelne, benannte Schalter. Eine Rolle ist nur ein -- Vorschlagspaket — jedes Recht kann pro Beamtem zusaetzlich gewaehrt -- oder entzogen werden (Spalten `rechte_extra` / `rechte_entzug`). -- ===================================================================== Polizei = Polizei or {} -- --------------------------------------------------------------------- -- Katalog aller Rechte -- Gruppiert nur fuer die Darstellung in der Administration. -- --------------------------------------------------------------------- Polizei.Rechte = { { gruppe = 'Dienst', eintraege = { { id = 'dienst.antreten', name = 'Dienst antreten' }, { id = 'dienst.leitstelle', name = 'Leitstelle übernehmen' }, { id = 'dienst.spezial', name = 'Spezialdienst wählen' }, }}, { gruppe = 'Personen & Fahrzeuge', eintraege = { { id = 'person.suchen', name = 'Personen suchen' }, { id = 'person.bearbeiten', name = 'Personendaten bearbeiten' }, { id = 'person.warnhinweis', name = 'Warnhinweise setzen' }, { id = 'fahrzeug.suchen', name = 'Fahrzeuge abfragen' }, }}, { gruppe = 'Akten & Berichte', eintraege = { { id = 'akte.lesen', name = 'Akten einsehen' }, { id = 'akte.erstellen', name = 'Akten anlegen' }, { id = 'akte.bearbeiten', name = 'Akten bearbeiten' }, { id = 'akte.freigeben', name = 'Akten freigeben' }, { id = 'akte.schliessen', name = 'Akten schließen' }, { id = 'bericht.erstellen', name = 'Berichte schreiben' }, { id = 'bericht.freigeben', name = 'Berichte freigeben' }, }}, { gruppe = 'Maßnahmen', eintraege = { { id = 'anzeige.erstellen', name = 'Anzeige erfassen' }, { id = 'anzeige.bestaetigen', name = 'Anzeige bestätigen' }, { id = 'anzeige.abweichen', name = 'Vom Katalogvorschlag abweichen' }, { id = 'gewahrsam.einweisen', name = 'In Gewahrsam nehmen' }, { id = 'gewahrsam.entlassen', name = 'Aus Gewahrsam entlassen' }, { id = 'fahndung.erstellen', name = 'Fahndung ausschreiben' }, { id = 'fahndung.aufheben', name = 'Fahndung aufheben' }, }}, { gruppe = 'Asservate & Beweise', eintraege = { { id = 'beweis.erfassen', name = 'Beweise erfassen' }, { id = 'beweis.loeschen', name = 'Beweise entfernen' }, { id = 'asservat.einlagern', name = 'Asservate einlagern' }, { id = 'asservat.ausgeben', name = 'Asservate ausgeben' }, { id = 'asservat.vernichten', name = 'Asservate vernichten' }, }}, { gruppe = 'Einsätze', eintraege = { { id = 'einsatz.erstellen', name = 'Einsatz anlegen' }, { id = 'einsatz.zuweisen', name = 'Einheiten zuweisen' }, { id = 'einsatz.schliessen', name = 'Einsatz abschließen' }, }}, { gruppe = 'Fahrzeugverwaltung', eintraege = { { id = 'dienstfahrzeug.sehen', name = 'Dienstfahrzeuge einsehen' }, { id = 'dienstfahrzeug.zuweisen', name = 'Dienstfahrzeuge zuweisen' }, { id = 'dienstfahrzeug.wartung', name = 'Wartungsstatus setzen' }, }}, { gruppe = 'Kommunikation', eintraege = { { id = 'nachricht.senden', name = 'Nachrichten schreiben' }, { id = 'nachricht.rundmeldung', name = 'Rundmeldung an alle senden' }, { id = 'aushang.schreiben', name = 'Aushänge veröffentlichen' }, { id = 'aushang.archivieren', name = 'Aushänge archivieren' }, }}, { gruppe = 'Verwaltung', eintraege = { { id = 'personal.sehen', name = 'Personalliste einsehen' }, { id = 'personal.rolle', name = 'Rollen zuweisen' }, { id = 'personal.rechte', name = 'Einzelrechte vergeben' }, { id = 'personal.einstellen', name = 'Personal einstellen/entlassen' }, { id = 'katalog.bearbeiten', name = 'Strafenkatalog pflegen' }, { id = 'protokoll.lesen', name = 'Protokoll einsehen' }, { id = 'statistik.sehen', name = 'Statistik einsehen' }, { id = 'admin.module', name = 'Module verwalten' }, }}, } --- Liefert alle Rechte-IDs als flache Liste --- @return table function Polizei.AlleRechte() local liste = {} for _, gruppe in ipairs(Polizei.Rechte) do for _, recht in ipairs(gruppe.eintraege) do liste[#liste + 1] = recht.id end end return liste end -- --------------------------------------------------------------------- -- Rollen — aufsteigend nach Verantwortung -- `rechte` ist ein Vorschlagspaket, kein festes Gesetz. -- --------------------------------------------------------------------- Polizei.Rollen = { { id = 'anwaerter', name = 'Anwärter', stufe = 0, rechte = { 'dienst.antreten', 'person.suchen', 'fahrzeug.suchen', 'akte.lesen', 'einsatz.erstellen', 'dienstfahrzeug.sehen', 'nachricht.senden', }, }, { id = 'officer', name = 'Officer', stufe = 1, rechte = { 'dienst.antreten', 'person.suchen', 'fahrzeug.suchen', 'akte.lesen', 'akte.erstellen', 'bericht.erstellen', 'anzeige.erstellen', 'beweis.erfassen', 'einsatz.erstellen', 'dienstfahrzeug.sehen', 'nachricht.senden', }, }, { id = 'senior_officer', name = 'Senior Officer', stufe = 2, rechte = { 'dienst.antreten', 'person.suchen', 'person.bearbeiten', 'fahrzeug.suchen', 'akte.lesen', 'akte.erstellen', 'akte.bearbeiten', 'bericht.erstellen', 'anzeige.erstellen', 'anzeige.bestaetigen', 'beweis.erfassen', 'asservat.einlagern', 'einsatz.erstellen', 'einsatz.schliessen', 'dienstfahrzeug.sehen', 'nachricht.senden', }, }, { id = 'sergeant', name = 'Sergeant', stufe = 3, rechte = { 'dienst.antreten', 'dienst.leitstelle', 'dienst.spezial', 'person.suchen', 'person.bearbeiten', 'person.warnhinweis', 'fahrzeug.suchen', 'akte.lesen', 'akte.erstellen', 'akte.bearbeiten', 'akte.schliessen', 'bericht.erstellen', 'anzeige.erstellen', 'anzeige.bestaetigen', 'gewahrsam.einweisen', 'gewahrsam.entlassen', 'fahndung.erstellen', 'fahndung.aufheben', 'beweis.erfassen', 'asservat.einlagern', 'asservat.ausgeben', 'einsatz.erstellen', 'einsatz.zuweisen', 'einsatz.schliessen', 'dienstfahrzeug.sehen', 'dienstfahrzeug.zuweisen', 'nachricht.senden', 'nachricht.rundmeldung', }, }, { id = 'lieutenant', name = 'Lieutenant', stufe = 4, erbt = 'sergeant', rechte = { 'akte.freigeben', 'bericht.freigeben', 'anzeige.abweichen', 'personal.sehen', 'statistik.sehen', 'dienstfahrzeug.wartung', 'aushang.schreiben', }, }, { id = 'captain', name = 'Captain', stufe = 5, erbt = 'lieutenant', rechte = { 'personal.rolle', 'beweis.loeschen', 'asservat.vernichten', 'protokoll.lesen', 'aushang.archivieren', }, }, { id = 'deputy_chief', name = 'Deputy Chief', stufe = 6, erbt = 'captain', rechte = { 'personal.rechte', 'personal.einstellen', 'katalog.bearbeiten' }, }, { id = 'chief', name = 'Chief of Police', stufe = 7, erbt = 'deputy_chief', rechte = { 'admin.module' }, }, } --- Sucht eine Rolle --- @param rollenId string Kennung --- @return table|nil function Polizei.HoleRolle(rollenId) for _, rolle in ipairs(Polizei.Rollen) do if rolle.id == rollenId then return rolle end end return nil end --- Loest die Rechte einer Rolle auf (inklusive Vererbung) --- @param rollenId string Kennung --- @return table Menge der Rechte { [rechtId] = true } function Polizei.RechteDerRolle(rollenId) local menge = {} local besucht = {} local aktuelle = rollenId -- Vererbungskette abarbeiten; Zyklen werden abgefangen while aktuelle and not besucht[aktuelle] do besucht[aktuelle] = true local rolle = Polizei.HoleRolle(aktuelle) if not rolle then break end for _, recht in ipairs(rolle.rechte or {}) do menge[recht] = true end aktuelle = rolle.erbt end return menge end --- Liefert die Stufe einer Rolle (fuer Vergleiche „darf ich das bei dem?") --- @param rollenId string Kennung --- @return number function Polizei.Stufe(rollenId) local rolle = Polizei.HoleRolle(rollenId) return rolle and rolle.stufe or -1 end