[🐘]カスタム絵文字まとめて登録

  • // @title [🐘]カスタム絵文字まとめて登録
    // @description 管理画面から複数の絵文字を登録できるようにします。
    // @include https://*/admin/custom_emojis/new
    // @license MIT License
    // @javascript_url
    
    // https://qiita.com/neustrashimy/items/870769d7db4d95cde238#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E7%B5%B5%E6%96%87%E5%AD%97%E3%82%92%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8Bimportv261
    // tootctl 使える場合はこっちがいいと思う
    
    // https://docs.joinmastodon.org/methods/admin/
    // API ないってことだよね?
    (async () => {
    
    	const delay = 2000;
    	const authenticityToken = document.querySelector('meta[name="csrf-token"]').content;
    
    	const up = async file => {
    
    		const shortcode = file.name.match(/^(?<s>\w+)\.png$/)?.groups?.s ?? '';
    		if (shortcode.length < 2) return `<span class="error">このファイル名は shortcode にできません(${file.name})</span>`;
    
    		const body = new FormData();
    		body.append('utf8', '✓');
    		body.append('authenticity_token', authenticityToken);
    		body.append('custom_emoji[shortcode]', shortcode);
    		body.append('custom_emoji[image]', file, file.name);
    		const message = await fetch('/admin/custom_emojis', {
    		 method: 'POST',
    		 credentials: 'include',
    		// なんかあると駄目だった
    		// headers: { 'Content-Type': 'multipart/form-data' },
    		 body
    		}).then(response => response.text());
    
    		return message.match(/<div class=["']?flash-message .+?<\/div>|<span class=['"]?error.+?<\/span>/gs)?.join('') || message;
    
    	};
    
    	const box = Object.assign(document.createElement('div'), {
    	 style: 'height:300px;overflow:auto;border:4px solid #888;'
    	});
    	box.append('ここにドロップ');
    	box.addEventListener('dragover', e => { e.preventDefault(); });
    	box.addEventListener('drop', async e => {
    
    		e.preventDefault();
    		box.textContent = '';
    
    		for (const file of e.dataTransfer.files) {
    
    			box.append(file.name + ' : ');
    			box.insertAdjacentHTML('beforeend', (await up(file)) + '<br>');
    			await new Promise(resolve => setTimeout(resolve, delay));
    		}
    
    		box.append('🈡');
    
    	});
    	document.querySelector('.content').prepend(box);
    
    })();
    
    
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2021/02/23 22:42:14 - 02/23