Compare commits

..

25 commits

Author SHA1 Message Date
60972e5782 Fix bunny tests
All checks were successful
Test / build (push) Successful in 16s
2024-05-01 18:36:31 +01:00
74cdd04d27 Merge branch 'develop' into feature/258-fix-tests 2024-05-01 18:23:06 +01:00
35646ef153 Update test script to use node
All checks were successful
Deploy To Production / build (push) Successful in 6s
Deploy To Stage / build (push) Successful in 6s
Deploy To Stage / deploy (push) Successful in 16s
Deploy To Production / deploy (push) Successful in 15s
2024-04-28 17:15:18 +01:00
16e0165922 Update stage script
All checks were successful
Deploy To Stage / build (push) Successful in 7s
Deploy To Stage / deploy (push) Successful in 16s
Deploy To Production / build (push) Successful in 7s
Deploy To Production / deploy (push) Successful in 13s
2024-04-28 17:09:57 +01:00
cb1b098daa Add stage script
Some checks failed
Deploy To Stage / build (push) Successful in 7s
Deploy To Stage / deploy (push) Failing after 5s
2024-04-28 17:07:25 +01:00
c33b4a8fdb Merge branch 'main' into develop 2024-04-28 17:05:53 +01:00
c6788370de Copy command
All checks were successful
Deploy To Production / build (push) Successful in 11s
Deploy To Production / deploy (push) Successful in 17s
2024-04-28 17:01:11 +01:00
a7bb5d995a Temp: ls
Some checks failed
Deploy To Production / build (push) Successful in 12s
Deploy To Production / deploy (push) Failing after 1s
2024-04-28 16:56:33 +01:00
00c90aec80 Source .sshrc
Some checks failed
Deploy To Production / build (push) Successful in 11s
Deploy To Production / deploy (push) Failing after 1s
2024-04-28 16:26:46 +01:00
13dd2558f2 Migrate to npm
Some checks failed
Deploy To Production / build (push) Successful in 37s
Deploy To Production / deploy (push) Failing after 14s
2024-04-28 16:19:16 +01:00
f7f304d1f4 Undo bash source
Some checks failed
Deploy To Production / build (push) Successful in 7s
Deploy To Production / deploy (push) Failing after 14s
2024-04-28 16:11:02 +01:00
344d6c01eb Cd first
Some checks failed
Deploy To Production / build (push) Successful in 9s
Deploy To Production / deploy (push) Failing after 14s
2024-04-28 16:09:18 +01:00
b62f799531 Use .bashrc
Some checks failed
Deploy To Production / build (push) Successful in 6s
Deploy To Production / deploy (push) Failing after 14s
2024-04-28 16:07:31 +01:00
0a340f36cf Use prod_
Some checks failed
Deploy To Production / build (push) Successful in 6s
Deploy To Production / deploy (push) Failing after 14s
2024-04-28 16:05:43 +01:00
9f7c622514 Runs on node
Some checks failed
Deploy To Production / build (push) Successful in 25s
Deploy To Production / deploy (push) Failing after 4s
2024-04-28 16:02:46 +01:00
ed3517ecda Use forgejo runner
Some checks failed
Deploy To Production / build (push) Failing after 13s
Deploy To Production / deploy (push) Has been skipped
2024-04-28 15:49:54 +01:00
c6cb35a12c Merge branch 'main' into develop
All checks were successful
continuous-integration/drone/push Build is passing
2024-04-19 18:24:57 +01:00
3b0586ddad v3.2.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2024-04-19 18:24:04 +01:00
1c430222aa Revert release bump 2024-04-19 18:24:00 +01:00
c9789a3c77 Update drone deployment
All checks were successful
continuous-integration/drone/push Build is passing
2024-04-19 18:20:01 +01:00
5678097aac v3.2.2
Some checks failed
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is failing
2024-04-19 18:18:04 +01:00
d6330ae501 3.2.2
All checks were successful
continuous-integration/drone/push Build is passing
2024-04-19 18:16:45 +01:00
f3d67bb33a Update bunny command to defer reply until it finds an image 2024-04-19 18:16:25 +01:00
790afcca4a Update random-bunny to v2.1.6 2024-04-19 18:15:59 +01:00
2b04952d85 Update cache helper using the wrong symbol to measure interval
All checks were successful
continuous-integration/drone/push Build is passing
2024-03-30 16:15:53 +00:00
18 changed files with 9024 additions and 4939 deletions

