From 3c29f98027df67246937a9b7a5b79877abcfb93e Mon Sep 17 00:00:00 2001 From: koneko <67551503+koneko@users.noreply.github.com> Date: Tue, 29 Apr 2025 12:22:45 +0200 Subject: [PATCH] commit --- .gitea/workflows/deploy.yml | 20 ++ Dockerfile | 15 ++ docker-compose.yml | 10 + index.js | 367 ++++++++++++++++++++++++++++++++++++ package.json | 9 + yarn.lock | 189 +++++++++++++++++++ 6 files changed, 610 insertions(+) create mode 100644 .gitea/workflows/deploy.yml create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 index.js create mode 100644 package.json create mode 100644 yarn.lock diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..3a72c66 --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,20 @@ +name: Deploy bot + +on: + push: + branches: + - master + +jobs: + build-and-deploy: + env: + TOKEN: ${{ secrets.TOKEN }} + PREFIX: ${{ secrets.PREFIX }} + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Deploy with Docker Compose + run: | + docker compose down + docker compose up -d --build diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2900dd7 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,15 @@ +ARG NODE_VERSION=18.0.0 + +FROM node:${NODE_VERSION}-alpine + +WORKDIR /usr/src/app + +COPY package.json . + +RUN npm install + +USER node + +COPY . . + +CMD node index.js diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..74b154a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,10 @@ +services: + shirocalc: + container_name: shirocalc-discord-bot + restart: unless-stopped + environment: + - TOKEN=${TOKEN} + - PREFIX=${PREFIX} + build: + context: . + dockerfile: Dockerfile diff --git a/index.js b/index.js new file mode 100644 index 0000000..1df172c --- /dev/null +++ b/index.js @@ -0,0 +1,367 @@ +const { + Client, + Events, + GatewayIntentBits, + EmbedBuilder, +} = require("discord.js"); +const token = process.env.TOKEN; +const prefix = process.env.PREFIX; +// Create a new client instance +const client = new Client({ + intents: [ + GatewayIntentBits.Guilds, + GatewayIntentBits.GuildMessages, + GatewayIntentBits.MessageContent, + ], +}); + +// When the client is ready, run this code (only once). +// The distinction between `client: Client` and `readyClient: Client` is important for TypeScript developers. +// It makes some properties non-nullable. +client.once(Events.ClientReady, (readyClient) => { + console.log(`Ready! Logged in as ${readyClient.user.tag}`); +}); + +client.on(Events.MessageCreate, (message) => { + if (message.author.bot) return; + if (message.content.indexOf(prefix) !== 0) return; + const args = message.content.slice(prefix.length).trim().split(/ +/g); + const command = args.shift().toLowerCase(); + if (command == "bonus") { + if (!args[0]) + return message.channel.send( + "Not enough arguments, consult < { + if (isNaN(parseInt(arg))) + return message.channel.send( + "Please provide atleast 1 number." + ); + arg = parseInt(arg); + }); + } catch (e) { + return message.channel.send("Please provide 1 number."); + } + let sum = 0; + args.forEach((arg) => { + if (arg > 2000) arg = 2000; + sum += parseInt(arg); + }); + message.channel.send( + `Will reach ${sum}, ${Math.ceil(sum * 1.4)} with bonus.` + ); + } + if (command == "ev") { + return message.channel.send("not implemented."); + if (!args[0] || !args[1]) + return message.channel.send( + "Not enough arguments, consult < { + if (res == null) return; + if (res > 29) + return message.channel.send( + "Please provide a number between 0 and 29. LMAO" + ); + if (res < 29) { + if (res < 0) { + let underzero = Math.abs(res); + if (underzero < 13) { + resUpgrades += 23 + Math.abs(res); + } else { + if (underzero == 13 || underzero == 14) { + resUpgrades += 23 + 13; + } + if (underzero == 15 || underzero == 16) { + resUpgrades += 23 + 13 + 1; + } + if (underzero == 17 || underzero == 18) { + resUpgrades += 23 + 13 + 2; + } + if ( + underzero == 19 || + underzero == 20 || + underzero == 22 + ) { + resUpgrades += 23 + 13 + 3; + } + if (underzero == 21 || underzero == 23) { + resUpgrades += 23 + 13 + 4; + } + if (underzero > 23) { + resUpgrades += 29 - underzero; + } + } + + // from 1% to 23% takes 17-18 ups + // from 23% to 29% takes 6 ups + // from 1% to 29% takes 23 ups + // 23 + Math.abs(res) + console.log( + "gotta spend " + + (23 + Math.abs(res)) + + " upgrades to max res for negative" + ); + } else { + //14 skips 15 to 16 + //15 skips 16 to 17 + //17 skips 18 to 19 + //19 skips 20 to 21 + //21 skips to 24 + // list: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,20,23 + // possible if 15,17,19,21,24 + //amount of numbers: 18 + // skipped 5 upgrades + //example 4 + // 5,6,7,8,9,10,11,12,13,14,16,18,20,23 + // count: 14 + // to 29% + 6, result 20 + if (res < 14) { + let am = 14 - res; + resUpgrades += am + 4 + 6; + console.log( + "gotta spend " + + (am + 4 + 6) + + " upgrades to max res for positive, am: " + + am + ); + } else { + if (res == 14) { + resUpgrades += 4 + 6; + } + if (res == 15 || res == 16) { + resUpgrades += 3 + 6; + } + if (res == 17 || res == 18) { + resUpgrades += 2 + 6; + } + if (res == 19 || res == 20 || res == 22) { + resUpgrades += 1 + 6; + } + if (res == 21 || res == 23) { + resUpgrades += 6; + } + if (res > 23) { + resUpgrades += 29 - res; + } + console.log( + "gotta spend " + + resUpgrades + + " upgrades to max res for positive, res: " + + res + ); + } + } + } + }); + upgrades -= resUpgrades; + mainStat += upgrades; + let over = 0; + if (mainStat > 999) { + let over = mainStat - 999; + mainStat -= over; + substat += over; + } + message.channel.send( + `With ${resUpgrades} upgrades spent in resistances, your piece will reach ${ + mainStat + substat + }, or ${Math.ceil(mainStat * 1.4 + substat * 1.4)} with set bonus!` + ); + } + if (command == "cat") { + if (!args[0] || !args[1]) + return message.channel.send( + "Not enough arguments, consult < 4) players = 4; + message.channel.send( + `Should be atleast ${ + boost + extraboost + }. Will boost atleast ${players} players.` + ); + } + if (command == "bident") { + if (!args[0] || !args[1]) + return message.channel.send( + "Not enough arguments, consult < [res] | [hero stat] [levels] [second hero stat])", + }, + { + name: "bonus", + value: ":star: Sums and calculates bonus for numbers. (< [inf optional extra numbers])", + }, + { + name: "cat", + value: ":cat: Calculates boost for cat. (< )", + }, + { + name: "cdrag", + value: ":dragon: Calculate damage for crystaline dragon taking into account upgrades and additional projectiles. (< )", + }, + { + name: "cb", + value: ":crossed_swords: Calculate calamity blade damage taking in to account speed. (< [proj speed])", + }, + { + name: "bident", + value: ":trident: Calculate bident damage taking in to account speed and charge speed. (< [proj speed] [charge speed])", + }, + { + name: "ms", + value: ":tada: Calculate moon staff damage taking in to account speed (< [proj speed])", + }, + { + name: "help", + value: ":scroll: Shows this message. (bot is a tbot replacement for this server :P)", + } + ); + embed.setColor(0x00ff00); + message.channel.send({ embeds: [embed] }); + } +}); + +// Log in to Discord with your client's token +client.login(token); diff --git a/package.json b/package.json new file mode 100644 index 0000000..efc24f5 --- /dev/null +++ b/package.json @@ -0,0 +1,9 @@ +{ + "name": "shirocalc", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "discord.js": "^14.14.1" + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..a938b04 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,189 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@discordjs/builders@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.7.0.tgz#e2478c7e55b0f4c40837edb8f102bce977323a37" + integrity sha512-GDtbKMkg433cOZur8Dv6c25EHxduNIBsxeHrsRoIM8+AwmEZ8r0tEpckx/sHwTLwQPOF3e2JWloZh9ofCaMfAw== + dependencies: + "@discordjs/formatters" "^0.3.3" + "@discordjs/util" "^1.0.2" + "@sapphire/shapeshift" "^3.9.3" + discord-api-types "0.37.61" + fast-deep-equal "^3.1.3" + ts-mixer "^6.0.3" + tslib "^2.6.2" + +"@discordjs/collection@1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-1.5.3.tgz#5a1250159ebfff9efa4f963cfa7e97f1b291be18" + integrity sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ== + +"@discordjs/collection@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-2.0.0.tgz#409b80c74eb8486cc4ee6a9b83426aaff1380f8c" + integrity sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w== + +"@discordjs/formatters@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@discordjs/formatters/-/formatters-0.3.3.tgz#b16fdd79bb819680ab7e519193004e9dc124a749" + integrity sha512-wTcI1Q5cps1eSGhl6+6AzzZkBBlVrBdc9IUhJbijRgVjCNIIIZPgqnUj3ntFODsHrdbGU8BEG9XmDQmgEEYn3w== + dependencies: + discord-api-types "0.37.61" + +"@discordjs/rest@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-2.2.0.tgz#f4ec00d3faff965c00a879b7e87bb4b6f4446966" + integrity sha512-nXm9wT8oqrYFRMEqTXQx9DUTeEtXUDMmnUKIhZn6O2EeDY9VCdwj23XCPq7fkqMPKdF7ldAfeVKyxxFdbZl59A== + dependencies: + "@discordjs/collection" "^2.0.0" + "@discordjs/util" "^1.0.2" + "@sapphire/async-queue" "^1.5.0" + "@sapphire/snowflake" "^3.5.1" + "@vladfrangu/async_event_emitter" "^2.2.2" + discord-api-types "0.37.61" + magic-bytes.js "^1.5.0" + tslib "^2.6.2" + undici "5.27.2" + +"@discordjs/util@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-1.0.2.tgz#dc1896d764452b1bd9707eb9aa99ccfbb30bd1c0" + integrity sha512-IRNbimrmfb75GMNEjyznqM1tkI7HrZOf14njX7tCAAUetyZM1Pr8hX/EK2lxBCOgWDRmigbp24fD1hdMfQK5lw== + +"@discordjs/ws@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@discordjs/ws/-/ws-1.0.2.tgz#3933b12d4686aabf6a95dfe5fb6e744342a661d1" + integrity sha512-+XI82Rm2hKnFwAySXEep4A7Kfoowt6weO6381jgW+wVdTpMS/56qCvoXyFRY0slcv7c/U8My2PwIB2/wEaAh7Q== + dependencies: + "@discordjs/collection" "^2.0.0" + "@discordjs/rest" "^2.1.0" + "@discordjs/util" "^1.0.2" + "@sapphire/async-queue" "^1.5.0" + "@types/ws" "^8.5.9" + "@vladfrangu/async_event_emitter" "^2.2.2" + discord-api-types "0.37.61" + tslib "^2.6.2" + ws "^8.14.2" + +"@fastify/busboy@^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff" + integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== + +"@sapphire/async-queue@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.0.tgz#2f255a3f186635c4fb5a2381e375d3dfbc5312d8" + integrity sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA== + +"@sapphire/shapeshift@^3.9.3": + version "3.9.3" + resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-3.9.3.tgz#89d26713044bc21cc5e0845e61a8a328ca3c1a84" + integrity sha512-WzKJSwDYloSkHoBbE8rkRW8UNKJiSRJ/P8NqJ5iVq7U2Yr/kriIBx2hW+wj2Z5e5EnXL1hgYomgaFsdK6b+zqQ== + dependencies: + fast-deep-equal "^3.1.3" + lodash "^4.17.21" + +"@sapphire/snowflake@3.5.1", "@sapphire/snowflake@^3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.1.tgz#254521c188b49e8b2d4cc048b475fb2b38737fec" + integrity sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA== + +"@types/node@*": + version "20.10.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.0.tgz#16ddf9c0a72b832ec4fcce35b8249cf149214617" + integrity sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ== + dependencies: + undici-types "~5.26.4" + +"@types/ws@8.5.9": + version "8.5.9" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.9.tgz#384c489f99c83225a53f01ebc3eddf3b8e202a8c" + integrity sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg== + dependencies: + "@types/node" "*" + +"@types/ws@^8.5.9": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + dependencies: + "@types/node" "*" + +"@vladfrangu/async_event_emitter@^2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.2.tgz#84c5a3f8d648842cec5cc649b88df599af32ed88" + integrity sha512-HIzRG7sy88UZjBJamssEczH5q7t5+axva19UbZLO6u0ySbYPrwzWiXBcC0WuHyhKKoeCyneH+FvYzKQq/zTtkQ== + +discord-api-types@0.37.61: + version "0.37.61" + resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.61.tgz#9dd8e58c624237e6f1b23be2d29579af268b8c5b" + integrity sha512-o/dXNFfhBpYHpQFdT6FWzeO7pKc838QeeZ9d91CfVAtpr5XLK4B/zYxQbYgPdoMiTDvJfzcsLW5naXgmHGDNXw== + +discord.js@^14.14.1: + version "14.14.1" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.14.1.tgz#9a2bea23bba13819705ab87612837610abce9ee3" + integrity sha512-/hUVzkIerxKHyRKopJy5xejp4MYKDPTszAnpYxzVVv4qJYf+Tkt+jnT2N29PIPschicaEEpXwF2ARrTYHYwQ5w== + dependencies: + "@discordjs/builders" "^1.7.0" + "@discordjs/collection" "1.5.3" + "@discordjs/formatters" "^0.3.3" + "@discordjs/rest" "^2.1.0" + "@discordjs/util" "^1.0.2" + "@discordjs/ws" "^1.0.2" + "@sapphire/snowflake" "3.5.1" + "@types/ws" "8.5.9" + discord-api-types "0.37.61" + fast-deep-equal "3.1.3" + lodash.snakecase "4.1.1" + tslib "2.6.2" + undici "5.27.2" + ws "8.14.2" + +fast-deep-equal@3.1.3, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +lodash.snakecase@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +magic-bytes.js@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.5.0.tgz#f5531ca53e1c8dab5692b8dcfb360f7ca6c6b6bc" + integrity sha512-wJkXvutRbNWcc37tt5j1HyOK1nosspdh3dj6LUYYAvF6JYNqs53IfRvK9oEpcwiDA1NdoIi64yAMfdivPeVAyw== + +ts-mixer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.3.tgz#69bd50f406ff39daa369885b16c77a6194c7cae6" + integrity sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ== + +tslib@2.6.2, tslib@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici@5.27.2: + version "5.27.2" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.27.2.tgz#a270c563aea5b46cc0df2550523638c95c5d4411" + integrity sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ== + dependencies: + "@fastify/busboy" "^2.0.0" + +ws@8.14.2, ws@^8.14.2: + version "8.14.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==