2023-11-26 09:11:23 +00:00
|
|
|
// ==UserScript==
|
|
|
|
// @name JetBra
|
2024-03-17 01:06:16 +00:00
|
|
|
// @namespace https://github.com/novice88/jetbra
|
2024-03-13 14:03:12 +00:00
|
|
|
// @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
|
2024-01-24 14:44:08 +00:00
|
|
|
// @match https://plugins.jetbrains.com/*
|
2023-11-26 09:11:23 +00:00
|
|
|
// @grant GM_setClipboard
|
|
|
|
// @grant GM_addStyle
|
|
|
|
// @grant GM_xmlhttpRequest
|
2024-01-24 14:08:50 +00:00
|
|
|
// @grant window.onurlchange
|
2023-11-26 09:11:23 +00:00
|
|
|
// @connect noviceli.win
|
2024-03-17 01:12:35 +00:00
|
|
|
// @connect novitechie.com
|
2023-11-26 09:11:23 +00:00
|
|
|
// @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.`);
|
|
|
|
}
|
|
|
|
|
2024-01-24 14:08:50 +00:00
|
|
|
let addButton = async function () {
|
2024-01-24 14:44:08 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
`);
|
2024-03-17 01:02:23 +00:00
|
|
|
const backendBaseUrl = 'https://jetbra.novitechie.com'
|
2024-01-24 14:44:08 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
2024-01-24 14:44:08 +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
|
|
|
|
2024-01-24 14:08:50 +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
|
|
|
}
|
|
|
|
});
|
|
|
|
})
|
2024-01-24 14:08:50 +00:00
|
|
|
};
|
2024-01-24 14:44:08 +00:00
|
|
|
|
|
|
|
addButton();
|
2024-01-24 14:08:50 +00:00
|
|
|
if (window.onurlchange === null) {
|
|
|
|
window.addEventListener('urlchange', (info) => {
|
|
|
|
addButton();
|
|
|
|
});
|
|
|
|
}
|