View file

@ -7,7 +7,7 @@ steps:
- name: deploy
image: appleboy/drone-ssh
settings:
host: 192.168.68.120
host: 192.168.1.115
username: vylpes
password:
from_secret: ssh_password
@ -28,7 +28,7 @@ steps:
- name: stage
image: appleboy/drone-ssh
settings:
host: 192.168.68.120
host: 192.168.1.115
username: vylpes
password:
from_secret: ssh_password

View file

@ -0,0 +1,67 @@
name: Deploy To Production
on:
push:
branches:
- main
jobs:
build:
environment: prod
runs-on: node
steps:
- uses: actions/checkout@v2
- name: Use Node.js
uses: actions/setup-node@v1
with:
node-version: 18.x
- run: npm ci
- run: npm run build
- run: npm test
- name: "Copy files over to location"
run: cp -r . ${{ secrets.PROD_REPO_PATH }}
deploy:
environment: prod
needs: build
runs-on: node
steps:
- uses: https://github.com/appleboy/ssh-action@v1.0.0
env:
DB_NAME: ${{ secrets.PROD_DB_NAME }}
DB_AUTH_USER: ${{ secrets.PROD_DB_AUTH_USER }}
DB_AUTH_PASS: ${{ secrets.PROD_DB_AUTH_PASS }}
DB_HOST: ${{ secrets.PROD_DB_HOST }}
DB_PORT: ${{ secrets.PROD_DB_PORT }}
DB_ROOT_HOST: ${{ secrets.PROD_DB_ROOT_HOST }}
DB_SYNC: ${{ secrets.PROD_DB_SYNC }}
DB_LOGGING: ${{ secrets.PROD_DB_LOGGING }}
DB_DATA_LOCATION: ${{ secrets.PROD_DB_DATA_LOCATION }}
SERVER_PATH: ${{ secrets.PROD_SSH_SERVER_PATH }}
BOT_TOKEN: ${{ secrets.PROD_BOT_TOKEN }}
BOT_VER: ${{ vars.PROD_BOT_VER }}
BOT_AUTHOR: ${{ vars.PROD_BOT_AUTHOR }}
BOT_OWNERID: ${{ vars.PROD_BOT_OWNERID }}
BOT_CLIENTID: ${{ vars.PROD_BOT_CLIENTID }}
ABOUT_FUNDING: ${{ vars.PROD_ABOUT_FUNDING }}
ABOUT_REPO: ${{ vars.PROD_ABOUT_REPO }}
CACHE_INTERVAL: ${{ vars.PROD_CACHE_INTERVAL }}
with:
host: ${{ secrets.PROD_SSH_HOST }}
username: ${{ secrets.PROD_SSH_USER }}
key: ${{ secrets.PROD_SSH_KEY }}
port: ${{ secrets.PROD_SSH_PORT }}
envs: DB_NAME,DB_AUTH_USER,DB_AUTH_PASS,DB_HOST,DB_PORT,DB_ROOT_HOST,DB_SYNC,DB_LOGGING,DB_DATA_LOCATION,BOT_TOKEN,BOT_VER,BOT_AUTHOR,BOT_OWNERID,BOT_CLIENTID,ABOUT_FUNDING,ABOUT_REPO,CACHE_INTERVAL
script: |
source .sshrc \
&& cd /home/vylpes/apps/vylbot/vylbot_prod \
&& docker compose down \
&& (pm2 stop vylbot_prod || true) \
&& (pm2 delete vylbot_prod || true) \
&& docker compose up -d \
&& sleep 10 \
&& npm run db:up \
&& pm2 start --name vylbot_prod dist/vylbot.js

View file

