privmsg.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. use async_std::sync::{Arc, Mutex};
  2. use ringbuffer::{AllocRingBuffer, RingBufferExt, RingBufferWrite};
  3. use darkfi::util::{
  4. serial::{SerialDecodable, SerialEncodable},
  5. Timestamp,
  6. };
  7. use crate::SIZE_OF_MSGS_BUFFER;
  8. pub type PrivmsgId = u64;
  9. pub type SeenMsgIds = Arc<Mutex<AllocRingBuffer<u64>>>;
  10. pub type ArcPrivmsgsBuffer = Arc<Mutex<PrivmsgsBuffer>>;
  11. pub struct PrivmsgsBuffer(AllocRingBuffer<Privmsg>);
  12. impl PrivmsgsBuffer {
  13. pub fn new() -> ArcPrivmsgsBuffer {
  14. Arc::new(Mutex::new(Self(ringbuffer::AllocRingBuffer::with_capacity(SIZE_OF_MSGS_BUFFER))))
  15. }
  16. pub fn push(&mut self, privmsg: &Privmsg) {
  17. if privmsg.timestamp > Timestamp::current_time() {
  18. return
  19. }
  20. if let Some(last_msg) = self.0.get(-1) {
  21. if privmsg.timestamp > last_msg.timestamp {
  22. self.0.push(privmsg.clone());
  23. }
  24. } else {
  25. self.0.push(privmsg.clone());
  26. }
  27. }
  28. pub fn to_vec(&self) -> Vec<Privmsg> {
  29. self.0.to_vec()
  30. }
  31. }
  32. #[derive(Debug, Clone, SerialEncodable, SerialDecodable)]
  33. pub struct Privmsg {
  34. pub id: PrivmsgId,
  35. pub nickname: String,
  36. pub target: String,
  37. pub message: String,
  38. pub timestamp: Timestamp,
  39. }
  40. impl Privmsg {
  41. pub fn to_irc_msg(&self) -> String {
  42. let irc_msg = format!(
  43. ":{}!anon@dark.fi PRIVMSG {} :{}\r\n",
  44. self.nickname, self.target, self.message
  45. );
  46. irc_msg
  47. }
  48. }