diff --git a/.github/workflows/push-docker-stable.yml b/.github/workflows/push-docker-stable.yml new file mode 100644 index 0000000..45cabb3 --- /dev/null +++ b/.github/workflows/push-docker-stable.yml @@ -0,0 +1,50 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# GitHub recommends pinning actions to a commit SHA. +# To get a newer version, you will need to update the SHA. +# You can also reference a tag or branch, but the action may change without warning. + +name: Publish staging Docker image + +on: + push: + branches: + - main + +jobs: + push_to_registry: + name: Push Docker image to Gitea Container Registry + runs-on: ubuntu-latest + steps: + - name: Check out the repo + uses: actions/checkout@v4 + - name: Install Docker + run: curl -fsSL https://get.docker.com | sh + - name: Log in to Docker Hub + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a + with: + registry: gitea.louisgallet.fr + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - + # Add support for more platforms with QEMU (optional) + # https://github.com/docker/setup-qemu-action + name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and push Docker image + uses: docker/build-push-action@v2 + with: + context: . + platforms: "linux/amd64,linux/arm64" + file: ./Dockerfile + push: true + tags: gitea.louisgallet.fr/lgallet/bot-louis:latest + labels: VERSION=stable diff --git a/.github/workflows/push-docker-staging.yml b/.github/workflows/push-docker-staging.yml new file mode 100644 index 0000000..df72163 --- /dev/null +++ b/.github/workflows/push-docker-staging.yml @@ -0,0 +1,50 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# GitHub recommends pinning actions to a commit SHA. +# To get a newer version, you will need to update the SHA. +# You can also reference a tag or branch, but the action may change without warning. + +name: Publish staging Docker image + +on: + push: + branches: + - feature/* + +jobs: + push_to_registry: + name: Push Docker image to Gitea Container Registry + runs-on: ubuntu-latest + steps: + - name: Check out the repo + uses: actions/checkout@v4 + - name: Install Docker + run: curl -fsSL https://get.docker.com | sh + - name: Log in to Docker Hub + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a + with: + registry: gitea.louisgallet.fr + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - + # Add support for more platforms with QEMU (optional) + # https://github.com/docker/setup-qemu-action + name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and push Docker image + uses: docker/build-push-action@v2 + with: + context: . + platforms: "linux/amd64,linux/arm64" + file: ./Dockerfile + push: true + tags: gitea.louisgallet.fr/lgallet/bot-louis:staging + labels: VERSION=staging diff --git a/commands/server/start-mc.js b/commands/server/start-mc.js index b324c6f..0280084 100644 --- a/commands/server/start-mc.js +++ b/commands/server/start-mc.js @@ -25,40 +25,46 @@ module.exports = { const row = new ActionRowBuilder() .addComponents(cancel, confirm); - - const response = await interaction.reply({ - content: 'Are you sure you want to start the Minecraft server?', - components: [row], - }); - - const collectorFilter = i => i.user.id === interaction.user.id; - try { - const confirmation = await response.awaitMessageComponent({ filter: collectorFilter, time: 30_000 }); - if (confirmation.customId === 'confirm') { - // eslint-disable-next-line no-undef - proxmox.qemu.start('pve', '102', function(err) { - if (err) { - confirmation.update('Error starting the Minecraft server: ' + err); - } - else { - const linkButton = new ButtonBuilder() - .setStyle(ButtonStyle.Link) - .setLabel('Web Interface') - .setURL('https://mc.louisgallet.fr'); - const linkRow = new ActionRowBuilder() - .addComponents(linkButton); - confirmation.update({ content: 'Minecraft server started successfully. Please wait a few minutes for it to boot.', components: [linkRow] }); - } - }); - } - else if (confirmation.customId === 'cancel') { - await confirmation.update({ content: 'Minecraft server start cancelled.', components: [] }); - } - } - catch (e) { - // eslint-disable-next-line no-undef - await confirmation.update({ content: 'You took too long to respond.', components: [] }); - } - - }, -}; + const response = await interaction.reply({ + content: 'Are you sure you want to start the Minecraft server?', + components: [row] + }) + // Before stop variable which return the time between now and 4am in discord timestamp + const date = new Date(new Date().setDate(new Date().getDate() + 1)) + date.setUTCHours(3, 0, 0, 0) + const test = Math.round(date.getTime() / 1000); + const collectorFilter = i => i.user.id === interaction.user.id; + let allowed = false; + for (const role of config.allowedRoles) { + if (interaction.member.roles.cache.has(role)) { + allowed = true; + } + } + try { + const confirmation = await response.awaitMessageComponent({ filter: collectorFilter, time: 30_000 }); + if (confirmation.customId === 'confirm') { + if (!allowed) { + await confirmation.update({ content: 'You do not have permission to start the Minecraft server.', components: [] }); + return; + } + proxmox.qemu.start("pve", "103", function(err) { + if (err) { + confirmation.update("Error starting the Minecraft server: " + err); + } else { + const linkButton = new ButtonBuilder() + .setStyle(ButtonStyle.Link) + .setLabel('Web Interface') + .setURL('https://mc.louisgallet.fr') + const row = new ActionRowBuilder() + .addComponents(linkButton) + confirmation.update({content: "Minecraft server started successfully. Please wait a few minutes for it to boot. Use the command `/stop-mc` to stop it, otherwise, the server will be automatically shut down " + ``, components: [row]}); + } + }) + } else if (confirmation.customId === 'cancel') { + await confirmation.update({ content: 'Minecraft server start cancelled.', components: [] }); + } + } catch (e) { + await confirmation.update({ content: 'You took too long to respond.', components: [] }); + } + } +} \ No newline at end of file diff --git a/commands/server/stop-mc.js b/commands/server/stop-mc.js index 26e5995..fbf1c89 100644 --- a/commands/server/stop-mc.js +++ b/commands/server/stop-mc.js @@ -8,17 +8,16 @@ if (!config.proxmoxUser || !config.proxmoxPass || !config.proxmoxHostname) { const proxmox = require('proxmox')(config.proxmoxUser, config.proxmoxPass, config.proxmoxHostname); module.exports = { - data: new SlashCommandBuilder() - .setName('stop-mc') - .setDescription('Stops the minecraft server machine.'), - async execute(interaction) { - proxmox.qemu.shutdown('pve', '102', function(err) { - if (err) { - interaction.reply('Error starting the Minecraft server: ' + err); - } - else { - interaction.reply('Minecraft server stopped successfully.'); - } - }); - }, -}; + data: new SlashCommandBuilder() + .setName('stop-mc') + .setDescription('Stops the minecraft server machine.'), + async execute(interaction) { + proxmox.qemu.shutdown("pve", "103", function(err, res) { + if (err) { + interaction.reply("Error starting the Minecraft server: " + err); + } else { + interaction.reply("Minecraft server stopped successfully."); + } + }) + } +} \ No newline at end of file diff --git a/commands/utility/check-perms.js b/commands/utility/check-perms.js new file mode 100644 index 0000000..4ff3080 --- /dev/null +++ b/commands/utility/check-perms.js @@ -0,0 +1,17 @@ +const { SlashCommandBuilder } = require('discord.js') +const config = require('../../config.json') + +module.exports = { + data: new SlashCommandBuilder() + .setName('check-perms') + .setDescription('Check if the user has the correct permissions to start the Minecraft server.'), + async execute(interaction) { + for (const role of config.allowedRoles) { + if (interaction.member.roles.cache.has(role)) { + await interaction.reply({ content: 'You have the correct permissions to start the Minecraft server.', ephemeral: true }); + return; + } + } + await interaction.reply({ content: 'You have the correct permissions to start the Minecraft server.', ephemeral: true }); + }, +} \ No newline at end of file diff --git a/commands/utility/test-time.js b/commands/utility/test-time.js new file mode 100644 index 0000000..deb76f1 --- /dev/null +++ b/commands/utility/test-time.js @@ -0,0 +1,13 @@ +const { SlashCommandBuilder } = require('discord.js') + +module.exports = { + data: new SlashCommandBuilder() + .setName('test-time') + .setDescription('Test the time between now and 4am in discord timestamp'), + async execute(interaction) { + const date = new Date(new Date().setDate(new Date().getDate() + 1)) + date.setUTCHours(3, 0, 0, 0) + const test = Math.round(date.getTime() / 1000); + await interaction.reply({ content: `Time between now and 4am: `}, {ephemeral: true}); + }, +} \ No newline at end of file