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}