Преглед на файлове

bin/ircd: update the buffer when add/send a message

ghassmo преди 3 години
родител
ревизия
0395727e32
променени са 8 файла, в които са добавени 34 реда и са изтрити 33 реда
  1. 1 16
      Cargo.lock
  2. 1 0
      bin/ircd/src/buffers.rs
  3. 2 0
      bin/ircd/src/crypto.rs
  4. 1 2
      bin/ircd/src/main.rs
  5. 3 0
      bin/ircd/src/privmsg.rs
  6. 13 12
      bin/ircd/src/protocol_privmsg.rs
  7. 11 2
      bin/ircd/src/server/command.rs
  8. 2 1
      bin/ircd/src/server/mod.rs

+ 1 - 16
Cargo.lock

@@ -77,12 +77,6 @@ version = "1.0.62"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1485d4d2cc45e7b201ee3767015c96faa5904387c9d87c6efdd0fb511f12d305"
 
-[[package]]
-name = "array-init"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfb6d71005dc22a708c7496eee5c8dc0300ee47355de6256c3b35b12b5fef596"
-
 [[package]]
 name = "arrayref"
 version = "0.3.6"
@@ -2337,6 +2331,7 @@ dependencies = [
  "async-std",
  "async-trait",
  "bs58",
+ "chrono",
  "clap 3.2.18",
  "crypto_box",
  "ctrlc",
@@ -2347,7 +2342,6 @@ dependencies = [
  "fxhash",
  "log",
  "rand",
- "ringbuffer",
  "rustls-pemfile",
  "serde",
  "serde_json",
@@ -3357,15 +3351,6 @@ dependencies = [
  "winapi",
 ]
 
-[[package]]
-name = "ringbuffer"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0aa778d993bd10cc64483ec8c75ce3755bd48f42886943e23d6588bc0943678d"
-dependencies = [
- "array-init",
-]
-
 [[package]]
 name = "rkyv"
 version = "0.7.39"

+ 1 - 0
bin/ircd/src/buffers.rs

@@ -6,6 +6,7 @@ use chrono::Utc;
 use crate::Privmsg;
 
 pub const SIZE_OF_MSGS_BUFFER: usize = 4095;
+pub const SIZE_OF_MSG_IDSS_BUFFER: usize = 65536;
 pub const LIFETIME_FOR_ORPHAN: i64 = 600;
 
 #[derive(Clone)]

+ 2 - 0
bin/ircd/src/crypto.rs

@@ -9,6 +9,8 @@ use crate::{
     privmsg::Privmsg,
     settings::{ChannelInfo, ContactInfo},
     MAXIMUM_LENGTH_OF_NICKNAME,
+    privmsg::{Privmsg, MAXIMUM_LENGTH_OF_NICKNAME},
+    settings::ChannelInfo,
 };
 
 /// Try decrypting a message given a NaCl box and a base58 string.

+ 1 - 2
bin/ircd/src/main.rs

@@ -37,7 +37,7 @@ pub mod server;
 pub mod settings;
 
 use crate::{
-    buffers::{ArcPrivmsgsBuffer, PrivmsgsBuffer, RingBuffer, SeenMsgIds},
+    buffers::{ArcPrivmsgsBuffer, PrivmsgsBuffer, RingBuffer, SeenMsgIds, SIZE_OF_MSG_IDSS_BUFFER},
     privmsg::Privmsg,
     protocol_privmsg::ProtocolPrivmsg,
     rpc::JsonRpcInterface,
@@ -48,7 +48,6 @@ use crate::{
     },
 };
 
-const SIZE_OF_MSG_IDSS_BUFFER: usize = 65536;
 pub const MAXIMUM_LENGTH_OF_MESSAGE: usize = 1024;
 pub const MAXIMUM_LENGTH_OF_NICKNAME: usize = 32;
 

+ 3 - 0
bin/ircd/src/privmsg.rs

@@ -7,6 +7,9 @@ use darkfi::util::{
 
 pub type PrivmsgId = u64;
 
+pub const MAXIMUM_LENGTH_OF_MESSAGE: usize = 1024;
+pub const MAXIMUM_LENGTH_OF_NICKNAME: usize = 32;
+
 #[derive(Debug, Clone, SerialEncodable, SerialDecodable, Eq, PartialEq)]
 pub struct Privmsg {
     pub id: PrivmsgId,

+ 13 - 12
bin/ircd/src/protocol_privmsg.rs

@@ -13,7 +13,7 @@ use crate::{
 
 pub struct ProtocolPrivmsg {
     jobsman: net::ProtocolJobsManagerPtr,
-    notify_queue_sender: async_channel::Sender<Privmsg>,
+    notify: async_channel::Sender<Privmsg>,
     msg_sub: net::MessageSubscription<Privmsg>,
     p2p: net::P2pPtr,
     msg_ids: SeenMsgIds,
@@ -24,7 +24,7 @@ pub struct ProtocolPrivmsg {
 impl ProtocolPrivmsg {
     pub async fn init(
         channel: net::ChannelPtr,
-        notify_queue_sender: async_channel::Sender<Privmsg>,
+        notify: async_channel::Sender<Privmsg>,
         p2p: net::P2pPtr,
         msg_ids: SeenMsgIds,
         msgs: ArcPrivmsgsBuffer,
@@ -36,7 +36,7 @@ impl ProtocolPrivmsg {
             channel.subscribe_msg::<Privmsg>().await.expect("Missing Privmsg dispatcher!");
 
         Arc::new(Self {
-            notify_queue_sender,
+            notify,
             msg_sub,
             jobsman: net::ProtocolJobsManager::new("ProtocolPrivmsg", channel.clone()),
             p2p,
@@ -62,19 +62,20 @@ impl ProtocolPrivmsg {
             let msg = self.msg_sub.receive().await?;
             let msg = (*msg).to_owned();
 
-            {
-                let msg_ids = &mut self.msg_ids.lock().await;
-                if msg_ids.contains(&msg.id) {
-                    continue
-                }
-
-                msg_ids.push(msg.id);
+            let mut msg_ids = self.msg_ids.lock().await;
+            if msg_ids.contains(&msg.id) {
+                continue
             }
+            msg_ids.push(msg.id);
+            drop(msg_ids);
 
             // add the msg to the buffer
-            self.msgs.lock().await.push(&msg);
+            let mut msgs = self.msgs.lock().await;
+            msgs.push(&msg);
+            msgs.update();
+            drop(msgs);
 
-            self.notify_queue_sender.send(msg.clone()).await?;
+            self.notify.send(msg.clone()).await?;
 
             self.p2p.broadcast_with_exclude(msg, &exclude_list).await?;
         }

+ 11 - 2
bin/ircd/src/server/command.rs

@@ -3,7 +3,11 @@ use log::{debug, info, warn};
 
 use darkfi::{Error, Result};
 
-use crate::{crypto::encrypt_privmsg, privmsg::Privmsg, ChannelInfo, MAXIMUM_LENGTH_OF_NICKNAME};
+use crate::{
+    crypto::encrypt_privmsg,
+    privmsg::{Privmsg, MAXIMUM_LENGTH_OF_NICKNAME},
+    ChannelInfo,
+};
 
 use super::IrcServerConnection;
 
@@ -206,7 +210,12 @@ impl<C: AsyncRead + AsyncWrite + Send + Unpin + 'static> IrcServerConnection<C>
 
         info!("(Plain) PRIVMSG {} :{}", target, message);
 
-        let mut privmsg = Privmsg::new(&self.nickname, target, &message, 0);
+        let mut privmsgs_buffer = self.privmsgs_buffer.lock().await;
+        privmsgs_buffer.update();
+        let last_term = privmsgs_buffer.last_term();
+        drop(privmsgs_buffer);
+
+        let mut privmsg = Privmsg::new(&self.nickname, target, &message, last_term);
 
         if target.starts_with('#') {
             if !self.configured_chans.contains_key(target) {

+ 2 - 1
bin/ircd/src/server/mod.rs

@@ -9,7 +9,8 @@ use darkfi::{net::P2pPtr, system::SubscriberPtr, Error, Result};
 use crate::{
     buffers::{ArcPrivmsgsBuffer, SeenMsgIds},
     crypto::{decrypt_privmsg, decrypt_target},
-    ChannelInfo, Privmsg, MAXIMUM_LENGTH_OF_MESSAGE,
+    privmsg::MAXIMUM_LENGTH_OF_MESSAGE,
+    ChannelInfo, Privmsg,
 };
 
 mod command;