Skip to content

Commit 837c4a8

Browse files
committed
deaddrop: add textarea option
Co-developed-by: gemini 2.5 Pro
1 parent f502d6c commit 837c4a8

File tree

3 files changed

+79
-27
lines changed

3 files changed

+79
-27
lines changed

plugins/deaddrop/assets/deaddrop.js

Lines changed: 64 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
(function() {
22

3-
var server_max_size = 0, ws;
3+
var server_max_size = 0, username = "", ws;
44

55
function san(s)
66
{
@@ -14,6 +14,10 @@
1414
replace(/%/g, "%");
1515
}
1616

17+
function pad(n) {
18+
return n < 10 ? '0' + n : n;
19+
}
20+
1721
function lws_urlencode(s)
1822
{
1923
return encodeURI(s).replace(/@/g, "%40");
@@ -64,15 +68,15 @@
6468
{
6569
var da = document.getElementById("da");
6670

67-
e.preventDefault();
71+
e.preventDefault();
6872
da.classList.remove("trot");
6973
}
7074

7175
function da_over(e)
7276
{
7377
var da = document.getElementById("da");
7478

75-
e.preventDefault();
79+
e.preventDefault();
7680
da.classList.add("trot");
7781
}
7882

@@ -84,39 +88,38 @@
8488
t.deleteRow(n);
8589
}
8690

87-
function do_upload(file) {
88-
var formData = new FormData();
91+
/*
92+
* Generic uploader: takes FormData, a display name and a display size
93+
*/
94+
function _do_upload(formData, displayName, displaySize) {
8995
var t = document.getElementById("ongoing");
90-
91-
formData.append("file", file);
92-
9396
var row = t.insertRow(0), c1 = row.insertCell(0),
94-
c2 = row.insertCell(1), c3 = row.insertCell(2);
97+
c2 = row.insertCell(1), c3 = row.insertCell(2);
9598

9699
c1.classList.add("ogn");
97100
c1.classList.add("r");
98101

99-
if (file.size > server_max_size) {
102+
if (displaySize > server_max_size) {
100103
c1.innerHTML = "Too Large";
101104
c1.classList.add("err");
102105
} else
103106
c1.innerHTML = "<img class=\"working\">";
104107

105108
c2.classList.add("ogn");
106109
c2.classList.add("r");
107-
c2.innerHTML = humanize(file.size);
110+
c2.innerHTML = humanize(displaySize);
108111

109112
c3.classList.add("ogn");
110-
c3.innerHTML = san(file.name);
113+
c3.innerHTML = san(displayName);
111114

112-
if (file.size > server_max_size)
115+
if (displaySize > server_max_size)
113116
return;
114117

115-
fetch("upload/" + lws_urlencode(file.name), {
118+
fetch("upload/" + lws_urlencode(displayName), {
116119
method: "POST",
117120
body: formData
118121
})
119-
.then((e) => { /* this just means we got a response code */
122+
.then((e) => { /* this just means we got a response code */
120123
var us = e.url.split("/"), ul = us[us.length - 1], n;
121124

122125
for (n = 0; n < t.rows.length; n++)
@@ -145,10 +148,16 @@
145148
});
146149
}
147150

151+
function do_upload(file) {
152+
var formData = new FormData();
153+
formData.append("file", file);
154+
_do_upload(formData, file.name, file.size);
155+
}
156+
148157
function da_drop(e) {
149158
var da = document.getElementById("da");
150159

151-
e.preventDefault();
160+
e.preventDefault();
152161
da.classList.remove("trot");
153162

154163
clear_errors();
@@ -165,17 +174,42 @@
165174
([...fi.files]).forEach(do_upload);
166175
}
167176

177+
function upl_text_button(e) {
178+
var content = document.getElementById("text_content"),
179+
d = new Date(),
180+
ts = d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' +
181+
pad(d.getDate()) + '_' + pad(d.getHours()) + '-' +
182+
pad(d.getMinutes()) + '-' + pad(d.getSeconds()),
183+
generated_filename = ts + (username ? '_' + username : '') + '.txt',
184+
formData = new FormData(), blob;
185+
186+
e.preventDefault();
187+
clear_errors();
188+
189+
blob = new Blob([content.value], { type: "text/plain" });
190+
formData.append("file", blob, generated_filename);
191+
192+
_do_upload(formData, generated_filename, blob.size);
193+
content.value = "";
194+
text_inp(); // Manually update button state after clearing
195+
}
196+
168197
function body_drop(e) {
169198
e.preventDefault();
170199
}
171200

172-
function inp() {
201+
function file_inp() {
173202
var fi = document.getElementById("file"),
174203
upl = document.getElementById("upl");
175-
console.log("inp");
176204
upl.disabled = !fi.files.length;
177205
}
178206

207+
function text_inp() {
208+
var content = document.getElementById("text_content"),
209+
upl_text = document.getElementById("upl_text");
210+
upl_text.disabled = !content.value.length;
211+
}
212+
179213
function delfile(e)
180214
{
181215
e.stopPropagation();
@@ -218,16 +252,21 @@
218252

219253
document.addEventListener("DOMContentLoaded", function() {
220254
var da = document.getElementById("da"),
221-
fi = document.getElementById("file"),
222-
upl = document.getElementById("upl");
255+
fi = document.getElementById("file"),
256+
upl = document.getElementById("upl"),
257+
text_content = document.getElementById("text_content"),
258+
upl_text = document.getElementById("upl_text");
223259

224260
da.addEventListener("dragenter", da_enter, false);
225261
da.addEventListener("dragleave", da_leave, false);
226262
da.addEventListener("dragover", da_over, false);
227263
da.addEventListener("drop", da_drop, false);
228264

229-
upl.addEventListener("click", upl_button, false);
230-
fi.addEventListener("change", inp, false);
265+
upl.addEventListener("click", upl_button, false);
266+
fi.addEventListener("change", file_inp, false);
267+
268+
upl_text.addEventListener("click", upl_text_button, false);
269+
text_content.addEventListener("input", text_inp, false);
231270

232271
window.addEventListener("dragover", body_drop, false);
233272
window.addEventListener("drop", body_drop, false);
@@ -246,6 +285,7 @@
246285
var j = JSON.parse(msg.data), s = "", n,
247286
t = document.getElementById("dd-list");
248287

288+
username = j.user || "";
249289
server_max_size = j.max_size;
250290
document.getElementById("size").innerHTML =
251291
"Server maximum file size " +
@@ -274,7 +314,7 @@
274314
}
275315
s += "</table>";
276316

277-
t.innerHTML = san(s);
317+
t.innerHTML = s;
278318

279319
for (n = 0; n < j.files.length; n++) {
280320
var d = document.getElementById("d" + n);
@@ -297,3 +337,4 @@
297337

298338
});
299339
}());
340+

plugins/deaddrop/assets/index.html

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,21 @@
55
<script src="deaddrop.js"></script>
66
</head>
77
<body>
8-
<h1>LWS Deaddrop</h1>
8+
<h1>LWS Deaddrop 2</h1>
99
<div class="uplbox">
1010
<table id="ddrop" class="noconn">
1111
<tr><td class="vm">
1212
<div id="da" class="da"><img class="disa" src="drop.svg"></div>
1313
</td><td>
14+
<h3>Paste text to upload:</h3>
15+
<form name=textupload action="upload" method="post"
16+
enctype="multipart/form-data">
17+
<textarea id="text_content" class="dd-textarea"
18+
placeholder="Paste content here"></textarea>
19+
<input id="upl_text" type="submit" value="Upload Text"
20+
class="ubtn" disabled>
21+
</form>
22+
<hr>
1423
<h3>...or select files to upload:</h3>
1524
<span id="size"></span><br>
1625
<form name=multipart action="upload" method="post"
@@ -31,4 +40,5 @@ <h3>...or select files to upload:</h3>
3140
</table>
3241
</div>
3342
</body>
34-
</html>
43+
44+

plugins/deaddrop/protocol_lws_deaddrop.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -502,8 +502,9 @@ callback_deaddrop(struct lws *wsi, enum lws_callback_reasons reason,
502502
was = 0;
503503
if (pss->first) {
504504
p += lws_snprintf((char *)p, lws_ptr_diff_size_t(end, p),
505-
"{\"max_size\":%llu, \"files\": [",
506-
vhd->max_size);
505+
"{\"max_size\":%llu, \"user\":\"%s\", "
506+
"\"files\": [", vhd->max_size,
507+
pss->user[0] ? pss->user : "");
507508
was = 1;
508509
}
509510

0 commit comments

Comments
 (0)