diff --git a/.env.example b/.env.example index 7e2961e..4ef4ee2 100644 --- a/.env.example +++ b/.env.example @@ -21,4 +21,4 @@ DISCORD_ADMIN_ROLE_IDS=123456789012345678,234567890123456789 # 15098193051880039 # Comma-separated role IDs. Team role can see internal orders, accept/decline, check warehouse. DISCORD_TEAM_ROLE_IDS=345678901234567890 # 1509819434330755233 -DATABASE_PATH=orders.db +DATABASE_PATH=/data/orders.db diff --git a/README.md b/README.md index 93a5fc4..8aac3e9 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,14 @@ Fügt Bestand hinzu oder setzt ihn absolut. /lager_add ware:Gold qualitaet:900 menge:100 einheit:SCU ort:Orison modus:setzen ``` +`ort` ist der interne Lagerort. Er wird nur in Team-/Admin-Ausgaben, der internen Lagerprüfung und im Auditlog angezeigt. Öffentliche Auftragsposts und Endnutzer-DMs enthalten keine Lagerorte. + +Das Auditlog zeigt Bestandsänderungen mit altem und neuem Wert, z. B.: + +```text +Lager geändert durch b1tk1ll3r: P4-AR Q725 Stück @ Baijini Point: 0 → 2 +``` + ### `/lager_remove` Reduziert Bestand. Der Bot verhindert negative Bestände. @@ -122,6 +130,8 @@ Reduziert Bestand. Der Bot verhindert negative Bestände. /lager_remove ware:Gold qualitaet:900 menge:10 einheit:SCU ort:Orison ``` +Auch hier bezieht sich `ort` auf genau diese Lagerposition. Wird kein Ort angegeben, wird der Bestand ohne Lagerort geführt. + ### `/lager_liste` Zeigt interne Lagerbestände ephemeral an. diff --git a/discord.go b/discord.go index ec484f4..384aa68 100644 --- a/discord.go +++ b/discord.go @@ -23,7 +23,7 @@ func NewBot(cfg Config, store *Store) (*Bot, error) { if err != nil { return nil, err } - dg.Identify.Intents = discordgo.IntentsGuilds | discordgo.IntentsGuildMessages | discordgo.IntentsGuildMembers | discordgo.IntentsDirectMessages + dg.Identify.Intents = discordgo.IntentsGuilds | discordgo.IntentsDirectMessages b := &Bot{cfg: cfg, store: store, dg: dg} dg.AddHandler(b.onReady) dg.AddHandler(b.onInteraction) @@ -358,12 +358,29 @@ func (b *Bot) cmdInventoryAdd(s *discordgo.Session, i *discordgo.InteractionCrea b.replyEphemeral(s, i, "Ware darf nicht leer sein.") return } + oldAmount := 0.0 + if existing, err := b.store.GetInventoryByKey(normalizeName(item.Name), item.Quality, item.QuantityUnit, item.Location); err == nil { + oldAmount = existing.QuantityAmount + } else if !errors.Is(err, sql.ErrNoRows) { + b.replyEphemeral(s, i, "Lager konnte vor Änderung nicht gelesen werden: "+err.Error()) + return + } + updated, err := b.store.UpsertInventory(item, mode != "set" || remove) if err != nil { b.replyEphemeral(s, i, "Lager konnte nicht aktualisiert werden: "+err.Error()) return } - b.audit(fmt.Sprintf("Lager geändert durch %s: %s Q%d = %s %s @ %s", userString(i), updated.Name, updated.Quality, formatAmount(updated.QuantityAmount), updated.QuantityUnit, updated.Location)) + b.audit(fmt.Sprintf( + "Lager geändert durch %s: %s Q%d %s%s: %s → %s", + userString(i), + updated.Name, + updated.Quality, + updated.QuantityUnit, + locationSuffix(updated.Location), + formatAmount(oldAmount), + formatAmount(updated.QuantityAmount), + )) b.replyEphemeral(s, i, fmt.Sprintf("Lager aktualisiert: %s Q%d — %s %s%s", updated.Name, updated.Quality, formatAmount(updated.QuantityAmount), updated.QuantityUnit, locationSuffix(updated.Location))) }