break rollUtils into multiple files

This commit is contained in:
Ean Milligan 2025-05-01 23:41:23 -04:00
parent 730c441645
commit 2b579eb4ac
16 changed files with 125 additions and 111 deletions

View File

@ -1,11 +1,9 @@
import { closeLog, initLog } from '@Log4Deno'; import { closeLog, initLog } from '@Log4Deno';
import { DEBUG } from '~flags';
import { parseRoll } from 'artigen/parser.ts'; import { parseRoll } from 'artigen/parser.ts';
import { loggingEnabled } from 'artigen/rollUtils.ts'; import { loggingEnabled } from 'artigen/utils/logFlag.ts';
loggingEnabled && initLog('logs/worker', DEBUG); loggingEnabled && initLog('logs/worker', loggingEnabled);
// Alert rollQueue that this worker is ready // Alert rollQueue that this worker is ready
self.postMessage('ready'); self.postMessage('ready');

View File

@ -4,13 +4,14 @@ import { log, LogTypes as LT } from '@Log4Deno';
import config from '~config'; import config from '~config';
import { DEVMODE } from '~flags'; import { DEVMODE } from '~flags';
import { loggingEnabled } from 'artigen/rollUtils.ts';
import { SolvedRoll } from 'artigen/solver.d.ts'; import { SolvedRoll } from 'artigen/solver.d.ts';
import { removeWorker } from 'artigen/managers/countManager.ts'; import { removeWorker } from 'artigen/managers/countManager.ts';
import { QueuedRoll } from 'artigen/managers/manager.d.ts'; import { QueuedRoll } from 'artigen/managers/manager.d.ts';
import { loggingEnabled } from 'artigen/utils/logFlag.ts';
import dbClient from 'db/client.ts'; import dbClient from 'db/client.ts';
import { queries } from 'db/common.ts'; import { queries } from 'db/common.ts';
import stdResp from 'endpoints/stdResponses.ts'; import stdResp from 'endpoints/stdResponses.ts';

View File

