aboutsummaryrefslogtreecommitdiffstats
path: root/src/student.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/student.rs')
-rw-r--r--src/student.rs96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/student.rs b/src/student.rs
new file mode 100644
index 0000000..4b7acf1
--- /dev/null
+++ b/src/student.rs
@@ -0,0 +1,96 @@
1use crate::Fingerprint;
2use lazy_static::lazy_static;
3use serde::{Deserialize, Serialize};
4use std::{collections::HashSet, fmt};
5
6#[derive(Debug, Serialize, Deserialize, PartialEq)]
7pub struct UserAtRest {
8 pub fingerprint: Fingerprint,
9 pub user: User,
10}
11
12/// A Student
13///
14/// - [`user_id`]: Can only be one of the preapproved students (who are enlisted in the course)
15/// - [`public_key`]: A PEM format public key "---- BEGIN" and all
16/// - [`balance`]: User's current Gradecoin amount
17///
18/// This should ideally include the fingerprint as well?
19#[derive(Serialize, Deserialize, Debug, PartialEq)]
20pub struct User {
21 pub user_id: MetuId,
22 pub public_key: String,
23 pub balance: u16,
24 #[serde(skip, default = "bool::default")]
25 pub is_bot: bool,
26}
27
28/// The values are hard coded in [`static@OUR_STUDENTS`] so `MetuId::new`() can accept/reject values based on that
29#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
30pub struct MetuId {
31 id: String,
32 passwd: String,
33}
34
35impl fmt::Display for MetuId {
36 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
37 write!(f, "{}", self.id)
38 }
39}
40
41impl MetuId {
42 pub fn new(id: String, pwd: String) -> Option<Self> {
43 if OUR_STUDENTS.contains(&(&*id, &*pwd)) {
44 Some(MetuId { id, passwd: pwd })
45 } else {
46 None
47 }
48 }
49}
50
51// TODO: remove this, read from a yaml or something, then MetuId::new gets a self <11-04-22, yigit> //
52
53// Students who are authorized to have Gradecoin accounts
54lazy_static! {
55 static ref OUR_STUDENTS: HashSet<(&'static str, &'static str)> = {
56 [
57 ("e254275", "DtNX1qk4YF4saRH"),
58 ("e223687", "cvFEs4XLjuGBD1v"),
59 ("e211024", "voQAcxiKJmEXYRT"),
60 ("e209888", "O75dli6AQtz2tUi"),
61 ("e223725", "xXuTD3Y4tyrv2Jz"),
62 ("e209362", "N7wGm5XU5zVWOWu"),
63 ("e209898", "aKBFfB8fZMq8pVn"),
64 ("e230995", "TgcHGlqeFhQGx42"),
65 ("e223743", "YVWVSWuIHplJk9C"),
66 ("e223747", "8LAeHrsjnwXh59Q"),
67 ("e223749", "HMFeJqVOzwCPHbc"),
68 ("e223751", "NjMsxmtmy2VOwMW"),
69 ("e188126", "QibuPdV2gXfsVJW"),
70 ("e209913", "kMxJvl2vHSWCy4A"),
71 ("e203608", "mfkkR0MWurk6Rp1"),
72 ("e233013", "GCqHxdOaDj2pWXx"),
73 ("e216982", "2Z0xmgCStnj5qg5"),
74 ("e217185", "BcaZNlzlhPph7A3"),
75 ("e223780", "2KvVxKUQaA9H4sn"),
76 ("e194931", "hsC0Wb8PQ5vzwdQ"),
77 ("e223783", "ETUJA3kt1QYvJai"),
78 ("e254550", "rPRjX0A4NefvKWi"),
79 ("e217203", "lN3IWhGyCrGfkk5"),
80 ("e217477", "O9xlMaa7LanC82w"),
81 ("e223786", "UxI6czykJfp9T9N"),
82 ("e231060", "VJgziofQQPCoisH"),
83 ("e223795", "pmcTCKox99NFsqp"),
84 ("e223715", "1H5QuOYI1b2r9ET"),
85 ("e181932", "THANKYOUHAVEFUN"),
86 ("bank", "P7oxDm30g1jeIId"),
87 ("friend_1", "not_used"),
88 ("friend_2", "not_used"),
89 ("friend_3", "not_used"),
90 ("friend_4", "not_used"),
91 ]
92 .iter()
93 .copied()
94 .collect()
95 };
96}