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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
extern crate frippy;
extern crate time;
extern crate irc;
extern crate glob;
#[macro_use]
extern crate log;
use log::{Record, Level, LevelFilter, Metadata};
use irc::client::reactor::IrcReactor;
use glob::glob;
use frippy::plugins;
use frippy::Config;
struct Logger;
impl log::Log for Logger {
fn enabled(&self, metadata: &Metadata) -> bool {
metadata.target().contains("frippy")
}
fn log(&self, record: &Record) {
if self.enabled(record.metadata()) {
if record.metadata().level() >= Level::Debug {
println!("[{}]({}) {} -> {}",
time::now().rfc822(),
record.level(),
record.target(),
record.args());
} else {
println!("[{}]({}) {}",
time::now().rfc822(),
record.level(),
record.args());
}
}
}
fn flush(&self) {}
}
static LOGGER: Logger = Logger;
fn main() {
log::set_max_level(if cfg!(debug_assertions) {
LevelFilter::Debug
} else {
LevelFilter::Info
});
log::set_logger(&LOGGER).unwrap();
// Load all toml files in the configs directory
let mut configs = Vec::new();
for toml in glob("configs/*.toml").unwrap() {
match toml {
Ok(path) => {
info!("Loading {}", path.to_str().unwrap());
match Config::load(path) {
Ok(v) => configs.push(v),
Err(e) => error!("Incorrect config file {}", e),
}
}
Err(e) => error!("Failed to read path {}", e),
}
}
// Without configs the bot would just idle
if configs.is_empty() {
error!("No config file found");
return;
}
// Create an event loop to run the connections on.
let mut reactor = IrcReactor::new().unwrap();
// Open a connection and add work for each config
for config in configs {
let mut disabled_plugins = None;
if let &Some(ref options) = &config.options {
if let Some(disabled) = options.get("disabled_plugins") {
disabled_plugins = Some(disabled
.split(",")
.map(|p| p.trim())
.collect::<Vec<_>>());
}
}
let mut bot = frippy::Bot::new();
bot.add_plugin(plugins::Help::new());
bot.add_plugin(plugins::Url::new(1024));
bot.add_plugin(plugins::Emoji::new());
bot.add_plugin(plugins::Currency::new());
bot.add_plugin(plugins::KeepNick::new());
if let Some(disabled_plugins) = disabled_plugins {
for name in disabled_plugins {
if let None = bot.remove_plugin(name) {
error!("{:?} was not found - could not disable", name);
}
}
}
bot.connect(&mut reactor, &config).expect("Failed to connect");
}
// Run the bots until they throw an error - an error could be loss of connection
reactor.run().unwrap();
}
|