Browse Source

Move DB code to a separate library

ghorsington 4 years ago
parent
commit
ac37981d18

+ 1 - 0
.dockerignore

@@ -1,6 +1,7 @@
 **/node_modules
 **/npm-debug.log
 **/Dockerfile*
+data/
 bot/build
 docker-compose*
 .dockerignore

+ 1 - 0
.gitignore

@@ -1,5 +1,6 @@
 build/
 data/
+lib/
 
 *.sqlite
 *.env

+ 6 - 0
Makefile

@@ -1,4 +1,10 @@
 
+build_db:
+	cd db && npm run build
+
+build_bot: build_db
+	cd bot && npm run build
+
 build:
 	docker-compose build
 

+ 17 - 5
bot/Dockerfile

@@ -61,21 +61,33 @@ RUN apk --no-cache add python make g++
 COPY --from=opencv-builder /opencv/opencv-${OPENCV_VERSION}/build/lib/libopencv* /usr/local/lib/
 COPY --from=opencv-builder /usr/local/include/opencv2 /usr/local/include/opencv2
 COPY --from=opencv-builder /usr/local/share/OpenCV /usr/local/share/OpenCV
-COPY package.json ./
+COPY ./bot/package.json ./
+RUN npm install
+
+WORKDIR /db/
+COPY ./db/package.json .
 RUN npm install
 
 FROM node:10-alpine
 
 ARG OPENCV_VERSION
-WORKDIR /app/noctbot
+WORKDIR /app
+
+RUN apk --no-cache add make
 
-COPY --from=builder node_modules node_modules
+COPY --from=builder node_modules bot/node_modules
+COPY --from=builder /db/node_modules db/node_modules
 COPY --from=opencv-builder /opencv/opencv-${OPENCV_VERSION}/build/lib/libopencv* /usr/local/lib/
 COPY --from=opencv-builder /usr/local/include/opencv2 /usr/local/include/opencv2
 COPY --from=opencv-builder /usr/local/share/OpenCV /usr/local/share/OpenCV
-COPY . .
 
-RUN npm run build
+COPY ./bot bot
+COPY ./db db
+COPY ./Makefile Makefile
+
+RUN make build_bot
+
+WORKDIR /app/bot
 
 EXPOSE 3000
 CMD npm run start

+ 4 - 0
bot/package.json

@@ -21,6 +21,9 @@
    ],
    "author": "Geoffrey Horsington <geoffrey.hoooooorse@gmail.com>",
    "license": "MIT",
+   "_moduleAliases": {
+      "@db": "../db/lib/src"
+   },
    "dependencies": {
       "@bbob/html": "^2.5.2",
       "@bbob/preset-html5": "^2.5.2",
@@ -36,6 +39,7 @@
       "interval-promise": "^1.2.0",
       "jimp": "^0.5.4",
       "lowdb": "^1.0.0",
+      "module-alias": "^2.2.0",
       "node-html-parser": "^1.1.16",
       "opencv4nodejs": "^4.9.0",
       "pg": "^7.11.0",

+ 1 - 1
bot/src/commands/aggregators/com3d2_updates.ts

@@ -3,7 +3,7 @@ import request from "request-promise-native";
 import { Response } from "request";
 import { IAggregator, INewsItem } from "./aggregator";
 import { getRepository } from "typeorm";
-import { AggroNewsItem } from "../../entity/AggroNewsItem";
+import { AggroNewsItem } from "@db/entity/AggroNewsItem";
 
 const updatePage = "http://com3d2.jp/update/";
 const changeLogPattern = /\[\s*([^\s\]]+)\s*\]\s*((・.*)\s+)+/gim;

+ 1 - 1
bot/src/commands/aggregators/com3d2_world.ts

@@ -3,7 +3,7 @@ import request from "request-promise-native";
 import { Response } from "request";
 import { INewsItem, IAggregator } from "./aggregator";
 import { getRepository } from "typeorm";
-import { AggroNewsItem } from "../../entity/AggroNewsItem";
+import { AggroNewsItem } from "@db/entity/AggroNewsItem";
 
 const kissDiaryRoot = "https://com3d2.world/r18/notices.php";
 const FEED_NAME = "com3d2-world-notices";

+ 1 - 1
bot/src/commands/aggregators/kiss_diary.ts

@@ -3,7 +3,7 @@ import request from "request-promise-native";
 import { Response } from "request";
 import { INewsItem, IAggregator } from "./aggregator";
 import { getRepository } from "typeorm";
-import { AggroNewsItem } from "../../entity/AggroNewsItem";
+import { AggroNewsItem } from "@db/entity/AggroNewsItem";
 
 const urlPattern = /diary\.php\?no=(\d+)/i;
 const kissDiaryRoot = "http://www.kisskiss.tv/kiss";

+ 1 - 1
bot/src/commands/dead_chat.ts

