Skip to content

Commit 0680b2d

Browse files
feat: replace canvas with napi-canvas, switch container OS to alpine
1 parent 26f7323 commit 0680b2d

20 files changed

+378
-671
lines changed

Dockerfile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
FROM node:14.20.0
1+
FROM node:14.20.0-alpine
22
LABEL maintainer="tyrone@sudeium.com"
33

4+
# Add ffmpeg, runtime requirement for reddit/tiktok
5+
# RUN apk --no-cache add ffmpeg
6+
47
WORKDIR /app
58
ADD . .

Production.dockerfile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM node:14.20.0
1+
FROM node:14.20.0-alpine
22
LABEL maintainer="tyrone@sudeium.com"
33

44
WORKDIR /app
@@ -8,6 +8,10 @@ ADD . .
88
ARG COMMIT_SHA=""
99
ENV SOURCE_VERSION=${COMMIT_SHA}
1010

11+
# Add ffmpeg, runtime requirement for reddit/tiktok
12+
# NOTE: Adds ~100MB :(
13+
# RUN apk --no-cache add ffmpeg
14+
1115
# Layer for build (includes dev dependencies, yarn cache)
1216
RUN yarn install
1317

docker-compose.dev.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
version: "3.5"
22
services:
33
bot:
4-
image: node:14.20.0
4+
image: node:14.20.0-alpine
55
command: yarn debug-bot
66
working_dir: /app
77
ports:
@@ -13,7 +13,7 @@ services:
1313
env_file:
1414
- ./development.env
1515
website:
16-
image: node:14.20.0
16+
image: node:14.20.0-alpine
1717
command: yarn debug-web
1818
working_dir: /app
1919
ports:

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@
3131
},
3232
"homepage": "https://github.com/tyrone-sudeium/aethebot#readme",
3333
"dependencies": {
34-
"@discordjs/opus": "^0.1.0",
34+
"@discordjs/opus": "^0.9",
35+
"@napi-rs/canvas": "^0.1",
3536
"@types/ws": "^7.2.1",
3637
"@tyrone-sudeium/napi-gif-encoder": "^0.0.1",
3738
"anchorme": "^1.1.2",
3839
"array-flatten": "^3.0.0",
39-
"canvas": "^2.0.0-alpha.12",
4040
"chrono-node": "^2.3.1",
4141
"discord.js": "12",
4242
"emoji-regex": "^9.2.2",
@@ -53,7 +53,7 @@
5353
"devDependencies": {
5454
"@types/minimist": "^1.2.0",
5555
"@types/moment-timezone": "^0.5.9",
56-
"@types/node": "^12",
56+
"@types/node": "^14",
5757
"@types/redis": "^2.8.31",
5858
"@types/uuid": "^3.4.5",
5959
"@types/xml2js": "^0.4.3",
@@ -63,7 +63,7 @@
6363
"eslint-plugin-import": "=2.20.0",
6464
"ffmpeg-binaries": "^3.2.2-3",
6565
"nodemon": "1.19.3",
66-
"typescript": "^3.2.2"
66+
"typescript": "^4.9"
6767
},
6868
"resolutions": {
6969
"**/needle": "^2.6.0"

res/font/OpenSans-SemiBold.ttf

147 KB
Binary file not shown.

src/features/index.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,11 @@ import { GalaxyBrainFeature } from "./memegen/galaxy_brain"
2424
import { VinceMcMahonFeature } from "./memegen/vince"
2525
import { PingFeature } from "./ping/"
2626
import { ReactorFeature } from "./reactor"
27-
import { RedditVideoFeature } from "./video/reddit_video"
2827
import { RegionalIndicatorFeature } from "./regional_indicator"
2928
import { RerollFeature } from "./reroll"
3029
import { ScomoFeature } from "./scomo"
3130
import { ServerFeaturesManager } from "./server_features"
3231
import { ShitcoinFeature } from "./shitcoin"
33-
import { TikTokVideoFeature } from "./video/tiktok_video"
3432
import { TimehelperFeature } from "./timehelper"
3533
import { UptimeFeature } from "./uptime"
3634
import { VoiceNoiseFeature } from "./voicenoise/"
@@ -74,8 +72,6 @@ export const allFeatures: GlobalFeatureConstructor<GlobalFeature>[] = [
7472
export const allServerFeatures: ServerFeatureConstructor<ServerFeature>[] = [
7573
AutoKimFeature,
7674
ReactorFeature,
77-
RedditVideoFeature,
78-
TikTokVideoFeature,
7975
TimPostFeature,
8076
ReactionRolesFeature,
8177
]

src/features/memegen/drawable.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
* This source code is licensed under the permissive MIT license.
1212
*/
1313

14-
import { CanvasRenderingContext2D } from "canvas"
14+
import { SKRSContext2D } from "@napi-rs/canvas"
1515

1616
export interface Drawable {
1717
height: number
1818
width: number
19-
drawInContext(ctx: CanvasRenderingContext2D, offset?: {x: number; y: number}): void
19+
drawInContext(ctx: SKRSContext2D, offset?: {x: number; y: number}): void
2020
}

src/features/memegen/galaxy_brain.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
import * as Path from "path"
1515
import * as Discord from "discord.js"
16-
import { createCanvas, Image, loadImage } from "canvas"
16+
import { createCanvas, Image, loadImage } from "@napi-rs/canvas"
1717
import { removeBotMentions } from "../../util/remove_mentions"
1818
import { GlobalFeature, MessageContext } from "../feature"
1919
import { Drawable } from "./drawable"

src/features/memegen/meme_tile.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
* This source code is licensed under the permissive MIT license.
1212
*/
1313

14-
import { Image, CanvasRenderingContext2D } from "canvas"
14+
import * as Path from "path"
15+
import { Image, SKRSContext2D, GlobalFonts } from "@napi-rs/canvas"
1516
import { Rect } from "../../util/rect"
1617
import { Drawable } from "./drawable"
1718

@@ -20,8 +21,15 @@ interface WrapTextResult {
2021
adjustedFontSize: number
2122
}
2223

23-
function renderTextInRect(ctx: CanvasRenderingContext2D,
24+
let fontsRegistered = false
25+
26+
function renderTextInRect(ctx: SKRSContext2D,
2427
text: string, font: string, rect: Rect, maxFontSize?: number): void {
28+
if (!fontsRegistered) {
29+
const fontPath = Path.join(__dirname, "..", "..", "..", "res", "font", "OpenSans-SemiBold.ttf")
30+
GlobalFonts.registerFromPath(fontPath, "OpenSans")
31+
fontsRegistered = true
32+
}
2533
// start with a large font size
2634
let fontSize = maxFontSize || rect.height
2735
let res = wrappedTextAtSize(ctx, text, font, rect.width, fontSize)
@@ -57,7 +65,7 @@ function renderTextInRect(ctx: CanvasRenderingContext2D,
5765
}
5866
}
5967

60-
function wrappedTextAtSize(ctx: CanvasRenderingContext2D,
68+
function wrappedTextAtSize(ctx: SKRSContext2D,
6169
text: string, fontFace: string, maxWidth: number, fontSize: number): WrapTextResult | null {
6270
const words = text.split(" ")
6371
const lines = []
@@ -113,11 +121,11 @@ export class MemeTile implements Drawable {
113121
this.width = width
114122
}
115123

116-
public drawInContext(ctx: CanvasRenderingContext2D, offset?: {x: number; y: number}): void {
124+
public drawInContext(ctx: SKRSContext2D, offset?: {x: number; y: number}): void {
117125
offset = offset || {x: 0, y: 0}
118126
const textRect = new Rect(offset.x, offset.y, this.width / 2, this.height)
119127
ctx.fillStyle = "#000"
120-
renderTextInRect(ctx, this.text, "Arial", textRect, 36)
128+
renderTextInRect(ctx, this.text, "OpenSans", textRect, 36)
121129
ctx.drawImage(this.image, this.width / 2, offset.y, this.width / 2, this.height)
122130
}
123131
}

src/features/memegen/separator.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* This source code is licensed under the permissive MIT license.
1313
*/
1414

15-
import { CanvasRenderingContext2D } from "canvas"
15+
import { SKRSContext2D } from "@napi-rs/canvas"
1616
import { Drawable } from "./drawable"
1717

1818
export class Separator implements Drawable {
@@ -23,7 +23,7 @@ export class Separator implements Drawable {
2323
this.width = width
2424
this.height = height
2525
}
26-
public drawInContext(ctx: CanvasRenderingContext2D, offset?: {x: number; y: number}): void {
26+
public drawInContext(ctx: SKRSContext2D, offset?: {x: number; y: number}): void {
2727
ctx.fillStyle = this.color
2828
offset = offset || {x: 0, y: 0}
2929
ctx.fillRect(offset.x, offset.y, this.width, this.height)

0 commit comments

Comments
 (0)