| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- import { TableDefinitionExporter } from "../../Types/Interfaces";
- import { TableDefiniton, _Rank } from "../../Types/Types";
- import { FrontworkAdmin } from "../../Admin/Admin";
- import { T1 } from "../../Types/Items";
- import { FrontworkComponent } from "../../Types/FrontworkComponent";
- import { RPC } from "rpclibrary";
- const fetch = require('node-fetch')
- const xml2js = require('xml2js');
- const parser = new xml2js.Parser(/* options */);
-
-
- export type ItemManagerFeatureIfc = any
-
- export type Item = {
- id?:number
- name:string
- iconname:string
- url:string
- quality:string
- hidden:boolean
- }
-
- export class ItemManager
- implements FrontworkComponent<any, any, ItemManagerFeatureIfc>, TableDefinitionExporter{
-
- admin:FrontworkAdmin
- name = "ItemManager";
-
- exportRPCs(): RPC<any, any>[]{
- return [{
- name: 'getItems',
- call: async () => await this.getItems()
- },{
- name: 'getItem',
- call: async (name:string) => await this.getItem(name)
- }]
- }
-
- exportRPCFeatures() {
- return []
- }
-
- getItems = async () :Promise<Item[]> => await this.admin.knex.select('*').from('items')
-
- getItem = async (name:string):Promise<Item> => {
- const res = await fetch('https://classic.wowhead.com/item='+name+'&xml');
- const txt = await res.text();
- const r = await parser.parseStringPromise(txt);
-
- try{
- return <Item>{
- name: r.wowhead.item[0].name[0],
- iconname: r.wowhead.item[0].icon[0]._,
- url: r.wowhead.item[0].link[0],
- quality: r.wowhead.item[0].quality[0]._,
- }
- }catch (e){
- console.log(name)
- throw e
- }
- }
-
- getTableDefinitions(): TableDefiniton[] {
- return [
- {
- name: 'reservations',
- tableBuilder: (table) => {
- table.integer("user_id").primary()
- table.foreign("user_id").references("id").inTable('users')
- table.integer("item_id").primary()
- table.foreign("item_id").references("id").inTable('items')
- table.integer("raid_id").primary()
- table.foreign("raid_id").references("id").inTable('raids')
- }
- },{
- name: 'items',
- tableBuilder: (table) => {
- table.increments("id").primary()
- table.string('name').unique().notNullable()
- table.string('iconname').notNullable()
- table.string('url').notNullable()
- table.string('quality').defaultTo('Epic').notNullable()
- table.boolean('hidden').defaultTo(false).notNullable()
- }
- }]
- }
-
- countItems = async() :Promise<number> => {
- const count = await this.admin.knex('items').count('*');
- return <number>count[0]['count(*)']
- }
-
- initialize = async() => {
- const allItems = [...T1]
- const countCache = await this.countItems()
- if(countCache != allItems.length){
- const items:Item[] = await Promise.all(allItems.map((i) => this.getItem(i)))
- try{
- await this.admin
- .knex('items')
- .insert(items)
- }catch(e){
- console.info("Skipping item insertion")
- }
- }
- }
- }
|