starting to work on unread/notify

This commit is contained in:
WanderingPenwing 2024-07-13 15:38:22 +02:00
parent faf95577da
commit f39954d5bc
4 changed files with 54 additions and 14 deletions

View file

@ -1 +1 @@
{"categories":[{"name":"to do","content":[{"name":"get incoming messages","description":"read","id":2},{"name":"ability to write messages","description":"// Hello there","id":5},{"name":"ability to change token","description":"use a config file to store token so that \n\n1- it is away from github\n\n2- it is configurable if need be","id":1}]},{"name":"in progress","content":[{"name":"fetch previous messages","description":"// Hello there","id":4}]},{"name":"done","content":[{"name":"run discord bot","description":"make it so the bot is running","id":1},{"name":"fixed token in github","description":"// Hello there","id":1}]},{"name":"bugs","content":[]},{"name":"+","content":[]}]} {"categories":[{"name":"to do","content":[{"name":"ability to change token","description":"use a config file to store token so that \n\n1- it is away from github\n\n2- it is configurable if need be","id":1},{"name":"better ui error display","description":"handle the error packet for better display","id":1},{"name":"clean up bot code","description":"try to remove unnecessary code\n\nunindent\n\ngive sender to function ?","id":2},{"name":"proper links","description":"when there is a link, ability to click it","id":3},{"name":"trayable ?","description":"// Hello there","id":5},{"name":"handle unknown channel better","description":"when receiving a message from a not yet scanned guild, create the channel and put the message\n\nallow scanning if guild selected\n\ndo not add duplicate channel","id":1},{"name":"guild unread ?","description":"// Hello there","id":2}]},{"name":"in progress","content":[{"name":"notifications !!!","description":"// Hello there","id":4}]},{"name":"done","content":[{"name":"run discord bot","description":"make it so the bot is running","id":1},{"name":"fixed token in github","description":"// Hello there","id":1},{"name":"fetch previous messages","description":"// Hello there","id":4},{"name":"ability to write messages","description":"// Hello there","id":5},{"name":"get incoming messages","description":"read","id":2},{"name":"unread system","description":"add a * when a channel just received a message","id":1}]},{"name":"bugs","content":[]},{"name":"+","content":[]}]}

View file