@ -0,0 +1,67 @@
name: Deploy To Stage
on:
push:
branches:
- develop
jobs:
build:
environment: prod
runs-on: node
steps:
- uses: actions/checkout@v2
- name: Use Node.js
uses: actions/setup-node@v1
with:
node-version: 18.x
- run: npm ci
- run: npm run build
- run: npm test
- name: "Copy files over to location"
run: cp -r . ${{ secrets.STAGE_REPO_PATH }}
deploy:
environment: prod
needs: build
runs-on: node
steps:
- uses: https://github.com/appleboy/ssh-action@v1.0.0
env:
DB_NAME: ${{ secrets.STAGE_DB_NAME }}
DB_AUTH_USER: ${{ secrets.STAGE_DB_AUTH_USER }}
DB_AUTH_PASS: ${{ secrets.STAGE_DB_AUTH_PASS }}
DB_HOST: ${{ secrets.STAGE_DB_HOST }}
DB_PORT: ${{ secrets.STAGE_DB_PORT }}
DB_ROOT_HOST: ${{ secrets.STAGE_DB_ROOT_HOST }}
DB_SYNC: ${{ secrets.STAGE_DB_SYNC }}
DB_LOGGING: ${{ secrets.STAGE_DB_LOGGING }}
DB_DATA_LOCATION: ${{ secrets.STAGE_DB_DATA_LOCATION }}
SERVER_PATH: ${{ secrets.STAGE_SSH_SERVER_PATH }}
BOT_TOKEN: ${{ secrets.STAGE_BOT_TOKEN }}
BOT_VER: ${{ vars.STAGE_BOT_VER }}
BOT_AUTHOR: ${{ vars.STAGE_BOT_AUTHOR }}
BOT_OWNERID: ${{ vars.STAGE_BOT_OWNERID }}
BOT_CLIENTID: ${{ vars.STAGE_BOT_CLIENTID }}
ABOUT_FUNDING: ${{ vars.STAGE_ABOUT_FUNDING }}
ABOUT_REPO: ${{ vars.STAGE_ABOUT_REPO }}
CACHE_INTERVAL: ${{ vars.STAGE_CACHE_INTERVAL }}
with:
host: ${{ secrets.STAGE_SSH_HOST }}
username: ${{ secrets.STAGE_SSH_USER }}
key: ${{ secrets.STAGE_SSH_KEY }}
port: ${{ secrets.STAGE_SSH_PORT }}
envs: DB_NAME,DB_AUTH_USER,DB_AUTH_PASS,DB_HOST,DB_PORT,DB_ROOT_HOST,DB_SYNC,DB_LOGGING,DB_DATA_LOCATION,BOT_TOKEN,BOT_VER,BOT_AUTHOR,BOT_OWNERID,BOT_CLIENTID,ABOUT_FUNDING,ABOUT_REPO,CACHE_INTERVAL
script: |
source .sshrc \
&& cd /home/vylpes/apps/vylbot/vylbot_stage \
&& docker compose down \
&& (pm2 stop vylbot_stage || true) \
&& (pm2 delete vylbot_stage || true) \
&& docker compose up -d \
&& sleep 10 \
&& npm run db:up \
&& pm2 start --name vylbot_stage dist/vylbot.js

View file

