notify.moe/arn/InventoryAPI.go

109 lines
1.9 KiB
Go

package arn
import (
"errors"
"github.com/aerogo/aero"
"github.com/aerogo/api"
)
// Force interface implementations
var (
_ Identifiable = (*Inventory)(nil)
)
// Actions
func init() {
API.RegisterActions("Inventory", []*api.Action{
// Use slot
{
Name: "use",
Route: "/use/:slot",
Run: func(obj interface{}, ctx aero.Context) error {
inventory := obj.(*Inventory)
slotIndex, err := ctx.GetInt("slot")
if err != nil {
return err
}
slot := inventory.Slots[slotIndex]
if slot.IsEmpty() {
return errors.New("No item in this slot")
}
if !slot.Item().Consumable {
return errors.New("This item is not consumable")
}
// Save item ID in case it gets deleted by slot.Decrease()
itemID := slot.ItemID
// Decrease quantity
err = slot.Decrease(1)
if err != nil {
return err
}
// Save inventory
inventory.Save()
user := GetUserFromContext(ctx)
err = user.ActivateItemEffect(itemID)
if err != nil {
// Refund item
slot.ItemID = itemID
slot.Increase(1)
inventory.Save()
return nil
}
return err
},
},
// Swap slots
{
Name: "swap",
Route: "/swap/:slot1/:slot2",
Run: func(obj interface{}, ctx aero.Context) error {
inventory := obj.(*Inventory)
a, err := ctx.GetInt("slot1")
if err != nil {
return err
}
b, err := ctx.GetInt("slot2")
if err != nil {
return err
}
err = inventory.SwapSlots(a, b)
if err != nil {
return err
}
inventory.Save()
return nil
},
},
})
}
// Authorize returns an error if the given API request is not authorized.
func (inventory *Inventory) Authorize(ctx aero.Context, action string) error {
return AuthorizeIfLoggedInAndOwnData(ctx, "id")
}
// Save saves the push items in the database.
func (inventory *Inventory) Save() {
DB.Set("Inventory", inventory.UserID, inventory)
}