@ -45,11 +45,11 @@ impl EventHandler for Handler {
let guild_id = if let Some(id) = msg.guild_id { let guild_id = if let Some(id) = msg.guild_id {
id.to_string() id.to_string()
} else { } else {
let private_channel = discord_structure::Channel::new(author_name.clone(), msg.channel_id.to_string(), "dm".to_string()); let private_channel = discord_structure::Channel::create(author_name.clone(), msg.channel_id.to_string(), "dm".to_string());
sender.send(postman::Packet::Channel(private_channel)).expect("failed to send packet"); sender.send(postman::Packet::Channel(private_channel)).expect("failed to send packet");
"dm".to_string() "dm".to_string()
}; };
let discord_message = discord_structure::Message::new(msg.id.to_string(), msg.channel_id.to_string(), guild_id, author_name, msg.content.clone(), msg.timestamp.to_rfc2822()); let discord_message = discord_structure::Message::create(msg.id.to_string(), msg.channel_id.to_string(), guild_id, author_name, msg.content.clone(), msg.timestamp.to_rfc2822()).new();
sender.send(postman::Packet::Message(discord_message)).expect("failed to send packet"); sender.send(postman::Packet::Message(discord_message)).expect("failed to send packet");
} else { } else {
println!("bot : failed to retrieve sender"); println!("bot : failed to retrieve sender");
@ -177,7 +177,7 @@ async fn get_channels(context: &Context, guild_id_str: String) -> Result<(), Str
if channel.kind != ChannelType::Text { if channel.kind != ChannelType::Text {
continue continue
} }
let discord_channel = discord_structure::Channel::new(channel.name, format!("{}",channel_id), guild_id_str.to_string()); let discord_channel = discord_structure::Channel::create(channel.name, format!("{}",channel_id), guild_id_str.to_string());
sender.send(postman::Packet::Channel(discord_channel)).map_err(|e| e.to_string())?; sender.send(postman::Packet::Channel(discord_channel)).map_err(|e| e.to_string())?;
} }
sender.send(postman::Packet::FinishedRequest).map_err(|e| e.to_string())?; sender.send(postman::Packet::FinishedRequest).map_err(|e| e.to_string())?;
@ -209,7 +209,7 @@ async fn get_messages(context: &Context, guild_id_str: String, channel_id_str: S
for message in &messages { for message in &messages {
let author_name = message.author.name.clone(); let author_name = message.author.name.clone();
let discord_message = discord_structure::Message::new(message.id.to_string(), channel_id_str.clone(), guild_id_str.clone(), author_name, message.content.clone(), message.timestamp.to_rfc2822()); let discord_message = discord_structure::Message::create(message.id.to_string(), channel_id_str.clone(), guild_id_str.clone(), author_name, message.content.clone(), message.timestamp.to_rfc2822());
sender.send(postman::Packet::Message(discord_message)).map_err(|e| e.to_string())?; sender.send(postman::Packet::Message(discord_message)).map_err(|e| e.to_string())?;
} }
@ -229,13 +229,13 @@ async fn get_guilds(context: &Context) {
let guilds = context.cache.guilds().await; let guilds = context.cache.guilds().await;
if let Some(sender) = context.data.read().await.get::<postman::Sender>() { if let Some(sender) = context.data.read().await.get::<postman::Sender>() {
let personal_messages = discord_structure::Guild::new("dm".to_string(), "dm".to_string()); let personal_messages = discord_structure::Guild::create("dm".to_string(), "dm".to_string());
sender.send(postman::Packet::Guild(personal_messages)).expect("Failed to send packet"); sender.send(postman::Packet::Guild(personal_messages)).expect("Failed to send packet");
for guild_id in guilds { for guild_id in guilds {
if let Some(guild) = context.cache.guild(guild_id).await { if let Some(guild) = context.cache.guild(guild_id).await {
println!("bot : found guild '{}'", guild.name.clone()); println!("bot : found guild '{}'", guild.name.clone());
let discord_guild = discord_structure::Guild::new(guild.name.clone(), guild_id.to_string()); let discord_guild = discord_structure::Guild::create(guild.name.clone(), guild_id.to_string());
sender.send(postman::Packet::Guild(discord_guild)).expect("Failed to send packet"); sender.send(postman::Packet::Guild(discord_guild)).expect("Failed to send packet");
} else { } else {

View file

@ -8,7 +8,7 @@ pub struct Guild {
} }
impl Guild { impl Guild {
pub fn new(name: String, id: String) -> Self { pub fn create(name: String, id: String) -> Self {
Self { Self {
name, name,
id, id,
@ -38,19 +38,27 @@ pub struct Channel {
pub id: String, pub id: String,
pub guild_id: String, pub guild_id: String,
pub messages: Vec<Message>, pub messages: Vec<Message>,
pub notify: bool,
pub unread: bool,
} }
impl Channel { impl Channel {
pub fn new(name: String, id: String, guild_id: String) -> Self { pub fn create(name: String, id: String, guild_id: String) -> Self {
Self { Self {
name, name,
id: id.clone(), id: id.clone(),
guild_id : guild_id.clone(), guild_id : guild_id.clone(),
messages: vec![Message::new("0".into(), id, guild_id, "+".into(), "".into(), "".into())], messages: vec![Message::create("0".into(), id, guild_id, "+".into(), "".into(), "".into())],
notify: false,
unread: false,
} }
} }
pub fn insert(&mut self, message: Message) { pub fn insert(&mut self, message: Message) {
if message.new != "" {
self.unread = true;
}
match self.get_index_from_timestamp(&message.timestamp) { match self.get_index_from_timestamp(&message.timestamp) {
Ok(index) => { Ok(index) => {
self.messages.insert(index, message); self.messages.insert(index, message);
@ -88,6 +96,20 @@ impl Channel {
} }
self.messages.remove(0); self.messages.remove(0);
} }
pub fn display(&self) -> String {
let notify = if self.notify {
" !"
} else {
""
};
let unread = if self.unread {
"~ "
} else {
""
};
format!("{}{}{}", unread, self.name, notify)
}
} }
#[derive(PartialEq, Clone)] #[derive(PartialEq, Clone)]
@ -98,10 +120,11 @@ pub struct Message {
pub author_name: String, pub author_name: String,
pub content: String, pub content: String,
pub timestamp: String, pub timestamp: String,
pub new: String,
} }
impl Message { impl Message {
pub fn new(id: String, channel_id: String, guild_id: String, author_name: String, content: String, timestamp: String) -> Self { pub fn create(id: String, channel_id: String, guild_id: String, author_name: String, content: String, timestamp: String) -> Self {
Self { Self {
id, id,
channel_id, channel_id,
@ -109,6 +132,12 @@ impl Message {
author_name, author_name,
content, content,
timestamp, timestamp,
new: "".to_string(),
} }
} }
pub fn new(&mut self) -> Self {
let mut updated = self.clone();
updated.new = "yes".to_string();
updated
}
} }

View file

@ -49,6 +49,7 @@ struct Jiji {
time_watch: f32, time_watch: f32,
pending_bot_requests: usize, pending_bot_requests: usize,
current_message: String, current_message: String,
channels_to_notify: Vec<String>,
} }
impl Jiji { impl Jiji {
@ -63,6 +64,7 @@ impl Jiji {
time_watch: 0.0, time_watch: 0.0,
pending_bot_requests: 0, pending_bot_requests: 0,
current_message: "".into(), current_message: "".into(),
channels_to_notify: vec![],
} }
} }
} }
@ -115,7 +117,9 @@ impl eframe::App for Jiji {
if unkown_channel { if unkown_channel {
println!("gui : unkown channel"); println!("gui : unkown channel");
self.guilds[guild_index].channels.push(discord_structure::Channel::new(message.channel_id.clone(), message.channel_id, message.guild_id)); self.guilds[guild_index].channels.push(discord_structure::Channel::create(message.channel_id.clone(), message.channel_id.clone(), message.guild_id.clone()));
let last = self.guilds[guild_index].channels.len() - 1;
self.guilds[guild_index].channels[last].insert(message.clone());
} }
} else { } else {
println!("gui : message guild issue : '{}'", message.guild_id); println!("gui : message guild issue : '{}'", message.guild_id);
@ -218,7 +222,7 @@ impl Jiji {
if let Some(selected_guild_index) = &self.selected_guild { if let Some(selected_guild_index) = &self.selected_guild {
if self.guilds[*selected_guild_index].channels.len() != 0 { if self.guilds[*selected_guild_index].channels.len() != 0 {
let selected_channel_text = if let Some(selected_channel_index) = &self.selected_channel { let selected_channel_text = if let Some(selected_channel_index) = &self.selected_channel {
self.guilds[*selected_guild_index].channels[*selected_channel_index].name.clone() self.guilds[*selected_guild_index].channels[*selected_channel_index].display()
} else { } else {
"None".to_string() "None".to_string()
}; };
@ -232,7 +236,7 @@ impl Jiji {
self.selected_channel = None; self.selected_channel = None;
} }
for i in 0..self.guilds[*selected_guild_index].channels.len() { for i in 0..self.guilds[*selected_guild_index].channels.len() {
if ui.add(egui::SelectableLabel::new(self.selected_channel == Some(i), self.guilds[*selected_guild_index].channels[i].name.clone())).clicked() { if ui.add(egui::SelectableLabel::new(self.selected_channel == Some(i), self.guilds[*selected_guild_index].channels[i].display())).clicked() {
self.selected_channel = Some(i); self.selected_channel = Some(i);
if self.guilds[*selected_guild_index].channels[i].messages.len() == 1 { if self.guilds[*selected_guild_index].channels[i].messages.len() == 1 {
let _ = self.sender.send(postman::Packet::FetchMessages(self.guilds[*selected_guild_index].id.clone(), self.guilds[*selected_guild_index].channels[i].id.clone(), "".into())); let _ = self.sender.send(postman::Packet::FetchMessages(self.guilds[*selected_guild_index].id.clone(), self.guilds[*selected_guild_index].channels[i].id.clone(), "".into()));
@ -243,6 +247,9 @@ impl Jiji {
} }
}); });
if let Some(selected_channel_index) = &self.selected_channel {
ui.checkbox(&mut self.guilds[*selected_guild_index].channels[*selected_channel_index].notify, "notify");
}
} }
} }
}); });
@ -292,10 +299,14 @@ impl Jiji {
.show(ui, |ui| { .show(ui, |ui| {
if let Some(selected_guild_index) = &self.selected_guild { if let Some(selected_guild_index) = &self.selected_guild {
if let Some(selected_channel_index) = &self.selected_channel { if let Some(selected_channel_index) = &self.selected_channel {
self.guilds[*selected_guild_index].channels[*selected_channel_index].unread = false;
let mut last_author = "".to_string(); let mut last_author = "".to_string();
if self.guilds[*selected_guild_index].channels[*selected_channel_index].messages.len() < 2 { if self.guilds[*selected_guild_index].channels[*selected_channel_index].messages.len() < 2 {
return return
} }
for message in &self.guilds[*selected_guild_index].channels[*selected_channel_index].messages { for message in &self.guilds[*selected_guild_index].channels[*selected_channel_index].messages {
if message.author_name == "+" { if message.author_name == "+" {
if ui.button("+").clicked() { if ui.button("+").clicked() {