@@ -1,6 +1,6 @@
 import { ICommand } from "./command";
 import { getRepository } from "typeorm";
-import { DeadChatReply } from "../entity/DeadChatReply";
+import { DeadChatReply } from "@db/entity/DeadChatReply";
 
 const triggers = [
     "dead server",

+ 2 - 2
bot/src/commands/facemorph.ts

@@ -7,8 +7,8 @@ import request from "request-promise-native";
 import { ICommand } from "./command";
 import { Message } from "discord.js";
 import { getRepository } from "typeorm";
-import { FaceCaptionMessage, FaceCaptionType } from "../entity/FaceCaptionMessage";
-import { KnownChannel } from "../entity/KnownChannel";
+import { FaceCaptionMessage, FaceCaptionType } from "@db/entity/FaceCaptionMessage";
+import { KnownChannel } from "@db/entity/KnownChannel";
 
 const EMOTE_GUILD = "505333548694241281";
 

+ 3 - 3
bot/src/commands/forums_news_checker.ts

@@ -7,9 +7,9 @@ import { ICommand } from "./command";
 import { TextChannel, Message, ReactionCollector, MessageReaction, Collector, User, Channel } from "discord.js";
 import { Dict } from "../util";
 import { getRepository, Not, IsNull } from "typeorm";
-import { PostedForumNewsItem } from "../entity/PostedForumsNewsItem";
-import { KnownChannel } from "../entity/KnownChannel";
-import { PostVerifyMessage } from "../entity/PostVerifyMessage";
+import { PostedForumNewsItem } from "@db/entity/PostedForumsNewsItem";
+import { KnownChannel } from "@db/entity/KnownChannel";
+import { PostVerifyMessage } from "@db/entity/PostVerifyMessage";
 import bbobHTML from '@bbob/html'
 import presetHTML5 from '@bbob/preset-html5'
 

+ 1 - 1
bot/src/commands/guide.ts

@@ -2,7 +2,7 @@ import { isAuthorisedAsync } from "../util";
 import { ICommand } from "./command";
 import { Message } from "discord.js";
 import { getRepository } from "typeorm";
-import { Guide, GuideType, GuideKeyword } from "../entity/Guide";
+import { Guide, GuideType, GuideKeyword } from "@db/entity/Guide";
 
 const makePattern = /^make (\w+)\s+name:(.+)\s*keywords:(.+)\s*contents:((.*[\n\r]*)+)$/i;
 const deletePattern = /^delete (\w+)\s+(.+)$/i;

+ 2 - 2
bot/src/commands/news_aggregator.ts

@@ -9,8 +9,8 @@ import { IAggregator, NewsPostItem, INewsPostData } from "./aggregators/aggregat
 import { ICommand } from "./command";
 import { RichEmbed, TextChannel, Message, Channel } from "discord.js";
 import { getRepository } from "typeorm";
-import { KnownChannel } from "../entity/KnownChannel";
-import { AggroNewsItem } from "../entity/AggroNewsItem";
+import { KnownChannel } from "@db/entity/KnownChannel";
+import { AggroNewsItem } from "@db/entity/AggroNewsItem";
 
 const UPDATE_INTERVAL = 5;
 const MAX_PREVIEW_LENGTH = 300; 

+ 1 - 1
bot/src/commands/quote.ts

@@ -1,7 +1,7 @@
 import { isAuthorisedAsync } from "../util";
 import { ICommand } from "./command";
 import { getRepository } from "typeorm";
-import { Quote } from "../entity/Quote";
+import { Quote } from "@db/entity/Quote";
 
 const quotePattern = /add quote by "([^"]+)"\s*(.*)/i;
 

+ 3 - 3
bot/src/commands/react.ts

@@ -1,9 +1,9 @@
 import { client } from "../client";
 import { ICommand } from "./command";
 import { getRepository } from "typeorm";
-import { MessageReaction } from "../entity/MessageReaction";
-import { KnownUser } from "../entity/KnownUser";
-import { ReactionType, ReactionEmote } from "../entity/ReactionEmote";
+import { MessageReaction } from "@db/entity/MessageReaction";
+import { KnownUser } from "@db/entity/KnownUser";
+import { ReactionType, ReactionEmote } from "@db/entity/ReactionEmote";
 import { isAuthorisedAsync } from "../util";
 
 const pattern = /^react to\s+"([^"]+)"\s+with\s+\<:[^:]+:([^\>]+)\>$/i;

+ 9 - 9
bot/src/lowdb_migrator.ts

@@ -1,15 +1,15 @@
 import { existsSync, readFileSync, renameSync } from "fs";
-import { ReactionType, ReactionEmote } from "./entity/ReactionEmote";
 import { getRepository, Repository } from "typeorm";
-import { KnownUser, User, UserRole } from "./entity/KnownUser";
 import { Dictionary } from "lodash";
