65 lines
1.5 KiB
TypeScript
65 lines
1.5 KiB
TypeScript
import { User } from 'discord.js';
|
|
import { CustomItem, db } from './db';
|
|
|
|
type DefaultItem = Omit<CustomItem, 'guild'>; // uses negative IDs
|
|
type Item = DefaultItem | CustomItem;
|
|
|
|
interface Behavior {
|
|
name: string,
|
|
description: string,
|
|
itemType: 'plain' | 'weapon' | 'consumable',
|
|
// triggers upon use
|
|
// for 'weapons', this is on hit
|
|
// for 'consumable', this is on use
|
|
// for 'plain', ...??
|
|
// returns `true` upon success, `false` otherwise
|
|
action?: (item: Item, user: User) => Promise<boolean>
|
|
}
|
|
|
|
export const defaultItems: DefaultItem[] = [
|
|
{
|
|
'id': -1,
|
|
'name': 'Coin',
|
|
'emoji': '🪙',
|
|
'type': 'plain',
|
|
'maxStack': 9999,
|
|
'untradable': false
|
|
}
|
|
];
|
|
|
|
export const behaviors: Behavior[] = [
|
|
{
|
|
'name': 'heal',
|
|
'description': 'Heals the user by `behaviorValue`',
|
|
'itemType': 'consumable',
|
|
'action': async (item: Item, user: User) => {
|
|
// todo
|
|
return false;
|
|
}
|
|
}
|
|
];
|
|
|
|
export async function getCustomItem(id: number) {
|
|
return await db<CustomItem>('customItems')
|
|
.where('id', id)
|
|
.first();
|
|
}
|
|
|
|
export async function getItem(id: number): Promise<Item | undefined> {
|
|
if (id >= 0) {
|
|
return await getCustomItem(id);
|
|
} else {
|
|
return defaultItems.find(item => item.id === id);
|
|
}
|
|
}
|
|
|
|
export function getMaxStack(item: Item) {
|
|
return item.type === 'weapon' ? 1 : item.maxStack;
|
|
}
|
|
|
|
export function formatItem(item: Item) {
|
|
return `${item.emoji} **${item.name}**`;
|
|
}
|
|
export function formatItems(item: Item, quantity: number) {
|
|
return `${quantity}x ${formatItem(item)}`;
|
|
} |