Feeder - Paste Upload

User script for uploading files from the clipboard in Feeder chat.

  1. // ==UserScript==
  2. // @name Feeder - Paste Upload
  3. // @name:ja Feeder - 貼り付けてアップロード
  4. // @description User script for uploading files from the clipboard in Feeder chat.
  5. // @description:ja Feederチャットでクリップボードからファイルをアップロードするためのユーザースクリプトです。
  6. // @version 2.0.3
  7. // @icon data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQ/wQAUP8GAAAAAAAAAAAASv4qAD//dgBL/qoBUf+yAFD/jwBQ/koAUP8FAAAAAABQ/wQAUP8FAE/+AABQ/wUAAAAAAAAAAAAAAAAATP9wA1L/6x5k//8LV//+AE3+/gBP//8AUP//AFD/qwBQ/h4AAAAAAAAAAAAAAAAAT/+UAFD+gQBQ/1kATv+MAEj//hxj//+rxf//SIH//wBF//8ATv//AE/+/wBQ//8AUP+8AFD/XQBQ/3EAUP+NAE/+aQBP/3wAUP+uAE7+/wBH//8tb//+3uj//l+R//8AQP7/AEn//gBO/v4AUP7/AFD//wBQ/tMAUP+HAE//eQBQ/jcAUP4uAE//mgBO/v8AR///K23//tTi//9YjP/+AD3//gBG//8ATf7/AFD+/wBQ//8AUP/KAE/+UABP/i0AUP+OAFD/gABQ/8kAT///AEf+/iBm///W4//+1+P//5q6/v+Utf/+Pnr+/gBK/v8ATv7/AFD/7wBQ/5kAUP5/AFD/EwBQ/wQAUP+OAE/+/wBH//8iZ//+0+H//sLV/v+Wt/7/ia7//ips//8ASP//AE7+/wBQ/tgAT/8yAFD/AAAAAAAAT/4SAFD+uwBO//8ARv//Km3//9zn//5+pv//F2D+/y5v//4rbf//BFL+/wBO/v8AT//zAE/+TwAAAAAAAAAAAFD+hwBP/v8AT/7/AEf//xZf/v7B1f/+5+7+/rrQ/v/P3v/+l7j+/ghW/v4ASv7/AE/+/wBQ/9MAUP4nAFD+LgBQ/98AT/7/AE/+/wBN//4AT///OHb//2CS/v9pmP7/Voz//x9l/v8ATP7+AE7+/gBP//8AT/7/AFD/aQBQ/0kAUP//AFD//wBQ//4AUP//AE///wBI//8ARf//AEb//wBG//8ASv7/AFD+/wBQ//4AUP//AFD//wBQ/5cAT/5NAFD//wBQ//8AUP//AFD//wBP//kAT/6AAE//ZgBP/3AAT/5pAE//xgBQ//8AUP//AFD+/wBQ//8AUP+eAFD/OABP/+sAUP7/AFD//wBQ/+YAT/5iAAAAAAAAAAAAAAAAAAAAAABQ/ygAUP+4AE/+/wBQ//8AUP//AFD/eABQ/w4AT/6BAFD+vABQ/3gAT/4nAAAAAAAAAAAAUP8FAE//AwBQ/wIAAAAAAFD/DABP/lYAT/+mAE/+tQBQ/jEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP4/AAD4DwAAIAYAAMABAADAAwAAAAEAAMADAADAAwAAgAEAAIABAACAAAAAgcAAAIfhAACf+QAA//8AAA==
  8. // @match https://*.x-feeder.info/*/
  9. // @exclude https://*.x-feeder.info/*/*/*
  10. // @namespace https://github.com/sqrtox/userscript-feeder-paste-upload
  11. // @author sqrtox
  12. // @license MIT
  13. // @grant unsafeWindow
  14. // ==/UserScript==
  15. "use strict";
  16. (() => {
  17. // src/utils/ElementIds.ts
  18. var ElementIds = {
  19. DropzoneArea: "picture_drop_zone_area",
  20. OpenDropzoneAreaButton: "post_picture",
  21. ImageSizeSelect: "frame_size",
  22. PostFormSingle: "post_form_single",
  23. PostFormMultiline: "post_form_multi"
  24. };
  25.  
  26. // src/utils/getElement.ts
  27. var getElement = (id) => {
  28. const element = document.getElementById(id);
  29. if (!element) {
  30. throw new Error(`Element with id "${id}" not found`);
  31. }
  32. return element;
  33. };
  34.  
  35. // src/utils/ImageSizes.ts
  36. var ImageSizes = {
  37. Original: "0",
  38. Small: "1",
  39. Medium: "2",
  40. Large: "3",
  41. ExtraLarge: "4",
  42. Largest: "5"
  43. };
  44.  
  45. // src/utils/openDropzoneArea.ts
  46. var openDropzoneArea = () => {
  47. const dropzoneArea = getElement(ElementIds.DropzoneArea);
  48. const dropzoneAreaIsHidden = !dropzoneArea.style.display || dropzoneArea.style.display === "none";
  49. if (dropzoneAreaIsHidden) {
  50. const openDropzoneAreaButton = getElement(ElementIds.OpenDropzoneAreaButton);
  51. openDropzoneAreaButton.click();
  52. const imageSizeSelect = getElement(ElementIds.ImageSizeSelect);
  53. imageSizeSelect.value = ImageSizes.Original;
  54. }
  55. };
  56.  
  57. // src/utils/getDropzone.ts
  58. var getDropzone = () => {
  59. const dropzone = unsafeWindow.Dropzone.instances[0];
  60. if (!dropzone) {
  61. throw new Error("Dropzone instance not found");
  62. }
  63. return dropzone;
  64. };
  65.  
  66. // src/utils/handlePaste.ts
  67. var handlePaste = ({ clipboardData }) => {
  68. if (!clipboardData) {
  69. return;
  70. }
  71. const file = clipboardData.files[0];
  72. if (!file) {
  73. return;
  74. }
  75. openDropzoneArea();
  76. const dropzone = getDropzone();
  77. dropzone.addFile(file);
  78. };
  79.  
  80. // src/utils/applyHandlePaste.ts
  81. var applyHandlePaste = () => {
  82. const postFormSingle = getElement(ElementIds.PostFormSingle);
  83. const postFormMultiline = getElement(ElementIds.PostFormMultiline);
  84. postFormSingle.addEventListener("paste", handlePaste);
  85. postFormMultiline.addEventListener("paste", handlePaste);
  86. };
  87.  
  88. // src/index.ts
  89. applyHandlePaste();
  90. })();