From fd61ade916a9d731326394104772470e6789fd59 Mon Sep 17 00:00:00 2001 From: "Jyotirmoy Bandyopadhyaya [Bravo68]" Date: Mon, 22 Jan 2024 06:27:18 +0530 Subject: [PATCH 1/2] feat: added first blood notifications to discord --- apps/desktop/package.json | 1 - packages/api/config/env.ts | 1 + packages/api/helpers/notifyBlood.ts | 43 +++++++++++++++++++++ packages/api/services/challenges.service.ts | 37 +++++++++++++++++- 4 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 packages/api/helpers/notifyBlood.ts diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 159d1cc..a9ebbfa 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -4,7 +4,6 @@ "version": "0.1.0", "type": "module", "scripts": { - "dev": "tauri dev", "tauri": "tauri" }, "devDependencies": { diff --git a/packages/api/config/env.ts b/packages/api/config/env.ts index b8d5ea0..0479461 100644 --- a/packages/api/config/env.ts +++ b/packages/api/config/env.ts @@ -17,6 +17,7 @@ const ZodEnvironmentVariables = z.object({ MAIL_LOGGER: z.string(), MAIL_FROM_EMAIL: z.string(), MAIL_FROM_NAME: z.string(), + DISCORD_BLOOD_HOOK: z.string(), }); ZodEnvironmentVariables.parse(process.env); diff --git a/packages/api/helpers/notifyBlood.ts b/packages/api/helpers/notifyBlood.ts new file mode 100644 index 0000000..2bc093b --- /dev/null +++ b/packages/api/helpers/notifyBlood.ts @@ -0,0 +1,43 @@ +import axios from "axios"; + +export const notifyForBlood = async ( + { + teamName, + challengeName, + }: { + teamName: string; + challengeName: string; + } +) => { + try { + const res = await axios.post(process.env.DISCORD_BLOOD_HOOK, { + content: "@here", + tts: false, + embeds: [ + { + id: Date.now().toString(), + description: "", + fields: [], + title: `🎉 ${teamName} owned first blood 🩸 for ${challengeName}`, + color: 7_782_594, + footer: { + icon_url: "https://rcs.encryptedge.in/logo.png", + text: "eeCTF" + }, + author: { + name: "RCS CTF 2024" + } + } + ], + components: [], + actions: {}, + username: "eeCTF Blood Notify" + } + ); + return res.data; + } catch (error) { + if(error instanceof Error) { + throw new TypeError(error.message); + } +} +}; diff --git a/packages/api/services/challenges.service.ts b/packages/api/services/challenges.service.ts index 5aef460..e442de1 100644 --- a/packages/api/services/challenges.service.ts +++ b/packages/api/services/challenges.service.ts @@ -3,9 +3,19 @@ import { SnowflakeId } from "hyperflake"; import { Challenges_Insert_Input, Machines_Insert_Input, Mutation_Root, Query_Root } from "../graphql/types"; import { client } from "../helpers/gqlClient"; +import { notifyForBlood } from "../helpers/notifyBlood"; const snowflake = SnowflakeId(); +interface IBloodCheck extends Query_Root { + blood_check: { + challenge_id: string; + submission: { + submited_flag: string; + }; + }[]; +} + export class ChallengeService { public createMachineS = async (reqBody: IMachineCreateInput) => { try { @@ -164,6 +174,7 @@ export class ChallengeService { public submitFlagS = async (reqBody: IMachineSubmitFlagInput) => { try { + let is_blood_aquired = false; const { challenge_id, submited_flag, team_id, user_id } = reqBody; if (!challenge_id || !submited_flag || !team_id || !user_id) { @@ -175,14 +186,25 @@ export class ChallengeService { scores(where: {challenge_id: {_eq: $challenge_id}, team_id: { _eq: $team_id }}) { id } + + blood_check: scores(where: {challenge_id: {_eq: $challenge_id}}) { + challenge_id + submission { + submited_flag + } + } } `; - const { scores } : Query_Root = await client.request(queryPreCheck, { + const { scores, blood_check } : IBloodCheck = await client.request(queryPreCheck, { challenge_id, team_id, }); + if(blood_check.length > 0){ + is_blood_aquired = true; + } + if(scores.length > 0){ throw new Error("Already solved"); } @@ -236,6 +258,12 @@ export class ChallengeService { id team_id user_id + team { + name + } + challenge { + name + } } } `; @@ -252,6 +280,13 @@ export class ChallengeService { throw new Error("Failed to submit score"); } + if(!is_blood_aquired){ + notifyForBlood({ + teamName: insert_scores_one.team.name, + challengeName: insert_scores_one.challenge.name, + }); + } + return { message: "GG!" }; From ef9bb4b35830a62dfc2240619d16ac7987a246ba Mon Sep 17 00:00:00 2001 From: "Jyotirmoy Bandyopadhyaya [Bravo68]" Date: Mon, 22 Jan 2024 06:33:59 +0530 Subject: [PATCH 2/2] fix: merge fix --- packages/api/package.json | 1 + packages/api/services/challenges.service.ts | 6 +-- pnpm-lock.yaml | 45 +++++++++++---------- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index 639a5e8..7786039 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -31,6 +31,7 @@ "@graphql-codegen/typescript-operations": "^4.0.1", "@hono/node-server": "^1.3.2", "@upstash/redis": "^1.28.1", + "axios": "^1.6.2", "dotenv": "^16.3.1", "eslint": "^8.53.0", "graphql-request": "^6.1.0", diff --git a/packages/api/services/challenges.service.ts b/packages/api/services/challenges.service.ts index 63a75e3..390bf50 100644 --- a/packages/api/services/challenges.service.ts +++ b/packages/api/services/challenges.service.ts @@ -404,10 +404,8 @@ export class ChallengeService { for (const machine of challengeCollection) { if(machine.depends_on) { const depends_on_machine = challengeCollection.find(challenge => challenge.id === machine.depends_on); - if(depends_on_machine) { - if(depends_on_machine.challenges?.length !== depends_on_machine.total_challenges) { - challengeCollection.splice(challengeCollection.indexOf(machine), 1); - } + if(depends_on_machine && depends_on_machine.challenges?.length !== depends_on_machine.total_challenges) { + challengeCollection.splice(challengeCollection.indexOf(machine), 1); } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 212ba36..ccc109a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,7 +28,7 @@ importers: version: 3.1.0 turbo: specifier: latest - version: 1.10.14 + version: 1.11.3 apps/desktop: devDependencies: @@ -99,6 +99,9 @@ importers: '@upstash/redis': specifier: ^1.28.1 version: 1.28.1 + axios: + specifier: ^1.6.2 + version: 1.6.2 dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -7677,64 +7680,64 @@ packages: typescript: 5.3.3 dev: true - /turbo-darwin-64@1.10.14: - resolution: {integrity: sha512-I8RtFk1b9UILAExPdG/XRgGQz95nmXPE7OiGb6ytjtNIR5/UZBS/xVX/7HYpCdmfriKdVwBKhalCoV4oDvAGEg==} + /turbo-darwin-64@1.11.3: + resolution: {integrity: sha512-IsOOg2bVbIt3o/X8Ew9fbQp5t1hTHN3fGNQYrPQwMR2W1kIAC6RfbVD4A9OeibPGyEPUpwOH79hZ9ydFH5kifw==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-darwin-arm64@1.10.14: - resolution: {integrity: sha512-KAdUWryJi/XX7OD0alOuOa0aJ5TLyd4DNIYkHPHYcM6/d7YAovYvxRNwmx9iv6Vx6IkzTnLeTiUB8zy69QkG9Q==} + /turbo-darwin-arm64@1.11.3: + resolution: {integrity: sha512-FsJL7k0SaPbJzI/KCnrf/fi3PgCDCjTliMc/kEFkuWVA6Httc3Q4lxyLIIinz69q6JTx8wzh6yznUMzJRI3+dg==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-linux-64@1.10.14: - resolution: {integrity: sha512-BOBzoREC2u4Vgpap/WDxM6wETVqVMRcM8OZw4hWzqCj2bqbQ6L0wxs1LCLWVrghQf93JBQtIGAdFFLyCSBXjWQ==} + /turbo-linux-64@1.11.3: + resolution: {integrity: sha512-SvW7pvTVRGsqtSkII5w+wriZXvxqkluw5FO/MNAdFw0qmoov+PZ237+37/NgArqE3zVn1GX9P6nUx9VO+xcQAg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-arm64@1.10.14: - resolution: {integrity: sha512-D8T6XxoTdN5D4V5qE2VZG+/lbZX/89BkAEHzXcsSUTRjrwfMepT3d2z8aT6hxv4yu8EDdooZq/2Bn/vjMI32xw==} + /turbo-linux-arm64@1.11.3: + resolution: {integrity: sha512-YhUfBi1deB3m+3M55X458J6B7RsIS7UtM3P1z13cUIhF+pOt65BgnaSnkHLwETidmhRh8Dl3GelaQGrB3RdCDw==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-windows-64@1.10.14: - resolution: {integrity: sha512-zKNS3c1w4i6432N0cexZ20r/aIhV62g69opUn82FLVs/zk3Ie0GVkSB6h0rqIvMalCp7enIR87LkPSDGz9K4UA==} + /turbo-windows-64@1.11.3: + resolution: {integrity: sha512-s+vEnuM2TiZuAUUUpmBHDr6vnNbJgj+5JYfnYmVklYs16kXh+EppafYQOAkcRIMAh7GjV3pLq5/uGqc7seZeHA==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /turbo-windows-arm64@1.10.14: - resolution: {integrity: sha512-rkBwrTPTxNSOUF7of8eVvvM+BkfkhA2OvpHM94if8tVsU+khrjglilp8MTVPHlyS9byfemPAmFN90oRIPB05BA==} + /turbo-windows-arm64@1.11.3: + resolution: {integrity: sha512-ZR5z5Zpc7cASwfdRAV5yNScCZBsgGSbcwiA/u3farCacbPiXsfoWUkz28iyrx21/TRW0bi6dbsB2v17swa8bjw==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /turbo@1.10.14: - resolution: {integrity: sha512-hr9wDNYcsee+vLkCDIm8qTtwhJ6+UAMJc3nIY6+PNgUTtXcQgHxCq8BGoL7gbABvNWv76CNbK5qL4Lp9G3ZYRA==} + /turbo@1.11.3: + resolution: {integrity: sha512-RCJOUFcFMQNIGKSjC9YmA5yVP1qtDiBA0Lv9VIgrXraI5Da1liVvl3VJPsoDNIR9eFMyA/aagx1iyj6UWem5hA==} hasBin: true optionalDependencies: - turbo-darwin-64: 1.10.14 - turbo-darwin-arm64: 1.10.14 - turbo-linux-64: 1.10.14 - turbo-linux-arm64: 1.10.14 - turbo-windows-64: 1.10.14 - turbo-windows-arm64: 1.10.14 + turbo-darwin-64: 1.11.3 + turbo-darwin-arm64: 1.11.3 + turbo-linux-64: 1.11.3 + turbo-linux-arm64: 1.11.3 + turbo-windows-64: 1.11.3 + turbo-windows-arm64: 1.11.3 dev: true /type-check@0.4.0: