// ==UserScript==
// @name Pixelplanet+
// @namespace http://tampermonkey.net/
// @version 4
// @author Pixel, join dsc.gg/turkmenlippf
// @description Customize the PixelPlanet interface with extended personalization options and revert to default.
// @match https://pixelplanet.fun/*
// @grant GM_addStyle
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @grant GM_setClipboard
// @icon https://files.catbox.moe/qb2prb.png
// ==/UserScript==
(function() {
'use strict';
GM_addStyle(`
@import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css');
@import url('https://fonts.googleapis.com/css2?family=Pixelify+Sans&display=swap');
`);
// Varsayılan stiller
const defaultCSS = `
body {
margin: 0;
font-family: 'Montserrat', sans-serif;
font-size: 16px;
background: #c4c4c4;
}
.menu > div { background-color: transparent !important; }
`;
// Kullanıcı ayarları
const settings = {
buttonColor: '#4CAF50',
buttonHoverColor: '#ff91a6',
fontColor: '#000000',
fontSize: '16',
fontFamily: 'Arial',
menuColor: '#ffffff',
backgroundOpacity: '1',
backgroundImage: '',
cursorURL: ''
};
// Sayfa yüklendiğinde ayarları uygula
applyStoredStyles();
// Buton ekle
addCustomizationButton();
// Ayarları yükle ve uygula
function applyStoredStyles() {
const storedSettings = loadSettings();
applyCustomStyles(storedSettings);
}
// Ayarları localStorage'dan yükle
function loadSettings() {
Object.keys(settings).forEach(key => {
settings[key] = getStoredValue(key, settings[key]);
});
return settings;
}
// LocalStorage'dan bir değeri al
function getStoredValue(key, defaultValue) {
return localStorage.getItem(key) || defaultValue;
}
// LocalStorage'a bir değeri kaydet
function setStoredValue(key, value) {
localStorage.setItem(key, value);
}
// Stilleri uygula
function applyCustomStyles({ buttonColor, buttonHoverColor, fontColor, fontSize, fontFamily, menuColor, backgroundOpacity, backgroundImage, cursorURL }) {
GM_addStyle(`
body {
background-color: rgba(255, 255, 255, ${backgroundOpacity});
background-image: url(${backgroundImage});
font-size: ${fontSize}px;
font-family: ${fontFamily};
color: ${fontColor};
}
.actionbuttons, .actionbuttons button,
.coorbox, .onlinebox, .cooldownbox, #palettebox {
background-color: ${buttonColor} !important;
color: white !important;
}
.actionbuttons:hover, .actionbuttons button:hover,
.coorbox:hover, .onlinebox:hover, .cooldownbox:hover, #palettebox:hover {
background-color: ${buttonHoverColor} !important;
}
.customMenu, .modal.USERAREA.show, .modal.HELP.show, .modal.SETTINGS.show {
background-color: ${menuColor} !important;
color: ${fontColor};
border-radius: 10px;
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
}
.window.CHAT.show {
background-image: url(${backgroundImage}) !important;
background-size: cover;
background-position: center;
}
* {
cursor: url('${cursorURL}') 16 16, auto !important;
}
`);
}
// Buton ekle
function addCustomizationButton() {
const customizationButton = document.createElement('div');
customizationButton.id = 'customizationButton';
customizationButton.className = 'actionbuttons';
customizationButton.setAttribute('role', 'button');
customizationButton.innerHTML = `
<i class="fa fa-plus-square" aria-hidden="true" style="vertical-align: middle; font-size: 19px; color: #FFFFFF;"></i>
`;
customizationButton.style.position = 'fixed';
customizationButton.style.left = '16px';
customizationButton.style.top = '37%';
customizationButton.style.zIndex = '9999';
customizationButton.style.transform = 'translateY(-50%)';
document.body.appendChild(customizationButton);
customizationButton.addEventListener('click', showCustomizationPanel);
}
// Ayar panelini göster
function showCustomizationPanel() {
const panelHTML = `
<div class="modal SETTINGS show customMenu" style="
z-index: 9999;
width: 50%;
max-width: 500px;
max-height: 80vh;
overflow-y: auto;
padding: 20px;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: #ffffff;
border: 1px solid #ccc;
border-radius: 12px;
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
transition: all 0.3s ease;
font-family: 'Pixelify Sans', sans-serif;
">
<h2 style="text-align: center; font-size: 1.4em; margin-bottom: 1em;">Settings</h2>
<div class="modal-topbtn close" role="button" title="Close" tabindex="-1" style="
position: absolute;
top: 10px;
right: 10px;
font-size: 1.2em;
cursor: pointer;
">✕</div>
<div class="content" style="display: flex; flex-direction: column; gap: 15px;">
<div class="setitem">
<label>Button Color:</label>
<input type="color" id="buttonColorPicker" value="${settings.buttonColor}" />
</div>
<div class="setitem">
<label>Button Hover Color:</label>
<input type="color" id="buttonHoverColorPicker" value="${settings.buttonHoverColor}" />
</div>
<div class="setitem">
<label>Font Color:</label>
<input type="color" id="fontColorPicker" value="${settings.fontColor}" />
</div>
<div class="setitem">
<label>Font Size:</label>
<input type="number" id="fontSizePicker" min="10" max="30" value="${settings.fontSize}" style="width: 80px;" /> px
</div>
<div class="setitem">
<label>Font Family:</label>
<select id="fontFamilyPicker" style="padding: 5px; border-radius: 5px;">
<option value="Arial" ${settings.fontFamily === 'Arial' ? 'selected' : ''}>Arial</option>
<option value="Verdana" ${settings.fontFamily === 'Verdana' ? 'selected' : ''}>Verdana</option>
<option value="Helvetica" ${settings.fontFamily === 'Helvetica' ? 'selected' : ''}>Helvetica</option>
<option value="Tahoma" ${settings.fontFamily === 'Tahoma' ? 'selected' : ''}>Tahoma</option>
<option value="Pixelify Sans" ${settings.fontFamily === 'Pixelify Sans' ? 'selected' : ''}>Pixelify Sans</option>
</select>
</div>
<div class="setitem">
<label>Menu Color:</label>
<input type="color" id="menuColorPicker" value="${settings.menuColor}" />
</div>
<div class="setitem">
<label>Background Opacity:</label>
<input type="range" id="backgroundOpacity" min="0.1" max="1" step="0.1" value="${settings.backgroundOpacity}" />
</div>
<div class="setitem">
<label>Chat Background Image URL:</label>
<input type="text" id="backgroundImage" value="${settings.backgroundImage}" style="width: 100%;" placeholder="Enter URL here" />
</div>
<div class="setitem">
<label>Custom Cursor URL:</label>
<input type="text" id="cursorURL" value="${settings.cursorURL}" style="width: 100%;" placeholder="Enter cursor URL here" />
</div>
<button id="saveButton" style="background-color: #4CAF50; color: white; padding: 10px 20px; border: none; cursor: pointer; border-radius: 5px;">Save</button>
<button id="resetButton" style="background-color: #f44336; color: white; padding: 10px 20px; border: none; cursor: pointer; border-radius: 5px;">Reset to Default</button>
<button id="exportButton" style="background-color: #2196F3; color: white; padding: 10px 20px; border: none; cursor: pointer; border-radius: 5px;">Export Settings</button>
<button id="importButton" style="background-color: #FF9800; color: white; padding: 10px 20px; border: none; cursor: pointer; border-radius: 5px;">Import Settings</button>
</div>
</div>
`;
const modalContainer = document.createElement('div');
modalContainer.innerHTML = panelHTML;
document.body.appendChild(modalContainer);
// Kapatma butonuna tıklandığında paneli kapat
document.querySelector('.modal-topbtn.close').addEventListener('click', () => {
modalContainer.remove();
});
// Ayarları kaydet
document.getElementById('saveButton').addEventListener('click', () => {
settings.buttonColor = document.getElementById('buttonColorPicker').value;
settings.buttonHoverColor = document.getElementById('buttonHoverColorPicker').value;
settings.fontColor = document.getElementById('fontColorPicker').value;
settings.fontSize = document.getElementById('fontSizePicker').value;
settings.fontFamily = document.getElementById('fontFamilyPicker').value;
settings.menuColor = document.getElementById('menuColorPicker').value;
settings.backgroundOpacity = document.getElementById('backgroundOpacity').value;
settings.backgroundImage = document.getElementById('backgroundImage').value;
settings.cursorURL = document.getElementById('cursorURL').value;
saveSettings();
applyStoredStyles();
modalContainer.remove();
});
// Varsayılan ayarlara sıfırlama
document.getElementById('resetButton').addEventListener('click', () => {
resetToDefaultStyles();
modalContainer.remove();
});
// Ayarları dışa aktar
document.getElementById('exportButton').addEventListener('click', () => {
const jsonSettings = JSON.stringify(settings);
const blob = new Blob([jsonSettings], { type: 'application/json' });
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'settings.json';
link.click();
});
// Ayarları içe aktar
document.getElementById('importButton').addEventListener('click', () => {
const input = document.createElement('input');
input.type = 'file';
input.accept = '.json';
input.click();
input.addEventListener('change', (event) => {
const file = event.target.files[0];
if (file && file.name.endsWith('.json')) {
const reader = new FileReader();
reader.onload = function () {
try {
const importedSettings = JSON.parse(reader.result);
Object.keys(importedSettings).forEach(key => {
settings[key] = importedSettings[key];
});
saveSettings();
applyStoredStyles();
} catch (e) {
alert('Failed to import settings.');
}
};
reader.readAsText(file);
} else {
alert('Invalid file format.');
}
});
});
}
// Ayarları kaydet
function saveSettings() {
Object.keys(settings).forEach(key => {
setStoredValue(key, settings[key]);
});
}
// Varsayılan ayarlara dön
function resetToDefaultStyles() {
settings.buttonColor = rgba(226, 226, 226, 0.80);
settings.buttonHoverColor = '#ff91a6';
settings.fontColor = '#000000';
settings.fontSize = '16';
settings.fontFamily = 'Arial';
settings.menuColor = '#ffffff';
settings.backgroundOpacity = '1';
settings.backgroundImage = '';
settings.cursorURL = '';
saveSettings();
applyStoredStyles();
}
})();
(function() {
'use strict';
// Buton oluşturma
let uploadBtn = document.createElement("button");
uploadBtn.innerHTML = '<img src="https://files.catbox.moe/potman.png" style="width: 16px; height: 16px;">'; // Ataş ikonu
uploadBtn.style.padding = "5px";
uploadBtn.style.fontSize = "12px";
uploadBtn.style.color = "white";
uploadBtn.style.border = "1px solid black"; // 1px kalınlığında siyah border eklendi
uploadBtn.style.borderRadius = "3px"; // İsteğe bağlı: Köşeleri yuvarlak yapmak için
uploadBtn.style.cursor = "pointer";
uploadBtn.style.display = "flex";
uploadBtn.style.alignItems = "center";
uploadBtn.style.justifyContent = "center";
uploadBtn.style.marginLeft = "5px"; // Sohbet giriş kutusundan biraz uzaklaştırmak için
uploadBtn.style.backgroundColor = "transparent"; // Arka planı şeffaf yap
// Dosya seçme input'u
let fileInput = document.createElement("input");
fileInput.type = "file";
fileInput.style.display = "none";
document.body.appendChild(fileInput);
// Butona tıklanınca dosya seç
uploadBtn.addEventListener("click", function() {
fileInput.click();
});
fileInput.addEventListener("change", function() {
if (fileInput.files.length === 0) return;
let file = fileInput.files[0];
let formData = new FormData();
formData.append("reqtype", "fileupload");
formData.append("userhash", "");
formData.append("fileToUpload", file);
GM_xmlhttpRequest({
method: "POST",
url: "https://catbox.moe/user/api.php",
data: formData,
onload: function(response) {
if (response.status === 200) {
let link = response.responseText.trim();
GM_setClipboard(link);
// Sohbet kutusuna linki ekle
let chatInput = document.querySelector("input.chtipt");
if (chatInput) {
chatInput.value = link;
}
} else {
console.error("Yükleme başarısız oldu!");
}
}
});
});
// Sohbet kutusunu bul ve butonu içine ekle
let chatInputContainer = document.querySelector("form.chatinput");
if (chatInputContainer) {
chatInputContainer.appendChild(uploadBtn);
} else {
console.error("Sohbet giriş kutusu bulunamadı!");
}
})();