From e2b5134318ef8be33f6c5385319f8f8b7d7a5a78 Mon Sep 17 00:00:00 2001 From: Christina Noppakao Bye Date: Mon, 27 Apr 2026 10:41:58 +0200 Subject: [PATCH 1/3] Add passwordbank task seed --- .../bootstrap/tasks/PassordbankenTaskSeeds.kt | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/main/kotlin/edu/ntnu/idi/idatt/backend/bootstrap/tasks/PassordbankenTaskSeeds.kt b/src/main/kotlin/edu/ntnu/idi/idatt/backend/bootstrap/tasks/PassordbankenTaskSeeds.kt index f06d2044..2c07e9c4 100644 --- a/src/main/kotlin/edu/ntnu/idi/idatt/backend/bootstrap/tasks/PassordbankenTaskSeeds.kt +++ b/src/main/kotlin/edu/ntnu/idi/idatt/backend/bootstrap/tasks/PassordbankenTaskSeeds.kt @@ -91,4 +91,44 @@ internal fun passordbankenTaskSeeds(): List = "A long phrase can be a good choice.", ), ), + SeedTask( + difficultyLevel = 4, + taskType = TaskType.PASSWORD_EVALUATION, + title = localized( + "Passordbanken 4: Lag et sterkt passord", + "Password Bank 4: Build a strong password", + ), + introText = localizedOptional( + "Lag et passord som klarer alle reglene.", + "Create a password that passes all the rules.", + ), + items = listOf( + SeedItem( + itemOrder = 1, + promptText = localized( + "Skriv et passord med minst 10 tegn, stor bokstav, liten bokstav, tall og spesialtegn.", + "Create a password with at least 10 characters, an uppercase letter, a lowercase letter, a number, and a special character.", + ), + metadataJson = """{"role":"passwordBuilder","passOptionOrder":1,"failOptionOrder":2}""", + options = listOf( + explainedOption( + 1, + "Godkjent", + "Approved", + true, + "Passordet oppfyller alle reglene.", + "The password meets all the rules.", + ), + explainedOption( + 2, + "Ikke godkjent ennå", + "Not approved yet", + false, + "Passordet mangler fortsatt ett eller flere krav.", + "The password is still missing one or more requirements.", + ), + ), + ), + ), + ) ) From 56e0d499e3d512bfc23303afce00e6ba0fb33173 Mon Sep 17 00:00:00 2001 From: Christina Noppakao Bye Date: Tue, 28 Apr 2026 08:21:02 +0200 Subject: [PATCH 2/3] Add socialmarketplace task seed --- .../DenSosialeMarkedsplassenTaskSeeds.kt | 221 +++++++++++++----- 1 file changed, 167 insertions(+), 54 deletions(-) diff --git a/src/main/kotlin/edu/ntnu/idi/idatt/backend/bootstrap/tasks/DenSosialeMarkedsplassenTaskSeeds.kt b/src/main/kotlin/edu/ntnu/idi/idatt/backend/bootstrap/tasks/DenSosialeMarkedsplassenTaskSeeds.kt index c693f49e..1334ae66 100644 --- a/src/main/kotlin/edu/ntnu/idi/idatt/backend/bootstrap/tasks/DenSosialeMarkedsplassenTaskSeeds.kt +++ b/src/main/kotlin/edu/ntnu/idi/idatt/backend/bootstrap/tasks/DenSosialeMarkedsplassenTaskSeeds.kt @@ -2,12 +2,16 @@ package edu.ntnu.idi.idatt.backend.bootstrap import edu.ntnu.idi.idatt.backend.game.tasks.domain.TaskType +private const val SCENARIO_ITEM_ORDER = 1 + internal fun denSosialeMarkedsplassenTaskSeeds(): List = listOf( - binaryChoiceTask( + socialScenarioTask( difficultyLevel = 1, - taskType = TaskType.SOCIAL_SCENARIO, - title = localized("Den sosiale markedsplassen 1: Tenk før du deler", "Social Marketplace 1: Think before sharing"), + title = localized( + "Den sosiale markedsplassen 1: Tenk før du deler", + "Social Marketplace 1: Think before sharing", + ), introText = localizedOptional( "Ikke alt som deles av venner, er sant.", "Not everything shared by friends is true.", @@ -16,27 +20,48 @@ internal fun denSosialeMarkedsplassenTaskSeeds(): List = "Hva er smartest å gjøre før du deler en dramatisk melding videre?", "What is smartest to do before sharing a dramatic message?", ), - correctOption = explainedOption( - 1, - "Sjekke hvor meldingen kommer fra og om andre kilder sier det samme.", - "Check where the message comes from and whether other sources say the same thing.", - true, - "Det hjelper deg å stoppe rykter før de sprer seg.", - "That helps you stop rumors before they spread.", - ), - incorrectOption = explainedOption( - 2, - "Dele den raskt fordi mange andre allerede har gjort det.", - "Share it quickly because many others have already done it.", - false, - "At mange deler noe, betyr ikke at det er sant.", - "Just because many people share something does not make it true.", + options = listOf( + explainedOption( + 1, + "Dele videre med én gang.", + "Share immediately.", + false, + "Det kan spre feilinformasjon.", + "That can spread misinformation.", + ), + explainedOption( + 2, + "Vente og se om flere deler.", + "Wait and see if more people share.", + false, + "Det er bedre å sjekke først.", + "It is better to check first.", + ), + explainedOption( + 3, + "Sjekke kilder eller spørre en voksen.", + "Check sources or ask an adult.", + true, + "Riktig! Da unngår du å spre rykter.", + "Correct! You avoid spreading rumors.", + ), + explainedOption( + 4, + "Ignorere meldingen.", + "Ignore the message.", + false, + "Det kan være lurt å sjekke først, særlig hvis meldingen kan påvirke andre.", + "It can be smart to check first, especially if the message may affect others.", + ), ), ), - binaryChoiceTask( + + socialScenarioTask( difficultyLevel = 2, - taskType = TaskType.SOCIAL_SCENARIO, - title = localized("Den sosiale markedsplassen 2: Følelser kan lure", "Social Marketplace 2: Feelings can mislead"), + title = localized( + "Den sosiale markedsplassen 2: Følelser kan lure", + "Social Marketplace 2: Feelings can mislead", + ), introText = localizedOptional( "Sterke følelser kan gjøre at vi glemmer å tenke kritisk.", "Strong feelings can make us forget to think critically.", @@ -45,27 +70,48 @@ internal fun denSosialeMarkedsplassenTaskSeeds(): List = "Hvilken melding prøver mest å manipulere følelsene dine?", "Which message tries hardest to manipulate your feelings?", ), - correctOption = explainedOption( - 1, - "Hvis du bryr deg om vennene dine, må du dele dette akkurat nå!", - "If you care about your friends, you must share this right now!", - true, - "Den bruker skyldfølelse og hastverk for å presse deg.", - "It uses guilt and urgency to pressure you.", - ), - incorrectOption = explainedOption( - 2, - "Se denne informasjonen og tenk over om den virker troverdig.", - "Look at this information and think about whether it seems trustworthy.", - false, - "Den prøver ikke å presse deg følelsesmessig.", - "It does not try to pressure you emotionally.", + options = listOf( + explainedOption( + 1, + "Hvis du bryr deg om vennene dine, må du dele dette akkurat nå!", + "If you care about your friends, you must share this right now!", + true, + "Den bruker skyldfølelse og hastverk for å presse deg.", + "It uses guilt and urgency to pressure you.", + ), + explainedOption( + 2, + "Her er en kilde. Les selv og tenk over om det virker troverdig.", + "Here is a source. Read it yourself and think about whether it seems trustworthy.", + false, + "Denne meldingen prøver ikke å presse deg følelsesmessig.", + "This message does not try to pressure you emotionally.", + ), + explainedOption( + 3, + "Jeg er usikker på om dette stemmer. Kan noen sjekke?", + "I am unsure whether this is true. Can someone check?", + false, + "Denne meldingen oppfordrer til å undersøke, ikke til panikk.", + "This message encourages checking, not panic.", + ), + explainedOption( + 4, + "Dette kan være viktig, men vi bør vente på mer informasjon.", + "This may be important, but we should wait for more information.", + false, + "Denne meldingen demper hastverk i stedet for å skape press.", + "This message reduces urgency instead of creating pressure.", + ), ), ), - binaryChoiceTask( + + socialScenarioTask( difficultyLevel = 3, - taskType = TaskType.SOCIAL_SCENARIO, - title = localized("Den sosiale markedsplassen 3: Stå imot gruppepress", "Social Marketplace 3: Resist peer pressure"), + title = localized( + "Den sosiale markedsplassen 3: Stå imot gruppepress", + "Social Marketplace 3: Resist peer pressure", + ), introText = localizedOptional( "Venner kan ta feil. Det er lov å stoppe opp.", "Friends can be wrong. It is okay to pause.", @@ -74,21 +120,88 @@ internal fun denSosialeMarkedsplassenTaskSeeds(): List = "Hva er den beste reaksjonen når alle andre sier at et rykte må være sant?", "What is the best response when everyone else says a rumor must be true?", ), - correctOption = explainedOption( - 1, - "Be om kilde og vente med å dele til du vet mer.", - "Ask for a source and wait to share until you know more.", - true, - "Du trenger ikke følge gruppa når informasjonen er usikker.", - "You do not have to follow the group when the information is uncertain.", - ), - incorrectOption = explainedOption( - 2, - "Stole på ryktet fordi så mange mener det samme.", - "Trust the rumor because so many people agree.", - false, - "Mange like meninger er ikke det samme som bevis.", - "Many matching opinions are not the same as evidence.", + options = listOf( + explainedOption( + 1, + "Be om kilde og vente med å dele til du vet mer.", + "Ask for a source and wait to share until you know more.", + true, + "Du trenger ikke følge gruppa når informasjonen er usikker.", + "You do not have to follow the group when the information is uncertain.", + ), + explainedOption( + 2, + "Stole på ryktet fordi så mange mener det samme.", + "Trust the rumor because so many people agree.", + false, + "Mange like meninger er ikke det samme som bevis.", + "Many matching opinions are not the same as evidence.", + ), + explainedOption( + 3, + "Dele ryktet, men skrive at du ikke vet om det stemmer.", + "Share the rumor, but write that you do not know if it is true.", + false, + "Da sprer du fortsatt usikker informasjon videre.", + "Then you are still spreading uncertain information.", + ), + explainedOption( + 4, + "Trykke liker, men ikke si noe.", + "Like the post, but say nothing.", + false, + "Å like kan også bidra til at ryktet spres mer.", + "Liking can also help the rumor spread further.", + ), ), ), ) + +private fun socialScenarioTask( + difficultyLevel: Int, + title: LocalizedText, + introText: LocalizedOptionalText?, + promptText: LocalizedText, + options: List, +): SeedTask = + SeedTask( + difficultyLevel = difficultyLevel, + taskType = TaskType.SOCIAL_SCENARIO, + title = title, + introText = introText, + items = listOf( + SeedItem( + itemOrder = SCENARIO_ITEM_ORDER, + promptText = promptText, + metadataJson = """ + { + "role": "socialScenarioChoice", + "actions": [ + { + "order": 1, + "label": { + "nb": "Del", + "en": "Share" + } + }, + { + "order": 2, + "label": { + "nb": "Kommenter", + "en": "Comment" + } + }, + { + "order": 3, + "label": { + "nb": "Sjekk kilder", + "en": "Check sources" + } + } + ] + } + """.trimIndent(), + options = options, + ), + ), + ) \ No newline at end of file From ebf06ac19b9f6546919e95e555fc91cfda1d9d4e Mon Sep 17 00:00:00 2001 From: Christina Noppakao Bye Date: Tue, 28 Apr 2026 13:56:32 +0200 Subject: [PATCH 3/3] Fix formatting --- .../DenSosialeMarkedsplassenTaskSeeds.kt | 332 +++++++++--------- 1 file changed, 172 insertions(+), 160 deletions(-) diff --git a/src/main/kotlin/edu/ntnu/idi/idatt/backend/bootstrap/tasks/DenSosialeMarkedsplassenTaskSeeds.kt b/src/main/kotlin/edu/ntnu/idi/idatt/backend/bootstrap/tasks/DenSosialeMarkedsplassenTaskSeeds.kt index 4182bc6e..7c2febd7 100644 --- a/src/main/kotlin/edu/ntnu/idi/idatt/backend/bootstrap/tasks/DenSosialeMarkedsplassenTaskSeeds.kt +++ b/src/main/kotlin/edu/ntnu/idi/idatt/backend/bootstrap/tasks/DenSosialeMarkedsplassenTaskSeeds.kt @@ -8,152 +8,162 @@ internal fun denSosialeMarkedsplassenTaskSeeds(): List = listOf( socialScenarioTask( difficultyLevel = 1, - title = localized( - "Den sosiale markedsplassen 1: Tenk før du deler", - "Social Marketplace 1: Think before sharing", - ), - introText = localizedOptional( - "Ikke alt som deles av venner, er sant.", - "Not everything shared by friends is true.", - ), - promptText = localized( - "Hva er smartest å gjøre før du deler en dramatisk melding videre?", - "What is smartest to do before sharing a dramatic message?", - ), - options = listOf( - explainedOption( - 1, - "Dele videre med én gang.", - "Share immediately.", - false, - "Det kan spre feilinformasjon.", - "That can spread misinformation.", + title = + localized( + "Den sosiale markedsplassen 1: Tenk før du deler", + "Social Marketplace 1: Think before sharing", ), - explainedOption( - 2, - "Vente og se om flere deler.", - "Wait and see if more people share.", - false, - "Det er bedre å sjekke først.", - "It is better to check first.", + introText = + localizedOptional( + "Ikke alt som deles av venner, er sant.", + "Not everything shared by friends is true.", ), - explainedOption( - 3, - "Sjekke kilder eller spørre en voksen.", - "Check sources or ask an adult.", - true, - "Riktig! Da unngår du å spre rykter.", - "Correct! You avoid spreading rumors.", + promptText = + localized( + "Hva er smartest å gjøre før du deler en dramatisk melding videre?", + "What is smartest to do before sharing a dramatic message?", ), - explainedOption( - 4, - "Ignorere meldingen.", - "Ignore the message.", - false, - "Det kan være lurt å sjekke først, særlig hvis meldingen kan påvirke andre.", - "It can be smart to check first, especially if the message may affect others.", + options = + listOf( + explainedOption( + 1, + "Dele videre med én gang.", + "Share immediately.", + false, + "Det kan spre feilinformasjon.", + "That can spread misinformation.", + ), + explainedOption( + 2, + "Vente og se om flere deler.", + "Wait and see if more people share.", + false, + "Det er bedre å sjekke først.", + "It is better to check first.", + ), + explainedOption( + 3, + "Sjekke kilder eller spørre en voksen.", + "Check sources or ask an adult.", + true, + "Riktig! Da unngår du å spre rykter.", + "Correct! You avoid spreading rumors.", + ), + explainedOption( + 4, + "Ignorere meldingen.", + "Ignore the message.", + false, + "Det kan være lurt å sjekke først, særlig hvis meldingen kan påvirke andre.", + "It can be smart to check first, especially if the message may affect others.", + ), ), - ), ), - socialScenarioTask( difficultyLevel = 2, - title = localized( - "Den sosiale markedsplassen 2: Følelser kan lure", - "Social Marketplace 2: Feelings can mislead", - ), - introText = localizedOptional( - "Sterke følelser kan gjøre at vi glemmer å tenke kritisk.", - "Strong feelings can make us forget to think critically.", - ), - promptText = localized( - "Hvilken melding prøver mest å manipulere følelsene dine?", - "Which message tries hardest to manipulate your feelings?", - ), - options = listOf( - explainedOption( - 1, - "Hvis du bryr deg om vennene dine, må du dele dette akkurat nå!", - "If you care about your friends, you must share this right now!", - true, - "Den bruker skyldfølelse og hastverk for å presse deg.", - "It uses guilt and urgency to pressure you.", + title = + localized( + "Den sosiale markedsplassen 2: Følelser kan lure", + "Social Marketplace 2: Feelings can mislead", ), - explainedOption( - 2, - "Her er en kilde. Les selv og tenk over om det virker troverdig.", - "Here is a source. Read it yourself and think about whether it seems trustworthy.", - false, - "Denne meldingen prøver ikke å presse deg følelsesmessig.", - "This message does not try to pressure you emotionally.", + introText = + localizedOptional( + "Sterke følelser kan gjøre at vi glemmer å tenke kritisk.", + "Strong feelings can make us forget to think critically.", ), - explainedOption( - 3, - "Jeg er usikker på om dette stemmer. Kan noen sjekke?", - "I am unsure whether this is true. Can someone check?", - false, - "Denne meldingen oppfordrer til å undersøke, ikke til panikk.", - "This message encourages checking, not panic.", + promptText = + localized( + "Hvilken melding prøver mest å manipulere følelsene dine?", + "Which message tries hardest to manipulate your feelings?", ), - explainedOption( - 4, - "Dette kan være viktig, men vi bør vente på mer informasjon.", - "This may be important, but we should wait for more information.", - false, - "Denne meldingen demper hastverk i stedet for å skape press.", - "This message reduces urgency instead of creating pressure.", + options = + listOf( + explainedOption( + 1, + "Hvis du bryr deg om vennene dine, må du dele dette akkurat nå!", + "If you care about your friends, you must share this right now!", + true, + "Den bruker skyldfølelse og hastverk for å presse deg.", + "It uses guilt and urgency to pressure you.", + ), + explainedOption( + 2, + "Her er en kilde. Les selv og tenk over om det virker troverdig.", + "Here is a source. Read it yourself and think about whether it seems trustworthy.", + false, + "Denne meldingen prøver ikke å presse deg følelsesmessig.", + "This message does not try to pressure you emotionally.", + ), + explainedOption( + 3, + "Jeg er usikker på om dette stemmer. Kan noen sjekke?", + "I am unsure whether this is true. Can someone check?", + false, + "Denne meldingen oppfordrer til å undersøke, ikke til panikk.", + "This message encourages checking, not panic.", + ), + explainedOption( + 4, + "Dette kan være viktig, men vi bør vente på mer informasjon.", + "This may be important, but we should wait for more information.", + false, + "Denne meldingen demper hastverk i stedet for å skape press.", + "This message reduces urgency instead of creating pressure.", + ), ), - ), ), - socialScenarioTask( difficultyLevel = 3, - title = localized( - "Den sosiale markedsplassen 3: Stå imot gruppepress", - "Social Marketplace 3: Resist peer pressure", - ), - introText = localizedOptional( - "Venner kan ta feil. Det er lov å stoppe opp.", - "Friends can be wrong. It is okay to pause.", - ), - promptText = localized( - "Hva er den beste reaksjonen når alle andre sier at et rykte må være sant?", - "What is the best response when everyone else says a rumor must be true?", - ), - options = listOf( - explainedOption( - 1, - "Be om kilde og vente med å dele til du vet mer.", - "Ask for a source and wait to share until you know more.", - true, - "Du trenger ikke følge gruppa når informasjonen er usikker.", - "You do not have to follow the group when the information is uncertain.", + title = + localized( + "Den sosiale markedsplassen 3: Stå imot gruppepress", + "Social Marketplace 3: Resist peer pressure", ), - explainedOption( - 2, - "Stole på ryktet fordi så mange mener det samme.", - "Trust the rumor because so many people agree.", - false, - "Mange like meninger er ikke det samme som bevis.", - "Many matching opinions are not the same as evidence.", + introText = + localizedOptional( + "Venner kan ta feil. Det er lov å stoppe opp.", + "Friends can be wrong. It is okay to pause.", ), - explainedOption( - 3, - "Dele ryktet, men skrive at du ikke vet om det stemmer.", - "Share the rumor, but write that you do not know if it is true.", - false, - "Da sprer du fortsatt usikker informasjon videre.", - "Then you are still spreading uncertain information.", + promptText = + localized( + "Hva er den beste reaksjonen når alle andre sier at et rykte må være sant?", + "What is the best response when everyone else says a rumor must be true?", ), - explainedOption( - 4, - "Trykke liker, men ikke si noe.", - "Like the post, but say nothing.", - false, - "Å like kan også bidra til at ryktet spres mer.", - "Liking can also help the rumor spread further.", + options = + listOf( + explainedOption( + 1, + "Be om kilde og vente med å dele til du vet mer.", + "Ask for a source and wait to share until you know more.", + true, + "Du trenger ikke følge gruppa når informasjonen er usikker.", + "You do not have to follow the group when the information is uncertain.", + ), + explainedOption( + 2, + "Stole på ryktet fordi så mange mener det samme.", + "Trust the rumor because so many people agree.", + false, + "Mange like meninger er ikke det samme som bevis.", + "Many matching opinions are not the same as evidence.", + ), + explainedOption( + 3, + "Dele ryktet, men skrive at du ikke vet om det stemmer.", + "Share the rumor, but write that you do not know if it is true.", + false, + "Da sprer du fortsatt usikker informasjon videre.", + "Then you are still spreading uncertain information.", + ), + explainedOption( + 4, + "Trykke liker, men ikke si noe.", + "Like the post, but say nothing.", + false, + "Å like kan også bidra til at ryktet spres mer.", + "Liking can also help the rumor spread further.", + ), ), - ), ), ) @@ -169,39 +179,41 @@ private fun socialScenarioTask( taskType = TaskType.SOCIAL_SCENARIO, title = title, introText = introText, - items = listOf( - SeedItem( - itemOrder = SCENARIO_ITEM_ORDER, - promptText = promptText, - metadataJson = """ - { - "role": "socialScenarioChoice", - "actions": [ + items = + listOf( + SeedItem( + itemOrder = SCENARIO_ITEM_ORDER, + promptText = promptText, + metadataJson = + """ { - "order": 1, - "label": { - "nb": "Del", - "en": "Share" - } - }, - { - "order": 2, - "label": { - "nb": "Kommenter", - "en": "Comment" - } - }, - { - "order": 3, - "label": { - "nb": "Sjekk kilder", - "en": "Check sources" - } + "role": "socialScenarioChoice", + "actions": [ + { + "order": 1, + "label": { + "nb": "Del", + "en": "Share" + } + }, + { + "order": 2, + "label": { + "nb": "Kommenter", + "en": "Comment" + } + }, + { + "order": 3, + "label": { + "nb": "Sjekk kilder", + "en": "Check sources" + } + } + ] } - ] - } - """.trimIndent(), - options = options, + """.trimIndent(), + options = options, + ), ), - ), )