-import { Guide, GuideKeyword, GuideType } from "./entity/Guide";
-import { Quote } from "./entity/Quote";
-import { MessageReaction } from "./entity/MessageReaction";
-import { FaceCaptionMessage, FaceCaptionType } from "./entity/FaceCaptionMessage";
-import { PostedForumNewsItem } from "./entity/PostedForumsNewsItem";
-import { KnownChannel } from "./entity/KnownChannel";
-import { DeadChatReply } from "./entity/DeadChatReply";
+import { KnownUser, User, UserRole } from "@db/entity/KnownUser";
+import { ReactionType, ReactionEmote } from "@db/entity/ReactionEmote";
+import { Guide, GuideKeyword, GuideType } from "@db/entity/Guide";
+import { Quote } from "@db/entity/Quote";
+import { MessageReaction } from "@db/entity/MessageReaction";
+import { FaceCaptionMessage, FaceCaptionType } from "@db/entity/FaceCaptionMessage";
+import { PostedForumNewsItem } from "@db/entity/PostedForumsNewsItem";
+import { KnownChannel } from "@db/entity/KnownChannel";
+import { DeadChatReply } from "@db/entity/DeadChatReply";
 
 type EmoteTable = { [reactionType: string]: string[] };
 

+ 2 - 0
bot/src/main.ts

@@ -1,3 +1,5 @@
+require("module-alias/register");
+
 import * as fs from "fs";
 import * as path from "path";
 import { client } from "./client";

+ 1 - 1
bot/src/util.ts

@@ -1,7 +1,7 @@
 import { GuildMember } from "discord.js";
 import { DocumentationSet } from "./commands/command";
 import { getRepository } from "typeorm";
-import { KnownUser } from "./entity/KnownUser";
+import { KnownUser } from "@db/entity/KnownUser";
 
 const VALID_EXTENSIONS = new Set([
     "png",

+ 10 - 1
bot/tsconfig.json

@@ -11,8 +11,17 @@
         "esModuleInterop": true,
         "target": "es2018",
         "emitDecoratorMetadata": true,
-        "experimentalDecorators": true
+        "experimentalDecorators": true,
+        "baseUrl": ".",
+        "paths": {
+            "@db/*": ["../db/src/*"]
+        }
     },
+    "references": [
+        {
+            "path": "../db"
+        }
+    ],
     "include": [
         "src/**/*.ts",
         "src/**/*.js"

+ 18 - 0
db/package.json

@@ -0,0 +1,18 @@
+{
+  "name": "db",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1",
+    "build": "rimraf build && tsc"
+  },
+  "author": "ghorsington",
+  "license": "ISC",
+  "dependencies": {
+    "@types/node": "^12.6.8",
+    "rimraf": "^2.6.3",
+    "typeorm": "^0.2.18",
+    "typescript": "^3.5.3"
+  }
+}

bot/src/entity/AggroNewsItem.ts → db/src/entity/AggroNewsItem.ts


bot/src/entity/DeadChatReply.ts → db/src/entity/DeadChatReply.ts


bot/src/entity/FaceCaptionMessage.ts → db/src/entity/FaceCaptionMessage.ts


bot/src/entity/Guide.ts → db/src/entity/Guide.ts


bot/src/entity/KnownChannel.ts → db/src/entity/KnownChannel.ts


bot/src/entity/KnownUser.ts → db/src/entity/KnownUser.ts


bot/src/entity/MessageReaction.ts → db/src/entity/MessageReaction.ts


bot/src/entity/PostVerifyMessage.ts → db/src/entity/PostVerifyMessage.ts


bot/src/entity/PostedForumsNewsItem.ts → db/src/entity/PostedForumsNewsItem.ts


bot/src/entity/Quote.ts → db/src/entity/Quote.ts


bot/src/entity/ReactionEmote.ts → db/src/entity/ReactionEmote.ts


+ 25 - 0
db/tsconfig.json

@@ -0,0 +1,25 @@
+{
+    "compileOnSave": true,
+    "compilerOptions": {
+        "module": "commonjs",
+        "noImplicitAny": true,
+        "removeComments": true,
+        "preserveConstEnums": true,
+        "sourceMap": true,
+        "outDir": "lib",
+        "lib": ["es2018", "dom"],
+        "esModuleInterop": true,
+        "target": "es2018",
+        "emitDecoratorMetadata": true,
+        "experimentalDecorators": true,
+        "declarationMap": true,
+        "composite": true
+    },
+    "include": [
+        "src/**/*.ts",
+        "src/**/*.js"
+    ],
+    "exclude": [
+        "node_modules"
+    ]
+}

+ 2 - 1
docker-compose.yml

@@ -4,7 +4,8 @@ services:
   noctbot:
     image: noctbot
     build:
-      context: ./bot/
+      context: ./
+      dockerfile: ./bot/Dockerfile
       args:
         OPENCV_VERSION: 3.4
     restart: on-failure