Compare commits

..

2 commits

Author SHA1 Message Date
5a5e034ba8 add groups dump 2024-02-02 18:22:29 +01:00
e90fa55862 refactor 2024-02-02 18:22:13 +01:00
3 changed files with 650 additions and 15 deletions

600
all_groups.json Normal file
View file

@ -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"
]
}

View file

@ -121,21 +121,25 @@ export class EpitlsBot {
function message_command_response_sending_email(email: string) { function message_command_response_sending_email(email: string) {
const embed = new EmbedBuilder() const embed = new EmbedBuilder()
.setTitle("`🟡`| Verification") .setTitle("`🟡`| Vérification")
.setDescription(`Sending a verification link to your email \`${email}\`.`); .setDescription(`
Un lien de vérification a é envoyé par e-mail à \`${email}\`.
Le lien expirera dans 5 minutes.
**Il pourraît être arrivé dans \`Courrier indésirable\`.**
`.trim());
return { embeds: [embed] }; return { embeds: [embed] };
} }
function message_command_response_error(msg: string) { function message_command_response_error(msg: string) {
const embed = new EmbedBuilder() const embed = new EmbedBuilder()
.setTitle("`❌`| Verification") .setTitle("`❌`| Vérification")
.setDescription(`An error occured\n\`${msg}\``); .setDescription(`Échec de la vérification :\n\`${msg}\``);
return { embeds: [embed] }; return { embeds: [embed] };
} }
function message_command_response_success() { function message_command_response_success() {
const embed = new EmbedBuilder() const embed = new EmbedBuilder()
.setTitle("`✅`| Verification") .setTitle("`✅`| Vérification")
.setDescription("Your email was associated with this account."); .setDescription("Votre e-mail CRI a bien été associé à ce compte Discord.");
return { embeds: [embed] }; return { embeds: [embed] };
} }

View file

@ -1,9 +1,14 @@
import { z } from "https://deno.land/x/zod@v3.22.4/mod.ts"; 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. * Wraps the CRI API.
*/ */
export class CriApi { export class CriApi {
/**
* note : a CRI token is actually
*/
private token; private token;
public constructor(token: string) { public constructor(token: string) {
@ -14,13 +19,8 @@ export class CriApi {
* Fetches an array of the groups an user has been part of. * Fetches an array of the groups an user has been part of.
*/ */
public async groups_of(login: string) { public async groups_of(login: string) {
const response = await fetch(`https://cri.epita.fr/api/v2/users/${login}/`, { log(`Fetching groups of '${login}'.`);
headers: { const response = await fetch_json_auth(`https://cri.epita.fr/api/v2/users/${login}/`, this.token);
accept: "application/json",
authorization: "Basic " + this.token,
},
});
const body = await response.json();
const group = z.object({ slug: z.string() }); const group = z.object({ slug: z.string() });
const parser = z.object({ const parser = z.object({
primary_group: group, primary_group: group,
@ -30,7 +30,7 @@ export class CriApi {
})), })),
current_groups: z.array(group), current_groups: z.array(group),
}); });
const parsed = parser.parse(body); const parsed = parser.parse(response);
const result = new Set<string>(); const result = new Set<string>();
result.add(parsed.primary_group.slug); result.add(parsed.primary_group.slug);
for (const group of parsed.current_groups) result.add(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. * Tests wether a given login exists within the CRI registry.
*/ */
public async user_exists(login: string) { public async user_exists(login: string) {
log(`Testing existence of user '${login}'.`);
const response = await fetch(`https://cri.epita.fr/api/v2/users/${login}/`, { const response = await fetch(`https://cri.epita.fr/api/v2/users/${login}/`, {
headers: { headers: {
accept: "application/json", accept: "application/json",
authorization: "Basic " + this.token, 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;
}