Advertisement
Guest User

Untitled

a guest
Nov 10th, 2018
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 11.04 KB | None | 0 0
  1. extern crate actix;
  2. extern crate env_logger;
  3. extern crate futures;
  4. extern crate hyper;
  5. extern crate tokio;
  6. extern crate tokio_threadpool;
  7. extern crate url;
  8.  
  9. #[macro_use]
  10. extern crate json;
  11. extern crate rust_tdlib;
  12.  
  13. // use json::object;
  14. use actix::prelude::*;
  15. use json::*;
  16. use rust_tdlib::Tdlib;
  17. use std::io;
  18. use std::sync::atomic::{AtomicPtr, Ordering};
  19. use std::{thread, time};
  20.  
  21. use futures::sync::mpsc;
  22.  
  23. use tokio::prelude::*;
  24.  
  25. fn get_authorized_client(client: &Tdlib, app_id: &str, app_hash: &str, phone: &str) -> Result<()> {
  26.     // let client = Tdlib::new();
  27.  
  28.     println!("client: {:?}", client);
  29.  
  30.     loop {
  31.         let resp = client.receive(2.0);
  32.  
  33.         // let mut auth_state = AuthState::Initial;
  34.  
  35.         match resp {
  36.             Some(r) => {
  37.                 let event = json::parse(&r).unwrap();
  38.  
  39.                 // println!("json: {}", event);
  40.                 // println!("event type: {}", event["@type"]);
  41.  
  42.                 if let JsonValue::Short(ref t) = event["@type"] {
  43.                     match t.as_str() {
  44.                         "updateAuthorizationState" => {
  45.                             let authorization_state = &event["authorization_state"];
  46.  
  47.                             // println!("authorization_state: {}", authorization_state);
  48.  
  49.                             match authorization_state["@type"] {
  50.                                 JsonValue::String(ref s)
  51.                                     if s == "authorizationStateWaitTdlibParameters" =>
  52.                                 {
  53.                                     // auth_state = AuthState::AuthorizationStateWaitTdlibParameters;
  54.  
  55.                                     let req = json::stringify(config(app_id, app_hash));
  56.  
  57.                                     client.send(&req[..]);
  58.                                 }
  59.                                 JsonValue::String(ref s)
  60.                                     if s == "authorizationStateWaitEncryptionKey" =>
  61.                                 {
  62.                                     // auth_state = AuthState::AuthorizationStateWaitEncryptionKey;
  63.                                     let req = json::stringify(
  64.                                         object!{"@type" => "checkDatabaseEncryptionKey"},
  65.                                     );
  66.                                     client.send(&req[..]);
  67.                                 }
  68.                                 JsonValue::String(ref s)
  69.                                     if s == "authorizationStateWaitPhoneNumber" =>
  70.                                 {
  71.                                     // auth_state = AuthState::AuthorizationStateWaitPhoneNumber;
  72.                                     let req = json::stringify(object!{
  73.                                     "@type" => "setAuthenticationPhoneNumber",
  74.                                         "phone_number" => phone,
  75.                                         "allow_flash_call" => false,
  76.                                         "is_current_phone_number" => false
  77.                                     });
  78.                                     client.send(&req[..]);
  79.                                 }
  80.                                 JsonValue::Short(ref s) if s == "authorizationStateWaitCode" => {
  81.                                     // auth_state = AuthState::AuthorizationStateWaitCode;
  82.  
  83.                                     if let Ok(code) = read_user_input() {
  84.                                         let req = json::stringify(object!{
  85.                                             "@type" => "checkAuthenticationCode",
  86.                                             "code" => code,
  87.                                         });
  88.                                         client.send(&req[..]);
  89.                                     } else {
  90.                                         println!("wrong input",)
  91.                                     }
  92.                                 }
  93.                                 JsonValue::Short(ref s)
  94.                                     if s == "authorizationStateWaitPassword" =>
  95.                                 {
  96.                                     // auth_state = AuthState::AuthorizationStateWaitCode;
  97.  
  98.                                     if let Ok(password) = read_user_input() {
  99.                                         let req = json::stringify(object!{
  100.                                             "@type" => "checkAuthenticationPassword",
  101.                                             "password" => password,
  102.                                         });
  103.                                         client.send(&req[..]);
  104.                                     } else {
  105.                                         println!("wrong input",)
  106.                                     }
  107.                                 }
  108.                                 JsonValue::Short(ref s) if s == "authorizationStateReady" => {
  109.                                     println!("READY!!",);
  110.  
  111.                                     return Ok(());
  112.                                 }
  113.                                 // JsonValue::String(ref s) => println!("other {}", s),
  114.                                 _ => println!("other state: {}", authorization_state["@type"]),
  115.                             }
  116.                         }
  117.  
  118.                         "error" => println!("ERROR: {}", event["message"]),
  119.                         "ok" => println!("ok: {}", r),
  120.                         // JsonValue::Short(ref t) => println!("other {}", t),
  121.                         ref _t => (),
  122.                     }
  123.                 }
  124.             }
  125.             None => println!("Empty response"),
  126.         }
  127.     }
  128.     // return Err;
  129. }
  130.  
  131. pub struct TdlibBox {
  132.     client: Tdlib,
  133. }
  134.  
  135. unsafe impl Send for TdlibBox {}
  136.  
  137. fn get_messages_stream(
  138.     client: Tdlib,
  139. ) -> (
  140.     std::thread::JoinHandle<()>,
  141.     futures::sync::mpsc::Receiver<String>,
  142. ) {
  143.     let bx = TdlibBox { client };
  144.     let (mut tx, rx) = mpsc::channel(1);
  145.  
  146.     let th = thread::spawn(move || loop {
  147.         if let Some(msg) = bx.client.receive(2.0) {
  148.             match tx.send(msg).wait() {
  149.                 Ok(_tx) => {
  150.                     tx = _tx;
  151.                 }
  152.                 Err(v) => {
  153.                     panic!("Wut? {}", v);
  154.                 }
  155.             }
  156.         }
  157.     });
  158.  
  159.     (th, rx)
  160. }
  161.  
  162. #[derive(Message)]
  163. struct IncomingMessage {
  164.     msg: std::string::String,
  165. }
  166.  
  167. struct ReceiverActor;
  168.  
  169. impl StreamHandler<IncomingMessage, io::Error> for ReceiverActor {
  170.     fn handle(&mut self, item: IncomingMessage, ctx: &mut Context<ReceiverActor>) {
  171.         println!("msg: {}", item.msg);
  172.     }
  173.  
  174.     fn finished(&mut self, ctx: &mut Self::Context) {
  175.         println!("finished");
  176.     }
  177. }
  178.  
  179. impl Actor for ReceiverActor {
  180.     type Context = Context<Self>;
  181.  
  182.     // fn started(&mut self, ctx: &mut Context<Self>) {
  183.     //     // add stream
  184.     //     // Self::add_stream(once::<IncomingMessage, io::Error>(Ok(IncomingMessage)), ctx);
  185.     // }
  186. }
  187.  
  188. impl Handler<IncomingMessage> for ReceiverActor {
  189.     type Result = ();
  190.  
  191.     fn handle(&mut self, msg: IncomingMessage, _: &mut Context<Self>) {
  192.         let event = json::parse(&msg.msg).unwrap();
  193.  
  194.         if let JsonValue::Short(ref t) = event["@type"] {
  195.             match t.as_str() {
  196.                 "updateNewChat" => {
  197.                     // println!(
  198.                     //     "json: {} {} {}",
  199.                     //     event["chat"]["type"], event["chat"]["id"], event["chat"]["title"]
  200.                     // );
  201.                     if(event["chat"]["title"] == "Rust Beginners"){
  202.                         println!("Found Rust Beginners: {}", event["chat"]["type"]["supergroup_id"])
  203.                     }
  204.                 }
  205.                 // "chats" => println!("chat: {}", event),
  206.                 // "supergroup" => println!("supergroup: {}", event),
  207.                 "error" => println!("error: {}", event),
  208.                 _ => (),
  209.             }
  210.         }
  211.     }
  212. }
  213.  
  214. struct SenderActor {
  215.     client_ptr: std::sync::atomic::AtomicPtr<Tdlib>,
  216. }
  217.  
  218. #[derive(Message)]
  219. struct OutgoingMessage {
  220.     msg: std::string::String,
  221. }
  222. impl Actor for SenderActor {
  223.     type Context = Context<Self>;
  224. }
  225.  
  226. impl Handler<OutgoingMessage> for SenderActor {
  227.     type Result = ();
  228.  
  229.     fn handle(&mut self, msg: OutgoingMessage, ctx: &mut Context<Self>) {
  230.         println!("will send: {}", msg.msg);
  231.  
  232.         unsafe {
  233.             let client = &*self.client_ptr.load(Ordering::Relaxed);
  234.             client.send(msg.msg.as_str());
  235.         }
  236.  
  237.         // ctx.run_later(time::Duration::from_secs(5), move |act, _ctx| unsafe {
  238.         //     let client = &*act.client_ptr.load(Ordering::Relaxed);
  239.         //     client.send(msg.msg.as_str());
  240.         // });
  241.     }
  242. }
  243.  
  244. fn main() {
  245.     env_logger::init();
  246.     Tdlib::set_log_verbosity_level(1);
  247.  
  248.     let app_id = "";
  249.     let app_hash = "";
  250.     let phone = "+";
  251.  
  252.     let system = actix::System::new("test");
  253.     let mut client = Tdlib::new();
  254.  
  255.     if let Ok(()) = get_authorized_client(&client, app_id, app_hash, phone) {
  256.         println!("got it");
  257.  
  258.         let client_ptr = AtomicPtr::new(&mut client);
  259.         let (th, msg_stream) = get_messages_stream(client);
  260.  
  261.         actix::System::run(|| {
  262.             ReceiverActor::create(|ctx| {
  263.                 ctx.add_message_stream(msg_stream.map(|msg| IncomingMessage { msg }));
  264.                 ReceiverActor {}
  265.             });
  266.  
  267.             let supergroup_id: i32 = 1241722061;
  268.             let sender = SenderActor::create(|ctx| SenderActor { client_ptr });
  269.  
  270.             // let req = json::stringify(object!{
  271.             // "@type" => "getSupergroup",
  272.             // "supergroup_id" => chat_id,
  273.             // });
  274.  
  275.             sender.do_send(OutgoingMessage {
  276.                 msg: json::stringify(object!{
  277.                 "@type" => "getChats",
  278.                 "limit" => 100,
  279.                 }),
  280.             });
  281.  
  282.             sender.do_send(OutgoingMessage {
  283.                 msg: json::stringify(object!{
  284.                 "@type" => "getSupergroup",
  285.                 "supergroup_id" => supergroup_id,
  286.                 }),
  287.             });
  288.         });
  289.     } else {
  290.         println!("failed");
  291.     }
  292. }
  293.  
  294. fn read_user_input() -> io::Result<String> {
  295.     let mut input = String::new();
  296.     print!("code: ",);
  297.  
  298.     io::stdin().read_line(&mut input)?;
  299.     Ok(input.trim().to_string())
  300. }
  301.  
  302. fn config(api_id: &str, api_hash: &str) -> json::JsonValue {
  303.     let cfg = object!{
  304.         "@type" => "tdlibParameters",
  305.         "api_hash" => api_hash,
  306.         "api_id" => api_id,
  307.         "application_version" => "tdlib",
  308.         "database_directory" => "tdlib",
  309.         "device_model" => "My PC",
  310.         "enable_storage_optimizer" => true,
  311.         "files_directory" => json::Null,
  312.         "ignore_file_names" => true,
  313.         "system_language_code" => "en",
  314.         "system_version" => "Unknown",
  315.         "use_chat_info_database" => true,
  316.         "use_file_database" => true,
  317.         "use_secret_chats" => false,
  318.         "use_test_dc" => false
  319.     };
  320.  
  321.     object!{
  322.         "@type" => "setTdlibParameters",
  323.         "parameters" => cfg
  324.     }
  325. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement