Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor: replace config.json with dotenv, pass config down from entry point #171

Merged
merged 5 commits into from
Feb 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ It uses Eris to talk to Discord and PostgreSQL for persistence.
CHALLONGE_USERNAME=
CHALLONGE_TOKEN=
OCTOKIT_TOKEN=
EMCEE_DEFAULT_PREFIX=mc!
EMCEE_DEFAULT_TO_ROLE=MC-TO
```

- Outside Docker:
Expand All @@ -48,6 +50,8 @@ It uses Eris to talk to Discord and PostgreSQL for persistence.
CHALLONGE_USERNAME=
CHALLONGE_TOKEN=
OCTOKIT_TOKEN=
EMCEE_DEFAULT_PREFIX=mc!
EMCEE_DEFAULT_TO_ROLE=MC-TO
```

1. Start Emcee.
Expand Down
2 changes: 2 additions & 0 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ services:
OCTOKIT_TOKEN: "${OCTOKIT_TOKEN}"
CHALLONGE_USERNAME: "${CHALLONGE_USERNAME}"
CHALLONGE_TOKEN: "${CHALLONGE_TOKEN}"
EMCEE_DEFAULT_PREFIX: "${EMCEE_DEFAULT_PREFIX}"
EMCEE_DEFAULT_TO_ROLE: "${EMCEE_DEFAULT_TO_ROLE}"
POSTGRESQL_URL: "postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres/${POSTGRES_DB}"
DEBUG: "emcee:*"
volumes:
Expand Down
7 changes: 0 additions & 7 deletions src/config/config.json

This file was deleted.

15 changes: 0 additions & 15 deletions src/config/env.ts

This file was deleted.

23 changes: 23 additions & 0 deletions src/config/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import dotenv from "dotenv";
dotenv.config();

function assertEnv(envvar: string): string {
if (process.env[envvar] === undefined) {
throw new Error(`Missing environment variable ${envvar}`);
}
// For some reason with indexed access, the cast is needed despite the if check
return process.env[envvar] as string;
}

// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/explicit-function-return-type
export function getConfig() {
return {
challongeUsername: assertEnv("CHALLONGE_USERNAME"),
challongeToken: assertEnv("CHALLONGE_TOKEN"),
defaultPrefix: assertEnv("EMCEE_DEFAULT_PREFIX"),
defaultTORole: assertEnv("EMCEE_DEFAULT_TO_ROLE"),
discordToken: assertEnv("DISCORD_TOKEN"),
octokitToken: assertEnv("OCTOKIT_TOKEN"),
postgresqlUrl: assertEnv("POSTGRESQL_URL")
};
}
7 changes: 3 additions & 4 deletions src/deck/deck.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,11 @@ import { Card, CardArray, Deck } from "ydeck";
import { Card as DataCard, YgoData } from "ygopro-data";
import cardOpts from "../config/cardOpts.json";
import dataOpts from "../config/dataOpts.json";
import { octokitToken } from "../config/env";
import transOpts from "../config/transOpts.json";
import { getLogger } from "../util/logger";

const logger = getLogger("deck");

const data = new YgoData(cardOpts, transOpts, dataOpts, "./dbs", octokitToken);

let cardArray: CardArray | undefined;

