refactor: hooks

This commit is contained in:
cha0s 2022-08-10 14:32:55 -05:00
parent c2eee71182
commit f779c74e13
15 changed files with 233 additions and 228 deletions

View File

@ -1,15 +1,11 @@
import {Hooks} from '@flecks/core';
import Receiver from './receiver';
export default {
[Hooks]: {
'@flecks/web/client.up': (flecks) => {
window.flecks = flecks;
const Synchronizer = Receiver(flecks);
const synchronizer = new Synchronizer();
flecks.set('$humus/app.synchronizer', synchronizer);
synchronizer.listenTo(flecks.get('$flecks/socket.socket'));
},
export const hooks = {
'@flecks/web/client.up': (flecks) => {
window.flecks = flecks;
const Synchronizer = Receiver(flecks);
const synchronizer = new Synchronizer();
flecks.set('$humus/app.synchronizer', synchronizer);
synchronizer.listenTo(flecks.get('$flecks/socket.socket'));
},
};

View File

@ -1,5 +1,3 @@
import {Hooks} from '@flecks/core';
import App from './components/app';
import {selfEntity} from './state';
import Ui, {Context} from './components/app/ui';
@ -9,18 +7,16 @@ export * from './state';
export {Ui};
export default {
[Hooks]: {
'@flecks/core.config': () => ({
resolution: [1600, 900],
}),
'@flecks/react.roots': () => App,
'@flecks/react.providers': async (req, flecks) => [
Context.Provider,
{value: flecks.get('@humus/app.resolution')},
],
'@flecks/redux.slices': () => ({
selfEntity,
}),
},
export const hooks = {
'@flecks/core.config': () => ({
resolution: [1600, 900],
}),
'@flecks/react.roots': () => App,
'@flecks/react.providers': async (req, flecks) => [
Context.Provider,
{value: flecks.get('@humus/app.resolution')},
],
'@flecks/redux.slices': () => ({
selfEntity,
}),
};

View File

@ -1,24 +1,16 @@
import {Hooks} from '@flecks/core';
// const {
// NODE_ENV,
// } = process.env;
export default {
[Hooks]: {
'@flecks/server.up': async (flecks) => {
// if ('production' === NODE_ENV) {
// return;
// }
const {User} = flecks.get('$flecks/db.models');
if (!await User.findOne({where: {email: 'humus@cha0s.io'}})) {
const user = await User.create({
email: 'humus@cha0s.io',
isAdmin: true,
});
await user.addHashedPassword('foobar');
await user.save();
}
},
export const hooks = {
'@flecks/server.up': async (flecks) => {
// if ('production' === NODE_ENV) {
// return;
// }
const {User} = flecks.get('$flecks/db.models');
if (!await User.findOne({where: {email: 'humus@cha0s.io'}})) {
const user = await User.create({
email: 'humus@cha0s.io',
isAdmin: true,
});
await user.addHashedPassword('foobar');
await user.save();
}
},
};

View File

@ -1,48 +1,46 @@
import {Class, Flecks, Hooks} from '@flecks/core';
import {Class, Flecks} from '@flecks/core';
import flatten from 'lodash.flatten';
export default {
[Hooks]: {
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
'@humus/combat.affinities': () => ({
Void: Class,
Bio: Class,
Stone: Class,
Wood: Class,
Metal: Class,
Air: Class,
Earth: Class,
Fire: Class,
Water: Class,
}),
'@humus/combat.interactions': () => {
const context = require.context('./interactions', false, /from-.*-to.*\.js$/);
return context.keys().map((path) => context(path).default);
},
'@flecks/core.starting': (flecks) => {
flecks.set('$humus/combat.affinities', flecks.gather('@humus/combat.affinities'));
const interactions = flatten(flecks.invokeFlat('@humus/combat.interactions'))
.reduce(
(r, interaction) => {
const {harming, harmed} = interaction;
return {
...r,
[harming]: {
...(r[harming] || {}),
[harmed]: [
...((r[harming] || {})[harmed] || []),
interaction,
],
},
};
},
{},
);
flecks.set(
'$humus/combat.interactions',
(harmingAffinity, harmedAffinity) => interactions[harmingAffinity]?.[harmedAffinity] || [],
);
},
'@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)),
export const hooks = {
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
'@humus/combat.affinities': () => ({
Void: Class,
Bio: Class,
Stone: Class,
Wood: Class,
Metal: Class,
Air: Class,
Earth: Class,
Fire: Class,
Water: Class,
}),
'@humus/combat.interactions': () => {
const context = require.context('./interactions', false, /from-.*-to.*\.js$/);
return context.keys().map((path) => context(path).default);
},
'@flecks/core.starting': (flecks) => {
flecks.set('$humus/combat.affinities', flecks.gather('@humus/combat.affinities'));
const interactions = flatten(flecks.invokeFlat('@humus/combat.interactions'))
.reduce(
(r, interaction) => {
const {harming, harmed} = interaction;
return {
...r,
[harming]: {
...(r[harming] || {}),
[harmed]: [
...((r[harming] || {})[harmed] || []),
interaction,
],
},
};
},
{},
);
flecks.set(
'$humus/combat.interactions',
(harmingAffinity, harmedAffinity) => interactions[harmingAffinity]?.[harmedAffinity] || [],
);
},
'@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)),
};

View File

@ -1,12 +1,10 @@
import {Hooks, Flecks} from '@flecks/core';
import {Flecks} from '@flecks/core';
export default {
[Hooks]: {
'@avocado/traits/persea.components': (
Flecks.provide(
require.context('./traits', false, /\.jsx$/),
{invoke: false},
)
),
},
export const hooks = {
'@avocado/traits/persea.components': (
Flecks.provide(
require.context('./traits', false, /\.jsx$/),
{invoke: false},
)
),
};

View File

@ -1,29 +1,26 @@
import {Hooks} from '@flecks/core';
import isElectron from 'is-electron';
const {
NODE_ENV,
} = process.env;
export default {
[Hooks]: {
'@flecks/electron/server.window': async (win) => {
// win.removeMenu();
if ('production' !== NODE_ENV) {
win.openDevTools();
}
win.maximize();
win.once('ready-to-show', () => {
win.show();
});
},
'@flecks/web/server.request.route': (flecks) => async (req, res, next) => {
if (isElectron() && 0 === req.user.id) {
const {User} = flecks.get('$flecks/db.models');
req.logIn(await User.findByPk(1), next);
return;
}
next();
},
export const hooks = {
'@flecks/electron/server.window': async (win) => {
// win.removeMenu();
if ('production' !== NODE_ENV) {
win.openDevTools();
}
win.maximize();
win.once('ready-to-show', () => {
win.show();
});
},
'@flecks/web/server.request.route': (flecks) => async (req, res, next) => {
if (isElectron() && 0 === req.user.id) {
const {User} = flecks.get('$flecks/db.models');
req.logIn(await User.findByPk(1), next);
return;
}
next();
},
};

View File

@ -1,7 +1,5 @@
import {Flecks, Hooks} from '@flecks/core';
import {Flecks} from '@flecks/core';
export default {
[Hooks]: {
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
},
export const hooks = {
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
};

View File

@ -1,12 +1,10 @@
import {Flecks, Hooks} from '@flecks/core';
import {Flecks} from '@flecks/core';
export default {
[Hooks]: {
'@avocado/traits/persea.components': (
Flecks.provide(
require.context('./traits', false, /\.jsx$/),
{invoke: false},
)
),
},
export const hooks = {
'@avocado/traits/persea.components': (
Flecks.provide(
require.context('./traits', false, /\.jsx$/),
{invoke: false},
)
),
};

View File

@ -1,16 +1,12 @@
import {join} from 'path';
import {Hooks} from '@flecks/core';
const {
FLECKS_CORE_ROOT = process.cwd(),
} = process.env;
export default {
[Hooks]: {
'@flecks/core.starting': (flecks) => {
const {browserWindowOptions} = flecks.get('@flecks/electron/server');
browserWindowOptions.icon = join(FLECKS_CORE_ROOT, 'icon.png');
},
export const hooks = {
'@flecks/core.starting': (flecks) => {
const {browserWindowOptions} = flecks.get('@flecks/electron/server');
browserWindowOptions.icon = join(FLECKS_CORE_ROOT, 'icon.png');
},
};

View File

@ -0,0 +1,46 @@
import {Vector} from '@avocado/math';
import {StateProperty, Trait} from '@avocado/traits';
import {compose} from '@flecks/core';
const decorate = compose(
StateProperty('mana', {
track: true,
}),
);
export default (flecks) => class Magical extends decorate(Trait) {
static defaultState() {
return {
mana: 0,
};
}
// eslint-disable-next-line class-methods-use-this
listeners() {
return {
mouseButtonDown: ({position}) => {
if (this.entity.is('Followed')) {
const offset = Vector.sub(
this.entity.position,
this.entity.camera.realOffset,
);
const {resolution} = flecks.get('@humus/app');
const scale = Vector.div(resolution, this.entity.camera.viewSize);
const scaledPosition = Vector.div(position, scale);
const relative = Vector.sub(scaledPosition, offset);
console.log(JSON.stringify({
offset,
position,
scale,
scaledPosition,
relative,
}, null, 2));
}
},
};
}
};

View File

@ -1,11 +1,9 @@
import {Flecks, Hooks} from '@flecks/core';
import {Flecks} from '@flecks/core';
export default {
[Hooks]: {
'@avocado/resource.resources.decorate': (
Flecks.decorate(require.context('./resources/decorators', false, /\.js$/))
),
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
'@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)),
},
export const hooks = {
'@avocado/resource.resources.decorate': (
Flecks.decorate(require.context('./resources/decorators', false, /\.js$/))
),
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
'@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)),
};

View File

@ -1,10 +1,8 @@
import {Hooks, Flecks} from '@flecks/core';
import {Flecks} from '@flecks/core';
export * from './hooks';
export default {
[Hooks]: {
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
'@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)),
},
export const hooks = {
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
'@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)),
};

View File

@ -1,9 +1,7 @@
import {Flecks, Hooks} from '@flecks/core';
import {Flecks} from '@flecks/core';
export default {
[Hooks]: {
'@avocado/resource.resources.decorate': (
Flecks.decorate(require.context('./resources/decorators', false, /\.js$/))
),
},
export const hooks = {
'@avocado/resource.resources.decorate': (
Flecks.decorate(require.context('./resources/decorators', false, /\.js$/))
),
};

View File

@ -1,20 +1,18 @@
import {Hooks, Flecks} from '@flecks/core';
import {Flecks} from '@flecks/core';
import {universes} from './state';
export * from './state';
export default {
[Hooks]: {
'@avocado/resource.resources': Flecks.provide(require.context('./resources', false, /\.js$/)),
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
'@flecks/core.config': () => ({
resource: 'resource',
universe: 'universe',
}),
'@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)),
'@flecks/redux.slices': () => ({
universes,
}),
},
export const hooks = {
'@avocado/resource.resources': Flecks.provide(require.context('./resources', false, /\.js$/)),
'@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)),
'@flecks/core.config': () => ({
resource: 'resource',
universe: 'universe',
}),
'@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)),
'@flecks/redux.slices': () => ({
universes,
}),
};

View File

@ -2,7 +2,7 @@ import {stat} from 'fs/promises';
import {resolve} from 'path';
import {Resource} from '@avocado/resource';
import {D, Flecks, Hooks} from '@flecks/core';
import {D, Flecks} from '@flecks/core';
import express from 'express';
import Universe from './universe';
@ -13,49 +13,47 @@ const {
const debug = D('@humus/universe/server');
export default {
[Hooks]: {
'@flecks/core.starting': async (flecks) => {
const {resource} = flecks.get('@humus/universe');
const stats = await stat(resource);
if (!stats.isDirectory()) {
throw new Error(`resource root ${resource} is not a directory`);
}
Resource.root = resource;
flecks.set('$humus/universe.resource-server', express.static(resource));
debug('resource root: %s', resource);
},
'@flecks/server.up': async (flecks) => {
const {universe: path} = flecks.get('@humus/universe');
try {
const universe = await Universe.loadFrom(flecks, resolve(FLECKS_CORE_ROOT, path));
flecks.set('$humus/universe.universe', universe);
universe.start();
debug('universe up and running!');
}
catch (error) {
throw new Error(`couldn't run universe: ${error.stack}`);
}
},
'@flecks/web/server.request.socket': (flecks) => (req, res, next) => {
if (req.url.startsWith('/resource')) {
req.url = req.url.slice('/resource'.length);
flecks.get('$humus/universe.resource-server')(req, res, next);
return;
}
next();
},
'@flecks/socket.packets.decorate': (
Flecks.decorate(require.context('./packets/decorators', false, /\.js$/))
),
'@flecks/socket/server.request.socket': (flecks) => async ({handshake}, next) => {
const {universe} = flecks.get('$humus/universe');
const {user} = handshake;
if (0 !== user.id) {
// eslint-disable-next-line no-param-reassign
handshake.entity = await universe.loadOrCreateEntity(user);
}
next();
},
export const hooks = {
'@flecks/core.starting': async (flecks) => {
const {resource} = flecks.get('@humus/universe');
const stats = await stat(resource);
if (!stats.isDirectory()) {
throw new Error(`resource root ${resource} is not a directory`);
}
Resource.root = resource;
flecks.set('$humus/universe.resource-server', express.static(resource));
debug('resource root: %s', resource);
},
'@flecks/server.up': async (flecks) => {
const {universe: path} = flecks.get('@humus/universe');
try {
const universe = await Universe.loadFrom(flecks, resolve(FLECKS_CORE_ROOT, path));
flecks.set('$humus/universe.universe', universe);
universe.start();
debug('universe up and running!');
}
catch (error) {
throw new Error(`couldn't run universe: ${error.stack}`);
}
},
'@flecks/web/server.request.socket': (flecks) => (req, res, next) => {
if (req.url.startsWith('/resource')) {
req.url = req.url.slice('/resource'.length);
flecks.get('$humus/universe.resource-server')(req, res, next);
return;
}
next();
},
'@flecks/socket.packets.decorate': (
Flecks.decorate(require.context('./packets/decorators', false, /\.js$/))
),
'@flecks/socket/server.request.socket': (flecks) => async ({handshake}, next) => {
const {universe} = flecks.get('$humus/universe');
const {user} = handshake;
if (0 !== user.id) {
// eslint-disable-next-line no-param-reassign
handshake.entity = await universe.loadOrCreateEntity(user);
}
next();
},
};