View difference between Paste ID: dU6qWd7L and U1cHgcz6
SHOW: | | - or go back to the newest paste.
1
class BoardDescription {
2
    constructor(
3
        board,
4
        title,
5
        subtitle,
6
        image_limit
7
    ) {
8
        this.board = board; // i.e. 'rf'
9
        this.title = title; // i.e. 'Убежище'
10
        this.subtitle = subtitle; // i.e. 'Доска с ОП-модерацией'
11
        this.image_limit = image_limit; // i.e. 4
12
    }
13
}
14
15
class ThreadDescription {
16
    constructor(
17
        no,
18
        sub,
19
        com,
20
        name
21
    ) {
22
        this.no = no; // i.e. 55977
23
        this.title = sub; // Thread title
24
        this.message = com; // Thread OP message
25
        this.op_name = name; // i.e. 'Доброанон'
26
    }
27
}
28
29
class VichanApiClient {
30
    constructor(base_url) {
31
        this.base_url = base_url; // i.e. 'https://rf.dobrochan.net/vichan'
32
    }
33
34
    boards() {
35
        return fetch(`${this.base_url}/boards.json`)
36
            .then((response) => response.json())
37
            .then((data) => {
38
                const result = [];
39
                for (const board of data) {
40
                    result.push(
41
                        new BoardDescription(
42
                            board.board,
43
                            board.title,
44
                            board.subtitle,
45
                            board.image_limit
46
                        )
47
                    )
48
                }
49
                return result;
50
            })
51
    }
52
53
    page(board, page = 0) {
54
        return fetch(`${this.base_url}/${board}/${page}.json`)
55
            .then((response) => response.json())
56
            .then((data) => {
57
                const result = [];
58
                for (const thread of data.threads) {
59
                    result.push(
60
                        new ThreadDescription(
61
                            thread.posts[0].no,
62
                            thread.posts[0].sub,
63
                            thread.posts[0].com,
64
                            thread.posts[0].name,
65
                        )
66
                    )
67
                }
68
                return result;
69
            })
70
    }
71
}
72
73
class DobrochanConsolePrinter {
74
    print(title, data) {
75
        console.log(title);
76
        for (const item of data) {
77
            for (const field in item) {
78
                console.log(`${field}: ${item[field]}`);
79
            }
80
        }
81
    }
82
}
83
84
class DobrochanClient {
85
    constructor(
86
        base_url = 'https://rf.dobrochan.net/vichan'
87
    ) {
88
        this.api_client = new VichanApiClient(base_url);
89
        this.boards = this.api_client.boards();
90
    }
91
92
    get_boards() {
93
        return this.boards;
94
    }
95
96
    get_first_page(board) {
97
        return this.api_client.page(board, 0);
98
    }
99
}
100
101
async function main() {
102
    const printer = new DobrochanConsolePrinter();
103
    const dc = new DobrochanClient();
104
    printer.print(`Доски`, await dc.get_boards());
105
    printer.print(`Нулевая /b`, await dc.get_first_page('b'));
106
}
107
108
main();