jetbra/jetbra.js

119 lines
3.8 KiB
JavaScript
Raw Normal View History

2023-11-26 09:11:23 +00:00
// ==UserScript==
// @name JetBra
2024-03-13 14:03:12 +00:00
// @namespace https://github.com/novitechie/jetbra
// @version 3.3
2023-11-26 09:11:23 +00:00
// @license MIT
2024-01-20 05:52:45 +00:00
// @description Add a button on the plugin homepage and click to get the plugin activation code
2023-11-26 09:11:23 +00:00
// @author novice.li
// @match https://plugins.jetbrains.com/*
2023-11-26 09:11:23 +00:00
// @grant GM_setClipboard
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @grant window.onurlchange
2023-11-26 09:11:23 +00:00
// @connect noviceli.win
// @connect self
// @connect localhost
// ==/UserScript==
2024-01-20 05:52:45 +00:00
async function findElementWithRetry(cssSelector) {
const maxAttempts = 50;
for (let attempts = 0; attempts < maxAttempts; attempts++) {
const element = document.querySelector(cssSelector);
if (element) {
return element;
2023-11-26 09:11:23 +00:00
}
2024-01-20 05:52:45 +00:00
await new Promise(resolve => setTimeout(resolve, 100));
2023-11-26 09:11:23 +00:00
}
2024-01-20 05:52:45 +00:00
throw new Error(`Element with selector '${cssSelector}' not found after ${maxAttempts} attempts.`);
}
let addButton = async function () {
console.log('JetBra is running');
2023-11-26 09:11:23 +00:00
'use strict';
GM_addStyle(`
.jetbra-button {
background-color: #04AA6D;
border: none;
color: white;
padding: 8px 24px;
text-align: center;
text-decoration: none;
display: inline-block;
border-radius: 16px;
box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
transition-duration: 0.4s;
}
.jetbra-button:hover {
background-color: #057e47;
color: white;
}
`);
const backendBaseUrl = 'https://jetbra.noviceli.win'
let url = window.location.href
if (!url.startsWith('https://plugins.jetbrains.com/plugin/')) {
return;
2023-11-26 09:11:23 +00:00
}
2024-03-13 14:03:12 +00:00
let pluginId = url.split('/')[4].split('-')[0]
console.log('pluginId: ' + pluginId);
2023-11-26 09:11:23 +00:00
let pluginDetail = await fetch('https://plugins.jetbrains.com/api/plugins/' + pluginId).then(r => r.json());
2023-11-26 09:34:36 +00:00
2024-01-20 05:52:45 +00:00
const parentElement = await findElementWithRetry('.plugin-header__controls-panel > div:first-child');
2023-11-26 09:11:23 +00:00
if (parentElement.querySelector('.jetbra-button')) {
return;
}
2023-11-26 09:11:23 +00:00
let newElement = document.createElement('div');
newElement.classList.toggle('wt-col-inline');
2024-01-20 05:52:45 +00:00
newElement.innerHTML = `<button class="jetbra-button" type="button">CLICK TO GENERATE ACTIVATION CODE</button>`;
2023-11-26 09:11:23 +00:00
parentElement.appendChild(newElement)
newElement.addEventListener('click', async () => {
if (pluginDetail.purchaseInfo === undefined) {
2024-01-20 05:52:45 +00:00
window.alert('This plugin is not a paid plugin in the market');
2023-11-26 09:11:23 +00:00
return;
}
let data = {
2024-02-27 12:57:19 +00:00
"licenseeName": "reborn",
"assigneeName": "reborn",
2023-11-26 09:11:23 +00:00
"assigneeEmail": "",
"licenseRestriction": "",
"checkConcurrentUse": false,
"products": [{
"code": pluginDetail.purchaseInfo.productCode,
2024-02-27 12:57:19 +00:00
"fallbackDate": "2026-12-30",
"paidUpTo": "2026-12-30",
2023-11-26 09:11:23 +00:00
"extended": false
}],
"metadata": "0120230102PPAA013009",
"hash": "41472961/0:1563609451",
"gracePeriodDays": 7,
"autoProlongated": true,
"isAutoProlongated": true
}
GM_xmlhttpRequest({
method: 'POST',
url: backendBaseUrl + '/generateLicense',
headers: {
'Content-Type': 'application/json'
},
data: JSON.stringify(data),
onload: function (response) {
let license = JSON.parse(response.responseText).license
GM_setClipboard(license, 'text');
2024-01-20 05:52:45 +00:00
window.alert('The activation code has been copied to your clipboard');
2023-11-26 09:11:23 +00:00
}
});
})
};
addButton();
if (window.onurlchange === null) {
window.addEventListener('urlchange', (info) => {
addButton();
});
}