109 lines
1.9 KiB
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)
|
|
}
|