ability for the bot to send data to the gui

This commit is contained in:
WanderingPenwing 2024-03-09 14:02:04 +01:00
parent 2d9ea54292
commit d11305b039
3 changed files with 59 additions and 13 deletions

View file

@ -3,6 +3,8 @@ use serenity::{
model::{channel::Message, gateway::Ready}, model::{channel::Message, gateway::Ready},
prelude::*, prelude::*,
}; };
use std::sync::mpsc;
use crate::postman;
mod token; mod token;
@ -29,21 +31,33 @@ impl EventHandler for Handler {
println!("{} is connected!", ready.user.name); println!("{} is connected!", ready.user.name);
let guilds = context.cache.guilds().await; let guilds = context.cache.guilds().await;
let mut guild_names : Vec<String> = vec![];
for guild_id in guilds { for guild_id in guilds {
let guild_name : String = if let Some(guild) = context.cache.guild(guild_id).await { let guild_name : String = if let Some(guild) = context.cache.guild(guild_id).await {
guild.name.clone() guild.name.clone()
} else { } else {
"not found".to_string() "not found".to_string()
}; };
guild_names.push(guild_name.clone());
println!("Guild : '{}' ({})", guild_id, guild_name); println!("Guild : '{}' ({})", guild_id, guild_name);
} }
if let Some(sender) = context.data.read().await.get::<postman::Sender>() {
let message = postman::Message::new(postman::MessageType::GuildName, guild_names[0].clone());
sender.send(message).unwrap();
println!("Message from bot to gui, sent");
} else {
println!("Failed to retrieve sender");
}
} }
} }
pub async fn start_discord_bot() { pub async fn start_discord_bot(sender: mpsc::Sender<postman::Message>) {
println!("Bot connection process started..."); println!("Bot connection process started...");
let maybe_client = Client::builder(token::TOKEN) let maybe_client = Client::builder(token::TOKEN)
.event_handler(Handler) .event_handler(Handler)
.type_map_insert::<postman::Sender>(sender)
.await .await
.map_err(|why| format!("Client error: {:?}", why)); .map_err(|why| format!("Client error: {:?}", why));

View file

@ -1,24 +1,27 @@
use eframe::egui; use eframe::egui;
use image::GenericImageView; use image::GenericImageView;
use std::{error::Error, sync::Arc, thread, time}; use std::{error::Error, sync::Arc, sync::mpsc, thread, time};
use tokio::runtime::Runtime; use tokio::runtime::Runtime;
mod bot; mod bot;
mod postman;
const MAX_FPS: f32 = 30.0; const MAX_FPS: f32 = 30.0;
fn main() { fn main() {
let _handle = thread::spawn(|| { let (tx, rx) = mpsc::channel::<postman::Message>(); //tx transmiter
let _handle = thread::spawn(move || {
println!("Bot thread spawned"); println!("Bot thread spawned");
let mut rt = Runtime::new().unwrap(); let mut rt = Runtime::new().unwrap();
rt.block_on(bot::start_discord_bot()); rt.block_on(bot::start_discord_bot(tx));
}); });
// Run the GUI on the main thread // Run the GUI on the main thread
gui(); gui(rx);
} }
fn gui() { fn gui(receiver: mpsc::Receiver<postman::Message>) {
let icon_data = load_icon().unwrap_or_default(); let icon_data = load_icon().unwrap_or_default();
let options = eframe::NativeOptions { let options = eframe::NativeOptions {
@ -28,17 +31,19 @@ fn gui() {
..Default::default() ..Default::default()
}; };
let _ = eframe::run_native("Jiji", options, Box::new(move |_cc| Box::from(Jiji::new()))); let _ = eframe::run_native("Jiji", options, Box::new(move |_cc| Box::from(Jiji::new(receiver))));
} }
struct Jiji { struct Jiji {
next_frame: time::Instant, next_frame: time::Instant,
receiver: mpsc::Receiver<postman::Message>,
} }
impl Jiji { impl Jiji {
fn new() -> Self { fn new(receiver: mpsc::Receiver<postman::Message>) -> Self {
Self { Self {
next_frame: time::Instant::now(), next_frame: time::Instant::now(),
receiver,
} }
} }
} }

27
src/postman.rs Normal file
View file

@ -0,0 +1,27 @@
use std::sync::mpsc;
use serenity::prelude::TypeMapKey;
pub struct Message {
kind: MessageType,
content: String,
}
impl Message {
pub fn new(kind : MessageType, content: String) -> Self {
Self {
kind,
content,
}
}
}
pub enum MessageType {
GuildName,
}
pub struct Sender;
impl TypeMapKey for Sender {
type Value = mpsc::Sender<Message>;
}