@@ -10,6 +10,8 @@ mod utils;
10
10
mod handler;
11
11
mod settings;
12
12
13
+ use tracing:: { error, info} ;
14
+
13
15
use std:: {
14
16
sync:: Arc ,
15
17
collections:: HashSet ,
@@ -24,13 +26,12 @@ use serenity::{
24
26
framework:: standard:: {
25
27
Args , StandardFramework , CommandGroup ,
26
28
HelpOptions , help_commands, CommandResult ,
27
- macros:: { help} ,
29
+ macros:: { help, hook } ,
28
30
} ,
29
31
model:: prelude:: * ,
30
32
prelude:: * ,
31
33
} ;
32
34
33
- use serenity:: prelude:: * ;
34
35
use lavalink_rs:: {
35
36
LavalinkClient
36
37
} ;
@@ -43,11 +44,16 @@ use crate::handler::{
43
44
Lavalink ,
44
45
VoiceManager ,
45
46
VoiceGuildUpdate ,
46
- LavalinkHandler
47
+ LavalinkHandler ,
48
+ ConnectionPool ,
49
+ after,
50
+ SettingsConf
47
51
} ;
48
52
49
53
use settings:: Settings ;
50
54
55
+ use crate :: utils:: database:: { obtain_pool} ;
56
+
51
57
52
58
#[ help]
53
59
async fn my_help (
@@ -62,37 +68,85 @@ async fn my_help(
62
68
Ok ( ( ) )
63
69
}
64
70
71
+ #[ hook]
72
+ // Sets a custom prefix for a guild.
73
+ pub async fn dynamic_prefix ( ctx : & Context , msg : & Message ) -> Option < String > {
74
+ let guild_id = & msg. guild_id ;
75
+
76
+ let data = ctx. data . read ( ) . await ;
77
+ let settings = data. get :: < SettingsConf > ( ) . unwrap ( ) ;
78
+ let default_prefix = settings. discord . prefix . as_str ( ) ;
79
+
80
+ let prefix: String ;
81
+ if let Some ( id) = guild_id {
82
+ let pool = data. get :: < ConnectionPool > ( ) . unwrap ( ) ;
83
+
84
+ let res = sqlx:: query!(
85
+ "SELECT prefix FROM prefixes WHERE guild_id = $1" ,
86
+ id. 0 as i64
87
+ )
88
+ . fetch_one ( pool)
89
+ . await ;
90
+
91
+ prefix = if let Ok ( data) = res {
92
+ if let Some ( p) = data. prefix {
93
+ p
94
+ } else {
95
+ default_prefix. to_string ( )
96
+ }
97
+ } else {
98
+ error ! ( "I couldn't query the database for getting guild prefix." ) ;
99
+ default_prefix. to_string ( )
100
+ }
101
+ } else {
102
+ prefix = default_prefix. to_string ( ) ;
103
+ } ;
104
+
105
+ Some ( prefix)
106
+ }
107
+
65
108
#[ tokio:: main]
66
109
async fn main ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
67
110
let settings = match Settings :: new ( ) {
68
111
Ok ( conf) => conf,
69
112
Err ( why) => panic ! ( "Could not read config: {:?}" , why) ,
70
113
} ;
71
114
72
- let token = settings. discord . token ;
73
- let lavalink_url = settings. lavalink . url ;
74
- let lavalink_password = settings. lavalink . password ;
115
+ let token = & settings. discord . token ;
116
+ let lavalink_url = & settings. lavalink . url ;
117
+ let lavalink_password = & settings. lavalink . password ;
75
118
76
- let prefix = settings. discord . prefix . as_str ( ) ;
119
+ let db_url = & settings. database_url ;
77
120
78
- let http = Http :: new_with_token ( & token) ;
121
+ let http = Http :: new_with_token ( token) ;
79
122
80
- let bot_id = match http. get_current_application_info ( ) . await {
81
- Ok ( info) => info. id ,
123
+ // We will fetch your bot's owners and id
124
+ let ( owners, bot_id) = match http. get_current_application_info ( ) . await {
125
+ Ok ( info) => {
126
+ let mut owners = HashSet :: new ( ) ;
127
+ owners. insert ( info. owner . id ) ;
128
+
129
+ ( owners, info. id )
130
+ }
82
131
Err ( why) => panic ! ( "Could not access application info: {:?}" , why) ,
83
132
} ;
84
133
85
134
86
135
let framework = StandardFramework :: new ( )
87
- . configure ( |c| c
88
- . prefix ( prefix) )
136
+ . configure ( |c| {
137
+ c. owners ( owners)
138
+ . dynamic_prefix ( dynamic_prefix)
139
+ . with_whitespace ( false )
140
+ . on_mention ( Some ( bot_id) )
141
+ } )
89
142
. help ( & MY_HELP )
143
+ . after ( after)
90
144
. group ( & MUSIC_GROUP )
91
145
. group ( & FUN_GROUP ) ;
92
146
93
- let mut client = Client :: new ( & token)
94
- . event_handler ( Handler )
147
+ let mut client = Client :: new ( token)
95
148
. framework ( framework)
149
+ . event_handler ( Handler )
96
150
. await
97
151
. expect ( "Err creating client" ) ;
98
152
@@ -109,8 +163,11 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
109
163
110
164
let lava = lava_client. initialize ( LavalinkHandler ) . await ?;
111
165
data. insert :: < Lavalink > ( lava) ;
166
+
167
+ let pool = obtain_pool ( db_url) . await ?;
168
+ data. insert :: < ConnectionPool > ( pool) ;
169
+ data. insert :: < SettingsConf > ( settings) ;
112
170
}
113
-
114
171
115
172
// Here we clone a lock to the Shard Manager, and then move it into a new
116
173
// thread. The thread will unlock the manager and print shards' status on a
@@ -134,6 +191,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
134
191
}
135
192
}
136
193
} ) ;
194
+
137
195
138
196
// Start two shards. Note that there is an ~5 second ratelimit period
139
197
// between when one shard can start after another.
0 commit comments