@ -1,9 +1,9 @@
import { log, LogTypes as LT } from '@Log4Deno'; import { log, LogTypes as LT } from '@Log4Deno';
import { loggingEnabled } from 'artigen/rollUtils.ts';
import { QueuedRoll } from 'artigen/managers/manager.d.ts'; import { QueuedRoll } from 'artigen/managers/manager.d.ts';
import { loggingEnabled } from 'artigen/utils/logFlag.ts';
export const onWorkerReady = (rollWorker: Worker, rollRequest: QueuedRoll) => { export const onWorkerReady = (rollWorker: Worker, rollRequest: QueuedRoll) => {
loggingEnabled && log(LT.LOG, `Sending roll to worker: ${rollRequest.rollCmd}, ${JSON.stringify(rollRequest.modifiers)}`); loggingEnabled && log(LT.LOG, `Sending roll to worker: ${rollRequest.rollCmd}, ${JSON.stringify(rollRequest.modifiers)}`);
rollWorker.postMessage({ rollWorker.postMessage({

View File

@ -10,7 +10,7 @@ import { terminateWorker } from 'artigen/managers/handler/workerTerminate.ts';
export const handleRollRequest = (rollRequest: QueuedRoll) => { export const handleRollRequest = (rollRequest: QueuedRoll) => {
// Handle setting up and calling the rollWorker // Handle setting up and calling the rollWorker
addWorker(); addWorker();
const rollWorker = new Worker(new URL('../rollWorker.ts', import.meta.url).href, { type: 'module' }); const rollWorker = new Worker(new URL('./artigenWorker.ts', import.meta.url).href, { type: 'module' });
const workerTimeout = setTimeout(() => terminateWorker(rollWorker, rollRequest), config.limits.workerTimeout); const workerTimeout = setTimeout(() => terminateWorker(rollWorker, rollRequest), config.limits.workerTimeout);
// Handle events from the worker // Handle events from the worker

View File

@ -3,10 +3,14 @@ import { log, LogTypes as LT } from '@Log4Deno';
import config from '~config'; import config from '~config';
import { formatRoll } from 'artigen/rollFormatter.ts'; import { formatRoll } from 'artigen/rollFormatter.ts';
import { compareTotalRolls, compareTotalRollsReverse, escapeCharacters, legalMathOperators, loggingEnabled } from 'artigen/rollUtils.ts';
import { fullSolver } from 'artigen/solver.ts'; import { fullSolver } from 'artigen/solver.ts';
import { CountDetails, ReturnData, SolvedRoll, SolvedStep } from 'artigen/solver.d.ts'; import { CountDetails, ReturnData, SolvedRoll, SolvedStep } from 'artigen/solver.d.ts';
import { escapeCharacters } from 'artigen/utils/escape.ts';
import { legalMathOperators } from 'artigen/utils/legalMath.ts';
import { loggingEnabled } from 'artigen/utils/logFlag.ts';
import { compareTotalRolls, compareTotalRollsReverse } from 'artigen/utils/sortFuncs.ts';
import { RollModifiers } from 'src/mod.d.ts'; import { RollModifiers } from 'src/mod.d.ts';
// parseRoll(fullCmd, modifiers) // parseRoll(fullCmd, modifiers)
@ -34,7 +38,7 @@ export const parseRoll = (fullCmd: string, modifiers: RollModifiers): SolvedRoll
try { try {
// Split the fullCmd by the command prefix to allow every roll/math op to be handled individually // Split the fullCmd by the command prefix to allow every roll/math op to be handled individually
const sepRolls = fullCmd.split(config.prefix); const sepRolls = fullCmd.split(config.prefix);
// TODO: HERE for the [[ ]] nesting stuff // TODO(@burn-e99): HERE for the [[ ]] nesting stuff
const tempReturnData: ReturnData[] = []; const tempReturnData: ReturnData[] = [];
const tempCountDetails: CountDetails[] = [ const tempCountDetails: CountDetails[] = [

View File

@ -1,11 +1,12 @@
import { log, LogTypes as LT } from '@Log4Deno'; import { log, LogTypes as LT } from '@Log4Deno';
import { rollCounter } from 'artigen/counter.ts'; import { rollCounter } from './utils/counter.ts';
import { RollModifiers } from 'src/mod.d.ts'; import { RollModifiers } from 'src/mod.d.ts';
import { roll } from 'artigen/roller.ts'; import { roll } from 'artigen/roller.ts';
import { loggingEnabled } from 'artigen/rollUtils.ts';
import { RollFormat } from 'artigen/solver.d.ts'; import { RollFormat } from 'artigen/solver.d.ts';
import { loggingEnabled } from 'artigen/utils/logFlag.ts';
// formatRoll(rollConf, modifiers) returns one SolvedStep // formatRoll(rollConf, modifiers) returns one SolvedStep
// formatRoll handles creating and formatting the completed rolls into the SolvedStep format // formatRoll handles creating and formatting the completed rolls into the SolvedStep format
export const formatRoll = (rollConf: string, modifiers: RollModifiers): RollFormat => { export const formatRoll = (rollConf: string, modifiers: RollModifiers): RollFormat => {

View File

@ -1,96 +0,0 @@
import { log, LogTypes as LT } from '@Log4Deno';
import { RollModifiers } from 'src/mod.d.ts';
import { DPercentConf, ReturnData, RollSet } from 'artigen/solver.d.ts';
type MathFunction = (arg: number) => number;
export const loggingEnabled = false;
export const legalMath: MathFunction[] = [];
(Object.getOwnPropertyNames(Math) as (keyof Math)[]).forEach((propName) => {
const mathProp = Math[propName];
if (typeof mathProp === 'function' && mathProp.length === 1) {
legalMath.push(mathProp as MathFunction);
}
});
export const legalMathOperators = legalMath.map((oper) => oper.name);
// genRoll(size) returns number
// genRoll rolls a die of size size and returns the result
export const genRoll = (size: number, modifiers: RollModifiers, dPercent: DPercentConf): number => {
let result;
if (modifiers.maxRoll) {
result = size;
} else if (modifiers.minRoll) {
result = 1;
} else {
// Math.random * size will return a decimal number between 0 and size (excluding size), so add 1 and floor the result to not get 0 as a result
result = modifiers.nominalRoll ? size / 2 + 0.5 : Math.floor(Math.random() * size + 1);
}
return dPercent.on ? (result - 1) * dPercent.sizeAdjustment : result;
};
// genFateRoll returns -1|0|1
// genFateRoll turns a d6 into a fate die, with sides: -1, -1, 0, 0, 1, 1
export const genFateRoll = (modifiers: RollModifiers): number => {
if (modifiers.nominalRoll) {
return 0;
} else {
const sides = [-1, -1, 0, 0, 1, 1];
return sides[genRoll(6, modifiers, <DPercentConf> { on: false }) - 1];
}
};
// compareRolls(a, b) returns -1|0|1
// compareRolls is used to order an array of RollSets by RollSet.roll
export const compareRolls = (a: RollSet, b: RollSet): number => {
if (a.roll < b.roll) {
return -1;
}
if (a.roll > b.roll) {
return 1;
}
return 0;
};
const internalCompareTotalRolls = (a: ReturnData, b: ReturnData, dir: 1 | -1): number => {
if (a.rollTotal < b.rollTotal) {
return -1 * dir;
}
if (a.rollTotal > b.rollTotal) {
return 1 * dir;
}
return 0;
};
// compareTotalRolls(a, b) returns -1|0|1
// compareTotalRolls is used to order an array of RollSets by RollSet.roll
export const compareTotalRolls = (a: ReturnData, b: ReturnData): number => internalCompareTotalRolls(a, b, 1);
// compareTotalRollsReverse(a, b) returns 1|0|-1
// compareTotalRollsReverse is used to order an array of RollSets by RollSet.roll reversed
export const compareTotalRollsReverse = (a: ReturnData, b: ReturnData): number => internalCompareTotalRolls(a, b, -1);
// compareRolls(a, b) returns -1|0|1
// compareRolls is used to order an array of RollSets by RollSet.origIdx
export const compareOrigIdx = (a: RollSet, b: RollSet): number => {
if (a.origIdx < b.origIdx) {
return -1;
}
if (a.origIdx > b.origIdx) {
return 1;
}
return 0;
};
// escapeCharacters(str, esc) returns str
// escapeCharacters escapes all characters listed in esc
export const escapeCharacters = (str: string, esc: string): string => {
// Loop thru each esc char one at a time
for (const e of esc) {
loggingEnabled && log(LT.LOG, `Escaping character ${e} | ${str}, ${esc}`);
// Create a new regex to look for that char that needs replaced and escape it
const tempRgx = new RegExp(`[${e}]`, 'g');
str = str.replace(tempRgx, `\\${e}`);
}
return str;
};

View File

@ -2,9 +2,12 @@ import { log, LogTypes as LT } from '@Log4Deno';
import config from '~config'; import config from '~config';
import { compareOrigIdx, compareRolls, genFateRoll, genRoll, loggingEnabled } from 'artigen/rollUtils.ts';
import { RollConf, RollSet, RollType } from 'artigen/solver.d.ts'; import { RollConf, RollSet, RollType } from 'artigen/solver.d.ts';
import { genFateRoll, genRoll } from 'artigen/utils/generateRoll.ts';
import { loggingEnabled } from 'artigen/utils/logFlag.ts';
import { compareOrigIdx, compareRolls } from 'artigen/utils/sortFuncs.ts';
import { RollModifiers } from 'src/mod.d.ts'; import { RollModifiers } from 'src/mod.d.ts';
// Call with loopCountCheck(++loopCount); // Call with loopCountCheck(++loopCount);

View File

@ -6,7 +6,9 @@
import { log, LogTypes as LT } from '@Log4Deno'; import { log, LogTypes as LT } from '@Log4Deno';
import { SolvedStep } from 'artigen/solver.d.ts'; import { SolvedStep } from 'artigen/solver.d.ts';
import { legalMath, legalMathOperators, loggingEnabled } from 'artigen/rollUtils.ts';
import { legalMath, legalMathOperators } from 'artigen/utils/legalMath.ts';
import { loggingEnabled } from 'artigen/utils/logFlag.ts';
// fullSolver(conf, wrapDetails) returns one condensed SolvedStep // fullSolver(conf, wrapDetails) returns one condensed SolvedStep
// fullSolver is a function that recursively solves the full roll and math // fullSolver is a function that recursively solves the full roll and math

View File

@ -0,0 +1,16 @@
import { log, LogTypes as LT } from '@Log4Deno';
import { loggingEnabled } from 'artigen/utils/logFlag.ts';
// escapeCharacters(str, esc) returns str
// escapeCharacters escapes all characters listed in esc
export const escapeCharacters = (str: string, esc: string): string => {
// Loop thru each esc char one at a time
for (const e of esc) {
loggingEnabled && log(LT.LOG, `Escaping character ${e} | ${str}, ${esc}`);
// Create a new regex to look for that char that needs replaced and escape it
const tempRgx = new RegExp(`[${e}]`, 'g');
str = str.replace(tempRgx, `\\${e}`);
}
return str;
};

View File

@ -0,0 +1,29 @@
import { RollModifiers } from 'src/mod.d.ts';
import { DPercentConf } from 'artigen/solver.d.ts';
// genRoll(size) returns number
// genRoll rolls a die of size size and returns the result
export const genRoll = (size: number, modifiers: RollModifiers, dPercent: DPercentConf): number => {
let result;
if (modifiers.maxRoll) {
result = size;
} else if (modifiers.minRoll) {
result = 1;
} else {
// Math.random * size will return a decimal number between 0 and size (excluding size), so add 1 and floor the result to not get 0 as a result
result = modifiers.nominalRoll ? size / 2 + 0.5 : Math.floor(Math.random() * size + 1);
}
return dPercent.on ? (result - 1) * dPercent.sizeAdjustment : result;
};
// genFateRoll returns -1|0|1
// genFateRoll turns a d6 into a fate die, with sides: -1, -1, 0, 0, 1, 1
export const genFateRoll = (modifiers: RollModifiers): number => {
if (modifiers.nominalRoll) {
return 0;
} else {
const sides = [-1, -1, 0, 0, 1, 1];
return sides[genRoll(6, modifiers, <DPercentConf> { on: false }) - 1];
}
};

View File

@ -0,0 +1,11 @@
type MathFunction = (arg: number) => number;
export const legalMath: MathFunction[] = [];
(Object.getOwnPropertyNames(Math) as (keyof Math)[]).forEach((propName) => {
const mathProp = Math[propName];
if (typeof mathProp === 'function' && mathProp.length === 1) {
legalMath.push(mathProp as MathFunction);
}
});
export const legalMathOperators = legalMath.map((oper) => oper.name);

View File

@ -0,0 +1 @@
export const loggingEnabled = false;

View File

@ -0,0 +1,43 @@
import { ReturnData, RollSet } from 'src/artigen/solver.d.ts';
// compareRolls(a, b) returns -1|0|1
// compareRolls is used to order an array of RollSets by RollSet.roll
export const compareRolls = (a: RollSet, b: RollSet): number => {
if (a.roll < b.roll) {
return -1;
}
if (a.roll > b.roll) {
return 1;
}
return 0;
};
const internalCompareTotalRolls = (a: ReturnData, b: ReturnData, dir: 1 | -1): number => {
if (a.rollTotal < b.rollTotal) {
return -1 * dir;
}
if (a.rollTotal > b.rollTotal) {
return 1 * dir;
}
return 0;
};
// compareTotalRolls(a, b) returns -1|0|1
// compareTotalRolls is used to order an array of RollSets by RollSet.roll
export const compareTotalRolls = (a: ReturnData, b: ReturnData): number => internalCompareTotalRolls(a, b, 1);
// compareTotalRollsReverse(a, b) returns 1|0|-1
// compareTotalRollsReverse is used to order an array of RollSets by RollSet.roll reversed
export const compareTotalRollsReverse = (a: ReturnData, b: ReturnData): number => internalCompareTotalRolls(a, b, -1);
// compareRolls(a, b) returns -1|0|1
// compareRolls is used to order an array of RollSets by RollSet.origIdx
export const compareOrigIdx = (a: RollSet, b: RollSet): number => {
if (a.origIdx < b.origIdx) {
return -1;
}
if (a.origIdx > b.origIdx) {
return 1;
}
return 0;
};

View File

@ -2,9 +2,10 @@ import { log, LogTypes as LT } from '@Log4Deno';
import config from '~config'; import config from '~config';
import { loggingEnabled } from 'artigen/rollUtils.ts';
import { CountDetails, SolvedRoll } from 'artigen/solver.d.ts'; import { CountDetails, SolvedRoll } from 'artigen/solver.d.ts';
import { loggingEnabled } from 'artigen/utils/logFlag.ts';
import { RollModifiers } from 'src/mod.d.ts'; import { RollModifiers } from 'src/mod.d.ts';
export const failColor = 0xe71212; export const failColor = 0xe71212;