@ -0,0 +1,24 @@
name: Test
on:
push:
branches:
- feature/*
- hotfix/*
- renovate/*
jobs:
build:
environment: stage
runs-on: node
steps:
- uses: actions/checkout@v2
- name: Use Node.js
uses: actions/setup-node@v1
with:
node-version: 18.x
- run: npm ci
- run: npm run build
- run: npm test

View file

@ -1,26 +0,0 @@
# Security Warning! Do not commit this file to any VCS!
# This is a local file to speed up development process,
# so you don't have to change your environment variables.
#
# This is not applied to `.env.template`!
# Template files must be committed to the VCS, but must not contain
# any secret values.
BOT_TOKEN=
BOT_VER=3.3.0
BOT_AUTHOR=Vylpes
BOT_OWNERID=147392775707426816
BOT_CLIENTID=680083120896081954
ABOUT_FUNDING=https://ko-fi.com/vylpes
ABOUT_REPO=https://gitea.vylpes.xyz/RabbitLabs/vylbot-app
CACHE_INTERVAL=1800000 # 30 minutes
DB_HOST=127.0.0.1
DB_PORT=3121
DB_NAME=vylbot
DB_AUTH_USER=prod
DB_AUTH_PASS=prod
DB_SYNC=false
DB_LOGGING=false

View file

@ -1,26 +0,0 @@
# Security Warning! Do not commit this file to any VCS!
# This is a local file to speed up development process,
# so you don't have to change your environment variables.
#
# This is not applied to `.env.template`!
# Template files must be committed to the VCS, but must not contain
# any secret values.
BOT_TOKEN=
BOT_VER=3.3.0
BOT_AUTHOR=Vylpes
BOT_OWNERID=147392775707426816
BOT_CLIENTID=1016767908740857949
ABOUT_FUNDING=https://ko-fi.com/vylpes
ABOUT_REPO=https://gitea.vylpes.xyz/RabbitLabs/vylbot-app
CACHE_INTERVAL=1800000 # 30 minutes
DB_HOST=127.0.0.1
DB_PORT=3111
DB_NAME=vylbot
DB_AUTH_USER=stage
DB_AUTH_PASS=stage
DB_SYNC=false
DB_LOGGING=false

View file

@ -1,31 +0,0 @@
version: "3.9"
volumes:
prod_database_data:
services:
# discord:
# build: .
database:
image: mysql/mysql-server
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
- MYSQL_DATABASE=vylbot
- MYSQL_USER=prod
- MYSQL_PASSWORD=prod
- MYSQL_ROOT_PASSWORD=root
- MYSQL_ROOT_HOST=0.0.0.0
ports:
- "3121:3306"
volumes:
- prod_database_data:/var/lib/mysql
phpmyadmin:
image: phpmyadmin
restart: always
ports:
- "3122:80"
environment:
- PMA_ARBITRARY=1

View file

@ -1,31 +0,0 @@
version: "3.9"
volumes:
stage_database_data:
services:
# discord:
# build: .
database:
image: mysql/mysql-server
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
- MYSQL_DATABASE=vylbot
- MYSQL_USER=stage
- MYSQL_PASSWORD=stage
- MYSQL_ROOT_PASSWORD=root
- MYSQL_ROOT_HOST=0.0.0.0
ports:
- "3111:3306"
volumes:
- stage_database_data:/var/lib/mysql
phpmyadmin:
image: phpmyadmin
restart: always
ports:
- "3112:80"
environment:
- PMA_ARBITRARY=1

View file

@ -1,31 +1,17 @@
version: "3.9"
volumes:
dev_database_data:
services:
# discord:
# build: .
database:
image: mysql/mysql-server
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
- MYSQL_DATABASE=vylbot
- MYSQL_USER=dev
- MYSQL_PASSWORD=dev
- MYSQL_ROOT_PASSWORD=root
- MYSQL_ROOT_HOST=0.0.0.0
- MYSQL_DATABASE=$DB_NAME
- MYSQL_USER=$DB_AUTH_USER
- MYSQL_PASSWORD=$DB_AUTH_PASS
- MYSQL_ROOT_PASSWORD=$DB_AUTH_PASS
- MYSQL_ROOT_HOST=$DB_ROOT_HOST
ports:
- "3101:3306"
- "$DB_PORT:3306"
volumes:
- dev_database_data:/var/lib/mysql
phpmyadmin:
image: phpmyadmin
restart: always
ports:
- "3102:80"
environment:
- PMA_ARBITRARY=1
- $DB_DATA_LOCATION:/var/lib/mysql

8815
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{
"name": "vylbot-app",
"version": "3.2.1",
"version": "3.2.2",
"description": "A discord bot made for Vylpes' Den",
"main": "./dist/vylbot",
"typings": "./dist",
@ -37,7 +37,7 @@
"jest-mock-extended": "^3.0.0",
"minimatch": "9.0.3",
"mysql": "^2.18.1",
"random-bunny": "^2.0.5",
"random-bunny": "^2.1.6",
"ts-jest": "^29.0.0",
"typeorm": "0.3.20"
},

View file

@ -15,6 +15,8 @@ export default class Bunny extends Command {
public override async execute(interaction: CommandInteraction) {
if (!interaction.isChatInputCommand()) return;
await interaction.deferReply();
const subreddits = [
'rabbits',
'bunnieswithhats',
@ -24,6 +26,7 @@ export default class Bunny extends Command {
];
const random = Math.floor(Math.random() * subreddits.length);
const selectedSubreddit = subreddits[random];
const result = await randomBunny(selectedSubreddit, 'hot');
@ -37,9 +40,9 @@ export default class Bunny extends Command {
.setURL(`https://reddit.com${result.Result!.Permalink}`)
.setFooter({ text: `r/${selectedSubreddit} · ${result.Result!.Ups} upvotes`});
await interaction.reply({ embeds: [ embed ]});
await interaction.editReply({ embeds: [ embed ]});
} else {
await interaction.reply("There was an error running this command.");
await interaction.editReply("There was an error running this command.");
}
}
}

View file

@ -7,7 +7,7 @@ export default class Unmute extends Command {
constructor() {
super();
super.CommandBuilder = new SlashCommandBuilder()
this.CommandBuilder = new SlashCommandBuilder()
.setName("unmute")
.setDescription("(DEPRECATED) Unmute a member in the server with an optional reason")
.setDefaultMemberPermissions(PermissionsBitField.Flags.ModerateMembers)

View file

@ -3,7 +3,9 @@ import NicknameChanged from "./GuildMemberUpdate/NicknameChanged";
import CacheHelper from "../../helpers/CacheHelper";
export default async function GuildMemberUpdate(oldMember: GuildMember, newMember: GuildMember) {
await CacheHelper.UpdateServerCache(newMember.guild);
const updatedFromCache = await CacheHelper.UpdateServerCache(newMember.guild);
if (updatedFromCache) return;
if (oldMember.nickname !== newMember.nickname) { // Nickname change
await NicknameChanged(oldMember, newMember);

View file

@ -2,10 +2,10 @@ import { Guild } from "discord.js";
import Server from "../database/entities/Server";
export default class CacheHelper {
public static async UpdateServerCache(guild: Guild) {
public static async UpdateServerCache(guild: Guild): Promise<boolean> {
const cacheInterval = process.env.CACHE_INTERVAL;
if (!cacheInterval) return;
if (!cacheInterval) return false;
let server = await Server.FetchOneById(Server, guild.id);
@ -14,9 +14,15 @@ export default class CacheHelper {
await server.Save(Server, server);
await CacheHelper.UpdateCache(guild);
} else if (server.LastCached.getTime() + Number(cacheInterval) < Date.now()) {
return true;
} else if (server.LastCached.getTime() + Number(cacheInterval) > Date.now()) {
await CacheHelper.UpdateCache(guild);
return true;
}
return false;
}
private static async UpdateCache(guild: Guild) {

View file

@ -28,9 +28,10 @@ describe('execute', () => {
const interaction = {
isChatInputCommand: jest.fn().mockReturnValue(true),
reply: jest.fn().mockImplementation((options) => {
editReply: jest.fn().mockImplementation((options) => {
repliedWith = options;
}),
deferReply: jest.fn(),
} as unknown as CommandInteraction;
jest.spyOn(randomBunny, "default").mockResolvedValue({
@ -46,6 +47,11 @@ describe('execute', () => {
Subreddit: "rabbits",
SubredditSubscribers: 1,
},
Error: undefined,
Query: {
subreddit: "rabbits",
sortBy: "hot",
},
});
Math.floor = jest.fn().mockReturnValue(0);
@ -56,7 +62,9 @@ describe('execute', () => {
expect(randomBunny.default).toHaveBeenCalledTimes(1);
expect(randomBunny.default).toHaveBeenCalledWith("rabbits", "hot");
expect(interaction.reply).toHaveBeenCalledTimes(1);
expect(interaction.editReply).toHaveBeenCalledTimes(1);
expect(interaction.deferReply).toHaveBeenCalledTimes(1);
expect(repliedWith).toBeDefined();
expect(repliedWith!.embeds).toBeDefined();
expect(repliedWith!.embeds.length).toBe(1);
@ -88,12 +96,18 @@ describe('execute', () => {
test("GIVEN a result from random-bunny is failure, EXPECT error", async () => {
const interaction = {
isChatInputCommand: jest.fn().mockReturnValue(true),
reply: jest.fn(),
editReply: jest.fn(),
deferReply: jest.fn(),
} as unknown as CommandInteraction;
jest.spyOn(randomBunny, "default").mockResolvedValue({
IsSuccess: false,
Result: undefined
Result: undefined,
Error: undefined,
Query: {
subreddit: "rabbits",
sortBy: "hot",
},
});
Math.floor = jest.fn().mockReturnValue(0);
@ -103,7 +117,9 @@ describe('execute', () => {
expect(randomBunny.default).toHaveBeenCalledTimes(1);
expect(interaction.reply).toHaveBeenCalledTimes(1);
expect(interaction.reply).toHaveBeenCalledWith("There was an error running this command.");
expect(interaction.editReply).toHaveBeenCalledTimes(1);
expect(interaction.editReply).toHaveBeenCalledWith("There was an error running this command.");
expect(interaction.deferReply).toHaveBeenCalledTimes(1);
});
});

4787
yarn.lock

File diff suppressed because it is too large Load diff