diff --git a/guild.json b/guild.json new file mode 100644 index 0000000..cd5b6bb --- /dev/null +++ b/guild.json @@ -0,0 +1,5 @@ +{ + "name": "AAA", + "realm": "Gandling EU", + "description": "Wee woo" +} \ No newline at end of file diff --git a/src/backend/Components/Guild/GuildManager.ts b/src/backend/Components/Guild/GuildManager.ts index f6da26f..14bed6c 100644 --- a/src/backend/Components/Guild/GuildManager.ts +++ b/src/backend/Components/Guild/GuildManager.ts @@ -1,37 +1,74 @@ import { FrontworkAdmin } from "../../Admin/Admin"; import { FrontworkComponent } from "../../Types/FrontworkComponent"; -import { _Rank } from "../../Types/Types"; +import { _Rank, Rank } from "../../Types/Types"; +import { ConfigLoader } from "loadson"; +import { GuildManagerIfc, GuildManagerFeatureIfc } from "./RPCInterface"; + +export type Guild = { + name: string + realm: string + description: string +} export class GuildManager -implements FrontworkComponent{ +implements FrontworkComponent{ - name = "GuildManager"; + name = "GuildManager" as "GuildManager"; admin: FrontworkAdmin + guild: ConfigLoader + + constructor(){ + this.guild = new ConfigLoader({ + name: "guild", + getDefaultConfig: () => { + return { + name: "Tranquil", + realm: "Gandling EU", + description: "Wee woo" + } + } + }, "./config") + } + exportRPCs = () => [{ - name: 'getGuildInfo', - call: async () => { - - return await Promise.all( - ['ADMIN', ..._Rank].map(async r => { - const res = await this.admin.knex - .select('*') - .from('users') - .where('rank', '=', r) - .first() - .count() - - return { - rank: r, - count: res['count(*)'] - } - }) - ) - } + name: 'getHeadCount' as 'getHeadCount', + call: async () => await this.headCount() + },{ + name: 'getGuildInfo' as 'getGuildInfo', + call: async () => this.guild.getConfig() }] - exportRPCFeatures = () => [] + exportRPCFeatures = () => [{ + name: 'manageGuild' as 'manageGuild', + exportRPCs: () => [{ + name: 'setName' as 'setName', + call: async (name:string) => this.guild.setConfigKey('name', name) + },{ + name: 'setRealm' as 'setRealm', + call: async (realm:string) => this.guild.setConfigKey('realm', realm) + }, { + name: 'setDescription' as 'setDescription', + call: async (description: string) => this.guild.setConfigKey('description', description) + }] + }] getTableDefinitions = () => [] + headCount = async () => await Promise.all( + ['ADMIN', ..._Rank].map(async r => { + const res = await this.admin.knex + .select('*') + .from('users') + .where('rank', '=', r) + .first() + .count() + + return <{rank:Rank, count: number}>{ + rank: r, + count: res['count(*)'] + } + }) + ) + } \ No newline at end of file diff --git a/src/backend/Components/Guild/RPCInterface.ts b/src/backend/Components/Guild/RPCInterface.ts new file mode 100644 index 0000000..f5a708e --- /dev/null +++ b/src/backend/Components/Guild/RPCInterface.ts @@ -0,0 +1,17 @@ +import { Guild } from "./GuildManager" +import { Rank } from "../../Types/Types" + +export type GuildManagerIfc = { + GuildManager: { + getHeadCount: () => Promise<{rank:Rank, count: number}[]> + getGuildInfo: () => Promise + } +} + +export type GuildManagerFeatureIfc = { + manageGuild: { + setName: (name:string) => Promise + setRealm: (realm:string) => Promise + setDescription: (description:string) => Promise + } +} \ No newline at end of file diff --git a/src/backend/Components/Item/ItemManager.ts b/src/backend/Components/Item/ItemManager.ts index 66247fd..1318f4f 100644 --- a/src/backend/Components/Item/ItemManager.ts +++ b/src/backend/Components/Item/ItemManager.ts @@ -3,13 +3,13 @@ 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"; +import { RPC, RPCInterface } from "rpclibrary"; +import { ItemManagerIfc, ItemManagerFeatureIfc } from "./RPCInterface"; const fetch = require('node-fetch') const xml2js = require('xml2js'); const parser = new xml2js.Parser(/* options */); -export type ItemManagerFeatureIfc = any export type Item = { id?:number @@ -21,10 +21,10 @@ export type Item = { } export class ItemManager -implements FrontworkComponent, TableDefinitionExporter{ +implements FrontworkComponent, TableDefinitionExporter{ admin:FrontworkAdmin - name = "ItemManager"; + name = "ItemManager" as "ItemManager"; exportRPCs(): RPC[]{ return [{ diff --git a/src/backend/Components/Item/RPCInterface.ts b/src/backend/Components/Item/RPCInterface.ts new file mode 100644 index 0000000..f9c2ffd --- /dev/null +++ b/src/backend/Components/Item/RPCInterface.ts @@ -0,0 +1,4 @@ +import { RPCInterface } from "rpclibrary" + +export type ItemManagerIfc = RPCInterface +export type ItemManagerFeatureIfc = RPCInterface \ No newline at end of file diff --git a/src/backend/Components/Raid/RPCInterface.ts b/src/backend/Components/Raid/RPCInterface.ts new file mode 100644 index 0000000..a5b8ef3 --- /dev/null +++ b/src/backend/Components/Raid/RPCInterface.ts @@ -0,0 +1,17 @@ +import { Raid, Signup, User } from "../../Types/Types"; +import { RPCInterface } from "rpclibrary"; + +export type RaidManagerIfc = RPCInterface + +export type RaidManagerFeatureIfc = { + manageRaid: { + createRaid: (raid:Raid) => Promise + addSignup: (signup: Signup) => Promise + removeSignup: (signup: Signup) => Promise + } + signup: { + getRaids: () => Promise + getSingups: (raid:Raid) => Promise + sign: (user:User, raid:Raid, attending:boolean) => Promise + } +} \ No newline at end of file diff --git a/src/backend/Components/Raid/RaidManager.ts b/src/backend/Components/Raid/RaidManager.ts index cadf6e2..579ec0e 100644 --- a/src/backend/Components/Raid/RaidManager.ts +++ b/src/backend/Components/Raid/RaidManager.ts @@ -1,11 +1,11 @@ -import { TableDefiniton, User, _Rank, Raid, Signup, RaidManagerFeatureIfc } from "../../Types/Types"; +import { TableDefiniton, User, _Rank, Raid, Signup } from "../../Types/Types"; import { FrontworkAdmin } from "../../Admin/Admin"; import { FrontworkComponent } from "../../Types/FrontworkComponent"; - +import { RaidManagerFeatureIfc, RaidManagerIfc } from "./RPCInterface"; export class RaidManager -implements FrontworkComponent{ - name = "RaidManager"; +implements FrontworkComponent{ + name = "RaidManager" as "RaidManager"; admin: FrontworkAdmin exportRPCs = () => [] diff --git a/src/backend/Components/User/RPCInterface.ts b/src/backend/Components/User/RPCInterface.ts new file mode 100644 index 0000000..9563a3f --- /dev/null +++ b/src/backend/Components/User/RPCInterface.ts @@ -0,0 +1,18 @@ +import { Token, Auth, User, RPCPermission } from "../../Types/Types" + +export type UserManagerIfc = { + Authenticator: { + login: (username:string, pwHash:string) => Promise + authenticate: (token:string | Token) => Promise + } +} + +export type UserManagerFeatureIfc = { + createUser: { + createUser: (user:User) => Promise + } + modifyPermissions: { + setPermission: (perm: RPCPermission) => Promise + getPermissions: () => Promise + } +} \ No newline at end of file diff --git a/src/backend/Components/User/UserManager.ts b/src/backend/Components/User/UserManager.ts index 1c13813..70b1c1a 100644 --- a/src/backend/Components/User/UserManager.ts +++ b/src/backend/Components/User/UserManager.ts @@ -1,19 +1,14 @@ import { RPCServer } from "rpclibrary"; -import { TableDefiniton, AnyRPCExporter, User, RPCPermission, _Rank, Token, Auth, FrontcraftFeatureIfc, Rank, LoginManagerFeatureIfc } from "../../Types/Types"; +import { TableDefiniton, AnyRPCExporter, User, RPCPermission, _Rank, Token, Auth, Rank, FrontcraftFeatureIfc } from "../../Types/Types"; import { FrontworkAdmin } from "../../Admin/Admin"; import { PrivilegedRPCExporter } from "../../Types/PrivilegedRPCExporter"; import { FrontworkComponent } from "../../Types/FrontworkComponent"; import { getSpecTableData } from "../../Types/PlayerSpecs" +import { UserManagerIfc, UserManagerFeatureIfc } from "./RPCInterface"; const uuid = require('uuid/v4') -export type LoginManagerIfc = { - Authenticator: { - login: (username:string, pwHash:string) => Promise - } -} - export class LoginManager -implements FrontworkComponent{ +implements FrontworkComponent{ name = "Authenticator" as "Authenticator"; admin:FrontworkAdmin @@ -124,7 +119,7 @@ implements FrontworkComponent{ const perm : RPCPermission[] = await this.admin.knex .select(rank) .from('rpcpermissions') - .where('name', '=', feature) + .where('name', '=', feature) if(perm.length === 0) return false return perm[0][rank] diff --git a/src/backend/Launcher.ts b/src/backend/Launcher.ts index 394d6dd..de752b9 100644 --- a/src/backend/Launcher.ts +++ b/src/backend/Launcher.ts @@ -12,7 +12,8 @@ let itemManager = new ItemManager() let guildManager = new GuildManager() let userManager = new LoginManager([ raidManager, - itemManager + itemManager, + guildManager ]) let components:FrontworkComponent[] = [ guildManager, raidManager, itemManager, userManager ] diff --git a/src/backend/Types/FrontworkComponent.ts b/src/backend/Types/FrontworkComponent.ts index d76649a..181b66d 100644 --- a/src/backend/Types/FrontworkComponent.ts +++ b/src/backend/Types/FrontworkComponent.ts @@ -1,22 +1,24 @@ import { PrivilegedRPCExporter } from "./PrivilegedRPCExporter"; -import { RPCInterface, RPC, AnyFunction, RPCExporter } from "rpclibrary"; +import { RPCInterface, RPCExporter, RPCInterfaceArray } from "rpclibrary"; import { TableDefinitionExporter } from "./Interfaces"; import { FrontworkAdmin } from "../Admin/Admin"; import { TableDefiniton } from "./Types"; export interface FrontworkComponent< Ifc extends RPCInterface = RPCInterface, + FeatureIfc extends RPCInterface = RPCInterface, Name extends keyof Ifc = keyof Ifc, + FeatureName extends keyof FeatureIfc = keyof FeatureIfc, SubresT = {} > extends - PrivilegedRPCExporter, + PrivilegedRPCExporter, TableDefinitionExporter { admin:FrontworkAdmin - name: string; + name: Name; - exportRPCFeatures(): RPCExporter[] - exportRPCs(): RPC[] + exportRPCFeatures(): RPCExporter[] + exportRPCs(): RPCInterfaceArray[Name] getTableDefinitions(): TableDefiniton[] initialize?(): Promise diff --git a/src/backend/Types/PrivilegedRPCExporter.ts b/src/backend/Types/PrivilegedRPCExporter.ts index 0242267..fbc612b 100644 --- a/src/backend/Types/PrivilegedRPCExporter.ts +++ b/src/backend/Types/PrivilegedRPCExporter.ts @@ -1,7 +1,11 @@ import { RPCExporter, RPCInterface, RPC, RPCInterfaceArray } from "rpclibrary"; -export interface PrivilegedRPCExporter -extends RPCExporter{ - - exportRPCFeatures() : RPCExporter[] +export interface PrivilegedRPCExporter < + Ifc extends RPCInterface = RPCInterface, + FeatureIfc extends RPCInterface = RPCInterface, + Name extends keyof Ifc = keyof Ifc, + FeatureName extends keyof FeatureIfc = keyof FeatureIfc, + SubresT = {} +>extends RPCExporter{ + exportRPCFeatures() : RPCExporter[] } \ No newline at end of file diff --git a/src/backend/Types/Types.ts b/src/backend/Types/Types.ts index 4ba9363..0b084df 100644 --- a/src/backend/Types/Types.ts +++ b/src/backend/Types/Types.ts @@ -1,5 +1,9 @@ import * as Knex from "knex" import { RPCExporter } from "rpclibrary"; +import { RaidManagerFeatureIfc } from "../Components/Raid/RPCInterface"; +import { ItemManagerIfc, ItemManagerFeatureIfc } from "../Components/Item/RPCInterface"; +import { UserManagerIfc, UserManagerFeatureIfc } from "../Components/User/RPCInterface"; + export declare type NotificationSeverity = 'Info' | 'Important' | 'Error'; @@ -57,38 +61,12 @@ export type Token = { export type Auth = {port: number, user: User, token: Token} -export type FrontcraftFeatureIfc = RaidManagerFeatureIfc & LoginManagerFeatureIfc +export type FrontcraftIfc = UserManagerIfc + & ItemManagerIfc - -export type LoginManagerIfc = { - Authenticator: { - login: (username:string, pwHash:string) => Promise - authenticate: (token:string | Token) => Promise - } -} - -export type LoginManagerFeatureIfc = { - createUser: { - createUser: (user:User) => Promise - } - modifyPermissions: { - setPermission: (perm: RPCPermission) => Promise - getPermissions: () => Promise - } -} - -export type RaidManagerFeatureIfc = { - manageRaid: { - createRaid: (raid:Raid) => Promise - addSignup: (signup: Signup) => Promise - removeSignup: (signup: Signup) => Promise - } - signup: { - getRaids: () => Promise - getSingups: (raid:Raid) => Promise - sign: (user:User, raid:Raid, attending:boolean) => Promise - } -} +export type FrontcraftFeatureIfc = RaidManagerFeatureIfc + & UserManagerFeatureIfc + & ItemManagerFeatureIfc export type Spec = { id?: number, diff --git a/src/frontend/custom-webpack.config.js b/src/frontend/custom-webpack.config.js index c44fbd2..06e6d73 100644 --- a/src/frontend/custom-webpack.config.js +++ b/src/frontend/custom-webpack.config.js @@ -1,4 +1,4 @@ module.exports = { - externals: ['http'], + externals: ['http', 'fs'], node: {global: true, fs: 'empty'} } \ No newline at end of file diff --git a/src/frontend/src/app/frontcraft/services/login-api.ts b/src/frontend/src/app/frontcraft/services/login-api.ts index 19f9bfe..2bab7f4 100644 --- a/src/frontend/src/app/frontcraft/services/login-api.ts +++ b/src/frontend/src/app/frontcraft/services/login-api.ts @@ -1,12 +1,12 @@ import { Injectable } from "@angular/core"; import {RPCSocket} from 'rpclibrary/js/src/Frontend' -import { Token, Auth, User, _Class, FrontcraftFeatureIfc, LoginManagerIfc, SomeOf, } from '../../../../../backend/Types/Types' +import { Token, Auth, User, _Class, FrontcraftFeatureIfc, SomeOf, FrontcraftIfc, } from '../../../../../backend/Types/Types' import { CookieService } from 'ngx-cookie-service'; @Injectable() export class LoginApiService{ - private socket:RPCSocket & LoginManagerIfc; + private socket:RPCSocket & FrontcraftIfc; private auth:Auth private privSocket: RPCSocket & SomeOf @@ -14,7 +14,7 @@ export class LoginApiService{ private cookieSvc : CookieService ){} - getUnprivilegedSocket = () : RPCSocket & LoginManagerIfc => this.socket + getUnprivilegedSocket = () : RPCSocket & FrontcraftIfc => this.socket private getPrivilegedSocket = async (auth:Auth) : Promise> => { if(this.privSocket) return this.privSocket @@ -85,7 +85,7 @@ export class LoginApiService{ } initialize = async () : Promise => { - const sock = await RPCSocket.makeSocket(20000, window.location.hostname) + const sock = await RPCSocket.makeSocket(20000, window.location.hostname) this.socket = sock const cookie = this.getCookie()