diff --git a/UI/config/rpc.js b/UI/config/rpc.js index 707e231..f7eb7ca 100644 --- a/UI/config/rpc.js +++ b/UI/config/rpc.js @@ -1,4 +1,13 @@ // @flow import RPCClient from '../rpc' -export default (new RPCClient({ forceDev: false })).rpc +const client = new RPCClient({ forceDev: false }) + +export default client.rpc +export const withCookies = (ctx: any) => { + if (ctx.req != null) { + return client.withCookies(ctx.req.headers.cookie) + } else { + return client.rpc + } +} diff --git a/UI/pages/testrpc.js b/UI/pages/testrpc.js index 5f26e5a..3e8f12d 100644 --- a/UI/pages/testrpc.js +++ b/UI/pages/testrpc.js @@ -1,14 +1,16 @@ import * as React from 'react' -import RPC from '../config/rpc' +import RPC, { withCookies } from '../config/rpc' export default class TestRPC extends React.Component { static async getInitialProps (ctx) { + const user = await withCookies(ctx).getCurrentUser() + console.log(user) return { - // hello: await RPC.hello('world') + user } } - componentDidMount () { + async componentDidMount () { window.$RPC = RPC } @@ -19,6 +21,11 @@ export default class TestRPC extends React.Component { } render () { - return
hello, { this.props.hello }
+ if (this.props.user == null) { + return
hello stranger OwO
+ } + + const { username, avatar, discriminator } = this.props.user + return
hello, {username}#{discriminator}
} } diff --git a/UI/rpc/index.js b/UI/rpc/index.js index 65db79f..efbda09 100644 --- a/UI/rpc/index.js +++ b/UI/rpc/index.js @@ -22,6 +22,7 @@ export default class RPCClient { baseUrl: string firstKnownHash: string recentHash: string + cookieHeader: string rpc: { [fn: string]: (...args: any[]) => Promise | string @@ -52,6 +53,11 @@ export default class RPCClient { } } + withCookies = (h: string) => { + this.cookieHeader = h + return this.rpc + } + async updateCalls () { // this is for development only. doing in prod is probably dumb. const rsp = await superagent.get(this.baseUrl) @@ -78,7 +84,11 @@ export default class RPCClient { async call (fn: string, ...args: any[]): mixed { const req: RPCRequest = { fn, args } - const rsp = await superagent.post(this.baseUrl).send(req).ok(() => true) + const rq = superagent.post(this.baseUrl) + if (this.cookieHeader != null) { + rq.cookies = this.cookieHeader + } + const rsp = await rq.send(req).ok(() => true) const body: RPCResponse = rsp.body if (body.error === true) { throw RPCError.fromResponse(body, rsp.status) diff --git a/rpc/index.js b/rpc/index.js index ae52b9e..1dbc315 100644 --- a/rpc/index.js +++ b/rpc/index.js @@ -32,7 +32,7 @@ export default class RPCServer { this.mapHash = fnv.hash(Object.keys(this.rpcMap)).str() // call map for the client. - this.rpcCalls = Object.keys(this.rpcMap).map(fn => ({ name: this.rpcMap[fn].name, args: this.rpcMap[fn].length - 1 })) + this.rpcCalls = Object.keys(this.rpcMap).map(fn => ({ name: this.rpcMap[fn].name, args: 0 })) } hookRoutes (router: betterRouter) { @@ -68,9 +68,9 @@ export default class RPCServer { // if call.length (which is the solid args list) // is longer than args, we have too little to call the function. - if (args.length < call.length) { - return this.rpcError(ctx, null, new RPCError(`RPC call ${fn}() with ${args.length} arguments does not exist.`, 400)) - } + // if (args.length < call.length) { + // return this.rpcError(ctx, null, new RPCError(`RPC call ${fn}() with ${args.length} arguments does not exist.`, 400)) + // } try { const response = await call(ctx, ...args) diff --git a/rpc/user.js b/rpc/user.js new file mode 100644 index 0000000..11d644b --- /dev/null +++ b/rpc/user.js @@ -0,0 +1,11 @@ +// @flow +import { type AppContext } from '../Roleypoly' +import { type Context } from 'koa' +// import { type Guild } from 'discord.js' + +export default ($: AppContext) => ({ + getCurrentUser (ctx: Context) { + const { userId } = ctx.session + return $.discord.getUserPartial(ctx.session.userId) + } +})