WebUI: migrate to fetch API
[qBittorrent.git] / src / webui / www / private / scripts / prop-peers.js
blobd64ecd85f62691285ad4391440ac174c4f9e63fc
1 /*
2  * Bittorrent Client using Qt and libtorrent.
3  * Copyright (C) 2018  Thomas Piccirello <thomas.piccirello@gmail.com>
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
18  *
19  * In addition, as a special exception, the copyright holders give permission to
20  * link this program with the OpenSSL project's "OpenSSL" library (or with
21  * modified versions of it that use the same license as the "OpenSSL" library),
22  * and distribute the linked executables. You must obey the GNU General Public
23  * License in all respects for all of the code used other than "OpenSSL".  If you
24  * modify file(s), you may extend this exception to your version of the file(s),
25  * but you are not obligated to do so. If you do not wish to do so, delete this
26  * exception statement from your version.
27  */
29 "use strict";
31 window.qBittorrent ??= {};
32 window.qBittorrent.PropPeers ??= (() => {
33     const exports = () => {
34         return {
35             updateData: updateData,
36             clear: clear
37         };
38     };
40     const torrentPeersTable = new window.qBittorrent.DynamicTable.TorrentPeersTable();
41     let loadTorrentPeersTimer = -1;
42     let syncTorrentPeersLastResponseId = 0;
43     let show_flags = true;
45     const loadTorrentPeersData = () => {
46         if ($("propPeers").classList.contains("invisible")
47             || $("propertiesPanel_collapseToggle").classList.contains("panel-expand")) {
48             syncTorrentPeersLastResponseId = 0;
49             torrentPeersTable.clear();
50             return;
51         }
52         const current_hash = torrentsTable.getCurrentTorrentID();
53         if (current_hash === "") {
54             syncTorrentPeersLastResponseId = 0;
55             torrentPeersTable.clear();
56             clearTimeout(loadTorrentPeersTimer);
57             return;
58         }
59         const url = new URI("api/v2/sync/torrentPeers")
60             .setData("rid", syncTorrentPeersLastResponseId)
61             .setData("hash", current_hash);
62         fetch(url, {
63                 method: "GET",
64                 cache: "no-store"
65             })
66             .then(async (response) => {
67                 if (!response.ok)
68                     return;
70                 const responseJSON = await response.json();
72                 $("error_div").textContent = "";
73                 if (responseJSON) {
74                     const full_update = (responseJSON["full_update"] === true);
75                     if (full_update)
76                         torrentPeersTable.clear();
77                     if (responseJSON["rid"])
78                         syncTorrentPeersLastResponseId = responseJSON["rid"];
79                     if (responseJSON["peers"]) {
80                         for (const key in responseJSON["peers"]) {
81                             if (!Object.hasOwn(responseJSON["peers"], key))
82                                 continue;
84                             responseJSON["peers"][key]["rowId"] = key;
85                             torrentPeersTable.updateRowData(responseJSON["peers"][key]);
86                         }
87                     }
88                     if (responseJSON["peers_removed"]) {
89                         responseJSON["peers_removed"].each((hash) => {
90                             torrentPeersTable.removeRow(hash);
91                         });
92                     }
93                     torrentPeersTable.updateTable(full_update);
95                     if (responseJSON["show_flags"]) {
96                         if (show_flags !== responseJSON["show_flags"]) {
97                             show_flags = responseJSON["show_flags"];
98                             torrentPeersTable.columns["country"].force_hide = !show_flags;
99                             torrentPeersTable.updateColumn("country");
100                         }
101                     }
102                 }
103                 else {
104                     torrentPeersTable.clear();
105                 }
107             })
108             .finally(() => {
109                 clearTimeout(loadTorrentPeersTimer);
110                 loadTorrentPeersTimer = loadTorrentPeersData.delay(window.qBittorrent.Client.getSyncMainDataInterval());
111             });
112     };
114     const updateData = () => {
115         clearTimeout(loadTorrentPeersTimer);
116         loadTorrentPeersTimer = -1;
117         loadTorrentPeersData();
118     };
120     const clear = () => {
121         torrentPeersTable.clear();
122     };
124     const torrentPeersContextMenu = new window.qBittorrent.ContextMenu.ContextMenu({
125         targets: "#torrentPeersTableDiv",
126         menu: "torrentPeersMenu",
127         actions: {
128             addPeer: (element, ref) => {
129                 const hash = torrentsTable.getCurrentTorrentID();
130                 if (!hash)
131                     return;
133                 new MochaUI.Window({
134                     id: "addPeersPage",
135                     icon: "images/qbittorrent-tray.svg",
136                     title: "QBT_TR(Add Peers)QBT_TR[CONTEXT=PeersAdditionDialog]",
137                     loadMethod: "iframe",
138                     contentURL: "addpeers.html?hash=" + hash,
139                     scrollbars: false,
140                     resizable: false,
141                     maximizable: false,
142                     paddingVertical: 0,
143                     paddingHorizontal: 0,
144                     width: 350,
145                     height: 260
146                 });
147             },
148             banPeer: (element, ref) => {
149                 const selectedPeers = torrentPeersTable.selectedRowsIds();
150                 if (selectedPeers.length === 0)
151                     return;
153                 if (confirm("QBT_TR(Are you sure you want to permanently ban the selected peers?)QBT_TR[CONTEXT=PeerListWidget]")) {
154                     fetch("api/v2/transfer/banPeers", {
155                         method: "POST",
156                         body: new URLSearchParams({
157                             "hash": torrentsTable.getCurrentTorrentID(),
158                             "peers": selectedPeers.join("|")
159                         })
160                     });
161                 }
162             }
163         },
164         offsets: {
165             x: 0,
166             y: 2
167         },
168         onShow: function() {
169             const selectedPeers = torrentPeersTable.selectedRowsIds();
171             if (selectedPeers.length >= 1) {
172                 this.showItem("copyPeer");
173                 this.showItem("banPeer");
174             }
175             else {
176                 this.hideItem("copyPeer");
177                 this.hideItem("banPeer");
178             }
179         }
180     });
182     new ClipboardJS("#CopyPeerInfo", {
183         text: (trigger) => {
184             return torrentPeersTable.selectedRowsIds().join("\n");
185         }
186     });
188     torrentPeersTable.setup("torrentPeersTableDiv", "torrentPeersTableFixedHeaderDiv", torrentPeersContextMenu);
190     return exports();
191 })();
192 Object.freeze(window.qBittorrent.PropPeers);