aboutsummaryrefslogtreecommitdiff
path: root/src/bin/quassel-client.rs
blob: fa3fdf8eebc56a14c356299ce896a30ac83c6cd5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
use failure::Error;

extern crate libquassel;

extern crate tokio;
extern crate pretty_env_logger;

use libquassel::primitive::*;
use libquassel::message::*;
use libquassel::client::*;

use tokio::io::{AsyncRead, AsyncWrite};
use core::marker::Unpin;
use futures::SinkExt;
use std::future::Future;

use log::*;

#[tokio::main]
async fn main() -> Result<(), Error> {
    pretty_env_logger::init();

//    let mut client = client::Client::<tokio::net::TcpStream>::connect(
//        "cocaine.farm",
//        4242,
//        true,
//    ).await.unwrap();

    let username = std::env::args().nth(1).expect("no username given");
    let password = std::env::args().nth(2).expect("no password given");

   let funcs = Funcs {
       init: InitFuncs {
           client_init_ack,
           client_init_reject,
           client_login_ack,
           client_login_reject,
           session_init
       },
       message: MessageFuncs {
           sync_message,
           rpc_call,
           init_request,
           init_data,
           heart_beat,
           heart_beat_reply
       }
   };

    let mut client = Client::<tokio_tls::TlsStream<tokio::net::TcpStream>>::connect_tls(
        "cocaine.farm",
        4242,
        true,
        User {
            name: username,
            password,
        },
        //funcs,
    ).await.unwrap();

    client.run().await;

    Ok(())
}

async fn client_init_ack<T: AsyncRead + AsyncWrite + Unpin, F: Future>(client: &mut Client<T, F>, item: VariantMap) {
    use libquassel::{HandshakeSerialize, HandshakeDeserialize};

    info!(target: "init", "Initialization successfull");
    info!(target: "login", "Starting Login");
    let login = ClientLogin {user: client.user.name.clone(), password: client.user.password.clone()};
    client.stream.send(login.serialize().unwrap()).await.unwrap();
}

async fn client_init_reject<T: AsyncRead + AsyncWrite + Unpin, F: Future>(client: Client<T, F>, item: VariantMap) {
    error!(target: "init", "Initialization failed: {:?}", item);
}

async fn client_login_ack<T: AsyncRead + AsyncWrite + Unpin, F: Future>(client: Client<T, F>, item: VariantMap) {
    info!(target: "login", "Login successfull");
}

async fn client_login_reject<T: AsyncRead + AsyncWrite + Unpin, F: Future>(client: Client<T, F>, item: VariantMap) {
    error!(target: "login", "Login failed: {:?}", item);
}

async fn session_init<T: AsyncRead + AsyncWrite + Unpin, F: Future>(client: &mut Client<T, F>, item: VariantMap) {
    info!(target: "login", "Session Initialization finished. Switching to Connected state");
    client.state = ClientState::Connected;
}

async fn sync_message<T: AsyncRead + AsyncWrite + Unpin, F: Future>(client: Client<T, F>, item: SyncMessage) { unimplemented!() }
async fn rpc_call<T: AsyncRead + AsyncWrite + Unpin, F: Future>(client: Client<T, F>, item: RpcCall) { unimplemented!() }
async fn init_request<T: AsyncRead + AsyncWrite + Unpin, F: Future>(client: Client<T, F>, item: InitRequest) { unimplemented!() }
async fn init_data<T: AsyncRead + AsyncWrite + Unpin, F: Future>(client: Client<T, F>, item: InitData) { unimplemented!() }
async fn heart_beat<T: AsyncRead + AsyncWrite + Unpin, F: Future>(client: Client<T, F>, item: HeartBeat) { unimplemented!() }
async fn heart_beat_reply<T: AsyncRead + AsyncWrite + Unpin, F: Future>(client: Client<T, F>, item: HeartBeatReply) { unimplemented!() }