// @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);
})();