1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
use std::collections::HashMap;
use regex::Regex;
use serde::Deserialize;
#[derive(Deserialize)]
pub enum AutoProxyScope {
Global,
Server,
Channel
}
#[derive(Deserialize)]
pub enum PresenceMode {
Online,
Busy,
Idle,
Invisible,
}
#[derive(Deserialize)]
pub enum AutoproxyConfig {
Member(String),
Latch {
scope: AutoproxyLatchScope,
timeout_seconds: u32,
presence_indicator: bool
}
}
#[derive(Deserialize)]
pub enum AutoproxyLatchScope {
Global,
Server
}
#[derive(Deserialize)]
pub struct PluralkitConfig {
#[serde(with = "serde_regex")]
pub message_pattern: Regex,
pub api_token: String,
}
#[derive(Deserialize)]
pub struct System {
pub reference_user_id: String,
pub members: Vec<Member>,
#[serde(default = "default_forward_pings")]
pub forward_pings: bool,
pub autoproxy: Option<AutoproxyConfig>,
pub pluralkit: Option<PluralkitConfig>,
}
fn default_forward_pings() -> bool {
false
}
#[derive(Deserialize)]
pub struct Member {
pub name: String,
#[serde(with = "serde_regex")]
pub message_pattern: Regex,
pub discord_token: String,
pub presence: Option<PresenceMode>,
pub status: Option<String>,
}
#[derive(Deserialize)]
pub struct Config {
#[serde(flatten)]
pub systems: HashMap<String, System>
}
impl Config {
pub fn load(config_contents: String) -> Config {
let config : Config = toml::from_str(config_contents.as_str()).unwrap();
config.systems.iter().for_each(|config_system| {
let (system_name, system) = config_system;
if let Some(autoproxy) = &system.autoproxy {
if let AutoproxyConfig::Member(autoproxy_member) = autoproxy {
let member_matches = system.members.iter().all(|member| {
member.name == *autoproxy_member
});
if !member_matches {
panic!("System {} autoproxy member {} does not match a known member name", system_name, autoproxy_member);
}
}
}
});
config
}
}
|