initial code
This commit is contained in:
parent
210b0afa67
commit
784a72dd08
2
.cargo/config
Normal file
2
.cargo/config
Normal file
@ -0,0 +1,2 @@
|
||||
[build]
|
||||
target-dir = "/home/jude/.rust_build/reminder-rs"
|
8
.idea/.gitignore
vendored
Normal file
8
.idea/.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
7
.idea/dictionaries/jude.xml
Normal file
7
.idea/dictionaries/jude.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<component name="ProjectDictionaryState">
|
||||
<dictionary name="jude">
|
||||
<words>
|
||||
<w>reqwest</w>
|
||||
</words>
|
||||
</dictionary>
|
||||
</component>
|
6
.idea/misc.xml
Normal file
6
.idea/misc.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="JavaScriptSettings">
|
||||
<option name="languageLevel" value="ES6" />
|
||||
</component>
|
||||
</project>
|
8
.idea/modules.xml
Normal file
8
.idea/modules.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/reminder-rs.iml" filepath="$PROJECT_DIR$/.idea/reminder-rs.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
11
.idea/reminder-rs.iml
Normal file
11
.idea/reminder-rs.iml
Normal file
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="CPP_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
6
.idea/vcs.xml
Normal file
6
.idea/vcs.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
1890
Cargo.lock
generated
Normal file
1890
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
16
Cargo.toml
Normal file
16
Cargo.toml
Normal file
@ -0,0 +1,16 @@
|
||||
[package]
|
||||
name = "reminder-rs"
|
||||
version = "0.1.0"
|
||||
authors = ["jude <judewrs@gmail.com>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
serenity = {git = "https://github.com/acdenisSK/serenity", branch = "await_next"}
|
||||
dotenv = "0.15"
|
||||
tokio = {version = "0.2.19", features = ["fs", "sync", "process", "io-util"]}
|
||||
reqwest = "0.10.6"
|
||||
sqlx = {version = "0.3.5", default-features = false, features = ["runtime-tokio", "macros", "mysql", "bigdecimal"]}
|
||||
regex = "1.3.9"
|
||||
async-trait = "0.1.36"
|
123
src/framework.rs
Normal file
123
src/framework.rs
Normal file
@ -0,0 +1,123 @@
|
||||
use async_trait::async_trait;
|
||||
|
||||
use serenity::{
|
||||
client::Context,
|
||||
framework::Framework,
|
||||
model::channel::Message,
|
||||
};
|
||||
|
||||
use std::{
|
||||
collections::HashSet,
|
||||
hash::{
|
||||
Hash,
|
||||
Hasher
|
||||
},
|
||||
};
|
||||
|
||||
use serenity::framework::standard::CommandFn;
|
||||
|
||||
pub enum PermissionLevel {
|
||||
Unrestricted,
|
||||
Managed,
|
||||
Restricted,
|
||||
}
|
||||
|
||||
pub struct Command {
|
||||
name: String,
|
||||
required_perms: PermissionLevel,
|
||||
can_blacklist: bool,
|
||||
supports_dm: bool,
|
||||
func: CommandFn,
|
||||
}
|
||||
|
||||
impl Hash for Command {
|
||||
fn hash<H: Hasher>(&self, state: &mut H) {
|
||||
self.name.hash(state);
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq for Command {
|
||||
fn eq(&self, other: &Self) -> bool {
|
||||
self.name == other.name
|
||||
}
|
||||
}
|
||||
|
||||
impl Eq for Command {}
|
||||
|
||||
// create event handler for bot
|
||||
pub struct RegexFramework {
|
||||
commands: HashSet<Command>,
|
||||
command_names: String,
|
||||
default_prefix: String,
|
||||
ignore_bots: bool,
|
||||
}
|
||||
|
||||
impl Command {
|
||||
pub fn from(name: &str, required_perms: PermissionLevel, func: CommandFn) -> Self {
|
||||
Command {
|
||||
name: name.to_string(),
|
||||
required_perms,
|
||||
can_blacklist: true,
|
||||
supports_dm: false,
|
||||
func,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn can_blacklist(&mut self, can_blacklist: bool) -> &mut Self {
|
||||
self.can_blacklist = can_blacklist;
|
||||
|
||||
self
|
||||
}
|
||||
|
||||
pub fn supports_dm(&mut self, supports_dm: bool) -> &mut Self {
|
||||
self.supports_dm = supports_dm;
|
||||
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl RegexFramework {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
commands: HashSet::new(),
|
||||
command_names: String::new(),
|
||||
default_prefix: String::from("$"),
|
||||
ignore_bots: true,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn default_prefix(mut self, new_prefix: &str) -> Self {
|
||||
self.default_prefix = new_prefix.to_string();
|
||||
|
||||
self
|
||||
}
|
||||
|
||||
pub fn ignore_bots(mut self, ignore_bots: bool) -> Self {
|
||||
self.ignore_bots = ignore_bots;
|
||||
|
||||
self
|
||||
}
|
||||
|
||||
pub fn add_command(mut self, command: Command) -> Self {
|
||||
self.commands.insert(command);
|
||||
|
||||
self
|
||||
}
|
||||
|
||||
pub fn build(mut self) -> Self {
|
||||
self.command_names = self.commands
|
||||
.iter()
|
||||
.map(|c| c.name.clone())
|
||||
.collect::<Vec<String>>()
|
||||
.join("|");
|
||||
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl Framework for RegexFramework {
|
||||
async fn dispatch(&self, ctx: Context, msg: Message) {
|
||||
println!("Message received! command_names=={}", self.command_names);
|
||||
}
|
||||
}
|
77
src/main.rs
Normal file
77
src/main.rs
Normal file
@ -0,0 +1,77 @@
|
||||
mod framework;
|
||||
|
||||
use serenity::{
|
||||
client::{
|
||||
bridge::gateway::GatewayIntents,
|
||||
Client, Context,
|
||||
},
|
||||
model::{
|
||||
channel::{
|
||||
Message,
|
||||
},
|
||||
},
|
||||
framework::standard::{
|
||||
Args, CommandResult,
|
||||
macros::{
|
||||
command,
|
||||
}
|
||||
},
|
||||
prelude::TypeMapKey,
|
||||
};
|
||||
|
||||
use sqlx::{
|
||||
Pool,
|
||||
mysql::{
|
||||
MySqlConnection,
|
||||
}
|
||||
};
|
||||
|
||||
use dotenv::dotenv;
|
||||
|
||||
use std::{
|
||||
sync::Arc,
|
||||
env,
|
||||
};
|
||||
|
||||
use crate::framework::{RegexFramework, Command, PermissionLevel};
|
||||
|
||||
struct SQLPool;
|
||||
|
||||
impl TypeMapKey for SQLPool {
|
||||
type Value = Pool<MySqlConnection>;
|
||||
}
|
||||
|
||||
struct ReqwestClient;
|
||||
|
||||
impl TypeMapKey for ReqwestClient {
|
||||
type Value = Arc<reqwest::Client>;
|
||||
}
|
||||
|
||||
static THEME_COLOR: u32 = 0x00e0f3;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
|
||||
dotenv()?;
|
||||
|
||||
let framework = RegexFramework::new()
|
||||
.ignore_bots(true)
|
||||
.default_prefix("$")
|
||||
.add_command(Command::from("help", PermissionLevel::Unrestricted, help_command))
|
||||
.build();
|
||||
|
||||
let mut client = Client::new(&env::var("DISCORD_TOKEN").expect("Missing DISCORD_TOKEN from environment"))
|
||||
.intents(GatewayIntents::GUILD_MESSAGES | GatewayIntents::GUILDS | GatewayIntents::DIRECT_MESSAGES)
|
||||
.framework(framework)
|
||||
.await.expect("Error occured creating client");
|
||||
|
||||
client.start_autosharded().await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[command]
|
||||
async fn help_command(_ctx: &Context, _msg: &Message, _args: Args) -> CommandResult {
|
||||
println!("Help command called");
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in New Issue
Block a user