From dc9d9cc1d517be16a1ee9d9cf79a583e06eaec11 Mon Sep 17 00:00:00 2001 From: poslop Date: Sat, 3 Dec 2022 21:50:06 -0600 Subject: [PATCH] fisrt --- Cargo.toml | 11 +++++ src/main.rs | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 Cargo.toml create mode 100644 src/main.rs diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..8c30699 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "MSDB" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +dotenv = "0.15.0" +serenity = "0.11" +tokio = { version = "1.21.2", features = ["macros", "rt-multi-thread"] } diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..f1fa689 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,120 @@ +use std::io::{Write, BufRead}; +use std::time::Duration; +use std::{env, io, clone}; +use serenity::async_trait; +use serenity::futures::io::{BufReader, BufWriter}; +use serenity::prelude::*; +use serenity::model::channel::Message; +use serenity::framework::standard::macros::{command, group}; +use serenity::framework::standard::{StandardFramework, CommandResult, Args}; +use dotenv::dotenv; +use std::net::TcpStream; + + + +struct TcpSock { + stream: TcpStream, + reader: std::io::BufReader, + writer: std::io::BufWriter +} + + +impl TypeMapKey for TcpSock { + type Value = TcpSock; +} + +impl TcpSock { + pub fn new() -> std::io::Result { + let stream = TcpStream::connect("localhost:6859").expect("Tcp connection fail"); + stream.set_read_timeout(Some(Duration::from_millis(200)))?; + let mut reader = std::io::BufReader::new(stream.try_clone()?); + let mut writer = std::io::BufWriter::new(stream.try_clone()?); + + Ok(TcpSock { stream, reader, writer }) + } +} + + +#[group] +#[commands(ping, pong, send)] +struct General; +struct Handler; + +#[async_trait] +impl EventHandler for Handler {} + +#[tokio::main] +async fn main() { + + let sock = TcpSock::new().unwrap(); + dotenv().ok(); + + let framework = StandardFramework::new() + .configure(|c| c.prefix(";")) // set the bot's prefix to "~" + .group(&GENERAL_GROUP); + + // Login with a bot token from the environment + let token = env::var("DISCORD_TOKEN").expect("token"); + let intents = GatewayIntents::non_privileged() | GatewayIntents::MESSAGE_CONTENT; + let mut client = Client::builder(&token, intents) + .event_handler(Handler) + .framework(framework) + .await + .expect("Error creating client"); + + { + let mut data = client.data.write().await; + data.insert::(sock); + } + + if let Err(why) = client.start().await { + println!("An error occurred while running the client: {:?}", why); + } +} + +#[command] +async fn ping(ctx: &Context, msg: &Message) -> CommandResult { + msg.reply(ctx, "Pong!").await?; + + Ok(()) +} + + +#[command] +async fn pong(ctx: &Context, msg: &Message) -> CommandResult { + msg.reply(ctx, "Ping!").await?; + + Ok(()) +} + +#[command] +async fn send(ctx: &Context, msg: &Message) -> CommandResult { + + let input = msg.content.strip_prefix(";send ").to_owned(); + let output = &mut String::new(); + if input == Option::None { + msg.reply(ctx, "Not enough Parameters").await?; + return Ok(()); + } + + let data = ctx.data.read().await; + let sock = data.get::().unwrap(); + + + let mut writer = std::io::BufWriter::new(sock.stream.try_clone()?); + let mut reader = std::io::BufReader::new(sock.stream.try_clone()?); + + writer.write((input.unwrap().to_owned() + "\n").as_bytes())?; + writer.flush().expect("flush failed"); + + loop { + match reader.read_line(output) { + Ok(t) => t, + Err(_) => break(), + }; + } + println!("{}", output); + msg.reply(ctx, format!("```ansi\n{}\n```", output)).await?; + Ok(()) +} +