diff --git a/Server/Roleypoly.js b/Server/Roleypoly.js index 0c61816..8df8f66 100644 --- a/Server/Roleypoly.js +++ b/Server/Roleypoly.js @@ -1,4 +1,4 @@ -const log = new (require('./logger'))('World') +const log = new (require('./logger'))('Roleypoly') const Sequelize = require('sequelize') const fetchModels = require('./models') const fetchApis = require('./api') @@ -40,9 +40,9 @@ class Roleypoly { // enableReadyCheck: true, // enableOfflineQueue: true // }) - this.ctx.discord = new (require('./services/discord'))(this.ctx) this.ctx.sessions = new (require('./services/sessions'))(this.ctx) + this.ctx.P = new (require('./services/presentation'))(this.ctx) } async mountRoutes () { diff --git a/Server/api/auth.js b/Server/api/auth.js index 15ddd8c..bc9753b 100644 --- a/Server/api/auth.js +++ b/Server/api/auth.js @@ -36,6 +36,7 @@ module.exports = (R, $) => { if (ctx.session.accessToken === undefined) { ctx.body = { err: 'not_logged_in' } ctx.status = 401 + return } const user = await $.discord.getUser(ctx.session.accessToken) diff --git a/Server/api/servers.js b/Server/api/servers.js index add8beb..5af758d 100644 --- a/Server/api/servers.js +++ b/Server/api/servers.js @@ -2,7 +2,7 @@ module.exports = (R, $) => { R.get('/api/servers', async (ctx) => { const { userId } = ctx.session const srv = $.discord.getRelevantServers(userId) - const presentable = $.discord.presentableServers(srv, userId) + const presentable = $.P.oldPresentableServers(srv, userId) ctx.body = presentable }) diff --git a/Server/index.js b/Server/index.js index 66304a4..f48dbf7 100644 --- a/Server/index.js +++ b/Server/index.js @@ -37,9 +37,9 @@ async function start () { await next() } catch (e) { log.error(e) - ctx.status = 500 + ctx.status = ctx.status || 500 if (DEVEL) { - ctx.body = e.stack + ctx.body = ctx.body || e.stack } else { ctx.body = { err: 'something terrible happened.' diff --git a/Server/models/Server.js b/Server/models/Server.js index 1a405b6..d93bd74 100644 --- a/Server/models/Server.js +++ b/Server/models/Server.js @@ -7,7 +7,7 @@ module.exports = (sql, DataTypes) => { categories: { type: DataTypes.JSON }, - note: { + message: { type: DataTypes.TEXT } }) diff --git a/Server/package.json b/Server/package.json index c303992..758d764 100644 --- a/Server/package.json +++ b/Server/package.json @@ -26,6 +26,7 @@ "koa-passport": "^4.0.1", "koa-session": "^5.5.1", "ksuid": "^0.4.0", + "lru-cache": "^4.1.1", "passport-discord": "^0.1.3", "passport-oauth2-refresh": "^1.0.0", "pg": "^7.4.0", diff --git a/Server/services/discord.js b/Server/services/discord.js index ccfa78d..da2954e 100644 --- a/Server/services/discord.js +++ b/Server/services/discord.js @@ -15,6 +15,7 @@ class DiscordService extends Service { this.client = new discord.Client() this.startBot() + } async startBot () { @@ -25,42 +26,12 @@ class DiscordService extends Service { return this.client.guilds.filter((g) => g.members.has(userId)) } - presentableServers (collection, userId) { - return collection.map((server) => { - const gm = server.members.get(userId) - - return { - id: server.id, - gm: { - nickname: gm.nickname, - color: gm.displayHexColor - }, - server: { - id: server.id, - name: server.name, - ownerID: server.ownerID, - icon: server.icon - }, - roles: this.presentableRoles(server.id, gm), - message: 'moe moe kyuuuuuuuuun~', - perms: this.getPermissions(gm) - } - }) + gm (serverId, userId) { + return this.client.guilds.get(serverId).members.get(userId) } - presentableRoles (serverId, gm) { - return this.client.guilds - .get(serverId) - .roles - .filter(r => r.id !== serverId) - .map((role) => ({ - color: role.hexColor, - position: role.position, - calculatedPosition: role.calculatedPosition, - id: role.id, - name: role.name, - selected: gm.roles.has(role.id) - })) + getRoles (server) { + return this.client.guilds.get(server).roles } getPermissions (gm) { diff --git a/Server/services/presentation.js b/Server/services/presentation.js new file mode 100644 index 0000000..e5b5643 --- /dev/null +++ b/Server/services/presentation.js @@ -0,0 +1,49 @@ +const Service = require('./Service') +const LRU = require('lru-cache') + +class PresentationService extends Service { + constructor (ctx) { + super(ctx) + this.M = ctx.M + this.discord = ctx.discord + + this.cache = LRU({ max: 500, maxAge: 100 * 60 * 5 }) + } + + oldPresentableServers (collection, userId) { + return collection.map((server) => { + const gm = server.members.get(userId) + + return { + id: server.id, + gm: { + nickname: gm.nickname, + color: gm.displayHexColor + }, + server: { + id: server.id, + name: server.name, + ownerID: server.ownerID, + icon: server.icon + }, + roles: server.roles.filter(r => r.id !== server.id).map(r => ({ + id: r.id, + color: r.color, + name: r.name, + selected: gm.roles.has(r.id), + position: r.position + })), + message: 'moe moe kyuuuuuuuuun~', + perms: this.discord.getPermissions(gm) + } + }) + } + + rolesByServer (serverId, userId) { + // get from discord, merge with server categories + } + + +} + +module.exports = PresentationService diff --git a/Server/services/server.js b/Server/services/server.js new file mode 100644 index 0000000..e61dfe4 --- /dev/null +++ b/Server/services/server.js @@ -0,0 +1,42 @@ +const Service = require('./Service') + +class ServerService extends Service { + constructor (ctx) { + super(ctx) + this.Server = ctx.M.Server + this.P = ctx.P + } + + async ensure (server) { + const srv = await this.get(server.id) + if (srv == null) { + return this.create({ + id: server.id, + message: '', + categories: {} + }) + } + } + + create ({ id, message, categories }) { + const srv = this.Server.build({ id, message, categories }) + + return srv.save() + } + + update (id, newData) { + const srv = this.get(id) + + return srv.update(newData) + } + + get (id) { + return this.Server.findOne({ + where: { + id + } + }) + } +} + +module.exports = ServerService diff --git a/Server/yarn.lock b/Server/yarn.lock index fbbb322..c9f0005 100644 --- a/Server/yarn.lock +++ b/Server/yarn.lock @@ -2022,6 +2022,13 @@ lru-cache@^4.0.1: pseudomap "^1.0.1" yallist "^2.0.0" +lru-cache@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -2635,7 +2642,7 @@ promptly@2.2.0: dependencies: read "^1.0.4" -pseudomap@^1.0.1: +pseudomap@^1.0.1, pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -3441,7 +3448,7 @@ y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" -yallist@^2.0.0: +yallist@^2.0.0, yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" diff --git a/UI/package.json b/UI/package.json index 4102504..3584a3e 100644 --- a/UI/package.json +++ b/UI/package.json @@ -6,6 +6,7 @@ "color": "^2.0.1", "custom-react-scripts": "0.2.1", "eslint": "^4.13.0", + "history": "^4.7.2", "immutable": "^3.8.2", "prop-types": "^15.6.0", "react": "^16.2.0", @@ -14,6 +15,7 @@ "react-redux": "^5.0.6", "react-router": "^4.2.0", "react-router-dom": "^4.2.2", + "react-router-redux": "^5.0.0-alpha.8", "redux": "^3.7.2", "redux-devtools": "^3.4.1", "redux-devtools-dock-monitor": "^1.1.2", diff --git a/UI/public/index.html b/UI/public/index.html index 69902b7..4b88511 100644 --- a/UI/public/index.html +++ b/UI/public/index.html @@ -4,7 +4,8 @@