Skip to content

Request feature #14

@remdui

Description

@remdui

Is your feature request related to a problem? Please describe.
We missen een generiek in-game request-systeem waarmee spelers aanvragen kunnen indienen en staff die kan beoordelen/verwerken. Er is behoefte aan:

  • Config-gedefinieerde requesttypes met eigen velden.
  • Staff-workflow (inzien, beoordelen, afhandelen).
  • Permanent archief per speler van verwerkte aanvragen.
    Concreet use-case: structures aanvragen (bijv. max. 2 Ocean Monuments per speler), handmatig goedkeuren/toewijzen door staff en blijvend zichtbaar voor alle staff.

Describe the solution you'd like

  • Config-gedreven types & velden

    • In config.yml per type: sleutel, naam, beschrijving, velden (tekst, keuze, locatie/coords, getal), validatie, optionele quota (limiet per speler), en cooldown.
    • Voorbeeldtype “structures”: limiet (bijv. 2), keuzelijst van toegestane structures, optioneel wereld/coords.
  • Commands & GUI

    • Speler:

      • /request new <type> → GUI/formulier voor invullen velden
      • /request my → openstaande/eerdere aanvragen
      • /request history → volledig persoonlijk archief (read-only)
    • Staff:

      • /request staff list [status|type|player]
      • /request staff view <id> (alle gegevens + audittrail)
      • /request staff approve <id> [opmerking]
      • /request staff deny <id> [reden]
      • /request staff fulfill <id> [gegevens] (eindstap; bij structures: toegewezen structure + locatie)
      • /request staff quota <player> <type> set|add <n>
    • Duidelijke status-updates (chat/actionbar) en een overzichtelijke staff-GUI (tabs per status: OPEN / IN_REVIEW / APPROVED / DENIED / FULFILLED).

  • Workflow & statussen

    • OPENIN_REVIEWAPPROVED/DENIED → (optioneel) FULFILLED.
    • Auditlog met wie/wat/wanneer en notities.
    • Quota-handhaving per type bij indienen en bij FULFILLED (bijv. structures telt pas bij fulfillment mee).
  • Persistent archief

    • Altijd alle requests bewaren (soft-delete nooit zichtbaar voor spelers, maar audit blijft).
    • Per speler een tijdlijn + filters (type/status).
  • Permissions (indicatief)

    • Spelers: request.use
    • Staff: request.staff.view, request.staff.process, request.staff.fulfill, request.staff.quota, request.admin
  • Notificaties (optioneel)

    • Bij nieuwe OPEN request: ping naar staff-kanaal; bij statuswijziging: melding aan speler.

Additional context

  • Config-schets

    requests:
      types:
        structures:
          name: "Structures aanvragen"
          description: "Vraag een structure aan tot je limiet."
          quota:
            per_player: 2          # hard limiet, telt bij FULFILLED
          fields:
            - key: "structure"
              label: "Welke structure?"
              type: "select"
              options: ["ocean_monument", "woodland_mansion", "ancient_city"]
              required: true
            - key: "world"
              label: "Wereld"
              type: "select"
              options: ["world", "world_nether", "world_the_end"]
              required: true
            - key: "coords"
              label: "Coördinaten"
              type: "location"     # GUI laat huidige positie kiezen of handmatig invullen
              required: false
          cooldown_seconds: 0
        custom_form:
          name: "Algemene aanvraag"
          description: "Vrij formulier met eigen velden."
          fields:
            - key: "omschrijving"
              type: "text"
              max_length: 500
              required: true
  • DB-schema (compact, uitbreidbaar)

    CREATE TABLE request_type (
      key VARCHAR(64) PRIMARY KEY,
      name VARCHAR(128) NOT NULL
    );
    
    CREATE TABLE request (
      id BIGINT AUTO_INCREMENT PRIMARY KEY,
      player_uuid BINARY(16) NOT NULL,
      type_key VARCHAR(64) NOT NULL,
      status VARCHAR(16) NOT NULL,           -- OPEN, IN_REVIEW, APPROVED, DENIED, FULFILLED
      created_at DATETIME(3) NOT NULL,
      updated_at DATETIME(3) NOT NULL,
      FOREIGN KEY (type_key) REFERENCES request_type(key)
    );
    
    CREATE TABLE request_field_value (
      request_id BIGINT NOT NULL,
      field_key VARCHAR(64) NOT NULL,
      value TEXT NOT NULL,
      PRIMARY KEY (request_id, field_key),
      FOREIGN KEY (request_id) REFERENCES request(id)
    );
    
    CREATE TABLE request_history (
      id BIGINT AUTO_INCREMENT PRIMARY KEY,
      request_id BIGINT NOT NULL,
      actor_uuid BINARY(16) NULL,            -- NULL = systeem
      from_status VARCHAR(16) NULL,
      to_status VARCHAR(16) NOT NULL,
      note TEXT NULL,
      created_at DATETIME(3) NOT NULL,
      FOREIGN KEY (request_id) REFERENCES request(id)
    );
    
    -- Optioneel: quota cache per speler × type (voor snelle checks)
    CREATE TABLE request_quota (
      player_uuid BINARY(16) NOT NULL,
      type_key VARCHAR(64) NOT NULL,
      fulfilled_count INT NOT NULL DEFAULT 0,
      PRIMARY KEY (player_uuid, type_key),
      FOREIGN KEY (type_key) REFERENCES request_type(key)
    );
  • Structures use-case

    • Speler dient “structures” in; staff keurt goed en zet daarna op FULFILLED met ingevulde gegevens (bijv. structure id/coords).
    • request_quota.fulfilled_count ++ → zichtbaar in staff-GUI per speler (“heeft 2/2 structures gekregen”).
    • Andere staff ziet in één oogopslag welke structures en wanneer aan een speler zijn toegewezen.
  • Acceptatiecriteria

    1. Admin kan via config nieuwe requesttypes en velden definiëren zonder codewijziging.
    2. Speler kan een request indienen via GUI/command; staff kan inzien, beoordelen en afhandelen.
    3. Permanent archief per speler met volledige audittrail en filtermogelijkheden.
    4. Quota voor “structures” werkt: max. toekenningen per speler bewaakt op FULFILLED.
    5. Geen console-errors; duidelijke meldingen voor spelers en staff; performance OK bij grote archieven.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions