better message history
This commit is contained in:
parent
391c284b59
commit
a66e462937
68
src/bot.rs
68
src/bot.rs
|
@ -127,40 +127,8 @@ async fn check_packets(context: &Context) {
|
||||||
}
|
}
|
||||||
postman::Packet::FetchMessages(guild_id_str, channel_id_str, first_message_id_str) => {
|
postman::Packet::FetchMessages(guild_id_str, channel_id_str, first_message_id_str) => {
|
||||||
println!("bot : received FetchMessages packet, channel : '{}', first message : {}", channel_id_str, first_message_id_str);
|
println!("bot : received FetchMessages packet, channel : '{}', first message : {}", channel_id_str, first_message_id_str);
|
||||||
if let Some(sender) = context.data.read().await.get::<postman::Sender>() {
|
|
||||||
match channel_id_str.parse::<u64>() {
|
|
||||||
Ok(channel_id_u64) => {
|
|
||||||
let channel_id = ChannelId::from(channel_id_u64);
|
|
||||||
|
|
||||||
let maybe_messages = channel_id.messages(&context.http, |retriever| {
|
let _result = get_messages(context, guild_id_str, channel_id_str, first_message_id_str).await;
|
||||||
retriever.after(MessageId::from(158339864557912064)).limit(25)
|
|
||||||
}).await;
|
|
||||||
|
|
||||||
match maybe_messages {
|
|
||||||
Ok(messages) => {
|
|
||||||
println!("bot : got messages");
|
|
||||||
|
|
||||||
for message in messages {
|
|
||||||
let discord_message = discord_structure::Message::new(message.id.to_string(), channel_id_str.clone(), guild_id_str.clone(), message.author.to_string(), message.content, message.timestamp.to_string());
|
|
||||||
sender.send(postman::Packet::Message(discord_message)).expect("Failed to send packet");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Err(why) => {
|
|
||||||
eprintln!("bot : Failed to fetch messages : {}", why);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Err(why) => {
|
|
||||||
eprintln!("bot : Failed to parse channel ID string to u64: {}", why);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
sender.send(postman::Packet::FinishedRequest).expect("Failed to send packet");
|
|
||||||
} else {
|
|
||||||
println!("bot : failed to retrieve sender");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
println!("bot : unhandled packet");
|
println!("bot : unhandled packet");
|
||||||
|
@ -169,6 +137,40 @@ async fn check_packets(context: &Context) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn get_messages(context: &Context, guild_id_str: String, channel_id_str: String, first_message_id_str: String) -> Result<(), String> {
|
||||||
|
if let Some(sender) = context.data.read().await.get::<postman::Sender>() {
|
||||||
|
let channel_id_u64 = channel_id_str.parse::<u64>().map_err(|e| e.to_string())?;
|
||||||
|
let channel_id = ChannelId::from(channel_id_u64);
|
||||||
|
|
||||||
|
let messages = if first_message_id_str == "" {
|
||||||
|
channel_id.messages(&context.http, |retriever| {
|
||||||
|
retriever.limit(25)
|
||||||
|
}).await.map_err(|e| e.to_string())?
|
||||||
|
} else {
|
||||||
|
let first_message_id_u64 = first_message_id_str.parse::<u64>().map_err(|e| e.to_string())?;
|
||||||
|
channel_id.messages(&context.http, |retriever| {
|
||||||
|
retriever.before(MessageId::from(first_message_id_u64)).limit(25)
|
||||||
|
}).await.map_err(|e| e.to_string())?
|
||||||
|
};
|
||||||
|
|
||||||
|
println!("bot : got messages");
|
||||||
|
|
||||||
|
for message in &messages {
|
||||||
|
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_string());
|
||||||
|
sender.send(postman::Packet::Message(discord_message)).map_err(|e| e.to_string())?;
|
||||||
|
}
|
||||||
|
|
||||||
|
if messages.len() == 25 {
|
||||||
|
let discord_fetch_message = discord_structure::Message::new("".to_string(), channel_id_str.clone(), guild_id_str.clone(), "+".to_string(), "".to_string(), "".to_string());
|
||||||
|
sender.send(postman::Packet::Message(discord_fetch_message)).map_err(|e| e.to_string())?;
|
||||||
|
}
|
||||||
|
|
||||||
|
sender.send(postman::Packet::FinishedRequest).map_err(|e| e.to_string())?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
async fn get_guilds(context: &Context) {
|
async fn get_guilds(context: &Context) {
|
||||||
let guilds = context.cache.guilds().await;
|
let guilds = context.cache.guilds().await;
|
||||||
|
|
52
src/main.rs
52
src/main.rs
|
@ -48,6 +48,7 @@ struct Jiji {
|
||||||
selected_channel: Option<usize>,
|
selected_channel: Option<usize>,
|
||||||
time_watch: f32,
|
time_watch: f32,
|
||||||
pending_bot_requests: usize,
|
pending_bot_requests: usize,
|
||||||
|
current_message: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Jiji {
|
impl Jiji {
|
||||||
|
@ -61,6 +62,7 @@ impl Jiji {
|
||||||
selected_channel: None,
|
selected_channel: None,
|
||||||
time_watch: 0.0,
|
time_watch: 0.0,
|
||||||
pending_bot_requests: 0,
|
pending_bot_requests: 0,
|
||||||
|
current_message: "".into(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -105,6 +107,10 @@ impl eframe::App for Jiji {
|
||||||
if self.guilds[guild_index].channels[i].id != message.channel_id {
|
if self.guilds[guild_index].channels[i].id != message.channel_id {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if self.guilds[guild_index].channels[i].messages[0].author_name == "+" {
|
||||||
|
self.guilds[guild_index].channels[i].messages[0] = message.clone();
|
||||||
|
continue
|
||||||
|
}
|
||||||
self.guilds[guild_index].channels[i].messages.insert(0, message.clone());
|
self.guilds[guild_index].channels[i].messages.insert(0, message.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -157,6 +163,7 @@ impl Jiji {
|
||||||
ui.set_min_width(60.0);
|
ui.set_min_width(60.0);
|
||||||
if ui.add(egui::SelectableLabel::new(self.selected_guild == None, "None")).clicked() {
|
if ui.add(egui::SelectableLabel::new(self.selected_guild == None, "None")).clicked() {
|
||||||
self.selected_guild = None;
|
self.selected_guild = None;
|
||||||
|
self.selected_channel = None;
|
||||||
}
|
}
|
||||||
for i in 0..self.guilds.len() {
|
for i in 0..self.guilds.len() {
|
||||||
if ui.add(egui::SelectableLabel::new(self.selected_guild == Some(i), self.guilds[i].name.clone())).clicked() {
|
if ui.add(egui::SelectableLabel::new(self.selected_guild == Some(i), self.guilds[i].name.clone())).clicked() {
|
||||||
|
@ -164,6 +171,7 @@ impl Jiji {
|
||||||
if self.guilds[i].channels.len() == 0 {
|
if self.guilds[i].channels.len() == 0 {
|
||||||
let _ = self.sender.send(postman::Packet::FetchChannels(self.guilds[i].id.clone()));
|
let _ = self.sender.send(postman::Packet::FetchChannels(self.guilds[i].id.clone()));
|
||||||
|
|
||||||
|
self.selected_channel = None;
|
||||||
self.pending_bot_requests += 1;
|
self.pending_bot_requests += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -213,6 +221,20 @@ impl Jiji {
|
||||||
egui::TopBottomPanel::bottom("infobar")
|
egui::TopBottomPanel::bottom("infobar")
|
||||||
.resizable(false)
|
.resizable(false)
|
||||||
.show(ctx, |ui| {
|
.show(ctx, |ui| {
|
||||||
|
if self.selected_channel != None {
|
||||||
|
ui.label("");
|
||||||
|
ui.horizontal(|ui| {
|
||||||
|
if ui.button(">").clicked() {
|
||||||
|
println!("gui : sent message");
|
||||||
|
}
|
||||||
|
egui::ScrollArea::vertical()
|
||||||
|
.show(ui, |ui| {
|
||||||
|
let _response = ui.add(egui::TextEdit::multiline(&mut self.current_message)
|
||||||
|
.desired_width(f32::INFINITY)
|
||||||
|
.lock_focus(true));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| {
|
ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| {
|
||||||
ui.label(&format!("time per frame : {:.1} ms", self.time_watch));
|
ui.label(&format!("time per frame : {:.1} ms", self.time_watch));
|
||||||
|
@ -234,13 +256,35 @@ 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 {
|
||||||
|
let mut last_author = "".to_string();
|
||||||
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 == "-" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
ui.separator();
|
|
||||||
|
if message.author_name == "+" {
|
||||||
|
if ui.button("+").clicked() {
|
||||||
|
if let Some(selected_guild_index) = &self.selected_guild {
|
||||||
|
if let Some(selected_channel_index) = &self.selected_channel {
|
||||||
|
let _ = self.sender.send(postman::Packet::FetchMessages(
|
||||||
|
self.guilds[*selected_guild_index].id.clone(),
|
||||||
|
self.guilds[*selected_guild_index].channels[*selected_channel_index].id.clone(),
|
||||||
|
self.guilds[*selected_guild_index].channels[*selected_channel_index].messages[1].id.clone(),
|
||||||
|
));
|
||||||
|
self.pending_bot_requests += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if message.author_name != last_author {
|
||||||
|
ui.separator();
|
||||||
|
ui.colored_label(hex_str_to_color("#3399ff"), &message.author_name);
|
||||||
|
} else {
|
||||||
|
ui.label("");
|
||||||
|
}
|
||||||
ui.label(&message.content);
|
ui.label(&message.content);
|
||||||
ui.label(&message.author_name);
|
last_author = message.author_name.clone();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -264,3 +308,7 @@ pub fn load_icon() -> Result<egui::IconData, Box<dyn Error>> {
|
||||||
height: icon_height,
|
height: icon_height,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn hex_str_to_color(hex_str: &str) -> egui::Color32 {
|
||||||
|
egui::Color32::from_hex(hex_str).unwrap_or_else(|_| egui::Color32::WHITE)
|
||||||
|
}
|
Loading…
Reference in a new issue