async function convertCard(card: DataCard): Promise<Card> {
Expand All @@ -34,8 +31,10 @@ async function convertCard(card: DataCard): Promise<Card> {
return new Card(card.text.en.name, card.data.ot, card.data.type, card.data.setcode, statusMap);
}

export async function initializeCardArray(): Promise<void> {
export async function initializeCardArray(octokitToken: string): Promise<void> {
if (!cardArray) {
logger.info("ygo-data preload for ydeck starting");
const data = new YgoData(cardOpts, transOpts, dataOpts, "./dbs", octokitToken);
const dataArray = await data.getCardList();
cardArray = {};
for (const code in dataArray) {
Expand Down
17 changes: 8 additions & 9 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { Client } from "eris";
import { prefix, toRole } from "./config/config.json";
import { challongeToken, challongeUsername, discordToken, postgresqlUrl } from "./config/env";
import { getConfig } from "./config"; // Must be imported first among first-party modules
import { initializeDatabase } from "./database/postgres";
import { initializeCardArray } from "./deck/deck";
import { DiscordWrapperEris } from "./discord/eris";
Expand All @@ -18,23 +17,23 @@ import { WebsiteInterface } from "./website/interface";
const logger = getLogger("index");

(async () => {
const database = await initializeDatabase(postgresqlUrl);

await initializeCardArray();
const config = getConfig();
const database = await initializeDatabase(config.postgresqlUrl);
await initializeCardArray(config.octokitToken);

const templater = new Templater();
const guides = await templater.load("guides");
logger.info(`Loaded ${guides} templates from "guides".`);

const challonge = new WebsiteWrapperChallonge(challongeUsername, challongeToken);
const challonge = new WebsiteWrapperChallonge(config.challongeUsername, config.challongeToken);
const website = new WebsiteInterface(challonge);

const bot = new Client(discordToken, {
const bot = new Client(config.discordToken, {
restMode: true
});
const eris = new DiscordWrapperEris(bot);
const discord = new DiscordInterface(eris);
const organiserRole = new OrganiserRoleProvider(toRole, 0x3498db);
const organiserRole = new OrganiserRoleProvider(config.defaultTORole, 0x3498db);
const participantRole = new ParticipantRoleProvider(bot, 0xe67e22);
const delegate: PersistentTimerDiscordDelegate = {
sendMessage: async (...args) => (await bot.createMessage(...args)).id,
Expand All @@ -44,7 +43,7 @@ const logger = getLogger("index");
create: async (...args) => await PersistentTimer.create(delegate, ...args),
loadAll: async () => await PersistentTimer.loadAll(delegate)
});
registerEvents(bot, prefix, { discord, tournamentManager, organiserRole }, database, website);
registerEvents(bot, config.defaultPrefix, { discord, tournamentManager, organiserRole }, database, website);
discord.onDelete(msg => tournamentManager.cleanRegistration(msg));

let firstReady = true;
Expand Down
4 changes: 3 additions & 1 deletion test/commands/deck.unit.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import { expect } from "chai";
import dotenv from "dotenv";
import { User } from "eris";
import sinon from "sinon";
import command from "../../src/commands/deck";
import { initializeCardArray } from "../../src/deck/deck";
import { itRejectsNonHosts, mockBotClient, msg, support } from "./common";

dotenv.config();
describe("command:deck", function () {
before(initializeCardArray);
before(() => initializeCardArray(process.env.OCTOKIT_TOKEN!));
itRejectsNonHosts(support, command, msg, ["name"]);
it("requires a mentioned user", async () => {
msg.mentions = [];
Expand Down
5 changes: 4 additions & 1 deletion test/commands/dump.unit.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import { expect } from "chai";
import dotenv from "dotenv";
import { SinonSandbox } from "sinon";
import command from "../../src/commands/dump";
import { initializeCardArray } from "../../src/deck/deck";
import { itRejectsNonHosts, msg, support, test } from "./common";

dotenv.config();
describe("command:dump", function () {
const args = ["battlecity"];
before(initializeCardArray);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
before(() => initializeCardArray(process.env.OCTOKIT_TOKEN!));
itRejectsNonHosts(support, command, msg, ["name"]);
it(
"provides a dump of all decks",
Expand Down
5 changes: 4 additions & 1 deletion test/commands/pie.unit.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import { expect } from "chai";
import dotenv from "dotenv";
import { SinonSandbox } from "sinon";
import command from "../../src/commands/pie";
import { initializeCardArray } from "../../src/deck/deck";
import { itRejectsNonHosts, msg, support, test } from "./common";

dotenv.config();
describe("command:pie", function () {
const args = ["battlecity"];
before(initializeCardArray);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
before(() => initializeCardArray(process.env.OCTOKIT_TOKEN!));
itRejectsNonHosts(support, command, msg, ["name"]);
it(
"provides a dump of all themes",
Expand Down
5 changes: 4 additions & 1 deletion test/commands/players.unit.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import { expect } from "chai";
import dotenv from "dotenv";
import { SinonSandbox } from "sinon";
import command from "../../src/commands/players";
import { initializeCardArray } from "../../src/deck/deck";
import { itRejectsNonHosts, msg, support, test } from "./common";

dotenv.config();
describe("command:players", function () {
const args = ["battlecity"];
before(initializeCardArray);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
before(() => initializeCardArray(process.env.OCTOKIT_TOKEN!));
itRejectsNonHosts(support, command, msg, ["name"]);
it(
"provides a dump of all players",
Expand Down
4 changes: 3 additions & 1 deletion test/tournamentManager.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import chai, { expect } from "chai";
import chaiAsPromised from "chai-as-promised";
import dotenv from "dotenv";
import { Client } from "eris";
import * as fs from "fs/promises";
import sinon from "sinon";
Expand All @@ -15,6 +16,7 @@ import { DatabaseWrapperMock } from "./mocks/database";
import { DiscordWrapperMock } from "./mocks/discord";
import { WebsiteWrapperMock } from "./mocks/website";

dotenv.config();
chai.use(chaiAsPromised);
chai.use(sinonChai);

Expand Down Expand Up @@ -45,7 +47,7 @@ const delegate = {
const tournament = new TournamentManager(mockDiscord, mockDb, mockWebsite, templater, participantRole, delegate);

before(async () => {
await initializeCardArray();
await initializeCardArray(process.env.OCTOKIT_TOKEN!);
await templater.load("guides");
});

Expand Down