osu! QuickPaste Image to BBCode

Automatically pastes BBCode image links in any textarea on osu! website when you use Ctrl V and an image is in the clipboard.

// ==UserScript==
// @name         osu! QuickPaste Image to BBCode
// @namespace    https://osu.ppy.sh/users/24332734
// @version      1.0
// @description  Automatically pastes BBCode image links in any textarea on osu! website when you use Ctrl V and an image is in the clipboard.
// @author       Behrauder
// @match        https://osu.ppy.sh/*
// @license      MIT
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const API_KEY = 'YOUR_API_KEY_HERE'; // Put your imgbb API key here

    // Listen to the "paste" event on the document
    document.addEventListener('paste', async function(e) {
        const clipboardData = e.clipboardData || window.clipboardData;
        const items = clipboardData.items;

        for (const item of items) {
            if (item.type.startsWith('image')) {
                const blob = item.getAsFile();
                const formData = new FormData();
                formData.append('image', blob);
                formData.append('key', API_KEY);
                formData.append('expiration', 0); // Never expire

                // Upload the image
                const response = await fetch('https://api.imgbb.com/1/upload', {
                    method: 'POST',
                    body: formData
                });

                const data = await response.json();
                if (data.success) {
                    const bbcodeFull = `[img]${data.data.url}[/img]`;
                    insertTextAtCursor(bbcodeFull);
                } else {
                    console.error('Upload failed:', data.status_txt);
                }
                break; // Exit the loop after the first image item
            }
        }
    });

    // Function to insert text at the cursor position in a textarea
    function insertTextAtCursor(text) {
        const textarea = document.activeElement;
        if (textarea.tagName === 'TEXTAREA') {
            const start = textarea.selectionStart;
            const end = textarea.selectionEnd;

            const value = textarea.value;
            textarea.value = value.substring(0, start) + text + value.substring(end);

            textarea.selectionStart = textarea.selectionEnd = start + text.length;
        }
    }
})();