telegram_client/
client.rs

1use std::sync::{Arc, Mutex};
2use std::thread::JoinHandle;
3
4use rtdlib::Tdlib;
5
6use crate::api::Api;
7use crate::listener::Listener;
8use crate::rtd::TdRecv;
9
10#[derive(Clone)]
11pub struct Client {
12  stop_flag: Arc<Mutex<bool>>,
13  listener: Listener,
14  api: Api,
15  warn_unregister_listener: bool,
16}
17
18impl Default for Client {
19  /// Creates a default Client
20  ///
21  /// # Examples
22  ///
23  /// ```
24  /// use telegram_client::client::Client;
25  /// use telegram_client::api::Api;
26  /// let client = Client::new(Api::default());
27  /// ```
28  fn default() -> Self {
29    Client::new(Api::default())
30  }
31}
32
33impl Client {
34  /// Sets the verbosity level of the internal logging of TDLib.
35  ///
36  /// By default the TDLib uses a log verbosity level of 5.
37  ///
38  /// # Parameters
39  ///
40  /// `level` New value of logging verbosity level. Value 0 corresponds to fatal errors,
41  /// value 1 corresponds to errors, value 2 corresponds to warnings and debug warnings,
42  /// value 3 corresponds to informational, value 4 corresponds to debug, value 5 corresponds
43  /// to verbose debug, value greater than 5 and up to 1024 can be used to enable even more logging.
44  ///
45  /// # Examples
46  ///
47  /// ```
48  /// use telegram_client::client::Client;
49  /// Client::set_log_verbosity_level(3);
50  /// ```
51  pub fn set_log_verbosity_level<'a>(level: i32) -> Result<(), &'a str> {
52    Tdlib::set_log_verbosity_level(level)
53  }
54
55  /// Sets maximum size of the file to where the internal TDLib log is written before the file will be auto-rotated.
56  ///
57  /// Unused if log is not written to a file. Defaults to 10 MB.
58  ///
59  /// # Parameters
60  ///
61  /// `size` Maximum size of the file to where the internal TDLib log is written before the file will be auto-rotated. Should be positive.
62  ///
63  /// # Examples
64  ///
65  /// ```
66  /// use telegram_client::client::Client;
67  /// Client::set_log_max_file_size(1024 * 1024);
68  /// ```
69  pub fn set_log_max_file_size(size: i64) {
70    Tdlib::set_log_max_file_size(size)
71  }
72
73  /// Sets the path to the file where the internal TDLib log will be written.
74  ///
75  /// By default TDLib writes logs to stderr or an OS specific log. Use this method to write the log to a file instead.
76  ///
77  /// # Parameters
78  ///
79  /// `path` Maybe path to a file where the internal TDLib log will be written. Use `None` to switch back to the default logging behaviour.
80  ///
81  /// # Examples
82  ///
83  /// ```
84  /// use telegram_client::client::Client;
85  /// Client::set_log_file_path(Some("/var/log/tdlib/tdlib.log"));
86  /// ```
87  pub fn set_log_file_path(path: Option<&str>) -> bool {
88    Tdlib::set_log_file_path(path)
89  }
90
91  /// Creates a new Client with api
92  ///
93  /// # Examples
94  ///
95  /// ```
96  /// use telegram_client::client::Client;
97  /// use telegram_client::api::Api;
98  /// let client = Client::new(Api::default());
99  /// ```
100  pub fn new(api: Api) -> Self {
101    let stop_flag = Arc::new(Mutex::new(false));
102    Self {
103      stop_flag,
104      api,
105      listener: Listener::new(),
106      warn_unregister_listener: true,
107    }
108  }
109
110  /// Start a Client.
111  ///
112  /// # Examples
113  ///
114  /// ```
115  /// use telegram_client::client::Client;
116  /// let client = Client::default();
117  /// client.start();
118  /// ```
119  pub fn start(&self) -> JoinHandle<()> {
120    let tdrecv = TdRecv::new();
121    tdrecv.start(
122      Arc::new(self.api.clone()),
123      self.stop_flag.clone(),
124      &self.listener,
125      Arc::new(self.warn_unregister_listener)
126    )
127  }
128
129  /// Start a daemon Client.
130  ///
131  /// # Examples
132  ///
133  /// ```
134  /// use telegram_client::client::Client;
135  /// let client = Client::default();
136  /// client.daemon("tgclient");
137  /// ```
138  pub fn daemon<S: AsRef<str>>(self, _name: S) -> std::thread::Result<()> {
139    self.start().join()
140//    debug!("Telegram client started.");
141//    let daemon = Daemon {
142//      name: name.as_ref().to_string(),
143//    };
144//    daemon.run(move |rx: Receiver<State>| {
145//      debug!("Worker started.");
146//      for signal in rx.iter() {
147//        match signal {
148//          State::Start => debug!("Worker: Start"),
149//          State::Reload => debug!("Worker: Reload"),
150//          State::Stop => debug!("Worker: Stop"),
151//        };
152//      }
153//      debug!("Worker finished.");
154//    }).expect("Can not start daemon");
155//    debug!("{} finished.", name.as_ref());
156  }
157
158  pub fn listener(&mut self) -> &mut Listener {
159    &mut self.listener
160  }
161
162  pub fn warn_unregister_listener(&mut self, value: bool) {
163    self.warn_unregister_listener = value
164  }
165}