diff --git a/all_groups.json b/all_groups.json new file mode 100644 index 0000000..ac8512d --- /dev/null +++ b/all_groups.json @@ -0,0 +1,600 @@ +{ + "_0": "This is a file containing all groups slugs from https://cri.epita.fr/api/v2/groups/", + "_1": "It was generated using CriApi.get_all_groups()", + "groups": [ + "administratives-site-directors", + "administratives", + "asso-prologin", + "asso-responsable", + "auditors", + "bocal", + "cri-olds", + "cri-roots", + "cri-service-accounts", + "cri-students", + "cri", + "cyber-cyb1-prs", + "cyber-cyb1-s1-prs", + "cyber-cyb1-s1", + "cyber-cyb1-s2-prs", + "cyber-cyb1-s2", + "cyber-cyb1", + "cyber-cyb2-prs", + "cyber-cyb2-s3-prs", + "cyber-cyb2-s3", + "cyber-cyb2-s4-prs", + "cyber-cyb2-s4", + "cyber-cyb2", + "cyber-cyb3-prs", + "cyber-cyb3-s5-prs", + "cyber-cyb3-s5", + "cyber-cyb3-s6-prs", + "cyber-cyb3-s6", + "cyber-cyb3", + "cyber-scolarite", + "cyber", + "department-cip", + "department-cri-manager", + "department-dg", + "department-forge-employees", + "department-forge-managers", + "exp-m1-prs", + "exp-m1-s5-prs-representatives", + "exp-m1-s5-prs", + "exp-m1-s5", + "exp-m1-s6-prs-representatives", + "exp-m1-s6-prs", + "exp-m1-s6", + "exp-m1", + "exp-m2-prs", + "exp-m2-s7-prs-representatives", + "exp-m2-s7-prs", + "exp-m2-s7", + "exp-m2-s8-prs-representatives", + "exp-m2-s8-prs", + "exp-m2-s8", + "exp-m2", + "exp-m3-prs", + "exp-m3-s10-prs-representatives", + "exp-m3-s10-prs", + "exp-m3-s10", + "exp-m3-s9-prs-representatives", + "exp-m3-s9-prs", + "exp-m3-s9", + "exp-m3", + "exp", + "forge-ing1", + "forge-interns", + "forge-prod-devs", + "forge-prod", + "forge-roots", + "forge-staff", + "forge-students", + "forge", + "guests-cats", + "guests", + "ing-app-i1-s5-prs-representatives", + "ing-app-i1-s5-prs", + "ing-app-i1-s6-prs-representatives", + "ing-app-i1-s6-prs", + "ing-app-i2-s7-prs-representatives", + "ing-app-i2-s7-prs", + "ing-app-i2-s8-prs-representatives", + "ing-app-i2-s8-prs", + "ing-app-i3-s10-prs-representatives", + "ing-app-i3-s10-prs", + "ing-app-i3-s9-prs-representatives", + "ing-app-i3-s9-prs", + "ing-assistants-acu-respos-42sh", + "ing-assistants-acu-respos-harmonisation", + "ing-assistants-acu-respos-httpd", + "ing-assistants-acu-respos-malloc", + "ing-assistants-acu-respos-minimake", + "ing-assistants-acu-respos-myfind", + "ing-assistants-acu-respos-piscine", + "ing-assistants-acu-respos-sql", + "ing-assistants-acu", + "ing-assistants-chefs", + "ing-assistants-cpi", + "ing-assistants-deadlines", + "ing-assistants-devs", + "ing-assistants-director-42sh", + "ing-assistants-director-asm", + "ing-assistants-director-chess", + "ing-assistants-director-cpp", + "ing-assistants-director-harmonisation-mpc", + "ing-assistants-director-harmonisation-prog", + "ing-assistants-director-harmonisation", + "ing-assistants-director-httpd", + "ing-assistants-director-java", + "ing-assistants-director-malloc", + "ing-assistants-director-minimake", + "ing-assistants-director-myfind", + "ing-assistants-director-piscine", + "ing-assistants-director-prerentree", + "ing-assistants-director-spider", + "ing-assistants-director-sql", + "ing-assistants-director-tiger", + "ing-assistants-directors-js", + "ing-assistants-gitlab-manager", + "ing-assistants-guests", + "ing-assistants-intendants", + "ing-assistants-moulettes", + "ing-assistants-others", + "ing-assistants-pypi-admins", + "ing-assistants-respos-calins", + "ing-assistants-reviews", + "ing-assistants-roots", + "ing-assistants-toolchain", + "ing-assistants-yaka-respos-chess", + "ing-assistants-yaka-respos-cpp", + "ing-assistants-yaka-respos-java", + "ing-assistants-yaka-respos-js", + "ing-assistants-yaka-respos-ping", + "ing-assistants-yaka-respos-prerentree", + "ing-assistants-yaka-respos-spider", + "ing-assistants-yaka-respos-tiger", + "ing-assistants-yaka-stage", + "ing-assistants-yaka", + "ing-assistants", + "ing-csi", + "ing-de", + "ing-gistre-chief", + "ing-gistre-representatives", + "ing-gistre-roots", + "ing-gistre", + "ing-gitm-representatives", + "ing-gitm", + "ing-ice-representatives", + "ing-ice-roots", + "ing-ice", + "ing-if-representatives", + "ing-if", + "ing-image-representatives", + "ing-image", + "ing-ing1-arcs-s5-prs", + "ing-ing1-arcs-s6-prs", + "ing-ing1-arcs", + "ing-ing1-bing", + "ing-ing1-lyn", + "ing-ing1-prs", + "ing-ing1-riemann", + "ing-ing1-rns", + "ing-ing1-s5-lyn-representatives", + "ing-ing1-s5-lyn", + "ing-ing1-s5-prs-a1", + "ing-ing1-s5-prs-a2", + "ing-ing1-s5-prs-a3", + "ing-ing1-s5-prs-a4", + "ing-ing1-s5-prs-a5", + "ing-ing1-s5-prs-auditors", + "ing-ing1-s5-prs-b10", + "ing-ing1-s5-prs-b6", + "ing-ing1-s5-prs-b7", + "ing-ing1-s5-prs-b8", + "ing-ing1-s5-prs-b9", + "ing-ing1-s5-prs-bing", + "ing-ing1-s5-prs-representatives", + "ing-ing1-s5-prs-riemann-a1", + "ing-ing1-s5-prs-riemann-a2", + "ing-ing1-s5-prs-riemann", + "ing-ing1-s5-prs-shannon-c1", + "ing-ing1-s5-prs-shannon-c2", + "ing-ing1-s5-prs-shannon-c3", + "ing-ing1-s5-prs-shannon-c4", + "ing-ing1-s5-prs-shannon-c5", + "ing-ing1-s5-prs-shannon", + "ing-ing1-s5-prs-std", + "ing-ing1-s5-prs-tanenbaum-d1", + "ing-ing1-s5-prs-tanenbaum-d2", + "ing-ing1-s5-prs-tanenbaum-d3", + "ing-ing1-s5-prs-tanenbaum-d4", + "ing-ing1-s5-prs-tanenbaum-d5", + "ing-ing1-s5-prs-tanenbaum", + "ing-ing1-s5-prs", + "ing-ing1-s5-representatives", + "ing-ing1-s5-rns-representatives", + "ing-ing1-s5-rns", + "ing-ing1-s5-std", + "ing-ing1-s5-stg-representatives", + "ing-ing1-s5-stg", + "ing-ing1-s5-tc-hi", + "ing-ing1-s5-tc-hm", + "ing-ing1-s5-tls-representatives", + "ing-ing1-s5-tls", + "ing-ing1-s5", + "ing-ing1-s6-lyn-l1", + "ing-ing1-s6-lyn-l2", + "ing-ing1-s6-lyn-l3", + "ing-ing1-s6-lyn-representatives", + "ing-ing1-s6-lyn", + "ing-ing1-s6-prs-a1", + "ing-ing1-s6-prs-a2", + "ing-ing1-s6-prs-a3", + "ing-ing1-s6-prs-a4", + "ing-ing1-s6-prs-a5", + "ing-ing1-s6-prs-auditors", + "ing-ing1-s6-prs-b10", + "ing-ing1-s6-prs-b11", + "ing-ing1-s6-prs-b6", + "ing-ing1-s6-prs-b7", + "ing-ing1-s6-prs-b8", + "ing-ing1-s6-prs-b9", + "ing-ing1-s6-prs-bing", + "ing-ing1-s6-prs-representatives", + "ing-ing1-s6-prs-riemann-a1", + "ing-ing1-s6-prs-riemann-a2", + "ing-ing1-s6-prs-riemann", + "ing-ing1-s6-prs-shannon-c1", + "ing-ing1-s6-prs-shannon-c2", + "ing-ing1-s6-prs-shannon-c3", + "ing-ing1-s6-prs-shannon-c4", + "ing-ing1-s6-prs-shannon-c5", + "ing-ing1-s6-prs-shannon", + "ing-ing1-s6-prs-std", + "ing-ing1-s6-prs-tanenbaum-d1", + "ing-ing1-s6-prs-tanenbaum-d2", + "ing-ing1-s6-prs-tanenbaum-d3", + "ing-ing1-s6-prs-tanenbaum-d4", + "ing-ing1-s6-prs-tanenbaum-d5", + "ing-ing1-s6-prs-tanenbaum", + "ing-ing1-s6-prs", + "ing-ing1-s6-representatives", + "ing-ing1-s6-rns-representatives", + "ing-ing1-s6-rns", + "ing-ing1-s6-stg-representatives", + "ing-ing1-s6-stg-s1", + "ing-ing1-s6-stg-s2", + "ing-ing1-s6-stg", + "ing-ing1-s6-tls-representatives", + "ing-ing1-s6-tls-t1", + "ing-ing1-s6-tls-t2", + "ing-ing1-s6-tls", + "ing-ing1-s6", + "ing-ing1-shannon", + "ing-ing1-stg", + "ing-ing1-tanenbaum", + "ing-ing1-tls", + "ing-ing1", + "ing-ing2-lyn", + "ing-ing2-prs", + "ing-ing2-s7-prs", + "ing-ing2-s7-representatives", + "ing-ing2-s7-stg", + "ing-ing2-s7", + "ing-ing2-s8-lyn-if-representatives", + "ing-ing2-s8-lyn-if", + "ing-ing2-s8-lyn-rdi", + "ing-ing2-s8-lyn-representatives", + "ing-ing2-s8-lyn-sciag-representatives", + "ing-ing2-s8-lyn-sciag", + "ing-ing2-s8-lyn", + "ing-ing2-s8-prs-gistre-representatives", + "ing-ing2-s8-prs-gistre", + "ing-ing2-s8-prs-gitm-representatives", + "ing-ing2-s8-prs-gitm", + "ing-ing2-s8-prs-ice-representatives", + "ing-ing2-s8-prs-ice", + "ing-ing2-s8-prs-image-representatives", + "ing-ing2-s8-prs-image", + "ing-ing2-s8-prs-mti-representatives", + "ing-ing2-s8-prs-mti", + "ing-ing2-s8-prs-quantum-representatives", + "ing-ing2-s8-prs-quantum", + "ing-ing2-s8-prs-rdi", + "ing-ing2-s8-prs-representatives", + "ing-ing2-s8-prs-sante-representatives", + "ing-ing2-s8-prs-sante", + "ing-ing2-s8-prs-scia-representatives", + "ing-ing2-s8-prs-scia", + "ing-ing2-s8-prs-sigl-representatives", + "ing-ing2-s8-prs-sigl", + "ing-ing2-s8-prs-srs-representatives", + "ing-ing2-s8-prs-srs", + "ing-ing2-s8-prs-startup-representatives", + "ing-ing2-s8-prs-startup", + "ing-ing2-s8-prs-tcom-representatives", + "ing-ing2-s8-prs-tcom", + "ing-ing2-s8-prs", + "ing-ing2-s8-representatives", + "ing-ing2-s8-tls-representatives", + "ing-ing2-s8-tls-ssie-representatives", + "ing-ing2-s8-tls-ssie", + "ing-ing2-s8-tls", + "ing-ing2-s8", + "ing-ing2-stg", + "ing-ing2-tls", + "ing-ing2", + "ing-ing3-lyn", + "ing-ing3-prs", + "ing-ing3-s10-prs", + "ing-ing3-s10", + "ing-ing3-s9-lyn-if-representatives", + "ing-ing3-s9-lyn-if", + "ing-ing3-s9-lyn-rdi", + "ing-ing3-s9-lyn-representatives", + "ing-ing3-s9-lyn-sciag-representatives", + "ing-ing3-s9-lyn-sciag", + "ing-ing3-s9-lyn", + "ing-ing3-s9-prs-gistre-representatives", + "ing-ing3-s9-prs-gistre", + "ing-ing3-s9-prs-gitm-representatives", + "ing-ing3-s9-prs-gitm", + "ing-ing3-s9-prs-ice-representatives", + "ing-ing3-s9-prs-ice", + "ing-ing3-s9-prs-image-representatives", + "ing-ing3-s9-prs-image", + "ing-ing3-s9-prs-mti-representatives", + "ing-ing3-s9-prs-mti", + "ing-ing3-s9-prs-quantum-representatives", + "ing-ing3-s9-prs-quantum", + "ing-ing3-s9-prs-rdi", + "ing-ing3-s9-prs-representatives", + "ing-ing3-s9-prs-sante-representatives", + "ing-ing3-s9-prs-sante", + "ing-ing3-s9-prs-scia-representatives", + "ing-ing3-s9-prs-scia", + "ing-ing3-s9-prs-sigl-representatives", + "ing-ing3-s9-prs-sigl", + "ing-ing3-s9-prs-srs-representatives", + "ing-ing3-s9-prs-srs", + "ing-ing3-s9-prs-startup-representatives", + "ing-ing3-s9-prs-startup", + "ing-ing3-s9-prs-tcom-representatives", + "ing-ing3-s9-prs-tcom", + "ing-ing3-s9-prs", + "ing-ing3-s9-representatives", + "ing-ing3-s9-tls-representatives", + "ing-ing3-s9-tls-ssie-representatives", + "ing-ing3-s9-tls-ssie", + "ing-ing3-s9-tls", + "ing-ing3-s9", + "ing-ing3-tls", + "ing-ing3", + "ing-mti-representatives", + "ing-mti-roots", + "ing-mti", + "ing-quantum-representatives", + "ing-quantum", + "ing-rdi", + "ing-sante-representatives", + "ing-sante", + "ing-scia-representatives", + "ing-scia", + "ing-sciag-representatives", + "ing-sciag", + "ing-scolarite-coaching", + "ing-scolarite", + "ing-sigl-representatives", + "ing-sigl-siops", + "ing-sigl", + "ing-srs-assistants", + "ing-srs-fic-directors", + "ing-srs-fic-roots", + "ing-srs-representatives", + "ing-srs-roots", + "ing-srs", + "ing-ssie-representatives", + "ing-ssie", + "ing-startup-representatives", + "ing-startup", + "ing-tcom-assistants", + "ing-tcom-representatives", + "ing-tcom-respos-labo", + "ing-tcom-roots", + "ing-tcom", + "ing", + "inter-bsc", + "inter-exch-f21", + "inter-exch-fall", + "inter-exch-s21", + "inter-exch-s22", + "inter-exch-spring", + "inter-f18", + "inter-f19", + "inter-f20", + "inter-f21", + "inter-fall", + "inter-mcs-cs", + "inter-mcs-dsa", + "inter-mcs-ism", + "inter-mcs-se", + "inter-mcs", + "inter-me", + "inter-msc-aims", + "inter-msc-ais", + "inter-s21", + "inter-s22", + "inter-spring", + "inter-summer", + "inter-summer22", + "inter", + "labo-3ie", + "labo-labsi-devs", + "labo-labsi-employees", + "labo-labsi-interns", + "labo-labsi-manager", + "labo-labsi-roots", + "labo-labsi-students", + "labo-labsi", + "labo-lrde-automates", + "labo-lrde-image-openstack", + "labo-lrde-image", + "labo-lrde-roots", + "labo-lrde", + "labo-lre-roots", + "labo-lre", + "labo-lse-eslr", + "labo-lse-roots", + "labo-lse-secu", + "labo-lse-sys", + "labo-lse", + "labo-metalab-roots", + "labo-seal-permanents", + "labo-seal-stagiaires", + "labo-seal", + "lyn", + "ofa-scolarite", + "pi-fle", + "pi", + "prepa-admissions", + "prepa-assistants-acdc-lyn", + "prepa-assistants-acdc-prs", + "prepa-assistants-acdc-rns", + "prepa-assistants-acdc-stg", + "prepa-assistants-acdc-tls", + "prepa-assistants-acdc", + "prepa-assistants-asm-lyn", + "prepa-assistants-asm-prs", + "prepa-assistants-asm-rns", + "prepa-assistants-asm-stg", + "prepa-assistants-asm-tls", + "prepa-assistants-asm", + "prepa-spe-api-s3-prs", + "prepa-spe-api-s4-prs", + "prepa-spe-lyn", + "prepa-spe-prs", + "prepa-spe-rns", + "prepa-spe-s3-lyn-l1", + "prepa-spe-s3-lyn-l2", + "prepa-spe-s3-lyn-l3", + "prepa-spe-s3-lyn", + "prepa-spe-s3-prs-a1", + "prepa-spe-s3-prs-a2", + "prepa-spe-s3-prs-b1", + "prepa-spe-s3-prs-b2", + "prepa-spe-s3-prs-c1", + "prepa-spe-s3-prs-c2", + "prepa-spe-s3-prs-d1", + "prepa-spe-s3-prs-d2", + "prepa-spe-s3-prs-e1", + "prepa-spe-s3-prs-pa1", + "prepa-spe-s3-prs-pa2", + "prepa-spe-s3-prs", + "prepa-spe-s3-rns-r1", + "prepa-spe-s3-rns-r2", + "prepa-spe-s3-rns", + "prepa-spe-s3-stg-spe1", + "prepa-spe-s3-stg-spe2", + "prepa-spe-s3-stg", + "prepa-spe-s3-tls-t1", + "prepa-spe-s3-tls-t2", + "prepa-spe-s3-tls", + "prepa-spe-s3", + "prepa-spe-s3s-prs-a1", + "prepa-spe-s3s-prs-a2", + "prepa-spe-s3s-prs", + "prepa-spe-s3s", + "prepa-spe-s4-inter", + "prepa-spe-s4-lyn-a", + "prepa-spe-s4-lyn-b", + "prepa-spe-s4-lyn-l1", + "prepa-spe-s4-lyn-l2", + "prepa-spe-s4-lyn-l3", + "prepa-spe-s4-lyn", + "prepa-spe-s4-prs-a1", + "prepa-spe-s4-prs-a2", + "prepa-spe-s4-prs-b1", + "prepa-spe-s4-prs-b2", + "prepa-spe-s4-prs-c1", + "prepa-spe-s4-prs-c2", + "prepa-spe-s4-prs", + "prepa-spe-s4-rns-r1", + "prepa-spe-s4-rns-r2", + "prepa-spe-s4-rns", + "prepa-spe-s4-stg-spe1", + "prepa-spe-s4-stg-spe2", + "prepa-spe-s4-stg", + "prepa-spe-s4-tls-t1", + "prepa-spe-s4-tls-t2", + "prepa-spe-s4-tls", + "prepa-spe-s4", + "prepa-spe-stg", + "prepa-spe-tls", + "prepa-spe", + "prepa-sup-lyn", + "prepa-sup-prs", + "prepa-sup-rns", + "prepa-sup-s1-lyn-l1", + "prepa-sup-s1-lyn-l2", + "prepa-sup-s1-lyn-l3", + "prepa-sup-s1-lyn-l4", + "prepa-sup-s1-lyn", + "prepa-sup-s1-prs-a1", + "prepa-sup-s1-prs-a2", + "prepa-sup-s1-prs-a3", + "prepa-sup-s1-prs-b1", + "prepa-sup-s1-prs-b2", + "prepa-sup-s1-prs-c1", + "prepa-sup-s1-prs-c2", + "prepa-sup-s1-prs-d1", + "prepa-sup-s1-prs-d2", + "prepa-sup-s1-prs-e1", + "prepa-sup-s1-prs-e2", + "prepa-sup-s1-prs-f1", + "prepa-sup-s1-prs-pa1", + "prepa-sup-s1-prs-pa2", + "prepa-sup-s1-prs", + "prepa-sup-s1-rns-r1", + "prepa-sup-s1-rns-r2", + "prepa-sup-s1-rns", + "prepa-sup-s1-stg-st1", + "prepa-sup-s1-stg-st2", + "prepa-sup-s1-stg", + "prepa-sup-s1-tls-t1", + "prepa-sup-s1-tls-t2", + "prepa-sup-s1-tls-t3", + "prepa-sup-s1-tls", + "prepa-sup-s1", + "prepa-sup-s1s-prs", + "prepa-sup-s1s", + "prepa-sup-s2-lyn-l1", + "prepa-sup-s2-lyn-l2", + "prepa-sup-s2-lyn-l3", + "prepa-sup-s2-lyn-l4", + "prepa-sup-s2-lyn", + "prepa-sup-s2-prs-a1", + "prepa-sup-s2-prs-a2", + "prepa-sup-s2-prs-a3", + "prepa-sup-s2-prs-b1", + "prepa-sup-s2-prs-b2", + "prepa-sup-s2-prs-c1", + "prepa-sup-s2-prs-c2", + "prepa-sup-s2-prs-d1", + "prepa-sup-s2-prs-d2", + "prepa-sup-s2-prs-e1", + "prepa-sup-s2-prs-e2", + "prepa-sup-s2-prs-f1", + "prepa-sup-s2-prs", + "prepa-sup-s2-rns-r1", + "prepa-sup-s2-rns-r2", + "prepa-sup-s2-rns-r3", + "prepa-sup-s2-rns", + "prepa-sup-s2-stg-st1", + "prepa-sup-s2-stg-st2", + "prepa-sup-s2-stg", + "prepa-sup-s2-tls-t1", + "prepa-sup-s2-tls-t2", + "prepa-sup-s2-tls-t3", + "prepa-sup-s2-tls", + "prepa-sup-s2", + "prepa-sup-s2s-prs-a1", + "prepa-sup-s2s-prs-a2", + "prepa-sup-s2s-prs", + "prepa-sup-s2s", + "prepa-sup-stg", + "prepa-sup-tls", + "prepa-sup", + "prepa", + "prs", + "rns", + "service-accounts", + "stg", + "students", + "teachers-permanent", + "teachers", + "tls", + "users", + "wheel" + ] +} diff --git a/src/bot.ts b/src/bot.ts index fd47139..993b2c1 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -121,21 +121,25 @@ export class EpitlsBot { function message_command_response_sending_email(email: string) { const embed = new EmbedBuilder() - .setTitle("`🟡`| Verification") - .setDescription(`Sending a verification link to your email \`${email}\`.`); + .setTitle("`🟡`| Vérification") + .setDescription(` +Un lien de vérification a été envoyé par e-mail à \`${email}\`. +Le lien expirera dans 5 minutes. +**Il pourraît être arrivé dans \`Courrier indésirable\`.** +`.trim()); return { embeds: [embed] }; } function message_command_response_error(msg: string) { const embed = new EmbedBuilder() - .setTitle("`❌`| Verification") - .setDescription(`An error occured\n\`${msg}\``); + .setTitle("`❌`| Vérification") + .setDescription(`Échec de la vérification :\n\`${msg}\``); return { embeds: [embed] }; } function message_command_response_success() { const embed = new EmbedBuilder() - .setTitle("`✅`| Verification") - .setDescription("Your email was associated with this account."); + .setTitle("`✅`| Vérification") + .setDescription("Votre e-mail CRI a bien été associé à ce compte Discord."); return { embeds: [embed] }; } diff --git a/src/cri.ts b/src/cri.ts index a980044..5c0d8c9 100644 --- a/src/cri.ts +++ b/src/cri.ts @@ -1,9 +1,14 @@ import { z } from "https://deno.land/x/zod@v3.22.4/mod.ts"; +import { log_from } from "./utils.ts"; +const log = (...args: unknown[]) => log_from(import.meta.url, ...args); /** * Wraps the CRI API. */ export class CriApi { + /** + * note : a CRI token is actually + */ private token; public constructor(token: string) { @@ -14,13 +19,8 @@ export class CriApi { * Fetches an array of the groups an user has been part of. */ public async groups_of(login: string) { - const response = await fetch(`https://cri.epita.fr/api/v2/users/${login}/`, { - headers: { - accept: "application/json", - authorization: "Basic " + this.token, - }, - }); - const body = await response.json(); + log(`Fetching groups of '${login}'.`); + const response = await fetch_json_auth(`https://cri.epita.fr/api/v2/users/${login}/`, this.token); const group = z.object({ slug: z.string() }); const parser = z.object({ primary_group: group, @@ -30,7 +30,7 @@ export class CriApi { })), current_groups: z.array(group), }); - const parsed = parser.parse(body); + const parsed = parser.parse(response); const result = new Set(); result.add(parsed.primary_group.slug); for (const group of parsed.current_groups) result.add(group.slug); @@ -42,12 +42,43 @@ export class CriApi { * Tests wether a given login exists within the CRI registry. */ public async user_exists(login: string) { + log(`Testing existence of user '${login}'.`); const response = await fetch(`https://cri.epita.fr/api/v2/users/${login}/`, { headers: { accept: "application/json", authorization: "Basic " + this.token, }, }); - return response.status === 200; + const found = response.status === 200; + return found; + } + + public async get_all_groups() { + const result = [] as string[]; + const response_parser = z.object({ + next: z.string().or(z.null()), + results: z.array(z.object({ + slug: z.string(), + })), + }); + let next_url = `https://cri.epita.fr/api/v2/groups/`; + while (true) { + const response = await fetch_json_auth(next_url, this.token); + const parsed = response_parser.parse(response); + result.push(...parsed.results.map((g) => g.slug)); + if (parsed.next === null) break; + next_url = parsed.next; + } + return result; } } + +async function fetch_json_auth(url: string, token: string) { + const response = await fetch(url, { + headers: { + accept: "application/json", + authorization: "Basic " + token, + }, + }); + return await response.json() as unknown; +}