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
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

use std::collections::HashMap;

use auth;
use links;
use common::*;
use user::UserID;

use super::*;

///Lookup a single DM by its numeric ID.
pub fn show<'a>(id: u64, token: &auth::Token, handle: &'a Handle)
    -> FutureResponse<'a, DirectMessage>
{
    let mut params = HashMap::new();
    add_param(&mut params, "id", id.to_string());

    let req = auth::get(links::direct::SHOW, token, Some(&params));

    make_parsed_future(handle, req)
}

///Create a `Timeline` struct to navigate the direct messages received by the authenticated user.
pub fn received<'a>(token: &'a auth::Token, handle: &'a Handle) -> Timeline<'a> {
    Timeline::new(links::direct::RECEIVED, None, token, handle)
}

///Create a `Timeline` struct to navigate the direct messages sent by the authenticated user.
pub fn sent<'a>(token: &'a auth::Token, handle: &'a Handle) -> Timeline<'a> {
    Timeline::new(links::direct::SENT, None, token, handle)
}

///Send a new direct message to the given user.
///
///The recipient must allow DMs from the authenticated user for this to be successful. In practice,
///this means that the recipient must either follow the authenticated user, or they must have the
///"allow DMs from anyone" setting enabled. As the latter setting has no visibility on the API,
///there may be situations where you can't verify the recipient's ability to receive the requested
///DM beforehand.
///
///Upon successfully sending the DM, the message will be returned.
pub fn send<'a, 'id, T: Into<UserID<'id>>>(to: T, text: &str, token: &auth::Token, handle: &'a Handle)
    -> FutureResponse<'a, DirectMessage>
{
    let mut params = HashMap::new();
    add_name_param(&mut params, &to.into());

    add_param(&mut params, "text", text);

    let req = auth::post(links::direct::SEND, token, Some(&params));

    make_parsed_future(handle, req)
}

///Delete the direct message with the given ID.
///
///The authenticated user must be the sender of this DM for this call to be successful.
///
///On a successful deletion, the future returned by this function yields the freshly-deleted
///message.
pub fn delete<'a>(id: u64, token: &auth::Token, handle: &'a Handle)
    -> FutureResponse<'a, DirectMessage>
{
    let mut params = HashMap::new();
    add_param(&mut params, "id", id.to_string());

    let req = auth::post(links::direct::DELETE, token, Some(&params));

    make_parsed_future(handle, req)
}

///Create a `ConversationTimeline` loader that can load direct messages as a collection of
///pre-sorted conversations.
///
///Note that this does not load any messages; you need to call `newest` or `next` for that. See
///[`ConversationTimeline`] for details.
///
///[`ConversationTimeline`]: struct.ConversationTimeline.html
pub fn conversations<'a>(token: &'a auth::Token, handle: &'a Handle) -> ConversationTimeline<'a> {
    ConversationTimeline::new(token, handle)
}